1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 ///
97 /// file drvMJPEG.c
98 /// @brief MJPEG Driver Interface
99 /// @author MStar Semiconductor Inc.
100 ///////////////////////////////////////////////////////////////////////////////////////////////////
101
102
103 #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE)) || defined(SUPPORT_X_MODEL_FEATURE)
104
105 //-------------------------------------------------------------------------------------------------
106 // Include Files
107 //-------------------------------------------------------------------------------------------------
108 // Common Definition
109 #ifdef MSOS_TYPE_LINUX_KERNEL
110 #include <linux/string.h>
111 #else
112 #include <string.h>
113 #endif
114
115 #include "MsCommon.h"
116 #include "MsVersion.h"
117 #include "MsOS.h"
118 #include "halCHIP.h"
119 // Internal Definition
120 #include "drvMJPEG.h"
121 #include "VirtualhalMJPEG.h"
122 #include "halVPU_EX.h"
123 #include "fwHVD_if.h"
124
125 //-------------------------------------------------------------------------------------------------
126 // Driver Compiler Options
127 //-------------------------------------------------------------------------------------------------
128 #ifdef MSOS_TYPE_LINUX_KERNEL
129 #undef printf
130 #define printf(format, args...) printk(format, ##args);
131 #endif
132
133 //-------------------------------------------------------------------------------------------------
134 // Local Defines
135 //-------------------------------------------------------------------------------------------------
136 //MJPEG driver debug macro
137 #ifndef ANDROID
138 #define MJPEG_DEBUG_DRV_MSG(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) printf(format, ##args);}while(0)
139 #define MJPEG_DEBUG_DRV_ERR(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) printf(format, ##args);}while(0)
140 #else
141 #define LOG_TAG "DRV_JPD"
142 #include <cutils/log.h>
143 #ifndef LOGD
144 #define MJPEG_DEBUG_DRV_MSG(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) ALOGI(format, ##args);}while(0)
145 #define MJPEG_DEBUG_DRV_ERR(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) ALOGE(format, ##args);}while(0)
146 #else
147 #define MJPEG_DEBUG_DRV_MSG(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) LOGI(format, ##args);}while(0)
148 #define MJPEG_DEBUG_DRV_ERR(format, args...) do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) LOGE(format, ##args);}while(0)
149 #endif
150
151 #endif
152
153 #ifndef UNUSED
154 #define UNUSED(x) ((x)=(x))
155 #endif
156
157 #define HVD_FW_MEM_OFFSET 0x100000UL // 1M
158 #define MJPEG_U32_MAX 0xFFFFFFFFUL
159 #define MJPEG_GENERAL_MAX ((size_t)(-1))
160
161
162 static MS_U8 u8MJPEG_DrvDbgLevel = E_MJPEG_DEBUG_DRV_NONE;
163
164 static MS_VIRT __u32FwAddr = MJPEG_U32_MAX;
165
166 static MS_BOOL bDisplayOutSideMode[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
167 static MS_VIRT u32FrameBuffStAddr[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
168 static MS_U32 u32FrameBuffTotalSize[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
169 static MS_U32 u32FrameBuffUnitSize[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
170 static MS_U32 u32FrameBuffTotalNum[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
171 static MS_U16 u16Width[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
172 static MS_U16 u16Height[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
173 static MS_U16 u16Pitch[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
174 static MS_U32 u32FrameCnt[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
175 static MS_U32 u32FrameRate[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
176 static MS_U32 u32FrameRateBase[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
177 static MS_U32 u32FrameTime[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
178
MDrv_MJPEG_SetFrameBuffStAddr(MS_U8 u8DrvId,MS_VIRT u32Value)179 void MDrv_MJPEG_SetFrameBuffStAddr(MS_U8 u8DrvId, MS_VIRT u32Value)
180 {
181 u32FrameBuffStAddr[u8DrvId] = u32Value;
182 }
MDrv_MJPEG_GetFrameBuffStAddr(MS_U8 u8DrvId)183 MS_VIRT MDrv_MJPEG_GetFrameBuffStAddr(MS_U8 u8DrvId)
184 {
185 return u32FrameBuffStAddr[u8DrvId];
186 }
187
MDrv_MJPEG_SetFrameBuffTotalSize(MS_U8 u8DrvId,MS_U32 u32Value)188 void MDrv_MJPEG_SetFrameBuffTotalSize(MS_U8 u8DrvId, MS_U32 u32Value)
189 {
190 u32FrameBuffTotalSize[u8DrvId] = u32Value;
191 }
MDrv_MJPEG_GetFrameBuffTotalSize(MS_U8 u8DrvId)192 MS_U32 MDrv_MJPEG_GetFrameBuffTotalSize(MS_U8 u8DrvId)
193 {
194 return u32FrameBuffTotalSize[u8DrvId];
195 }
196
MDrv_MJPEG_SetFrameBuffUnitSize(MS_U8 u8DrvId,MS_U32 u32Value)197 void MDrv_MJPEG_SetFrameBuffUnitSize(MS_U8 u8DrvId, MS_U32 u32Value)
198 {
199 u32FrameBuffUnitSize[u8DrvId] = u32Value;
200 }
MDrv_MJPEG_GetFrameBuffUnitSize(MS_U8 u8DrvId)201 MS_U32 MDrv_MJPEG_GetFrameBuffUnitSize(MS_U8 u8DrvId)
202 {
203 return u32FrameBuffUnitSize[u8DrvId];
204 }
205
MDrv_MJPEG_SetFrameBuffTotalNum(MS_U8 u8DrvId,MS_U32 u32Value)206 void MDrv_MJPEG_SetFrameBuffTotalNum(MS_U8 u8DrvId, MS_U32 u32Value)
207 {
208 u32FrameBuffTotalNum[u8DrvId] = u32Value;
209 }
MDrv_MJPEG_GetFrameBuffTotalNum(MS_U8 u8DrvId)210 MS_U32 MDrv_MJPEG_GetFrameBuffTotalNum(MS_U8 u8DrvId)
211 {
212 return u32FrameBuffTotalNum[u8DrvId];
213 }
214
MDrv_MJPEG_SetWidth(MS_U8 u8DrvId,MS_U16 u16Value)215 void MDrv_MJPEG_SetWidth(MS_U8 u8DrvId, MS_U16 u16Value)
216 {
217 u16Width[u8DrvId] = u16Value;
218 }
MDrv_MJPEG_GetWidth(MS_U8 u8DrvId)219 MS_U16 MDrv_MJPEG_GetWidth(MS_U8 u8DrvId)
220 {
221 return u16Width[u8DrvId];
222 }
223
MDrv_MJPEG_SetHeight(MS_U8 u8DrvId,MS_U16 u16Value)224 void MDrv_MJPEG_SetHeight(MS_U8 u8DrvId, MS_U16 u16Value)
225 {
226 u16Height[u8DrvId] = u16Value;
227 }
MDrv_MJPEG_GetHeight(MS_U8 u8DrvId)228 MS_U16 MDrv_MJPEG_GetHeight(MS_U8 u8DrvId)
229 {
230 return u16Height[u8DrvId];
231 }
232
MDrv_MJPEG_SetPitch(MS_U8 u8DrvId,MS_U16 u16Value)233 void MDrv_MJPEG_SetPitch(MS_U8 u8DrvId, MS_U16 u16Value)
234 {
235 u16Pitch[u8DrvId] = u16Value;
236 }
MDrv_MJPEG_GetPitch(MS_U8 u8DrvId)237 MS_U16 MDrv_MJPEG_GetPitch(MS_U8 u8DrvId)
238 {
239 return u16Pitch[u8DrvId];
240 }
241
MDrv_MJPEG_SetFrameCnt(MS_U8 u8DrvId,MS_U32 u32Value)242 void MDrv_MJPEG_SetFrameCnt(MS_U8 u8DrvId, MS_U32 u32Value)
243 {
244 u32FrameCnt[u8DrvId] = u32Value;
245 }
MDrv_MJPEG_GetFrameCnt(MS_U8 u8DrvId)246 MS_U32 MDrv_MJPEG_GetFrameCnt(MS_U8 u8DrvId)
247 {
248 return u32FrameCnt[u8DrvId];
249 }
250
MDrv_MJPEG_SetFrameRate(MS_U8 u8DrvId,MS_U32 u32Value)251 void MDrv_MJPEG_SetFrameRate(MS_U8 u8DrvId, MS_U32 u32Value)
252 {
253 u32FrameRate[u8DrvId] = u32Value;
254 }
MDrv_MJPEG_GetFrameRate(MS_U8 u8DrvId)255 MS_U32 MDrv_MJPEG_GetFrameRate(MS_U8 u8DrvId)
256 {
257 return u32FrameRate[u8DrvId];
258 }
259
MDrv_MJPEG_SetFrameRateBase(MS_U8 u8DrvId,MS_U32 u32Value)260 void MDrv_MJPEG_SetFrameRateBase(MS_U8 u8DrvId, MS_U32 u32Value)
261 {
262 u32FrameRateBase[u8DrvId] = u32Value;
263 }
MDrv_MJPEG_GetFrameRateBase(MS_U8 u8DrvId)264 MS_U32 MDrv_MJPEG_GetFrameRateBase(MS_U8 u8DrvId)
265 {
266 return u32FrameRateBase[u8DrvId];
267 }
268
MDrv_MJPEG_SetFrameTime(MS_U8 u8DrvId,MS_U32 u32Value)269 void MDrv_MJPEG_SetFrameTime(MS_U8 u8DrvId, MS_U32 u32Value)
270 {
271 u32FrameTime[u8DrvId] = u32Value;
272 }
MDrv_MJPEG_GetFrameTime(MS_U8 u8DrvId)273 MS_U32 MDrv_MJPEG_GetFrameTime(MS_U8 u8DrvId)
274 {
275 return u32FrameTime[u8DrvId];
276 }
277
278 /********************************************************************/
279 ///Set MJPEG Debug level
280 ///@para MS_U8 u8DbgLevel \b IN The MJPEG debug level
281 ///@return none
282 /********************************************************************/
MDrv_MJPEG_SetDbgLevel(MS_U8 u8DbgLevel)283 void MDrv_MJPEG_SetDbgLevel(MS_U8 u8DbgLevel)
284 {
285 u8MJPEG_DrvDbgLevel = u8DbgLevel;
286 }
287
288 /* =============================== MJPEG =====================================*/
289
MDrv_MJPEG_GetDrvId(MS_U32 u32Id)290 MS_U8 MDrv_MJPEG_GetDrvId(MS_U32 u32Id)
291 {
292 return (0xFF & (u32Id >> 16));
293 }
294 /******************************************************************************/
295 /// Stop VPU
296 /******************************************************************************/
MDrv_MJPEG_StopVPU(MS_U32 u32Id)297 void MDrv_MJPEG_StopVPU(MS_U32 u32Id)
298 {
299 VirtualHal_MJPEG_StopVPU(u32Id);
300 }
301
302
303 /******************************************************************************/
304 /// Release VPU
305 /******************************************************************************/
MDrv_MJPEG_ReleaseVPU(MS_U32 u32Id)306 void MDrv_MJPEG_ReleaseVPU(MS_U32 u32Id)
307 {
308 VirtualHal_MJPEG_ReleaseVPU(u32Id);
309 }
310
311 /******************************************************************************/
312 ///Check if MJPEG firmware ready or not
313 ///@return TRUE or FALSE
314 /******************************************************************************/
MDrv_MJPEG_IsFirmwareReady(MS_U32 u32Id)315 MS_BOOL MDrv_MJPEG_IsFirmwareReady(MS_U32 u32Id)
316 {
317 MS_U32 u32FirmVer = 0, u32Timeout = 50000;
318
319 // read VPU_RISC_MBOX0 to get firmware version
320 while(u32Timeout)
321 {
322 if(VirtualHal_MJPEG_IsVPUMBoxReady(u32Id, VPU_RISC_MBOX0))
323 {
324 VirtualHal_MJPEG_ReadVPUMBox(u32Id, VPU_RISC_MBOX0, (MS_U32 *)&u32FirmVer);
325 VirtualHal_MJPEG_ClearVPUMBox(u32Id, VPU_RISC_MBOX0);
326 break;
327 }
328 u32Timeout--;
329 }
330 if(u32Timeout > 0)
331 {
332 MJPEG_DEBUG_DRV_MSG("MJPEG firmware version 0x%tx\n", (ptrdiff_t)u32FirmVer);
333 }
334 else
335 {
336 MJPEG_DEBUG_DRV_ERR("Cannot get MJPEG firmware version !! \n");
337 return FALSE;
338 }
339
340 return TRUE;
341 }
342
343 /******************************************************************************/
344 ///Set VPU Command
345 ///@return TRUE or FALSE
346 ///@param u8Cmd \b IN: VPU Command
347 /// - MJPEG_CMD_SET_FRAME_BUFF_ADDR, Set frame buffer address
348 /// - MJPEG_CMD_SET_FRAME_BUFF_SIZE, Set frame buffer size
349 /******************************************************************************/
MDrv_MJPEG_SetVPUCmd(MS_U32 u32Id,MS_U32 u32Cmd)350 static MS_BOOL MDrv_MJPEG_SetVPUCmd(MS_U32 u32Id, MS_U32 u32Cmd)
351 {
352 //currently we only use VPU_HI_MBOX0 to send command.
353 //MS_U32 u32TimeOut = MsOS_GetSystemTime() + _u32FrameTime;
354 MS_U32 u32TimeOut = 200000;
355 MS_BOOL bResult = FALSE;
356
357 MJPEG_DEBUG_DRV_MSG("Send CMD 0x%tx to MJPEG firmware\n", (ptrdiff_t)u32Cmd);
358 //while(MsOS_GetSystemTime() < u32TimeOut)
359 while(u32TimeOut)
360 {
361 if(VirtualHal_MJPEG_IsVPUMBoxReady(u32Id, VPU_HI_MBOX0))
362 {
363 bResult = VirtualHal_MJPEG_SendVPUMBox(u32Id, VPU_HI_MBOX0, u32Cmd);
364 break;
365 }
366 u32TimeOut--;
367 }
368 if(u32TimeOut <= 0)
369 {
370 MJPEG_DEBUG_DRV_ERR("MJPEG send command timeout !!....pc=0x%tx \n", (ptrdiff_t)HAL_VPU_EX_GetProgCnt(u32Id));
371 bResult = FALSE;
372 }
373
374 return bResult;
375 }
376
377 /******************************************************************************/
378 ///Set VPU command argument
379 ///@return TRUE or FALSE
380 ///@param u32Arg \b IN: VPU command argument
381 /******************************************************************************/
MDrv_MJPEG_SetVPUCmdArg(MS_U32 u32Id,MS_U32 u32Arg)382 static MS_BOOL MDrv_MJPEG_SetVPUCmdArg(MS_U32 u32Id, MS_U32 u32Arg)
383 {
384 // we use VPU_HI_MBOX1 to send command argument
385 //U16 u16TimeOut = 0xFFFF;
386 MS_U32 u32TimeOut = 200000;
387 MS_BOOL bResult = FALSE;
388
389 MJPEG_DEBUG_DRV_MSG("Send argument 0x%tx to VPU \n", (ptrdiff_t)u32Arg);
390 while(--u32TimeOut)
391 {
392 if( VirtualHal_MJPEG_IsVPUMBoxReady(u32Id, VPU_HI_MBOX0)&& VirtualHal_MJPEG_IsVPUMBoxReady(u32Id, VPU_HI_MBOX1))
393 {
394 // the argument to be sent doesn't need to add task information in prefix
395 bResult = VirtualHal_MJPEG_SendVPUMBox(0, VPU_HI_MBOX1, u32Arg);
396 break;
397 }
398 }
399 if(u32TimeOut <= 0)
400 {
401 MJPEG_DEBUG_DRV_ERR("MJPEG send command argument timeout !! \n");
402 bResult = FALSE;
403 }
404
405 return bResult;
406 }
407
408
409 /******************************************************************************/
410 ///Set VPU command argument
411 ///@return TRUE or FALSE
412 ///@param u32Arg \b IN: VPU command argument
413 /******************************************************************************/
MDrv_MJPEG_SendVPUCommand(MS_U32 u32Id,MJPEG_User_Cmd eCmd,MS_VIRT u32Arg)414 MS_U32 MDrv_MJPEG_SendVPUCommand(MS_U32 u32Id, MJPEG_User_Cmd eCmd, MS_VIRT u32Arg)
415 {
416 MS_U32 u32Ret = 0;
417
418 MS_U32 idx = 0;
419 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
420
421 if (bDisplayOutSideMode[u8DrvId])
422 {
423 volatile HVD_ShareMem *pShareMem = NULL;
424 MsOS_ReadMemory();
425 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
426 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
427 {
428 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!![%d]\n", __LINE__);
429 return MJPEG_U32_MAX;
430 }
431
432 switch (eCmd)
433 {
434 case E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR:
435 u32FrameBuffStAddr[u8DrvId] = u32Arg;
436 pShareMem->DispQueue[0].u32LumaAddr = u32FrameBuffStAddr[u8DrvId];
437 pShareMem->DispQueue[0].u32Status = E_HVD_DISPQ_STATUS_FREE;
438 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free(init) 0][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
439 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
440 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
441 MsOS_FlushMemory();
442 break;
443
444 case E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE:
445 u32FrameBuffUnitSize[u8DrvId] = u32Arg;
446 break;
447
448 case E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM:
449 if (u32FrameBuffTotalNum[u8DrvId] > HVD_DISP_QUEUE_MAX_SIZE)
450 u32FrameBuffTotalNum[u8DrvId] = HVD_DISP_QUEUE_MAX_SIZE;
451 else
452 u32FrameBuffTotalNum[u8DrvId] = u32Arg;
453
454 pShareMem->u16DispQSize = u32FrameBuffTotalNum[u8DrvId];
455
456 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]-1; idx++)
457 {
458 if (u32FrameBuffUnitSize[u8DrvId] != 0)
459 {
460 pShareMem->DispQueue[idx+1].u32LumaAddr = pShareMem->DispQueue[idx].u32LumaAddr + u32FrameBuffUnitSize[u8DrvId];
461 pShareMem->DispQueue[idx+1].u32Status = E_HVD_DISPQ_STATUS_FREE;
462 }
463 }
464 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free(init) all][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
465 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
466 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
467 MsOS_FlushMemory();
468 break;
469
470 case E_MJPEG_CMD_PUSH_QUEUE_PARA_SETTING:
471
472 pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32Status = E_HVD_DISPQ_STATUS_NONE;
473 pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32TimeStamp = pShareMem->u32MJPEGTimeStamp;
474 pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32ID_L = pShareMem->u32MJPEGID_L;
475 pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32ID_H = pShareMem->u32MJPEGID_H;
476 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][none %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)pShareMem->u32MJPEGFrameBuffIdx, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
477 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
478 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
479 MsOS_FlushMemory();
480 break;
481
482 case E_MJPEG_CMD_SET_DISPLAY_OUTSIDE_MODE:
483
484 if(u32Arg==0)
485 {
486 bDisplayOutSideMode[u8DrvId] = FALSE;
487 }
488 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
489 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_DISPLAY_OUTSIDE_MODE);
490 break;
491
492 case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY:
493 if (u32Arg < u32FrameBuffTotalNum[u8DrvId])
494 {
495 u32FrameCnt[u8DrvId]++;
496 pShareMem->DispQueue[u32Arg].u32Status = E_HVD_DISPQ_STATUS_INIT;
497 pShareMem->DispQueue[u32Arg].u32ChromaAddr = pShareMem->DispQueue[u32Arg].u32LumaAddr;
498 pShareMem->DispQueue[u32Arg].u16Width = u16Width[u8DrvId];
499 pShareMem->DispQueue[u32Arg].u16Height = u16Height[u8DrvId];
500 pShareMem->DispQueue[u32Arg].u16Pitch = u16Pitch[u8DrvId];
501 pShareMem->DispQueue[u32Arg].u32PrivateData = u32FrameCnt[u8DrvId];
502
503 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
504 {
505 if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE)
506 {
507 pShareMem->u32MJPEG_NextFrameBuffIdx = idx;
508 break;
509 }
510 else
511 {
512 pShareMem->u32MJPEG_NextFrameBuffIdx = 0xFFFF;
513 }
514 }
515 }
516 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][init %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)u32Arg, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
517 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
518 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
519 MsOS_FlushMemory();
520 break;
521
522 case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID:
523 if (u32Arg < u32FrameBuffTotalNum[u8DrvId])
524 {
525 pShareMem->DispQueue[u32Arg].u32Status = E_HVD_DISPQ_STATUS_FREE;
526 MsOS_FlushMemory();
527 }
528 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free(valid) %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)u32Arg, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
529 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
530 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
531 break;
532
533 case E_MJPEG_CMD_FLUSH_DISP_QUEUE:
534
535 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
536 {
537 if (pShareMem->DispQueue[idx].u32Status != E_HVD_DISPQ_STATUS_VIEW)
538 {
539 pShareMem->DispQueue[idx].u32Status = E_HVD_DISPQ_STATUS_FREE;
540 pShareMem->DispQueue[idx].u32TimeStamp = 0;
541 pShareMem->DispQueue[idx].u32ID_L = 0xFFFFFFFF;
542 pShareMem->DispQueue[idx].u32ID_H = 0xFFFFFFFF;
543 }
544 }
545 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free(flush) all][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
546 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
547 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
548
549 pShareMem->u8MJPEG_bFlushQueue = 0;
550 u32Ret = 2;
551 MsOS_FlushMemory();
552 break;
553
554 case E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL:
555 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
556 {
557 if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE)
558 {
559 return 0;
560 }
561 }
562 MJPEG_DEBUG_DRV_MSG("Display Q is full[%d]\n", __LINE__);
563 // return full
564 return 1;
565 break;
566
567 case E_MJPEG_CMD_SET_WIDTH:
568 u16Width[u8DrvId] = (MS_U16)u32Arg;
569 break;
570
571 case E_MJPEG_CMD_SET_HEIGHT:
572 u16Height[u8DrvId] = (MS_U16)u32Arg;
573 break;
574
575 case E_MJPEG_CMD_SET_PITCH:
576 u16Pitch[u8DrvId] = (MS_U16)u32Arg;
577 break;
578
579 case E_MJPEG_CMD_IS_DISP_FINISH:
580 u32Ret = TRUE;
581 break;
582
583
584 #ifdef VDEC3
585 case E_MJPEG_CMD_FREE_FRAME_BUFFER:
586 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREE_FRAME_BUFFER);
587 u32Ret = (MS_U32) MDrv_MJPEG_IsFreeFinish(u32Id);
588 break;
589 #endif
590
591 case E_MJPEG_CMD_GO:
592 case E_MJPEG_CMD_SET_FRAMERATE:
593 case E_MJPEG_CMD_SET_FRAMERATE_BASE:
594 case E_MJPEG_CMD_PLAY:
595 case E_MJPEG_CMD_PAUSE:
596 case E_MJPEG_CMD_RESUME:
597 case E_MJPEG_CMD_STEP_PLAY:
598 case E_MJPEG_CMD_SET_SPEED_TYPE:
599 case E_MJPEG_CMD_SET_SPEED:
600 case E_MJPEG_CMD_FREEZE_DISP:
601 case E_MJPEG_CMD_ENABLE_AVSYNC:
602 case E_MJPEG_CMD_SET_AVSYNC_DELAY:
603 case E_MJPEG_CMD_SET_AVSYNC_TOLERENCE:
604 case E_MJPEG_CMD_SET_PTS_BASE:
605 case E_MJPEG_CMD_SET_STC_BASE:
606 case E_MJPEG_CMD_SET_BLUE_SCREEN:
607 case E_MJPEG_CMD_COMPENSATE_PTS:
608 case E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE:
609 MJPEG_DEBUG_DRV_MSG(" Unused MJPEG Command[0x%x] in display outside mode\n", eCmd);
610 u32Ret = 0xFFFFFFFF;
611 break;
612
613 default:
614 MJPEG_DEBUG_DRV_MSG(" !!! Unknown MJPEG Command[0x%x] !!!\n", eCmd);
615 u32Ret = 0xFFFFFFFF;
616 break;
617 }
618
619 return u32Ret;
620 }
621
622 switch (eCmd)
623 {
624 case E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR:
625 u32FrameBuffStAddr[u8DrvId] = u32Arg;
626 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
627 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_START_ADDR);
628 break;
629
630 case E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE:
631 u32FrameBuffUnitSize[u8DrvId] = u32Arg;
632 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
633 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_UNIT_SIZE);
634 break;
635
636 case E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM:
637 if (u32FrameBuffTotalNum[u8DrvId] > HVD_DISP_QUEUE_MAX_SIZE)
638 u32FrameBuffTotalNum[u8DrvId] = HVD_DISP_QUEUE_MAX_SIZE;
639 else
640 u32FrameBuffTotalNum[u8DrvId] = u32Arg;
641 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
642 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM);
643 break;
644
645 case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY:
646 u32FrameCnt[u8DrvId]++;
647 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
648 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_IDX_READY);
649 break;
650
651 case E_MJPEG_CMD_SET_WIDTH:
652 u16Width[u8DrvId] = (MS_U16)u32Arg;
653 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
654 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_WIDTH);
655 break;
656
657 case E_MJPEG_CMD_SET_HEIGHT:
658 u16Height[u8DrvId] = (MS_U16)u32Arg;
659 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
660 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_HEIGHT);
661 break;
662
663 case E_MJPEG_CMD_SET_PITCH:
664 u16Pitch[u8DrvId] = (MS_U16)u32Arg;
665 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
666 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_PITCH);
667 break;
668
669 case E_MJPEG_CMD_SET_FRAMERATE:
670 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
671 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAMERATE);
672 break;
673
674 case E_MJPEG_CMD_SET_FRAMERATE_BASE:
675 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
676 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAMERATE_BASE);
677 break;
678
679 case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID:
680 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
681 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_IDX_VALID);
682 break;
683
684 case E_MJPEG_CMD_PLAY:
685 u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PLAY);
686 break;
687
688 case E_MJPEG_CMD_PAUSE:
689 u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PAUSE);
690 break;
691
692 case E_MJPEG_CMD_RESUME:
693 u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_RESUME);
694 break;
695
696 case E_MJPEG_CMD_STEP_PLAY:
697 u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_STEP_PLAY);
698 break;
699
700 case E_MJPEG_CMD_SET_SPEED_TYPE:
701 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
702 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_SPEED_TYPE);
703 break;
704
705 case E_MJPEG_CMD_SET_SPEED:
706 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
707 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_SPEED);
708 break;
709
710 case E_MJPEG_CMD_FLUSH_DISP_QUEUE:
711 u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FLUSH_DISP_QUEUE);
712 break;
713
714 case E_MJPEG_CMD_FREEZE_DISP:
715 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
716 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREEZE_DISP);
717 break;
718
719 case E_MJPEG_CMD_ENABLE_AVSYNC:
720 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
721 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_AVSYNC);
722 break;
723
724 case E_MJPEG_CMD_SET_AVSYNC_DELAY:
725 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
726 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_AVSYNC_DELAY);
727 break;
728
729 case E_MJPEG_CMD_SET_AVSYNC_TOLERENCE:
730 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
731 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_AVSYNC_TOLERENCE);
732 break;
733
734 case E_MJPEG_CMD_SET_PTS_BASE:
735 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
736 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_PTS_BASE);
737 break;
738
739 case E_MJPEG_CMD_SET_STC_BASE:
740 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_STC_BASE);
741 break;
742
743 case E_MJPEG_CMD_SET_BLUE_SCREEN:
744 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
745 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_BLUE_SCREEN);
746 break;
747
748 case E_MJPEG_CMD_PUSH_QUEUE_PARA_SETTING:
749 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PUSH_QUEUE_PARA_SETTING);
750 break;
751
752 case E_MJPEG_CMD_SET_DISPLAY_OUTSIDE_MODE:
753
754 if(u32Arg)
755 {
756 bDisplayOutSideMode[u8DrvId] = TRUE;
757 }
758 if (bDisplayOutSideMode[u8DrvId])
759 {
760 // set E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM to 0 previent F/W write share mem
761 MDrv_MJPEG_SetVPUCmdArg(u32Id, 0);
762 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM);
763 MDrv_MJPEG_SetVPUCmdArg(u32Id, 0);
764 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_DISP_CMD_QUEUE);
765
766 MsOS_DelayTaskUs(10* 1000);
767 u32FrameCnt[u8DrvId] = 0;
768
769 volatile HVD_ShareMem *pShareMem = NULL;
770 MsOS_ReadMemory();
771 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
772 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
773 {
774 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!![%d]\n", __LINE__);
775 return MJPEG_U32_MAX;
776 }
777
778 pShareMem->DispQueue[0].u32LumaAddr = u32FrameBuffStAddr[u8DrvId];
779 pShareMem->DispQueue[0].u32Status = E_HVD_DISPQ_STATUS_FREE;
780 pShareMem->u16DispQSize = u32FrameBuffTotalNum[u8DrvId];
781
782 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]-1; idx++)
783 {
784 if (u32FrameBuffUnitSize[u8DrvId] != 0)
785 {
786 pShareMem->DispQueue[idx+1].u32LumaAddr = pShareMem->DispQueue[idx].u32LumaAddr + u32FrameBuffUnitSize[u8DrvId];
787 pShareMem->DispQueue[idx+1].u32Status = E_HVD_DISPQ_STATUS_FREE;
788 }
789 }
790 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free all][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
791 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
792 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
793
794 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
795 {
796 MJPEG_DEBUG_DRV_MSG("pShareMem->DispQueue[idx].u32Status : 0x%tX %td\n", (ptrdiff_t)pShareMem->DispQueue[idx].u32Status, (ptrdiff_t)idx);
797 }
798 MsOS_FlushMemory();
799 }
800 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
801 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_DISPLAY_OUTSIDE_MODE);
802 break;
803
804 case E_MJPEG_CMD_COMPENSATE_PTS:
805 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
806 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_COMPENSATE_PTS);
807 break;
808
809 // Display Command Queue -- BEGIN
810 case E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE:
811 MDrv_MJPEG_SetVPUCmdArg(u32Id, u32Arg);
812 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_DISP_CMD_QUEUE);
813 break;
814
815 // Display Command Queue -- END
816
817 case E_MJPEG_CMD_IS_DISP_FINISH:
818 MDrv_MJPEG_Init_IsDispFinish(u32Id);
819 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_IS_DISP_FINISH);
820 u32Ret = (MS_U32) MDrv_MJPEG_IsDispFinish(u32Id);
821 break;
822
823 case E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL:
824 MDrv_MJPEG_Init_IsQueueFull(u32Id);
825 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_IS_DISPLAY_QUEUE_FULL);
826 u32Ret = (MS_U32) MDrv_MJPEG_IsQueueFull(u32Id);
827 break;
828
829 #ifdef VDEC3
830 case E_MJPEG_CMD_GET_FRAME_BUFFER:
831 MDrv_MJPEG_Init_GetFrameBuffer(u32Id);
832 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_GET_FRAME_BUFFER);
833 u32Ret = (MS_U32) MDrv_MJPEG_GetFrameBuffer(u32Id);
834 break;
835 case E_MJPEG_CMD_FREE_FRAME_BUFFER:
836 MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREE_FRAME_BUFFER);
837 u32Ret = (MS_U32) MDrv_MJPEG_IsFreeFinish(u32Id);
838 break;
839 #endif
840
841 default:
842 MJPEG_DEBUG_DRV_MSG(" !!! Unknown MJPEG Command !!!\n");
843 u32Ret = 0xFFFFFFFF;
844 break;
845 }
846
847
848 return u32Ret;
849 }
850
851 #if 0
852 /******************************************************************************/
853 ///
854 ///@param value \b IN
855 ///@param value \b OUT
856 ///@return status
857 /******************************************************************************/
858 MS_BOOL MDrv_MJPEG_IsVPUOnMiu1(void)
859 {
860 return VirtualHal_MJPEG_IsVPUOnMiu1();
861 }
862
863 /******************************************************************************/
864 ///
865 ///@param value \b IN
866 ///@param value \b OUT
867 ///@return status
868 /******************************************************************************/
869 MS_U32 MDrv_MJPEG_GetMiuBase(void)
870 {
871 return VirtualHal_MJPEG_GetMiuBase();
872 }
873 #endif
874
875 /******************************************************************************/
876 ///Get ShareMemory address
877 ///@param u32Value \b IN new PTS value
878 /******************************************************************************/
MDrv_MJPEG_GetShareMemAddr(MS_U32 u32Id)879 MS_VIRT MDrv_MJPEG_GetShareMemAddr(MS_U32 u32Id)
880 {
881 MS_VIRT u32ShareMemAddr = MJPEG_U32_MAX;
882
883 if (__u32FwAddr != MJPEG_U32_MAX)
884 u32ShareMemAddr = __u32FwAddr +(HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
885 else
886 return MJPEG_U32_MAX;
887
888 u32ShareMemAddr = MS_PA2KSEG1((MS_VIRT)u32ShareMemAddr); //PhysicalAddr to VirtualAddr
889
890 return u32ShareMemAddr;
891 }
892
893 /******************************************************************************/
894 ///Description
895 ///@param in \b IN in parameter
896 ///@param out \b OUT out parameter
897 ///@return status
898 /******************************************************************************/
MDrv_MJPEG_ClearShareMemory(MS_U32 u32Id)899 void MDrv_MJPEG_ClearShareMemory(MS_U32 u32Id)
900 {
901 MS_U32 u32Idx = 0, u32Size;
902 volatile MS_U8 *u8Ptr = 0;
903
904 u8Ptr = (volatile MS_U8 *)MDrv_MJPEG_GetShareMemAddr(u32Id);
905 if((MS_VIRT)u8Ptr==MJPEG_U32_MAX)
906 {
907 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
908 return;
909 }
910 u32Size = sizeof(HVD_ShareMem);
911
912 for (u32Idx = 0; u32Idx < u32Size; u32Idx++)
913 {
914 *u8Ptr = 0;
915 u8Ptr++;
916 }
917 return;
918 }
919
920 /******************************************************************************/
921 ///Get PTS table address
922 ///@param u32Value \b IN new PTS value
923 /******************************************************************************/
MDrv_MJPEG_GetPtsTableAddr(MS_U32 u32Id)924 MS_VIRT MDrv_MJPEG_GetPtsTableAddr(MS_U32 u32Id)
925 {
926 MS_VIRT u32PtsAddr = MJPEG_U32_MAX;
927 #if defined(SUPPORT_NEW_MEM_LAYOUT)
928 volatile HVD_ShareMem *pShareMem = NULL;
929 MsOS_ReadMemory();
930 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
931 MS_U32 u32HVD_PTS_TABLE_ST_OFFSET = pShareMem->u32HVD_PTS_TABLE_ST_OFFSET - HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET;
932 #else
933 MS_U32 u32HVD_PTS_TABLE_ST_OFFSET = HVD_PTS_TABLE_ST_OFFSET;
934 #endif
935
936 if (__u32FwAddr != MJPEG_U32_MAX)
937 u32PtsAddr = __u32FwAddr + u32HVD_PTS_TABLE_ST_OFFSET;
938 else
939 return MJPEG_U32_MAX;
940
941 u32PtsAddr = MS_PA2KSEG1((MS_VIRT)u32PtsAddr); //PhysicalAddr to VirtualAddr
942
943 return u32PtsAddr;
944 }
945
946 /******************************************************************************/
947 ///Reset PTS value
948 ///@param u32Value \b IN new PTS value
949 /******************************************************************************/
MDrv_MJPEG_ResetPTS(MS_U32 u32Id,MS_U32 u32PtsBase)950 MS_BOOL MDrv_MJPEG_ResetPTS(MS_U32 u32Id, MS_U32 u32PtsBase)
951 {
952
953 MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_PTS_BASE, u32PtsBase);
954
955 return TRUE;
956 }
957
958 /******************************************************************************/
959 ///Return PTS of current displayed frame
960 ///@return PTS
961 /******************************************************************************/
MDrv_MJPEG_GetPTS(MS_U32 u32Id)962 MS_U32 MDrv_MJPEG_GetPTS(MS_U32 u32Id)
963 {
964 volatile HVD_ShareMem *pShareMem = NULL;
965 MsOS_ReadMemory();
966
967 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
968 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
969 {
970 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
971 return NULL;
972 }
973
974 return pShareMem->DispFrmInfo.u32TimeStamp;
975 }
976
977 /******************************************************************************/
978 ///Description
979 ///@param in \b IN in parameter
980 ///@param out \b OUT out parameter
981 ///@return status
982 /******************************************************************************/
MDrv_MJPEG_DispFrame(MS_U32 u32Id,MS_U32 u32DispIdx)983 void MDrv_MJPEG_DispFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
984 {
985 volatile HVD_ShareMem *pShareMem = NULL;
986 MsOS_ReadMemory();
987 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
988 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
989 {
990 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
991 return;
992 }
993
994 if (pShareMem->DispQueue[u32DispIdx].u32Status == E_HVD_DISPQ_STATUS_VIEW)
995 {
996 pShareMem->DispQueue[u32DispIdx].u32Status = E_HVD_DISPQ_STATUS_DISP;
997 }
998 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][disp %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)u32DispIdx, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
999 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1000 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1001 MsOS_FlushMemory();
1002 }
1003
1004 /******************************************************************************/
1005 ///Description
1006 ///@param in \b IN in parameter
1007 ///@param out \b OUT out parameter
1008 ///@return status
1009 /******************************************************************************/
MDrv_MJPEG_FreeFrame(MS_U32 u32Id,MS_U32 u32DispIdx)1010 void MDrv_MJPEG_FreeFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
1011 {
1012 volatile HVD_ShareMem *pShareMem = NULL;
1013 MsOS_ReadMemory();
1014 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1015 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1016 {
1017 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1018 return;
1019 }
1020
1021 if (pShareMem->DispQueue[u32DispIdx].u32Status == E_HVD_DISPQ_STATUS_VIEW)
1022 {
1023 pShareMem->DispQueue[u32DispIdx].u32Status = E_HVD_DISPQ_STATUS_FREE;
1024 }
1025 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][free %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)u32DispIdx, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
1026 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1027 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1028
1029 MsOS_FlushMemory();
1030 }
1031
1032 /******************************************************************************/
1033 ///Description
1034 ///@param in \b IN in parameter
1035 ///@param out \b OUT out parameter
1036 ///@return status
1037 /******************************************************************************/
1038 #define MJPEG_DISPQ_PREFETCH_COUNT 2
1039
1040 static MS_U16 _u16DispQPtr[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0};
MDrv_MJPEG_GetNextDispFrame(MS_U32 u32Id)1041 void* MDrv_MJPEG_GetNextDispFrame(MS_U32 u32Id)
1042 {
1043 volatile HVD_ShareMem *pShareMem = NULL;
1044 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1045 MsOS_ReadMemory();
1046 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1047 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1048 {
1049 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1050 return NULL;
1051 }
1052
1053 HVD_Frm_Information *pFrm;
1054
1055 if (bDisplayOutSideMode[u8DrvId])
1056 {
1057 MS_U32 idx = 0;
1058 MS_S32 found = -1;
1059
1060 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1061 {
1062 if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_INIT)
1063 {
1064 MJPEG_DEBUG_DRV_MSG("MDrv_MJPEG_GetNextDispFrame, pShareMem->DispQueue[%td].u32PrivateData = %td", (ptrdiff_t)idx, (ptrdiff_t)pShareMem->DispQueue[idx].u32PrivateData);
1065
1066 if (found >= 0)
1067 {
1068 // find the older one
1069 if (pShareMem->DispQueue[idx].u32PrivateData < pShareMem->DispQueue[found].u32PrivateData)
1070 found = idx;
1071 }
1072 else
1073 {
1074 found = idx;
1075 }
1076 }
1077 }
1078
1079 if (found >= 0)
1080 {
1081 pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[found]);
1082 _u16DispQPtr[u8DrvId] = found;
1083 pFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
1084 MsOS_FlushMemory();
1085 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][view %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)found, (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
1086 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1087 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1088 MJPEG_DEBUG_DRV_MSG("bDisplayOutSideMode-->FrameDone: %td, pFrm=0x%tx, timestamp=%td\n", (ptrdiff_t)idx, (ptrdiff_t)pFrm, (ptrdiff_t)pFrm->u32TimeStamp);
1089 return pFrm;
1090 }
1091 else
1092 {
1093 MJPEG_DEBUG_DRV_MSG("MDrv_MJPEG_GetNextDispFrame return NULL!!! [MJPEG_FB][%td %td %td %td %td %td %td %td]\n",
1094 (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
1095 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1096 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1097 return NULL;
1098 }
1099 }
1100 else
1101 {
1102
1103 MS_U16 u16QNum = pShareMem->u16DispQNumb;
1104 MS_U16 u16QPtr = pShareMem->u16DispQPtr;
1105
1106 #if 0
1107 if (u16QNum > MJPEG_DISPQ_PREFETCH_COUNT) u16QNum = MJPEG_DISPQ_PREFETCH_COUNT;
1108 #endif
1109
1110 while (u16QNum != 0)
1111 {
1112 pFrm = (HVD_Frm_Information*)(MS_VIRT)&(pShareMem->DispQueue[u16QPtr]);
1113
1114 if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1115 {
1116 _u16DispQPtr[u8DrvId] = u16QPtr;
1117 pFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
1118 MJPEG_DEBUG_DRV_MSG("[MJPEG_FB][view %td][%td %td %td %td %td %td %td %td]\n", (ptrdiff_t)_u16DispQPtr[u8DrvId], (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
1119 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1120 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1121
1122 MJPEG_DEBUG_DRV_MSG("FrameDone: %td, pFrm=0x%tx, timestamp=%td\n", (ptrdiff_t)u16QPtr, (ptrdiff_t)pFrm, (ptrdiff_t)pFrm->u32TimeStamp);
1123 return pFrm;
1124 }
1125 u16QNum--;
1126 u16QPtr++;
1127 if (u16QPtr == pShareMem->u16DispQSize) u16QPtr = 0; //wrap to the begin
1128 }
1129 MsOS_FlushMemory();
1130 return NULL;
1131 }
1132 }
1133
MDrv_MJPEG_GetDispFrameNum(MS_U32 u32Id)1134 MS_U32 MDrv_MJPEG_GetDispFrameNum(MS_U32 u32Id)
1135 {
1136 volatile HVD_ShareMem *pShareMem = NULL;
1137 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1138
1139 MsOS_ReadMemory();
1140 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1141 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1142 {
1143 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1144 return NULL;
1145 }
1146
1147 HVD_Frm_Information *pFrm;
1148 MS_U32 u32DispFrmNum = 0;
1149
1150 if (bDisplayOutSideMode[u8DrvId])
1151 {
1152 MS_U32 idx = 0;
1153 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1154 {
1155 pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[idx]);
1156
1157 if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1158 {
1159 u32DispFrmNum++;
1160 }
1161 }
1162 return u32DispFrmNum;
1163 }
1164 else
1165 {
1166 MS_U16 u16QNum = pShareMem->u16DispQNumb;
1167 MS_U16 u16QPtr = pShareMem->u16DispQPtr;
1168
1169 while (u16QNum != 0)
1170 {
1171 pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[u16QPtr]);
1172
1173 if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1174 {
1175 u32DispFrmNum++;
1176 }
1177 u16QNum--;
1178 u16QPtr++;
1179 if (u16QPtr == pShareMem->u16DispQSize)
1180 {
1181 u16QPtr = 0; //wrap to the begin
1182 }
1183 }
1184 return u32DispFrmNum;
1185 }
1186 }
1187
1188 /******************************************************************************/
1189 ///Description
1190 ///@param in \b IN in parameter
1191 ///@param out \b OUT out parameter
1192 ///@return status
1193 /******************************************************************************/
MDrv_MJPEG_GetNextDispQPtr(MS_U32 u32Id)1194 MS_U32 MDrv_MJPEG_GetNextDispQPtr(MS_U32 u32Id)
1195 {
1196 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1197 return _u16DispQPtr[u8DrvId];
1198 }
1199
1200 /******************************************************************************/
1201 ///Description
1202 ///@param in \b IN in parameter
1203 ///@param out \b OUT out parameter
1204 ///@return status
1205 /******************************************************************************/
MDrv_MJPEG_GetDispFrameInfo(MS_U32 u32Id,void * pInfo)1206 void MDrv_MJPEG_GetDispFrameInfo(MS_U32 u32Id, void *pInfo)
1207 {
1208 MJPEG_DRV_FrameInfo *pFrmInfo = (MJPEG_DRV_FrameInfo *)pInfo;
1209
1210 volatile HVD_ShareMem *pShareMem = NULL;
1211 MsOS_ReadMemory();
1212 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1213 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1214 {
1215 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1216 return;
1217 }
1218
1219 pFrmInfo->u32LumaAddr = pShareMem->DispFrmInfo.u32LumaAddr;
1220 pFrmInfo->u32ChromaAddr = pShareMem->DispFrmInfo.u32ChromaAddr;
1221 pFrmInfo->u32TimeStamp = pShareMem->DispFrmInfo.u32TimeStamp;
1222 pFrmInfo->u32ID_L = pShareMem->DispFrmInfo.u32ID_L;
1223 pFrmInfo->u32ID_H = pShareMem->DispFrmInfo.u32ID_H;
1224 }
1225
MDrv_MJPEG_EnableTurboFWMode(MS_U32 u32Id,MS_BOOL bEnable)1226 void MDrv_MJPEG_EnableTurboFWMode(MS_U32 u32Id, MS_BOOL bEnable)
1227 {
1228 // gbEnableTurboFWMode = bEnable;
1229 HAL_VPU_EX_SetFWReload(u32Id, !bEnable);
1230 }
1231
MDrv_MJPEG_InitFw(MS_U32 u32Id,MJPEG_FW_Info FWInfo)1232 MJPEG_Return MDrv_MJPEG_InitFw(MS_U32 u32Id, MJPEG_FW_Info FWInfo)
1233 {
1234 __u32FwAddr = FWInfo.u32Addr;
1235 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1236
1237 MJPEG_DEBUG_DRV_MSG("MDrv_MJPEG_InitFw u32Size = 0x%tx, u32Addr = 0x%tx, u32BinSize = 0x%tx, u32BinAddr = 0x%tx, u8FwSrcType = %td\n", (ptrdiff_t)FWInfo.u32Size, (ptrdiff_t)FWInfo.u32Addr, (ptrdiff_t)FWInfo.u32BinSize, (ptrdiff_t)FWInfo.u32BinAddr, (ptrdiff_t)FWInfo.u8FwSrcType);
1238 // for wb
1239 //MDrv_MJPEG_ClearShareMemory(u32Id);
1240
1241 bDisplayOutSideMode[MDrv_MJPEG_GetDrvId(u32Id)] = FALSE;
1242
1243 // Set Codec Type for HVD Firmware
1244 volatile HVD_ShareMem *pHVDShareMem = NULL;
1245 pHVDShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1246 if((MS_VIRT)pHVDShareMem==MJPEG_U32_MAX)
1247 {
1248 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1249 return E_MJPEG_FAILED;
1250 }
1251 pHVDShareMem->u32CodecType = E_HVD_Codec_MJPEG;
1252 // u16ChipID is set in HAL_HVD_EX_InitShareMem()
1253 //pHVDShareMem->u16ChipID = E_MSTAR_CHIP_J2;
1254 MsOS_FlushMemory();
1255
1256 // Create Task
1257 VPU_EX_FWCodeCfg stVpuFWCfg;
1258 VPU_EX_TaskInfo stTaskInfo;
1259 VPU_EX_VLCTblCfg stVlcCfg;
1260 #ifdef VDEC3
1261 VPU_EX_FBCfg stFBCfg;
1262 #endif
1263 VPU_EX_NDecInitPara stVpuInitPara;
1264
1265 memset(&stVpuFWCfg, 0, sizeof(VPU_EX_FWCodeCfg));
1266 memset(&stTaskInfo, 0, sizeof(VPU_EX_TaskInfo));
1267 memset(&stVlcCfg, 0, sizeof(VPU_EX_VLCTblCfg));
1268 #ifdef VDEC3
1269 memset(&stFBCfg, 0, sizeof(VPU_EX_FBCfg));
1270 #endif
1271 memset(&stVpuInitPara, 0, sizeof(VPU_EX_NDecInitPara));
1272
1273 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1274 stVpuInitPara.pTaskInfo = &stTaskInfo;
1275 #ifdef VDEC3
1276 stVpuInitPara.pFBCfg = &stFBCfg;
1277 MJPEG_DEBUG_DRV_MSG("[MJPEG] FWInfo.u32MWCAddr=0x%tx, FWInfo.u32MWCSize=0x%tx\n", (ptrdiff_t)FWInfo.u32MWCAddr, (ptrdiff_t)FWInfo.u32MWCSize);
1278
1279 MS_U8 MIUAllocation;
1280 _phy_to_miu_offset(MIUAllocation, stVpuInitPara.pFBCfg->u32FrameBufAddr, FWInfo.u32MWCAddr);
1281 MDrv_MJPEG_SetMIUInfo(u32Id, MIUAllocation);
1282 stVpuInitPara.pFBCfg->u32FrameBufSize = FWInfo.u32MWCSize;
1283 MJPEG_DEBUG_DRV_MSG("[MJPEG] u32FrameBufAddr=0x%tx, u32FrameBufSize=0x%tx\n", (ptrdiff_t)stVpuInitPara.pFBCfg->u32FrameBufAddr, (ptrdiff_t)stVpuInitPara.pFBCfg->u32FrameBufSize);
1284 #endif
1285
1286 stVpuFWCfg.u32DstAddr = MsOS_PA2KSEG1(FWInfo.u32Addr);
1287 stVpuFWCfg.u32DstSize = FWInfo.u32Size;
1288 stVpuFWCfg.u32BinAddr = MsOS_PA2KSEG1(FWInfo.u32BinAddr);
1289 stVpuFWCfg.u32BinSize = FWInfo.u32BinSize;
1290 stVpuFWCfg.u8SrcType = FWInfo.u8FwSrcType;
1291
1292 stTaskInfo.u32Id = u32Id;
1293 stTaskInfo.eDecType = E_VPU_EX_DECODER_HVD;
1294 stTaskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
1295 stTaskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
1296 #ifdef VDEC3
1297 HAL_VPU_EX_TaskCreate(u32Id, &stVpuInitPara, FWInfo.bFWdecideFB, 0);
1298 #else
1299 HAL_VPU_EX_TaskCreate(u32Id, &stVpuInitPara);
1300 #endif
1301 VirtualHal_MJPEG_Init(u8DrvId);
1302
1303 return E_MJPEG_OK;
1304 }
1305
MDrv_MJPEG_Get_Chip_ID(void)1306 MJPEG_MSTAR_CHIP_ID MDrv_MJPEG_Get_Chip_ID(void)
1307 {
1308 return VirtualHal_MJPEG_Get_Chip_ID();
1309 }
1310
MDrv_MJPEG_GetFreeStream(MS_U32 * pu32Id,MJPEG_DRV_StreamType eStreamType)1311 MJPEG_Return MDrv_MJPEG_GetFreeStream(MS_U32 *pu32Id, MJPEG_DRV_StreamType eStreamType)
1312 {
1313 MJPEG_Return eRet = E_MJPEG_INVALID_PARAM;
1314 MS_U8 i = 0xff;
1315 MS_U32 u32VPUStreamId = 0;
1316 MS_U32 u32MJPEGStreamId = 0;
1317
1318 MJPEG_DEBUG_DRV_MSG("%20s:%30s: Id=0x%tX\n", __FILE__, __FUNCTION__, (ptrdiff_t)(*pu32Id));
1319
1320 #ifdef VDEC3
1321 if ((eStreamType >= E_MJPEG_DRV_N_STREAM) && (eStreamType < E_MJPEG_DRV_N_STREAM + E_MJPEG_MJPEG_TOTAL))
1322 {
1323 i = eStreamType - E_MJPEG_DRV_N_STREAM;
1324 }
1325 else
1326 {
1327 return E_MJPEG_FAILED;
1328 }
1329 u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_N_STREAM + i, FALSE, FALSE);
1330 u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_N_STREAM + i);
1331
1332 if (u32VPUStreamId && u32MJPEGStreamId)
1333 {
1334 *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1335 eRet = E_MJPEG_OK;
1336 }
1337 #else
1338 switch(eStreamType)
1339 {
1340 case(E_MJPEG_DRV_MAIN_STREAM):
1341 i = 0;
1342 break;
1343 case(E_MJPEG_DRV_SUB_STREAM):
1344 i = 1;
1345 break;
1346 case(E_MJPEG_DRV_STREAM_NONE):
1347 default:
1348 i = 0xff;
1349 break;
1350 }
1351
1352 if ( i == 0xff )
1353 {
1354 return E_MJPEG_FAILED;
1355 }
1356
1357 if (E_MJPEG_DRV_MAIN_STREAM == eStreamType)
1358 {
1359 u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MAIN_STREAM, FALSE);
1360 u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_MAIN_STREAM);
1361
1362 if(u32MJPEGStreamId == E_HAL_MJPEG_STREAM_NONE)
1363 {
1364 HAL_VPU_EX_ReleaseFreeStream(0);
1365 }
1366
1367 if (u32VPUStreamId && u32MJPEGStreamId)
1368 {
1369 *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1370 eRet = E_MJPEG_OK;
1371 }
1372 }
1373 else //if (E_MJPEG_DRV_SUB_STREAM== eStreamType)
1374 {
1375 u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_SUB_STREAM, FALSE);
1376 u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_SUB_STREAM);
1377
1378 if(u32MJPEGStreamId == E_HAL_MJPEG_STREAM_NONE)
1379 {
1380 HAL_VPU_EX_ReleaseFreeStream(1);
1381 }
1382
1383 if (u32VPUStreamId && u32MJPEGStreamId)
1384 {
1385 *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1386 eRet = E_MJPEG_OK;
1387 }
1388 }
1389 #endif
1390
1391
1392 MJPEG_DEBUG_DRV_MSG("%20s:%30s: Id=0x%tX\n", __FILE__, __FUNCTION__, (ptrdiff_t)(*pu32Id));
1393
1394 return eRet;
1395 }
1396
MDrv_MJPEG_DeInit(MS_U32 u32Id)1397 MJPEG_Return MDrv_MJPEG_DeInit(MS_U32 u32Id)
1398 {
1399 MJPEG_Return eRet = E_MJPEG_INVALID_PARAM;
1400 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1401
1402 VPU_EX_FWCodeCfg stVpuFWCfg;
1403 VPU_EX_TaskInfo stTaskInfo;
1404 VPU_EX_NDecInitPara stVpuInitPara;
1405
1406 stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1407 stVpuInitPara.pTaskInfo = &stTaskInfo;
1408
1409 stVpuFWCfg.u32DstAddr = MsOS_PA2KSEG1(__u32FwAddr);
1410 stVpuFWCfg.u8SrcType = E_HVD_FW_INPUT_SOURCE_NONE;
1411
1412 stTaskInfo.u32Id = u32Id;
1413 stTaskInfo.eDecType = E_VPU_EX_DECODER_HVD;
1414 stTaskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
1415 stTaskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
1416
1417 VirtualHal_MJPEG_DeInit(u8DrvId);
1418
1419 if ( HAL_VPU_EX_TaskDelete(u32Id, &stVpuInitPara) ) eRet = E_MJPEG_OK;
1420
1421 return eRet;
1422 }
1423
MDrv_MJPEG_InitRegBase(MS_VIRT u32RegBase)1424 void MDrv_MJPEG_InitRegBase(MS_VIRT u32RegBase)
1425 {
1426 HAL_VPU_EX_InitRegBase(u32RegBase);
1427 }
1428
MDrv_MJPEG_SetPushQPara(MS_U32 u32Id,MS_U32 u32TimeStamp,MS_U32 u32ID_L,MS_U32 u32ID_H,MS_U32 u32NextFrameBuffIdx)1429 void MDrv_MJPEG_SetPushQPara(MS_U32 u32Id, MS_U32 u32TimeStamp, MS_U32 u32ID_L, MS_U32 u32ID_H, MS_U32 u32NextFrameBuffIdx)
1430 {
1431 volatile HVD_ShareMem *pShareMem = NULL;
1432 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1433 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1434 {
1435 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1436 return;
1437 }
1438
1439 pShareMem->u32MJPEGFrameBuffIdx = u32NextFrameBuffIdx;
1440 pShareMem->u32MJPEGTimeStamp = u32TimeStamp;
1441 pShareMem->u32MJPEGID_L = u32ID_L;
1442 pShareMem->u32MJPEGID_H = u32ID_H;
1443 pShareMem->u32MJPEG_NextFrameBuffIdx = 0xffff;
1444 MsOS_FlushMemory();
1445
1446 }
1447
1448
MDrv_MJPEG_SetStepDispPara(MS_U32 u32Id)1449 void MDrv_MJPEG_SetStepDispPara(MS_U32 u32Id)
1450 {
1451 volatile HVD_ShareMem *pShareMem = NULL;
1452 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1453 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1454 {
1455 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1456 return;
1457 }
1458 pShareMem->u8MJPEG_bStepPlay = TRUE;
1459 MsOS_FlushMemory();
1460
1461 }
1462
MDrv_MJPEG_SetMIUInfo(MS_U32 u32Id,MS_U8 u8MIU)1463 void MDrv_MJPEG_SetMIUInfo(MS_U32 u32Id, MS_U8 u8MIU)
1464 {
1465 volatile HVD_ShareMem *pShareMem = NULL;
1466 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1467 if((MS_VIRT)pShareMem==0xFFFFFFFF)
1468 {
1469 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1470 return;
1471 }
1472 pShareMem->u32VDEC_MIU_SEL = (MS_U32)u8MIU;
1473 MsOS_FlushMemory();
1474
1475 }
1476
1477
1478
MDrv_MJPEG_PrintShareInfo(MS_U32 u32Id)1479 void MDrv_MJPEG_PrintShareInfo(MS_U32 u32Id)
1480 {
1481 volatile HVD_ShareMem *pShareMem = NULL;
1482 MsOS_ReadMemory();
1483 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1484 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1485 {
1486 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1487 return;
1488 }
1489
1490 MJPEG_DEBUG_DRV_MSG("0x%08tx, r:%td, w:%td, sys=%td, v_pts=%td, s/r=%td(%c)\n",
1491 (ptrdiff_t)pShareMem->u32MJPEGDbg_DispStatus,
1492 (ptrdiff_t)pShareMem->u8MJPEGDbg_ReadFbIdx, (ptrdiff_t)pShareMem->u8MJPEGDbg_WriteFbIdx,
1493 (ptrdiff_t)pShareMem->u32MJPEGDbg_SysTime, (ptrdiff_t)pShareMem->u32MJPEGDbg_VideoPts,
1494 (ptrdiff_t)pShareMem->u32MJPEGDbg_SkipRepeatTime, pShareMem->u8MJPEGDbg_SkipRepeat
1495 );
1496 }
1497
MDrv_MJPEG_GetNextFrameBufferIdx(MS_U32 u32Id)1498 MS_U32 MDrv_MJPEG_GetNextFrameBufferIdx(MS_U32 u32Id)
1499 {
1500 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1501 volatile HVD_ShareMem *pShareMem = NULL;
1502 MsOS_ReadMemory();
1503 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1504 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1505 {
1506 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1507 return NULL;
1508 }
1509
1510 if (bDisplayOutSideMode[u8DrvId])
1511 {
1512 MS_U32 idx = 0;
1513 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1514 {
1515 if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE) return idx;
1516 }
1517 MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_GetNextFrameBufferIdx is full!!!\n");
1518 return (MJPEG_U32_MAX);
1519 }
1520 else
1521 {
1522 return pShareMem->u32MJPEG_NextFrameBuffIdx;
1523 }
1524 }
1525
MDrv_MJPEG_IsStepPlayDone(MS_U32 u32Id)1526 MS_BOOL MDrv_MJPEG_IsStepPlayDone(MS_U32 u32Id)
1527 {
1528 volatile HVD_ShareMem *pShareMem = NULL;
1529 MsOS_ReadMemory();
1530 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1531 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1532 {
1533 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1534 return FALSE;
1535 }
1536 return (MS_BOOL)pShareMem->u8MJPEG_bStepPlay;
1537 }
1538
MDrv_MJPEG_IsPlaying(MS_U32 u32Id)1539 MS_BOOL MDrv_MJPEG_IsPlaying(MS_U32 u32Id)
1540 {
1541 volatile HVD_ShareMem *pShareMem = NULL;
1542 MsOS_ReadMemory();
1543 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1544 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1545 {
1546 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1547 return FALSE;
1548 }
1549 return (MS_BOOL)pShareMem->u8MJPEG_bPlaying;
1550 }
1551
MDrv_MJPEG_IsAVSyncOn(MS_U32 u32Id)1552 MS_BOOL MDrv_MJPEG_IsAVSyncOn(MS_U32 u32Id)
1553 {
1554 volatile HVD_ShareMem *pShareMem = NULL;
1555 MsOS_ReadMemory();
1556 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1557 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1558 {
1559 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1560 return FALSE;
1561 }
1562 return (MS_BOOL)pShareMem->u8MJPEG_bIsAVSyncOn;
1563 }
1564
MDrv_MJPEG_IsReachAVSync(MS_U32 u32Id)1565 MS_BOOL MDrv_MJPEG_IsReachAVSync(MS_U32 u32Id)
1566 {
1567 volatile HVD_ShareMem *pShareMem = NULL;
1568 MsOS_ReadMemory();
1569 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1570 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1571 {
1572 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1573 return FALSE;
1574 }
1575 return (MS_BOOL)pShareMem->u8MJPEG_bIsReachAVSync;
1576 }
1577
MDrv_MJPEG_IsFlushDone(MS_U32 u32Id)1578 MS_BOOL MDrv_MJPEG_IsFlushDone(MS_U32 u32Id)
1579 {
1580 volatile HVD_ShareMem *pShareMem = NULL;
1581 MsOS_ReadMemory();
1582 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1583 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1584 {
1585 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1586 return FALSE;
1587 }
1588 return (MS_BOOL)(!pShareMem->u8MJPEG_bFlushQueue);
1589 }
1590
MDrv_MJPEG_InitFlush(MS_U32 u32Id)1591 void MDrv_MJPEG_InitFlush(MS_U32 u32Id)
1592 {
1593 volatile HVD_ShareMem *pShareMem = NULL;
1594 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1595 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1596 {
1597 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1598 return;
1599 }
1600 pShareMem->u8MJPEG_bFlushQueue = 1;
1601 MsOS_FlushMemory();
1602 }
1603
1604
MDrv_MJPEG_Init_IsDispFinish(MS_U32 u32Id)1605 void MDrv_MJPEG_Init_IsDispFinish(MS_U32 u32Id)
1606 {
1607 volatile HVD_ShareMem *pShareMem = NULL;
1608 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1609 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1610 {
1611 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1612 return;
1613 }
1614 pShareMem->u8MJPEG_bIsDispFinish = 0xff;
1615 MsOS_FlushMemory();
1616 }
1617
MDrv_MJPEG_IsDispFinish(MS_U32 u32Id)1618 MS_BOOL MDrv_MJPEG_IsDispFinish(MS_U32 u32Id)
1619 {
1620 volatile HVD_ShareMem *pShareMem = NULL;
1621 MsOS_ReadMemory();
1622 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1623 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1624 {
1625 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1626 return FALSE;
1627 }
1628 MS_U32 u32Timer;
1629
1630 u32Timer = MsOS_GetSystemTime();
1631 while(1)
1632 {
1633 if (MsOS_GetSystemTime()-u32Timer > 30)
1634 {
1635 MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsDispFinish() timeout...\n");
1636 break;
1637 }
1638 if(pShareMem->u8MJPEG_bIsDispFinish!=0xff)
1639 break;
1640 }
1641 return (MS_BOOL)(pShareMem->u8MJPEG_bIsDispFinish);
1642 }
1643
1644
MDrv_MJPEG_Init_IsQueueFull(MS_U32 u32Id)1645 void MDrv_MJPEG_Init_IsQueueFull(MS_U32 u32Id)
1646 {
1647 volatile HVD_ShareMem *pShareMem = NULL;
1648 MsOS_ReadMemory();
1649 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1650 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1651 {
1652 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1653 return;
1654 }
1655 pShareMem->u8MJPEG_bQueueFull = 0xff;
1656 MsOS_FlushMemory();
1657 }
1658
MDrv_MJPEG_IsQueueFull(MS_U32 u32Id)1659 MS_BOOL MDrv_MJPEG_IsQueueFull(MS_U32 u32Id)
1660 {
1661 volatile HVD_ShareMem *pShareMem = NULL;
1662 MsOS_ReadMemory();
1663 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1664 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1665 {
1666 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1667 return FALSE;
1668 }
1669 MS_U32 u32Timer;
1670
1671 u32Timer = MsOS_GetSystemTime();
1672 while(1)
1673 {
1674 if (MsOS_GetSystemTime()-u32Timer > 1000)
1675 {
1676 MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsQueueFull() timeout...\n");
1677 break;
1678 }
1679 MsOS_ReadMemory();
1680 if(pShareMem->u8MJPEG_bQueueFull!=0xff)
1681 {
1682 MJPEG_DEBUG_DRV_MSG("[%td]ms\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1683 break;
1684 }
1685 }
1686 return (MS_BOOL)(pShareMem->u8MJPEG_bQueueFull);
1687
1688 }
1689
1690 #ifdef VDEC3
MDrv_MJPEG_Init_GetFrameBuffer(MS_U32 u32Id)1691 void MDrv_MJPEG_Init_GetFrameBuffer(MS_U32 u32Id)
1692 {
1693 volatile HVD_ShareMem *pShareMem = NULL;
1694 MsOS_ReadMemory();
1695 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1696 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1697 {
1698 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1699 return;
1700 }
1701 pShareMem->u32FrameBufAddr = 0;
1702 pShareMem->u32FrameBufSize = 0;
1703 MsOS_FlushMemory();
1704 }
1705
MDrv_MJPEG_GetFrameBuffer(MS_U32 u32Id)1706 MS_BOOL MDrv_MJPEG_GetFrameBuffer(MS_U32 u32Id)
1707 {
1708 MS_BOOL bRet = FALSE;
1709 MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1710 volatile HVD_ShareMem *pShareMem = NULL;
1711 MsOS_ReadMemory();
1712 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1713 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1714 {
1715 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1716 return FALSE;
1717 }
1718 MS_U32 u32Timer;
1719
1720 u32Timer = MsOS_GetSystemTime();
1721 while(1)
1722 {
1723 if (MsOS_GetSystemTime()-u32Timer > 1000)
1724 {
1725 MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_GetFrameBuffer() timeout...\n");
1726 return FALSE;
1727 }
1728 MsOS_ReadMemory();
1729 if(pShareMem->u32FrameBufAddr!=0)
1730 {
1731 MJPEG_DEBUG_DRV_MSG("[%td]ms, get ok\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1732 break;
1733 }
1734 }
1735 if(pShareMem->u32FrameBufAddr!=MJPEG_U32_MAX
1736 && pShareMem->u32FrameBufSize!=MJPEG_U32_MAX)
1737 {
1738 bRet = TRUE;
1739 u32FrameBuffStAddr[u8DrvId] = (MS_VIRT)pShareMem->u32FrameBufAddr;
1740 u32FrameBuffTotalSize[u8DrvId] = pShareMem->u32FrameBufSize;
1741 MJPEG_DEBUG_DRV_MSG("Get addr=0x%tx, size=0x%tx\n", (ptrdiff_t)pShareMem->u32FrameBufAddr, (ptrdiff_t)pShareMem->u32FrameBufSize);
1742 }
1743 else
1744 {
1745 MJPEG_DEBUG_DRV_ERR("[fail]Get addr=0x%tx, size=0x%tx\n", (ptrdiff_t)pShareMem->u32FrameBufAddr, (ptrdiff_t)pShareMem->u32FrameBufSize);
1746 }
1747 return bRet;
1748 }
1749
MDrv_MJPEG_IsFreeFinish(MS_U32 u32Id)1750 MS_BOOL MDrv_MJPEG_IsFreeFinish(MS_U32 u32Id)
1751 {
1752 MS_BOOL bRet = FALSE;
1753 volatile HVD_ShareMem *pShareMem = NULL;
1754 MsOS_ReadMemory();
1755 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1756 if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1757 {
1758 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1759 return FALSE;
1760 }
1761 MS_U32 u32Timer;
1762
1763 u32Timer = MsOS_GetSystemTime();
1764 while(1)
1765 {
1766 if (MsOS_GetSystemTime()-u32Timer > 1000)
1767 {
1768 MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsFreeFinish() timeout...\n");
1769 break;
1770 }
1771 MsOS_ReadMemory();
1772 if(pShareMem->u32FrameBufAddr==0)
1773 {
1774 MJPEG_DEBUG_DRV_MSG("[%td]ms, free ok\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1775 bRet = TRUE;
1776 break;
1777 }
1778 }
1779 return bRet;
1780 }
1781
1782 #if defined(MSOS_TYPE_LINUX) && defined(SUPPORT_CMA)
MDrv_MJPEG_GetCMAInformation(MS_U32 u32Id,MS_PHY * u32Addr,MS_U32 * u32Size,MS_BOOL * bAllocDone)1783 void MDrv_MJPEG_GetCMAInformation(MS_U32 u32Id, MS_PHY* u32Addr,MS_U32* u32Size,MS_BOOL* bAllocDone)
1784 {
1785 volatile HVD_ShareMem *pShareMem = NULL;
1786 pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1787 *u32Addr = pShareMem->u32FrameBufAddr;
1788 *u32Size = pShareMem->u32FrameBufSize;
1789 *bAllocDone = pShareMem->bCMA_AllocDone;
1790
1791 MsOS_ReadMemory();
1792 MsOS_FlushMemory();
1793 }
1794 #endif
1795 #endif
1796 #endif
1797
1798