xref: /utopia/UTPA2-700.0.x/modules/vdec_lite/drv/mjpeg_lite/drvMJPEG_EX.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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