xref: /utopia/UTPA2-700.0.x/modules/vdec_v3/drv/mjpeg_v3/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))
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 #if (defined CONFIG_MLOG)
126 #include "ULog.h"
127 #endif
128 
129 //-------------------------------------------------------------------------------------------------
130 //  Driver Compiler Options
131 //-------------------------------------------------------------------------------------------------
132 #ifndef CONFIG_MLOG
133 #ifdef MSOS_TYPE_LINUX_KERNEL
134 #undef printf
135 #define printf(format, args...)          printk(format, ##args);
136 #endif
137 #endif
138 
139 //-------------------------------------------------------------------------------------------------
140 //  Local Defines
141 //-------------------------------------------------------------------------------------------------
142 //MJPEG driver debug macro
143 #if (defined CONFIG_MLOG)
144 #define MJPEG_DEBUG_DRV_MSG(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) ULOGI("MJPEG", format, ##args);}while(0)
145 #define MJPEG_DEBUG_DRV_ERR(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) ULOGE("MJPEG", format, ##args);}while(0)
146 
147 #else
148 #ifndef ANDROID
149 #define MJPEG_DEBUG_DRV_MSG(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) printf(format, ##args);}while(0)
150 #define MJPEG_DEBUG_DRV_ERR(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) printf(format, ##args);}while(0)
151 #else
152 #define LOG_TAG "DRV_JPD"
153 #include <cutils/log.h>
154 #ifndef LOGD
155 #define MJPEG_DEBUG_DRV_MSG(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) ALOGI(format, ##args);}while(0)
156 #define MJPEG_DEBUG_DRV_ERR(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) ALOGE(format, ##args);}while(0)
157 #else
158 #define MJPEG_DEBUG_DRV_MSG(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_MSG) LOGI(format, ##args);}while(0)
159 #define MJPEG_DEBUG_DRV_ERR(format, args...)  do{if(u8MJPEG_DrvDbgLevel & E_MJPEG_DEBUG_DRV_ERR) LOGE(format, ##args);}while(0)
160 #endif
161 
162 #endif
163 #endif
164 
165 #ifndef UNUSED
166 #define UNUSED(x) ((x)=(x))
167 #endif
168 
169 #define HVD_FW_MEM_OFFSET           0x100000UL  // 1M
170 #define MJPEG_U32_MAX               0xFFFFFFFFUL
171 #define MJPEG_GENERAL_MAX           ((size_t)(-1))
172 
173 
174 static MS_U8 u8MJPEG_DrvDbgLevel = E_MJPEG_DEBUG_DRV_NONE;
175 
176 //static MS_VIRT __u32FwAddr = MJPEG_U32_MAX;
177 
178 static MS_BOOL bDisplayOutSideMode[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
179 static MS_VIRT u32FrameBuffStAddr[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
180 static MS_U32 u32FrameBuffTotalSize[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
181 static MS_U32 u32FrameBuffUnitSize[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
182 static MS_U32 u32FrameBuffTotalNum[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
183 static MS_U16 u16Width[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
184 static MS_U16 u16Height[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
185 static MS_U16 u16Pitch[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
186 static MS_U32 u32FrameCnt[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
187 static MS_U32 u32FrameRate[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
188 static MS_U32 u32FrameRateBase[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
189 static MS_U32 u32FrameTime[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
190 
191 typedef struct
192 {
193     MS_PHY __u32FwAddr;
194 } MJPEG_EX_CTX;
195 
196 MJPEG_EX_CTX* pMJPEGContext = NULL;
197 MJPEG_EX_CTX gMJPEGContext;
198 
_MJPEG_Context_Init(void)199 static void _MJPEG_Context_Init(void)
200 {
201     pMJPEGContext->__u32FwAddr = MJPEG_U32_MAX;
202 }
203 
MDrv_MJPEG_Init_Share_Mem(void)204 MS_BOOL MDrv_MJPEG_Init_Share_Mem(void)
205 {
206 #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL) || defined(MSOS_TYPE_ECOS)
207     MS_U32 u32ShmId;
208     MS_VIRT u32Addr;
209     MS_U32 u32BufSize;
210 
211     if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux MJPEG driver",
212                                           sizeof(MJPEG_EX_CTX),
213                                           &u32ShmId,
214                                           &u32Addr,
215                                           &u32BufSize,
216                                           MSOS_SHM_QUERY))
217     {
218         if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux MJPEG driver",
219                                              sizeof(MJPEG_EX_CTX),
220                                              &u32ShmId,
221                                              &u32Addr,
222                                              &u32BufSize,
223                                              MSOS_SHM_CREATE))
224         {
225             if(pMJPEGContext == NULL)
226             {
227                 pMJPEGContext = &gMJPEGContext;
228                 memset(pMJPEGContext,0,sizeof(MJPEG_EX_CTX));
229                 _MJPEG_Context_Init();
230             }
231             else
232             {
233                 MJPEG_DEBUG_DRV_MSG("[%s]Global structure exists!!!\n",__FUNCTION__);
234             }
235             //return FALSE;
236         }
237         else
238         {
239             memset((MS_U8*)u32Addr, 0, sizeof(MJPEG_EX_CTX));
240             pMJPEGContext = (MJPEG_EX_CTX*)u32Addr; // for one process
241             _MJPEG_Context_Init();
242         }
243     }
244     else
245     {
246         pMJPEGContext = (MJPEG_EX_CTX*)u32Addr; // for another process
247     }
248 
249 
250 #else
251     if(pMJPEGContext == NULL)
252     {
253         pMJPEGContext = &gMJPEGContext;
254         memset(pMJPEGContext,0,sizeof(MJPEG_EX_CTX));
255         _MJPEG_Context_Init();
256     }
257 #endif
258 
259     return TRUE;
260 }
261 
MDrv_MJPEG_SetFrameBuffStAddr(MS_U8 u8DrvId,MS_VIRT u32Value)262 void MDrv_MJPEG_SetFrameBuffStAddr(MS_U8 u8DrvId, MS_VIRT u32Value)
263 {
264     u32FrameBuffStAddr[u8DrvId] = u32Value;
265 }
MDrv_MJPEG_GetFrameBuffStAddr(MS_U8 u8DrvId)266 MS_VIRT MDrv_MJPEG_GetFrameBuffStAddr(MS_U8 u8DrvId)
267 {
268     return u32FrameBuffStAddr[u8DrvId];
269 }
270 
MDrv_MJPEG_SetFrameBuffTotalSize(MS_U8 u8DrvId,MS_U32 u32Value)271 void MDrv_MJPEG_SetFrameBuffTotalSize(MS_U8 u8DrvId, MS_U32 u32Value)
272 {
273     u32FrameBuffTotalSize[u8DrvId] = u32Value;
274 }
MDrv_MJPEG_GetFrameBuffTotalSize(MS_U8 u8DrvId)275 MS_U32 MDrv_MJPEG_GetFrameBuffTotalSize(MS_U8 u8DrvId)
276 {
277     return u32FrameBuffTotalSize[u8DrvId];
278 }
279 
MDrv_MJPEG_SetFrameBuffUnitSize(MS_U8 u8DrvId,MS_U32 u32Value)280 void MDrv_MJPEG_SetFrameBuffUnitSize(MS_U8 u8DrvId, MS_U32 u32Value)
281 {
282     u32FrameBuffUnitSize[u8DrvId] = u32Value;
283 }
MDrv_MJPEG_GetFrameBuffUnitSize(MS_U8 u8DrvId)284 MS_U32 MDrv_MJPEG_GetFrameBuffUnitSize(MS_U8 u8DrvId)
285 {
286     return u32FrameBuffUnitSize[u8DrvId];
287 }
288 
MDrv_MJPEG_SetFrameBuffTotalNum(MS_U8 u8DrvId,MS_U32 u32Value)289 void MDrv_MJPEG_SetFrameBuffTotalNum(MS_U8 u8DrvId, MS_U32 u32Value)
290 {
291     u32FrameBuffTotalNum[u8DrvId] = u32Value;
292 }
MDrv_MJPEG_GetFrameBuffTotalNum(MS_U8 u8DrvId)293 MS_U32 MDrv_MJPEG_GetFrameBuffTotalNum(MS_U8 u8DrvId)
294 {
295     return u32FrameBuffTotalNum[u8DrvId];
296 }
297 
MDrv_MJPEG_SetWidth(MS_U8 u8DrvId,MS_U16 u16Value)298 void MDrv_MJPEG_SetWidth(MS_U8 u8DrvId, MS_U16 u16Value)
299 {
300     u16Width[u8DrvId] = u16Value;
301 }
MDrv_MJPEG_GetWidth(MS_U8 u8DrvId)302 MS_U16 MDrv_MJPEG_GetWidth(MS_U8 u8DrvId)
303 {
304     return u16Width[u8DrvId];
305 }
306 
MDrv_MJPEG_SetHeight(MS_U8 u8DrvId,MS_U16 u16Value)307 void MDrv_MJPEG_SetHeight(MS_U8 u8DrvId, MS_U16 u16Value)
308 {
309     u16Height[u8DrvId] = u16Value;
310 }
MDrv_MJPEG_GetHeight(MS_U8 u8DrvId)311 MS_U16 MDrv_MJPEG_GetHeight(MS_U8 u8DrvId)
312 {
313     return u16Height[u8DrvId];
314 }
315 
MDrv_MJPEG_SetPitch(MS_U8 u8DrvId,MS_U16 u16Value)316 void MDrv_MJPEG_SetPitch(MS_U8 u8DrvId, MS_U16 u16Value)
317 {
318     u16Pitch[u8DrvId] = u16Value;
319 }
MDrv_MJPEG_GetPitch(MS_U8 u8DrvId)320 MS_U16 MDrv_MJPEG_GetPitch(MS_U8 u8DrvId)
321 {
322     return u16Pitch[u8DrvId];
323 }
324 
MDrv_MJPEG_SetFrameCnt(MS_U8 u8DrvId,MS_U32 u32Value)325 void MDrv_MJPEG_SetFrameCnt(MS_U8 u8DrvId, MS_U32 u32Value)
326 {
327     u32FrameCnt[u8DrvId] = u32Value;
328 }
MDrv_MJPEG_GetFrameCnt(MS_U8 u8DrvId)329 MS_U32 MDrv_MJPEG_GetFrameCnt(MS_U8 u8DrvId)
330 {
331     return u32FrameCnt[u8DrvId];
332 }
333 
MDrv_MJPEG_SetFrameRate(MS_U8 u8DrvId,MS_U32 u32Value)334 void MDrv_MJPEG_SetFrameRate(MS_U8 u8DrvId, MS_U32 u32Value)
335 {
336     u32FrameRate[u8DrvId] = u32Value;
337 }
MDrv_MJPEG_GetFrameRate(MS_U8 u8DrvId)338 MS_U32 MDrv_MJPEG_GetFrameRate(MS_U8 u8DrvId)
339 {
340     return u32FrameRate[u8DrvId];
341 }
342 
MDrv_MJPEG_SetFrameRateBase(MS_U8 u8DrvId,MS_U32 u32Value)343 void MDrv_MJPEG_SetFrameRateBase(MS_U8 u8DrvId, MS_U32 u32Value)
344 {
345     u32FrameRateBase[u8DrvId] = u32Value;
346 }
MDrv_MJPEG_GetFrameRateBase(MS_U8 u8DrvId)347 MS_U32 MDrv_MJPEG_GetFrameRateBase(MS_U8 u8DrvId)
348 {
349     return u32FrameRateBase[u8DrvId];
350 }
351 
MDrv_MJPEG_SetFrameTime(MS_U8 u8DrvId,MS_U32 u32Value)352 void MDrv_MJPEG_SetFrameTime(MS_U8 u8DrvId, MS_U32 u32Value)
353 {
354     u32FrameTime[u8DrvId] = u32Value;
355 }
MDrv_MJPEG_GetFrameTime(MS_U8 u8DrvId)356 MS_U32 MDrv_MJPEG_GetFrameTime(MS_U8 u8DrvId)
357 {
358     return u32FrameTime[u8DrvId];
359 }
360 
361 /********************************************************************/
362 ///Set MJPEG Debug level
363 ///@para MS_U8 u8DbgLevel \b IN The MJPEG debug level
364 ///@return none
365 /********************************************************************/
MDrv_MJPEG_SetDbgLevel(MS_U8 u8DbgLevel)366 void MDrv_MJPEG_SetDbgLevel(MS_U8 u8DbgLevel)
367 {
368     u8MJPEG_DrvDbgLevel = u8DbgLevel;
369 }
370 
371 /* =============================== MJPEG =====================================*/
372 
MDrv_MJPEG_GetDrvId(MS_U32 u32Id)373 MS_U8 MDrv_MJPEG_GetDrvId(MS_U32 u32Id)
374 {
375     return (0xFF & (u32Id >> 16));
376 }
377 /******************************************************************************/
378 /// Stop VPU
379 /******************************************************************************/
MDrv_MJPEG_StopVPU(void)380 void MDrv_MJPEG_StopVPU(void)
381 {
382     VirtualHal_MJPEG_StopVPU();
383 }
384 
385 
386 /******************************************************************************/
387 /// Release VPU
388 /******************************************************************************/
MDrv_MJPEG_ReleaseVPU(void)389 void MDrv_MJPEG_ReleaseVPU(void)
390 {
391     VirtualHal_MJPEG_ReleaseVPU();
392 }
393 
394 /******************************************************************************/
395 ///Check if MJPEG firmware ready or not
396 ///@return TRUE or FALSE
397 /******************************************************************************/
MDrv_MJPEG_IsFirmwareReady(void)398 MS_BOOL MDrv_MJPEG_IsFirmwareReady(void)
399 {
400     MS_U32 u32FirmVer = 0, u32Timeout = 50000;
401 
402     // read VPU_RISC_MBOX0 to get firmware version
403     while(u32Timeout)
404     {
405         if(VirtualHal_MJPEG_IsVPUMBoxReady(VPU_RISC_MBOX0))
406         {
407             VirtualHal_MJPEG_ReadVPUMBox(VPU_RISC_MBOX0, (MS_U32 *)&u32FirmVer);
408             VirtualHal_MJPEG_ClearVPUMBox(VPU_RISC_MBOX0);
409             break;
410         }
411         u32Timeout--;
412     }
413     if(u32Timeout > 0)
414     {
415         MJPEG_DEBUG_DRV_MSG("MJPEG firmware version 0x%tx\n", (ptrdiff_t)u32FirmVer);
416     }
417     else
418     {
419         MJPEG_DEBUG_DRV_ERR("Cannot get MJPEG firmware version !! \n");
420         return FALSE;
421     }
422 
423     return TRUE;
424 }
425 
426 /******************************************************************************/
427 ///Set VPU Command
428 ///@return TRUE or FALSE
429 ///@param u8Cmd \b IN: VPU Command
430 ///     - MJPEG_CMD_SET_FRAME_BUFF_ADDR, Set frame buffer address
431 ///     - MJPEG_CMD_SET_FRAME_BUFF_SIZE, Set frame buffer size
432 /******************************************************************************/
MDrv_MJPEG_SetVPUCmd(MS_U32 u32Id,MS_U32 u32Cmd)433 static MS_BOOL MDrv_MJPEG_SetVPUCmd(MS_U32 u32Id, MS_U32 u32Cmd)
434 {
435     //currently we only use VPU_HI_MBOX0 to send command.
436     //MS_U32 u32TimeOut = MsOS_GetSystemTime() + _u32FrameTime;
437     MS_U32 u32TimeOut = 200000;
438     MS_BOOL bResult = FALSE;
439 
440     MJPEG_DEBUG_DRV_MSG("Send CMD 0x%tx to MJPEG firmware\n", (ptrdiff_t)u32Cmd);
441     //while(MsOS_GetSystemTime() < u32TimeOut)
442     while(u32TimeOut)
443     {
444         if(VirtualHal_MJPEG_IsVPUMBoxReady(VPU_HI_MBOX0))
445         {
446             bResult = VirtualHal_MJPEG_SendVPUMBox(u32Id, VPU_HI_MBOX0, u32Cmd);
447             break;
448         }
449         u32TimeOut--;
450     }
451     if(u32TimeOut <= 0)
452     {
453         MJPEG_DEBUG_DRV_ERR("MJPEG send command timeout !!....pc=0x%tx \n", (ptrdiff_t)HAL_VPU_EX_GetProgCnt());
454         bResult = FALSE;
455     }
456 
457     return bResult;
458 }
459 
460 /******************************************************************************/
461 ///Set VPU command argument
462 ///@return TRUE or FALSE
463 ///@param u32Arg \b IN: VPU command argument
464 /******************************************************************************/
MDrv_MJPEG_SetVPUCmdArg(MS_U32 u32Arg)465 static MS_BOOL MDrv_MJPEG_SetVPUCmdArg(MS_U32 u32Arg)
466 {
467     // we use VPU_HI_MBOX1 to send command argument
468     //U16 u16TimeOut = 0xFFFF;
469     MS_U32 u32TimeOut = 200000;
470     MS_BOOL bResult = FALSE;
471 
472     MJPEG_DEBUG_DRV_MSG("Send argument 0x%tx to VPU \n", (ptrdiff_t)u32Arg);
473     while(--u32TimeOut)
474     {
475         if( VirtualHal_MJPEG_IsVPUMBoxReady(VPU_HI_MBOX0)&& VirtualHal_MJPEG_IsVPUMBoxReady(VPU_HI_MBOX1))
476         {
477             // the argument to be sent doesn't need to add task information in prefix
478             bResult = VirtualHal_MJPEG_SendVPUMBox(0, VPU_HI_MBOX1, u32Arg);
479             break;
480         }
481     }
482     if(u32TimeOut <= 0)
483     {
484         MJPEG_DEBUG_DRV_ERR("MJPEG send command argument timeout !! \n");
485         bResult = FALSE;
486     }
487 
488     return bResult;
489 }
490 
491 
492 /******************************************************************************/
493 ///Set VPU command argument
494 ///@return TRUE or FALSE
495 ///@param u32Arg \b IN: VPU command argument
496 /******************************************************************************/
MDrv_MJPEG_SendVPUCommand(MS_U32 u32Id,MJPEG_User_Cmd eCmd,MS_VIRT u32Arg)497 MS_U32 MDrv_MJPEG_SendVPUCommand(MS_U32 u32Id, MJPEG_User_Cmd eCmd, MS_VIRT u32Arg)
498 {
499     MS_U32 u32Ret = 0;
500 
501     MS_U32 idx = 0;
502     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
503 
504     if (bDisplayOutSideMode[u8DrvId])
505     {
506         volatile HVD_ShareMem *pShareMem = NULL;
507         MsOS_ReadMemory();
508         pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
509         if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
510         {
511             MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!![%d]\n", __LINE__);
512             return MJPEG_U32_MAX;
513         }
514 
515         switch (eCmd)
516         {
517         case E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR:
518             u32FrameBuffStAddr[u8DrvId] = u32Arg;
519             pShareMem->DispQueue[0].u32LumaAddr = u32FrameBuffStAddr[u8DrvId];
520             pShareMem->DispQueue[0].u32Status = E_HVD_DISPQ_STATUS_FREE;
521             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,
522                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
523                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
524             MsOS_FlushMemory();
525             break;
526 
527         case E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE:
528             u32FrameBuffUnitSize[u8DrvId] = u32Arg;
529             break;
530 
531         case E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM:
532             if (u32FrameBuffTotalNum[u8DrvId] > HVD_DISP_QUEUE_MAX_SIZE)
533                 u32FrameBuffTotalNum[u8DrvId] = HVD_DISP_QUEUE_MAX_SIZE;
534             else
535                 u32FrameBuffTotalNum[u8DrvId] = u32Arg;
536 
537             pShareMem->u16DispQSize = u32FrameBuffTotalNum[u8DrvId];
538 
539             for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]-1; idx++)
540             {
541                 if (u32FrameBuffUnitSize[u8DrvId] != 0)
542                 {
543                     pShareMem->DispQueue[idx+1].u32LumaAddr = pShareMem->DispQueue[idx].u32LumaAddr + u32FrameBuffUnitSize[u8DrvId];
544                     pShareMem->DispQueue[idx+1].u32Status = E_HVD_DISPQ_STATUS_FREE;
545                 }
546             }
547             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,
548                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
549                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
550             MsOS_FlushMemory();
551             break;
552 
553         case E_MJPEG_CMD_PUSH_QUEUE_PARA_SETTING:
554 
555             pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32Status = E_HVD_DISPQ_STATUS_NONE;
556             pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32TimeStamp =  pShareMem->u32MJPEGTimeStamp;
557             pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32ID_L = pShareMem->u32MJPEGID_L;
558             pShareMem->DispQueue[pShareMem->u32MJPEGFrameBuffIdx].u32ID_H = pShareMem->u32MJPEGID_H;
559             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,
560                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
561                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
562             MsOS_FlushMemory();
563             break;
564 
565         case E_MJPEG_CMD_SET_DISPLAY_OUTSIDE_MODE:
566 
567             if(u32Arg==0)
568             {
569                 bDisplayOutSideMode[u8DrvId] = FALSE;
570             }
571             MDrv_MJPEG_SetVPUCmdArg(u32Arg);
572             MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_DISPLAY_OUTSIDE_MODE);
573             break;
574 
575         case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY:
576             if (u32Arg < u32FrameBuffTotalNum[u8DrvId])
577             {
578                 u32FrameCnt[u8DrvId]++;
579                 pShareMem->DispQueue[u32Arg].u32Status = E_HVD_DISPQ_STATUS_INIT;
580                 pShareMem->DispQueue[u32Arg].u32ChromaAddr = pShareMem->DispQueue[u32Arg].u32LumaAddr;
581                 pShareMem->DispQueue[u32Arg].u16Width = u16Width[u8DrvId];
582                 pShareMem->DispQueue[u32Arg].u16Height = u16Height[u8DrvId];
583                 pShareMem->DispQueue[u32Arg].u16Pitch = u16Pitch[u8DrvId];
584                 pShareMem->DispQueue[u32Arg].u32PrivateData = u32FrameCnt[u8DrvId];
585 
586                 for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
587                 {
588                     if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE)
589                     {
590                         pShareMem->u32MJPEG_NextFrameBuffIdx = idx;
591                         break;
592                     }
593                     else
594                     {
595                         pShareMem->u32MJPEG_NextFrameBuffIdx = 0xFFFF;
596                     }
597                 }
598             }
599             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,
600                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
601                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
602             MsOS_FlushMemory();
603             break;
604 
605         case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID:
606             if (u32Arg < u32FrameBuffTotalNum[u8DrvId])
607             {
608                 pShareMem->DispQueue[u32Arg].u32Status = E_HVD_DISPQ_STATUS_FREE;
609                 MsOS_FlushMemory();
610             }
611             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,
612                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
613                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
614             break;
615 
616         case E_MJPEG_CMD_FLUSH_DISP_QUEUE:
617 
618             for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
619             {
620                 if (pShareMem->DispQueue[idx].u32Status != E_HVD_DISPQ_STATUS_VIEW)
621                 {
622                     pShareMem->DispQueue[idx].u32Status = E_HVD_DISPQ_STATUS_FREE;
623                     pShareMem->DispQueue[idx].u32TimeStamp = 0;
624                     pShareMem->DispQueue[idx].u32ID_L = 0xFFFFFFFF;
625                     pShareMem->DispQueue[idx].u32ID_H = 0xFFFFFFFF;
626                 }
627             }
628             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,
629                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
630                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
631 
632             pShareMem->u8MJPEG_bFlushQueue = 0;
633             u32Ret = 2;
634             MsOS_FlushMemory();
635             break;
636 
637         case E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL:
638             for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
639             {
640                 if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE)
641                 {
642                     return 0;
643                 }
644             }
645             MJPEG_DEBUG_DRV_MSG("Display Q is full[%d]\n", __LINE__);
646             // return full
647             return 1;
648             break;
649 
650         case E_MJPEG_CMD_SET_WIDTH:
651             u16Width[u8DrvId] = (MS_U16)u32Arg;
652             break;
653 
654         case E_MJPEG_CMD_SET_HEIGHT:
655             u16Height[u8DrvId] = (MS_U16)u32Arg;
656             break;
657 
658         case E_MJPEG_CMD_SET_PITCH:
659             u16Pitch[u8DrvId] = (MS_U16)u32Arg;
660             break;
661 
662         case E_MJPEG_CMD_IS_DISP_FINISH:
663             u32Ret = TRUE;
664             break;
665 
666 
667 #ifdef VDEC3
668         case E_MJPEG_CMD_FREE_FRAME_BUFFER:
669             MDrv_MJPEG_SetVPUCmdArg(0);
670             MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREE_FRAME_BUFFER);
671             u32Ret = (MS_U32) MDrv_MJPEG_IsFreeFinish(u32Id);
672             break;
673 #endif
674         case E_MJPEG_CMD_DYNAMIC_CONNECT_DISP_PATH:
675             MDrv_MJPEG_SetVPUCmdArg(u32Arg);
676             MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_DYNAMIC_CONNECT_DISP_PATH);
677             break;
678 
679         case E_MJPEG_CMD_GO:
680         case E_MJPEG_CMD_SET_FRAMERATE:
681         case E_MJPEG_CMD_SET_FRAMERATE_BASE:
682         case E_MJPEG_CMD_PLAY:
683         case E_MJPEG_CMD_PAUSE:
684         case E_MJPEG_CMD_RESUME:
685         case E_MJPEG_CMD_STEP_PLAY:
686         case E_MJPEG_CMD_SET_SPEED_TYPE:
687         case E_MJPEG_CMD_SET_SPEED:
688         case E_MJPEG_CMD_FREEZE_DISP:
689         case E_MJPEG_CMD_ENABLE_AVSYNC:
690         case E_MJPEG_CMD_SET_AVSYNC_DELAY:
691         case E_MJPEG_CMD_SET_AVSYNC_TOLERENCE:
692         case E_MJPEG_CMD_SET_PTS_BASE:
693         case E_MJPEG_CMD_SET_STC_BASE:
694         case E_MJPEG_CMD_SET_BLUE_SCREEN:
695         case E_MJPEG_CMD_COMPENSATE_PTS:
696         case E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE:
697             MJPEG_DEBUG_DRV_MSG(" Unused MJPEG Command[0x%x] in display outside mode\n", eCmd);
698             u32Ret = 0xFFFFFFFF;
699             break;
700 
701         default:
702             MJPEG_DEBUG_DRV_MSG("    !!! Unknown MJPEG Command[0x%x] !!!\n", eCmd);
703             u32Ret = 0xFFFFFFFF;
704             break;
705         }
706 
707         return u32Ret;
708     }
709 
710     switch (eCmd)
711     {
712     case E_MJPEG_CMD_SET_FRAME_BUFF_START_ADDR:
713         u32FrameBuffStAddr[u8DrvId] = u32Arg;
714         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
715         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_START_ADDR);
716         break;
717 
718     case E_MJPEG_CMD_SET_FRAME_BUFF_UNIT_SIZE:
719         u32FrameBuffUnitSize[u8DrvId] = u32Arg;
720         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
721         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_UNIT_SIZE);
722         break;
723 
724     case E_MJPEG_CMD_SET_FRAME_BUFF_TOTAL_NUM:
725         if (u32FrameBuffTotalNum[u8DrvId] > HVD_DISP_QUEUE_MAX_SIZE)
726             u32FrameBuffTotalNum[u8DrvId] = HVD_DISP_QUEUE_MAX_SIZE;
727         else
728             u32FrameBuffTotalNum[u8DrvId] = u32Arg;
729         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
730         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM);
731         break;
732 
733     case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_READY:
734         u32FrameCnt[u8DrvId]++;
735         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
736         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_IDX_READY);
737         break;
738 
739     case E_MJPEG_CMD_SET_WIDTH:
740         u16Width[u8DrvId] = (MS_U16)u32Arg;
741         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
742         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_WIDTH);
743         break;
744 
745     case E_MJPEG_CMD_SET_HEIGHT:
746         u16Height[u8DrvId] = (MS_U16)u32Arg;
747         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
748         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_HEIGHT);
749         break;
750 
751     case E_MJPEG_CMD_SET_PITCH:
752         u16Pitch[u8DrvId] = (MS_U16)u32Arg;
753         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
754         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_PITCH);
755         break;
756 
757     case E_MJPEG_CMD_SET_FRAMERATE:
758         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
759         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAMERATE);
760         break;
761 
762     case E_MJPEG_CMD_SET_FRAMERATE_BASE:
763         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
764         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAMERATE_BASE);
765         break;
766 
767     case E_MJPEG_CMD_SET_FRAME_BUFF_IDX_VALID:
768         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
769         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_IDX_VALID);
770         break;
771 
772     case E_MJPEG_CMD_PLAY:
773         MDrv_MJPEG_SetVPUCmdArg(0);
774         u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PLAY);
775         break;
776 
777     case E_MJPEG_CMD_PAUSE:
778         MDrv_MJPEG_SetVPUCmdArg(0);
779         u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PAUSE);
780         break;
781 
782     case E_MJPEG_CMD_RESUME:
783         MDrv_MJPEG_SetVPUCmdArg(0);
784         u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_RESUME);
785         break;
786 
787     case E_MJPEG_CMD_STEP_PLAY:
788         MDrv_MJPEG_SetVPUCmdArg(0);
789         u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_STEP_PLAY);
790         break;
791 
792     case E_MJPEG_CMD_SET_SPEED_TYPE:
793         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
794         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_SPEED_TYPE);
795         break;
796 
797     case E_MJPEG_CMD_SET_SPEED:
798         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
799         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_SPEED);
800         break;
801 
802     case E_MJPEG_CMD_FLUSH_DISP_QUEUE:
803         MDrv_MJPEG_SetVPUCmdArg(0);
804         u32Ret = (MS_U32)MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FLUSH_DISP_QUEUE);
805         break;
806 
807     case E_MJPEG_CMD_FREEZE_DISP:
808         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
809         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREEZE_DISP);
810         break;
811 
812     case E_MJPEG_CMD_ENABLE_AVSYNC:
813         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
814         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_AVSYNC);
815         break;
816 
817     case E_MJPEG_CMD_SET_AVSYNC_DELAY:
818         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
819         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_AVSYNC_DELAY);
820         break;
821 
822     case E_MJPEG_CMD_SET_AVSYNC_TOLERENCE:
823         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
824         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_AVSYNC_TOLERENCE);
825         break;
826 
827     case E_MJPEG_CMD_SET_PTS_BASE:
828         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
829         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_PTS_BASE);
830         break;
831 
832     case E_MJPEG_CMD_SET_STC_BASE:
833         MDrv_MJPEG_SetVPUCmdArg(0);
834         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_STC_BASE);
835         break;
836 
837     case E_MJPEG_CMD_SET_BLUE_SCREEN:
838         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
839         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_BLUE_SCREEN);
840         break;
841 
842     case E_MJPEG_CMD_PUSH_QUEUE_PARA_SETTING:
843         MDrv_MJPEG_SetVPUCmdArg(0);
844         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_PUSH_QUEUE_PARA_SETTING);
845         break;
846 
847     case E_MJPEG_CMD_SET_DISPLAY_OUTSIDE_MODE:
848 
849         if(u32Arg)
850         {
851             bDisplayOutSideMode[u8DrvId] = TRUE;
852         }
853         if (bDisplayOutSideMode[u8DrvId])
854         {
855             // set E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM to 0 previent F/W write share mem
856             MDrv_MJPEG_SetVPUCmdArg(0);
857             MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_FRAME_BUFF_TOTAL_NUM);
858             MDrv_MJPEG_SetVPUCmdArg(0);
859             MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_DISP_CMD_QUEUE);
860 
861             MsOS_DelayTaskUs(10* 1000);
862             u32FrameCnt[u8DrvId] = 0;
863 
864             volatile HVD_ShareMem *pShareMem = NULL;
865             MsOS_ReadMemory();
866             pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
867             if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
868             {
869                 MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!![%d]\n", __LINE__);
870                 return MJPEG_U32_MAX;
871             }
872 
873             pShareMem->DispQueue[0].u32LumaAddr = u32FrameBuffStAddr[u8DrvId];
874             pShareMem->DispQueue[0].u32Status = E_HVD_DISPQ_STATUS_FREE;
875             pShareMem->u16DispQSize = u32FrameBuffTotalNum[u8DrvId];
876 
877             for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]-1; idx++)
878             {
879                 if (u32FrameBuffUnitSize[u8DrvId] != 0)
880                 {
881                     pShareMem->DispQueue[idx+1].u32LumaAddr = pShareMem->DispQueue[idx].u32LumaAddr + u32FrameBuffUnitSize[u8DrvId];
882                     pShareMem->DispQueue[idx+1].u32Status = E_HVD_DISPQ_STATUS_FREE;
883                 }
884             }
885             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,
886                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
887                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
888 
889             for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
890             {
891                 MJPEG_DEBUG_DRV_MSG("pShareMem->DispQueue[idx].u32Status : 0x%tX  %td\n", (ptrdiff_t)pShareMem->DispQueue[idx].u32Status, (ptrdiff_t)idx);
892             }
893             MsOS_FlushMemory();
894         }
895         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
896         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_SET_DISPLAY_OUTSIDE_MODE);
897         break;
898 
899     case E_MJPEG_CMD_COMPENSATE_PTS:
900         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
901         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_COMPENSATE_PTS);
902         break;
903 
904     // Display Command Queue -- BEGIN
905     case E_MJPEG_CMD_ENABLE_DISP_CMD_QUEUE:
906         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
907         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_ENABLE_DISP_CMD_QUEUE);
908         break;
909 
910     // Display Command Queue -- END
911 
912     case E_MJPEG_CMD_IS_DISP_FINISH:
913         MDrv_MJPEG_Init_IsDispFinish(u32Id);
914         MDrv_MJPEG_SetVPUCmdArg(0);
915         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_IS_DISP_FINISH);
916         u32Ret = (MS_U32) MDrv_MJPEG_IsDispFinish(u32Id);
917         break;
918 
919     case E_MJPEG_CMD_IS_DISPLAY_QUEUE_FULL:
920         MDrv_MJPEG_Init_IsQueueFull(u32Id);
921         MDrv_MJPEG_SetVPUCmdArg(0);
922         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_IS_DISPLAY_QUEUE_FULL);
923         u32Ret = (MS_U32) MDrv_MJPEG_IsQueueFull(u32Id);
924         break;
925 
926 #ifdef VDEC3
927     case E_MJPEG_CMD_GET_FRAME_BUFFER:
928         MDrv_MJPEG_Init_GetFrameBuffer(u32Id);
929         MDrv_MJPEG_SetVPUCmdArg(0);
930         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_GET_FRAME_BUFFER);
931         u32Ret = (MS_U32) MDrv_MJPEG_GetFrameBuffer(u32Id);
932         break;
933     case E_MJPEG_CMD_FREE_FRAME_BUFFER:
934         MDrv_MJPEG_SetVPUCmdArg(0);
935         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_FREE_FRAME_BUFFER);
936         u32Ret = (MS_U32) MDrv_MJPEG_IsFreeFinish(u32Id);
937         break;
938 #endif
939     case E_MJPEG_CMD_DYNAMIC_CONNECT_DISP_PATH:
940         MDrv_MJPEG_SetVPUCmdArg(u32Arg);
941         MDrv_MJPEG_SetVPUCmd(u32Id, E_JPD_CMD_DYNAMIC_CONNECT_DISP_PATH);
942         break;
943 
944     default:
945         MJPEG_DEBUG_DRV_MSG("    !!! Unknown MJPEG Command !!!\n");
946         u32Ret = 0xFFFFFFFF;
947         break;
948     }
949 
950 
951     return u32Ret;
952 }
953 
954 #if 0
955 /******************************************************************************/
956 ///
957 ///@param value \b IN
958 ///@param value \b OUT
959 ///@return status
960 /******************************************************************************/
961 MS_BOOL MDrv_MJPEG_IsVPUOnMiu1(void)
962 {
963     return VirtualHal_MJPEG_IsVPUOnMiu1();
964 }
965 
966 /******************************************************************************/
967 ///
968 ///@param value \b IN
969 ///@param value \b OUT
970 ///@return status
971 /******************************************************************************/
972 MS_U32 MDrv_MJPEG_GetMiuBase(void)
973 {
974     return VirtualHal_MJPEG_GetMiuBase();
975 }
976 #endif
977 
978 /******************************************************************************/
979 ///Get ShareMemory address
980 ///@param u32Value \b IN new PTS value
981 /******************************************************************************/
MDrv_MJPEG_GetShareMemAddr(MS_U32 u32Id)982 MS_VIRT MDrv_MJPEG_GetShareMemAddr(MS_U32 u32Id)
983 {
984     MS_VIRT u32ShareMemAddr = MJPEG_U32_MAX;
985 
986     if (pMJPEGContext->__u32FwAddr != MJPEG_U32_MAX)
987         u32ShareMemAddr = pMJPEGContext->__u32FwAddr +(HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET) + HVD_SHARE_MEM_ST_OFFSET;
988     else
989         return MJPEG_U32_MAX;
990 
991     u32ShareMemAddr = MS_PA2KSEG1((MS_VIRT)u32ShareMemAddr); //PhysicalAddr to VirtualAddr
992 
993     return u32ShareMemAddr;
994 }
995 
996 /******************************************************************************/
997 ///Description
998 ///@param in \b IN in parameter
999 ///@param out \b OUT out parameter
1000 ///@return status
1001 /******************************************************************************/
MDrv_MJPEG_ClearShareMemory(MS_U32 u32Id)1002 void MDrv_MJPEG_ClearShareMemory(MS_U32 u32Id)
1003 {
1004     MS_U32 u32Idx = 0, u32Size;
1005     volatile MS_U8 *u8Ptr = 0;
1006 
1007     u8Ptr = (volatile MS_U8 *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1008     if((MS_VIRT)u8Ptr==MJPEG_U32_MAX)
1009     {
1010         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1011         return;
1012     }
1013     u32Size = sizeof(HVD_ShareMem);
1014 
1015     for (u32Idx = 0; u32Idx < u32Size; u32Idx++)
1016     {
1017         *u8Ptr = 0;
1018         u8Ptr++;
1019     }
1020     return;
1021 }
1022 
1023 /******************************************************************************/
1024 ///Get PTS table address
1025 ///@param u32Value \b IN new PTS value
1026 /******************************************************************************/
MDrv_MJPEG_GetPtsTableAddr(MS_U32 u32Id)1027 MS_VIRT MDrv_MJPEG_GetPtsTableAddr(MS_U32 u32Id)
1028 {
1029     MS_VIRT u32PtsAddr = MJPEG_U32_MAX;
1030     #if defined(SUPPORT_NEW_MEM_LAYOUT)
1031     volatile HVD_ShareMem *pShareMem = NULL;
1032     MsOS_ReadMemory();
1033     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1034     MS_U32 u32HVD_PTS_TABLE_ST_OFFSET = pShareMem->u32HVD_PTS_TABLE_ST_OFFSET - HAL_VPU_EX_GetTaskId(u32Id) * HVD_FW_MEM_OFFSET;
1035     #else
1036     MS_U32 u32HVD_PTS_TABLE_ST_OFFSET = HVD_PTS_TABLE_ST_OFFSET;
1037     #endif
1038 
1039     if (pMJPEGContext->__u32FwAddr != MJPEG_U32_MAX)
1040         u32PtsAddr = pMJPEGContext->__u32FwAddr + u32HVD_PTS_TABLE_ST_OFFSET;
1041     else
1042         return MJPEG_U32_MAX;
1043 
1044     u32PtsAddr = MS_PA2KSEG1((MS_VIRT)u32PtsAddr); //PhysicalAddr to VirtualAddr
1045 
1046     return u32PtsAddr;
1047 }
1048 
1049 /******************************************************************************/
1050 ///Reset PTS value
1051 ///@param u32Value \b IN new PTS value
1052 /******************************************************************************/
MDrv_MJPEG_ResetPTS(MS_U32 u32Id,MS_U32 u32PtsBase)1053 MS_BOOL MDrv_MJPEG_ResetPTS(MS_U32 u32Id, MS_U32 u32PtsBase)
1054 {
1055 
1056     MDrv_MJPEG_SendVPUCommand(u32Id, E_MJPEG_CMD_SET_PTS_BASE, u32PtsBase);
1057 
1058     return TRUE;
1059 }
1060 
1061 /******************************************************************************/
1062 ///Return PTS of current displayed frame
1063 ///@return PTS
1064 /******************************************************************************/
MDrv_MJPEG_GetPTS(MS_U32 u32Id)1065 MS_U32 MDrv_MJPEG_GetPTS(MS_U32 u32Id)
1066 {
1067     volatile HVD_ShareMem *pShareMem = NULL;
1068     MsOS_ReadMemory();
1069 
1070     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1071     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1072     {
1073         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1074         return NULL;
1075     }
1076 
1077     return pShareMem->DispFrmInfo.u32TimeStamp;
1078 }
1079 
1080 /******************************************************************************/
1081 ///Description
1082 ///@param in \b IN in parameter
1083 ///@param out \b OUT out parameter
1084 ///@return status
1085 /******************************************************************************/
MDrv_MJPEG_DispFrame(MS_U32 u32Id,MS_U32 u32DispIdx)1086 void MDrv_MJPEG_DispFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
1087 {
1088     volatile HVD_ShareMem *pShareMem = NULL;
1089     MsOS_ReadMemory();
1090     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1091     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1092     {
1093         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1094         return;
1095     }
1096 
1097     if (pShareMem->DispQueue[u32DispIdx].u32Status == E_HVD_DISPQ_STATUS_VIEW)
1098     {
1099         pShareMem->DispQueue[u32DispIdx].u32Status = E_HVD_DISPQ_STATUS_DISP;
1100     }
1101     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,
1102         (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1103         (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1104     MsOS_FlushMemory();
1105 }
1106 
1107 /******************************************************************************/
1108 ///Description
1109 ///@param in \b IN in parameter
1110 ///@param out \b OUT out parameter
1111 ///@return status
1112 /******************************************************************************/
MDrv_MJPEG_FreeFrame(MS_U32 u32Id,MS_U32 u32DispIdx)1113 void MDrv_MJPEG_FreeFrame(MS_U32 u32Id, MS_U32 u32DispIdx)
1114 {
1115     volatile HVD_ShareMem *pShareMem = NULL;
1116     MsOS_ReadMemory();
1117     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1118     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1119     {
1120         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1121         return;
1122     }
1123 
1124     if (pShareMem->DispQueue[u32DispIdx].u32Status == E_HVD_DISPQ_STATUS_VIEW)
1125     {
1126         pShareMem->DispQueue[u32DispIdx].u32Status = E_HVD_DISPQ_STATUS_FREE;
1127     }
1128     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,
1129         (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1130         (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1131 
1132     MsOS_FlushMemory();
1133 }
1134 
1135 /******************************************************************************/
1136 ///Description
1137 ///@param in \b IN in parameter
1138 ///@param out \b OUT out parameter
1139 ///@return status
1140 /******************************************************************************/
1141 #define MJPEG_DISPQ_PREFETCH_COUNT        2
1142 
1143 static MS_U16 _u16DispQPtr[E_MJPEG_MJPEG_TOTAL] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
MDrv_MJPEG_GetNextDispFrame(MS_U32 u32Id)1144 void* MDrv_MJPEG_GetNextDispFrame(MS_U32 u32Id)
1145 {
1146     volatile HVD_ShareMem *pShareMem = NULL;
1147     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1148     MsOS_ReadMemory();
1149     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1150     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1151     {
1152         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1153         return NULL;
1154     }
1155 
1156     HVD_Frm_Information *pFrm;
1157 
1158     if (bDisplayOutSideMode[u8DrvId])
1159     {
1160         MS_U32 idx = 0;
1161         MS_S32 found = -1;
1162 
1163         for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1164         {
1165             if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_INIT)
1166             {
1167                 MJPEG_DEBUG_DRV_MSG("MDrv_MJPEG_GetNextDispFrame, pShareMem->DispQueue[%td].u32PrivateData = %td", (ptrdiff_t)idx, (ptrdiff_t)pShareMem->DispQueue[idx].u32PrivateData);
1168 
1169                 if (found >= 0)
1170                 {
1171                     // find the older one
1172                     if (pShareMem->DispQueue[idx].u32PrivateData < pShareMem->DispQueue[found].u32PrivateData)
1173                         found = idx;
1174                 }
1175                 else
1176                 {
1177                     found = idx;
1178                 }
1179             }
1180         }
1181 
1182         if (found >= 0)
1183         {
1184             pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[found]);
1185             _u16DispQPtr[u8DrvId] = found;
1186             pFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW;
1187             MsOS_FlushMemory();
1188             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,
1189                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1190                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1191             MJPEG_DEBUG_DRV_MSG("bDisplayOutSideMode-->FrameDone: %td, pFrm=0x%tx, timestamp=%td\n", (ptrdiff_t)idx, (ptrdiff_t)pFrm, (ptrdiff_t)pFrm->u32TimeStamp);
1192             return pFrm;
1193         }
1194         else
1195         {
1196             MJPEG_DEBUG_DRV_MSG("MDrv_MJPEG_GetNextDispFrame return NULL!!! [MJPEG_FB][%td %td %td %td %td %td %td %td]\n",
1197                 (ptrdiff_t)pShareMem->DispQueue[0].u32Status, (ptrdiff_t)pShareMem->DispQueue[1].u32Status,
1198                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1199                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1200             return NULL;
1201         }
1202     }
1203     else
1204     {
1205 
1206         MS_U16 u16QNum = pShareMem->u16DispQNumb;
1207         MS_U16 u16QPtr = pShareMem->u16DispQPtr;
1208 
1209 #if 0
1210         if (u16QNum > MJPEG_DISPQ_PREFETCH_COUNT) u16QNum = MJPEG_DISPQ_PREFETCH_COUNT;
1211 #endif
1212 
1213         while (u16QNum != 0)
1214         {
1215             pFrm = (HVD_Frm_Information*)(MS_VIRT)&(pShareMem->DispQueue[u16QPtr]);
1216 
1217             if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1218             {
1219                 _u16DispQPtr[u8DrvId] = u16QPtr;
1220                 pFrm->u32Status = E_HVD_DISPQ_STATUS_VIEW; /////Change its state!!
1221                 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,
1222                 (ptrdiff_t)pShareMem->DispQueue[2].u32Status, (ptrdiff_t)pShareMem->DispQueue[3].u32Status, (ptrdiff_t)pShareMem->DispQueue[4].u32Status,
1223                 (ptrdiff_t)pShareMem->DispQueue[5].u32Status, (ptrdiff_t)pShareMem->DispQueue[6].u32Status, (ptrdiff_t)pShareMem->DispQueue[7].u32Status);
1224 
1225                 MJPEG_DEBUG_DRV_MSG("FrameDone: %td, pFrm=0x%tx, timestamp=%td\n", (ptrdiff_t)u16QPtr, (ptrdiff_t)pFrm, (ptrdiff_t)pFrm->u32TimeStamp);
1226                 return pFrm;
1227             }
1228             u16QNum--;
1229             u16QPtr++;
1230             if (u16QPtr == pShareMem->u16DispQSize) u16QPtr = 0; //wrap to the begin
1231         }
1232         MsOS_FlushMemory();
1233         return NULL;
1234     }
1235 }
1236 
MDrv_MJPEG_GetDispFrameNum(MS_U32 u32Id)1237 MS_U32 MDrv_MJPEG_GetDispFrameNum(MS_U32 u32Id)
1238 {
1239     volatile HVD_ShareMem *pShareMem = NULL;
1240     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1241 
1242     MsOS_ReadMemory();
1243     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1244     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1245     {
1246         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1247         return NULL;
1248     }
1249 
1250     HVD_Frm_Information *pFrm;
1251     MS_U32 u32DispFrmNum = 0;
1252 
1253     if (bDisplayOutSideMode[u8DrvId])
1254     {
1255         MS_U32 idx = 0;
1256         for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1257         {
1258             pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[idx]);
1259 
1260             if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1261             {
1262                 u32DispFrmNum++;
1263             }
1264         }
1265         return u32DispFrmNum;
1266     }
1267     else
1268     {
1269         MS_U16 u16QNum = pShareMem->u16DispQNumb;
1270         MS_U16 u16QPtr = pShareMem->u16DispQPtr;
1271 
1272         while (u16QNum != 0)
1273         {
1274             pFrm = (HVD_Frm_Information *)(MS_VIRT)&(pShareMem->DispQueue[u16QPtr]);
1275 
1276             if (pFrm->u32Status == E_HVD_DISPQ_STATUS_INIT)
1277             {
1278                 u32DispFrmNum++;
1279             }
1280             u16QNum--;
1281             u16QPtr++;
1282             if (u16QPtr == pShareMem->u16DispQSize)
1283             {
1284                 u16QPtr = 0; //wrap to the begin
1285             }
1286         }
1287         return u32DispFrmNum;
1288     }
1289 }
1290 
1291 /******************************************************************************/
1292 ///Description
1293 ///@param in \b IN in parameter
1294 ///@param out \b OUT out parameter
1295 ///@return status
1296 /******************************************************************************/
MDrv_MJPEG_GetNextDispQPtr(MS_U32 u32Id)1297 MS_U32 MDrv_MJPEG_GetNextDispQPtr(MS_U32 u32Id)
1298 {
1299     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1300     return _u16DispQPtr[u8DrvId];
1301 }
1302 
1303 /******************************************************************************/
1304 ///Description
1305 ///@param in \b IN in parameter
1306 ///@param out \b OUT out parameter
1307 ///@return status
1308 /******************************************************************************/
MDrv_MJPEG_GetDispFrameInfo(MS_U32 u32Id,void * pInfo)1309 void MDrv_MJPEG_GetDispFrameInfo(MS_U32 u32Id, void *pInfo)
1310 {
1311     MJPEG_DRV_FrameInfo *pFrmInfo = (MJPEG_DRV_FrameInfo *)pInfo;
1312 
1313     volatile HVD_ShareMem *pShareMem = NULL;
1314     MsOS_ReadMemory();
1315     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1316     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1317     {
1318         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1319         return;
1320     }
1321 
1322     pFrmInfo->u32LumaAddr = pShareMem->DispFrmInfo.u32LumaAddr;
1323     pFrmInfo->u32ChromaAddr = pShareMem->DispFrmInfo.u32ChromaAddr;
1324     pFrmInfo->u32TimeStamp = pShareMem->DispFrmInfo.u32TimeStamp;
1325     pFrmInfo->u32ID_L = pShareMem->DispFrmInfo.u32ID_L;
1326     pFrmInfo->u32ID_H = pShareMem->DispFrmInfo.u32ID_H;
1327 }
1328 
MDrv_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)1329 void MDrv_MJPEG_EnableTurboFWMode(MS_BOOL bEnable)
1330 {
1331 //    gbEnableTurboFWMode = bEnable;
1332     HAL_VPU_EX_SetFWReload(!bEnable);
1333 }
1334 
MDrv_MJPEG_InitFw(MS_U32 u32Id,MJPEG_FW_Info FWInfo)1335 MJPEG_Return MDrv_MJPEG_InitFw(MS_U32 u32Id, MJPEG_FW_Info FWInfo)
1336 {
1337     pMJPEGContext->__u32FwAddr = FWInfo.u32Addr;
1338     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1339 
1340     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);
1341     // for wb
1342     //MDrv_MJPEG_ClearShareMemory(u32Id);
1343 
1344     bDisplayOutSideMode[MDrv_MJPEG_GetDrvId(u32Id)] = FALSE;
1345 
1346     // Set Codec Type for HVD Firmware
1347     volatile HVD_ShareMem *pHVDShareMem = NULL;
1348     pHVDShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1349     if((MS_VIRT)pHVDShareMem==MJPEG_U32_MAX)
1350     {
1351         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1352         return E_MJPEG_FAILED;
1353     }
1354     pHVDShareMem->u32CodecType = E_HVD_Codec_MJPEG;
1355     // u16ChipID is set in HAL_HVD_EX_InitShareMem()
1356     //pHVDShareMem->u16ChipID = E_MSTAR_CHIP_J2;
1357     MsOS_FlushMemory();
1358 
1359     // Create Task
1360     VPU_EX_FWCodeCfg       stVpuFWCfg;
1361     VPU_EX_TaskInfo        stTaskInfo;
1362     VPU_EX_VLCTblCfg       stVlcCfg;
1363 #ifdef VDEC3
1364     VPU_EX_FBCfg       stFBCfg;
1365 #endif
1366     VPU_EX_NDecInitPara    stVpuInitPara;
1367 
1368     memset(&stVpuFWCfg,     0, sizeof(VPU_EX_FWCodeCfg));
1369     memset(&stTaskInfo,     0, sizeof(VPU_EX_TaskInfo));
1370     memset(&stVlcCfg,       0, sizeof(VPU_EX_VLCTblCfg));
1371 #ifdef VDEC3
1372     memset(&stFBCfg,       0, sizeof(VPU_EX_FBCfg));
1373 #endif
1374     memset(&stVpuInitPara,  0, sizeof(VPU_EX_NDecInitPara));
1375 
1376     stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1377     stVpuInitPara.pTaskInfo = &stTaskInfo;
1378 #ifdef VDEC3
1379     stVpuInitPara.pFBCfg = &stFBCfg;
1380     MJPEG_DEBUG_DRV_MSG("[MJPEG] FWInfo.u32MWCAddr=0x%tx, FWInfo.u32MWCSize=0x%tx\n", (ptrdiff_t)FWInfo.u32MWCAddr, (ptrdiff_t)FWInfo.u32MWCSize);
1381 
1382     MS_U8 MIUAllocation;
1383     _phy_to_miu_offset(MIUAllocation, stVpuInitPara.pFBCfg->u32FrameBufAddr, FWInfo.u32MWCAddr);
1384     //MDrv_MJPEG_SetMIUInfo(u32Id, MIUAllocation);
1385     stVpuInitPara.pFBCfg->u32FrameBufSize = FWInfo.u32MWCSize;
1386     MJPEG_DEBUG_DRV_MSG("[MJPEG] u32FrameBufAddr=0x%tx, u32FrameBufSize=0x%tx\n", (ptrdiff_t)stVpuInitPara.pFBCfg->u32FrameBufAddr, (ptrdiff_t)stVpuInitPara.pFBCfg->u32FrameBufSize);
1387 #endif
1388 
1389     stVpuFWCfg.u32DstAddr = MsOS_PA2KSEG1(FWInfo.u32Addr);
1390     stVpuFWCfg.u32DstSize = FWInfo.u32Size;
1391     stVpuFWCfg.u32BinAddr = MsOS_PA2KSEG1(FWInfo.u32BinAddr);
1392     stVpuFWCfg.u32BinSize = FWInfo.u32BinSize;
1393     stVpuFWCfg.u8SrcType  = FWInfo.u8FwSrcType;
1394 
1395     stTaskInfo.u32Id = u32Id;
1396     stTaskInfo.eDecType = E_VPU_EX_DECODER_HVD;
1397     stTaskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
1398     stTaskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
1399 #ifdef VDEC3
1400     HAL_VPU_EX_TaskCreate(u32Id, &stVpuInitPara, FWInfo.bFWdecideFB, 0);
1401     // MIU info sould be set after HAL_VPU_EX_TaskCreate()
1402     MDrv_MJPEG_SetMIUInfo(u32Id, MIUAllocation);
1403 #else
1404     HAL_VPU_EX_TaskCreate(u32Id, &stVpuInitPara);
1405 #endif
1406     VirtualHal_MJPEG_Init(u8DrvId);
1407 
1408     return E_MJPEG_OK;
1409 }
1410 
MDrv_MJPEG_Get_Chip_ID(void)1411 MJPEG_MSTAR_CHIP_ID MDrv_MJPEG_Get_Chip_ID(void)
1412 {
1413     return VirtualHal_MJPEG_Get_Chip_ID();
1414 }
1415 
MDrv_MJPEG_GetFreeStream(MS_U32 * pu32Id,MJPEG_DRV_StreamType eStreamType)1416 MJPEG_Return MDrv_MJPEG_GetFreeStream(MS_U32 *pu32Id, MJPEG_DRV_StreamType eStreamType)
1417 {
1418     MJPEG_Return eRet = E_MJPEG_INVALID_PARAM;
1419     MS_U8 i = 0xff;
1420     MS_U32 u32VPUStreamId = 0;
1421     MS_U32 u32MJPEGStreamId = 0;
1422 
1423     MJPEG_DEBUG_DRV_MSG("%20s:%30s: Id=0x%tX\n", __FILE__, __FUNCTION__, (ptrdiff_t)(*pu32Id));
1424 
1425 #ifdef VDEC3
1426     if ((eStreamType >=  E_MJPEG_DRV_N_STREAM) && (eStreamType < E_MJPEG_DRV_N_STREAM + E_MJPEG_MJPEG_TOTAL))
1427     {
1428         i = eStreamType - E_MJPEG_DRV_N_STREAM;
1429     }
1430     else
1431     {
1432         return E_MJPEG_FAILED;
1433     }
1434     u32VPUStreamId   = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_N_STREAM + i);
1435     u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_N_STREAM + i);
1436 
1437     if (u32VPUStreamId && u32MJPEGStreamId)
1438     {
1439         *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1440         eRet = E_MJPEG_OK;
1441     }
1442 #else
1443     switch(eStreamType)
1444     {
1445         case(E_MJPEG_DRV_MAIN_STREAM):
1446             i = 0;
1447             break;
1448         case(E_MJPEG_DRV_SUB_STREAM):
1449             i = 1;
1450             break;
1451         case(E_MJPEG_DRV_STREAM_NONE):
1452         default:
1453             i = 0xff;
1454             break;
1455     }
1456 
1457     if ( i == 0xff )
1458     {
1459         return E_MJPEG_FAILED;
1460     }
1461 
1462     if (E_MJPEG_DRV_MAIN_STREAM == eStreamType)
1463     {
1464     u32VPUStreamId   = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MAIN_STREAM);
1465     u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_MAIN_STREAM);
1466         if(u32MJPEGStreamId == E_HAL_MJPEG_STREAM_NONE)
1467         {
1468             HAL_VPU_EX_ReleaseFreeStream(0);
1469         }
1470 
1471         if (u32VPUStreamId && u32MJPEGStreamId)
1472         {
1473             *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1474             eRet = E_MJPEG_OK;
1475         }
1476     }
1477     else //if (E_MJPEG_DRV_SUB_STREAM== eStreamType)
1478     {
1479         u32VPUStreamId   = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_SUB_STREAM);
1480         u32MJPEGStreamId = (MS_U32) VirtualHal_MJPEG_GetFreeStream(E_HAL_MJPEG_SUB_STREAM);
1481 
1482         if(u32MJPEGStreamId == E_HAL_MJPEG_STREAM_NONE)
1483         {
1484             HAL_VPU_EX_ReleaseFreeStream(1);
1485         }
1486 
1487         if (u32VPUStreamId && u32MJPEGStreamId)
1488         {
1489             *pu32Id = (i << 16 | u32MJPEGStreamId << 8 | u32VPUStreamId);
1490             eRet = E_MJPEG_OK;
1491         }
1492     }
1493 #endif
1494 
1495 
1496     MJPEG_DEBUG_DRV_MSG("%20s:%30s: Id=0x%tX\n", __FILE__, __FUNCTION__, (ptrdiff_t)(*pu32Id));
1497 
1498     return eRet;
1499 }
1500 
MDrv_MJPEG_DeInit(MS_U32 u32Id)1501 MJPEG_Return MDrv_MJPEG_DeInit(MS_U32 u32Id)
1502 {
1503     MJPEG_Return eRet = E_MJPEG_INVALID_PARAM;
1504     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1505 
1506     VPU_EX_FWCodeCfg stVpuFWCfg;
1507     VPU_EX_TaskInfo stTaskInfo;
1508     VPU_EX_NDecInitPara stVpuInitPara;
1509 
1510     stVpuInitPara.pFWCodeCfg = &stVpuFWCfg;
1511     stVpuInitPara.pTaskInfo = &stTaskInfo;
1512 
1513     stVpuFWCfg.u32DstAddr = MsOS_PA2KSEG1(pMJPEGContext->__u32FwAddr);
1514     stVpuFWCfg.u8SrcType  = E_HVD_FW_INPUT_SOURCE_NONE;
1515 
1516     stTaskInfo.u32Id = u32Id;
1517     stTaskInfo.eDecType = E_VPU_EX_DECODER_HVD;
1518     stTaskInfo.eVpuId = (HAL_VPU_StreamId) (0xFF & u32Id);
1519     stTaskInfo.eSrcType = E_VPU_EX_INPUT_FILE;
1520 
1521     VirtualHal_MJPEG_DeInit(u8DrvId);
1522 
1523     if ( HAL_VPU_EX_TaskDelete(u32Id, &stVpuInitPara) ) eRet = E_MJPEG_OK;
1524 
1525     return eRet;
1526 }
1527 
MDrv_MJPEG_InitRegBase(MS_VIRT u32RegBase)1528 void MDrv_MJPEG_InitRegBase(MS_VIRT u32RegBase)
1529 {
1530     HAL_VPU_EX_InitRegBase(u32RegBase);
1531 }
1532 
MDrv_MJPEG_SetPushQPara(MS_U32 u32Id,MS_U32 u32TimeStamp,MS_U32 u32ID_L,MS_U32 u32ID_H,MS_U32 u32NextFrameBuffIdx)1533 void MDrv_MJPEG_SetPushQPara(MS_U32 u32Id, MS_U32 u32TimeStamp, MS_U32 u32ID_L, MS_U32 u32ID_H, MS_U32 u32NextFrameBuffIdx)
1534 {
1535     volatile HVD_ShareMem *pShareMem = NULL;
1536     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1537     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1538     {
1539         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1540         return;
1541     }
1542 
1543     pShareMem->u32MJPEGFrameBuffIdx = u32NextFrameBuffIdx;
1544     pShareMem->u32MJPEGTimeStamp = u32TimeStamp;
1545     pShareMem->u32MJPEGID_L = u32ID_L;
1546     pShareMem->u32MJPEGID_H = u32ID_H;
1547     pShareMem->u32MJPEG_NextFrameBuffIdx = 0xffff;
1548     MsOS_FlushMemory();
1549 
1550 }
1551 
1552 
MDrv_MJPEG_SetStepDispPara(MS_U32 u32Id)1553 void MDrv_MJPEG_SetStepDispPara(MS_U32 u32Id)
1554 {
1555     volatile HVD_ShareMem *pShareMem = NULL;
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;
1561     }
1562     pShareMem->u8MJPEG_bStepPlay = TRUE;
1563     MsOS_FlushMemory();
1564 
1565 }
1566 
MDrv_MJPEG_SetMIUInfo(MS_U32 u32Id,MS_U8 u8MIU)1567 void MDrv_MJPEG_SetMIUInfo(MS_U32 u32Id, MS_U8 u8MIU)
1568 {
1569     volatile HVD_ShareMem *pShareMem = NULL;
1570     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1571     if((MS_VIRT)pShareMem==0xFFFFFFFF)
1572     {
1573         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1574         return;
1575     }
1576     pShareMem->u32VDEC_MIU_SEL = (MS_U32)u8MIU;
1577     MsOS_FlushMemory();
1578 
1579 }
1580 
1581 
1582 
MDrv_MJPEG_PrintShareInfo(MS_U32 u32Id)1583 void MDrv_MJPEG_PrintShareInfo(MS_U32 u32Id)
1584 {
1585     volatile HVD_ShareMem *pShareMem = NULL;
1586     MsOS_ReadMemory();
1587     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1588     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1589     {
1590         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1591         return;
1592     }
1593 
1594     MJPEG_DEBUG_DRV_MSG("0x%08tx, r:%td, w:%td, sys=%td, v_pts=%td, s/r=%td(%c)\n",
1595         (ptrdiff_t)pShareMem->u32MJPEGDbg_DispStatus,
1596         (ptrdiff_t)pShareMem->u8MJPEGDbg_ReadFbIdx, (ptrdiff_t)pShareMem->u8MJPEGDbg_WriteFbIdx,
1597         (ptrdiff_t)pShareMem->u32MJPEGDbg_SysTime, (ptrdiff_t)pShareMem->u32MJPEGDbg_VideoPts,
1598         (ptrdiff_t)pShareMem->u32MJPEGDbg_SkipRepeatTime, pShareMem->u8MJPEGDbg_SkipRepeat
1599         );
1600 }
1601 
MDrv_MJPEG_GetNextFrameBufferIdx(MS_U32 u32Id)1602 MS_U32 MDrv_MJPEG_GetNextFrameBufferIdx(MS_U32 u32Id)
1603 {
1604     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1605     volatile HVD_ShareMem *pShareMem = NULL;
1606     MsOS_ReadMemory();
1607     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1608     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1609     {
1610         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1611         return NULL;
1612     }
1613 
1614     if (bDisplayOutSideMode[u8DrvId])
1615     {
1616         MS_U32 idx = 0;
1617         for (idx = 0; idx < u32FrameBuffTotalNum[u8DrvId]; idx++)
1618         {
1619             if (pShareMem->DispQueue[idx].u32Status == E_HVD_DISPQ_STATUS_FREE)    return idx;
1620         }
1621         MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_GetNextFrameBufferIdx is full!!!\n");
1622         return (MJPEG_U32_MAX);
1623     }
1624     else
1625     {
1626         return pShareMem->u32MJPEG_NextFrameBuffIdx;
1627     }
1628 }
1629 
MDrv_MJPEG_IsStepPlayDone(MS_U32 u32Id)1630 MS_BOOL MDrv_MJPEG_IsStepPlayDone(MS_U32 u32Id)
1631 {
1632     volatile HVD_ShareMem *pShareMem = NULL;
1633     MsOS_ReadMemory();
1634     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1635     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1636     {
1637         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1638         return FALSE;
1639     }
1640     return (MS_BOOL)pShareMem->u8MJPEG_bStepPlay;
1641 }
1642 
MDrv_MJPEG_IsPlaying(MS_U32 u32Id)1643 MS_BOOL MDrv_MJPEG_IsPlaying(MS_U32 u32Id)
1644 {
1645     volatile HVD_ShareMem *pShareMem = NULL;
1646     MsOS_ReadMemory();
1647     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1648     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1649     {
1650         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1651         return FALSE;
1652     }
1653     return (MS_BOOL)pShareMem->u8MJPEG_bPlaying;
1654 }
1655 
MDrv_MJPEG_IsAVSyncOn(MS_U32 u32Id)1656 MS_BOOL MDrv_MJPEG_IsAVSyncOn(MS_U32 u32Id)
1657 {
1658     volatile HVD_ShareMem *pShareMem = NULL;
1659     MsOS_ReadMemory();
1660     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1661     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1662     {
1663         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1664         return FALSE;
1665     }
1666     return (MS_BOOL)pShareMem->u8MJPEG_bIsAVSyncOn;
1667 }
1668 
MDrv_MJPEG_IsReachAVSync(MS_U32 u32Id)1669 MS_BOOL MDrv_MJPEG_IsReachAVSync(MS_U32 u32Id)
1670 {
1671     volatile HVD_ShareMem *pShareMem = NULL;
1672     MsOS_ReadMemory();
1673     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1674     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1675     {
1676         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1677         return FALSE;
1678     }
1679     return (MS_BOOL)pShareMem->u8MJPEG_bIsReachAVSync;
1680 }
1681 
MDrv_MJPEG_IsFlushDone(MS_U32 u32Id)1682 MS_BOOL MDrv_MJPEG_IsFlushDone(MS_U32 u32Id)
1683 {
1684     volatile HVD_ShareMem *pShareMem = NULL;
1685     MsOS_ReadMemory();
1686     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1687     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1688     {
1689         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1690         return FALSE;
1691     }
1692     return (MS_BOOL)(!pShareMem->u8MJPEG_bFlushQueue);
1693 }
1694 
MDrv_MJPEG_InitFlush(MS_U32 u32Id)1695 void MDrv_MJPEG_InitFlush(MS_U32 u32Id)
1696 {
1697     volatile HVD_ShareMem *pShareMem = NULL;
1698     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1699     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1700     {
1701         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1702         return;
1703     }
1704     pShareMem->u8MJPEG_bFlushQueue = 1;
1705     MsOS_FlushMemory();
1706 }
1707 
1708 
MDrv_MJPEG_Init_IsDispFinish(MS_U32 u32Id)1709 void MDrv_MJPEG_Init_IsDispFinish(MS_U32 u32Id)
1710 {
1711     volatile HVD_ShareMem *pShareMem = NULL;
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;
1717     }
1718     pShareMem->u8MJPEG_bIsDispFinish = 0xff;
1719     MsOS_FlushMemory();
1720 }
1721 
MDrv_MJPEG_IsDispFinish(MS_U32 u32Id)1722 MS_BOOL MDrv_MJPEG_IsDispFinish(MS_U32 u32Id)
1723 {
1724     volatile HVD_ShareMem *pShareMem = NULL;
1725     MsOS_ReadMemory();
1726     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1727     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1728     {
1729         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1730         return FALSE;
1731     }
1732     MS_U32 u32Timer;
1733 
1734     u32Timer = MsOS_GetSystemTime();
1735     while(1)
1736     {
1737         if (MsOS_GetSystemTime()-u32Timer > 30)
1738         {
1739             MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsDispFinish() timeout...\n");
1740             break;
1741         }
1742         if(pShareMem->u8MJPEG_bIsDispFinish!=0xff)
1743             break;
1744     }
1745     return (MS_BOOL)(pShareMem->u8MJPEG_bIsDispFinish);
1746 }
1747 
1748 
MDrv_MJPEG_Init_IsQueueFull(MS_U32 u32Id)1749 void MDrv_MJPEG_Init_IsQueueFull(MS_U32 u32Id)
1750 {
1751     volatile HVD_ShareMem *pShareMem = NULL;
1752     MsOS_ReadMemory();
1753     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1754     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1755     {
1756         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1757         return;
1758     }
1759     pShareMem->u8MJPEG_bQueueFull = 0xff;
1760     MsOS_FlushMemory();
1761 }
1762 
MDrv_MJPEG_IsQueueFull(MS_U32 u32Id)1763 MS_BOOL MDrv_MJPEG_IsQueueFull(MS_U32 u32Id)
1764 {
1765     volatile HVD_ShareMem *pShareMem = NULL;
1766     MsOS_ReadMemory();
1767     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1768     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1769     {
1770         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1771         return FALSE;
1772     }
1773     MS_U32 u32Timer;
1774 
1775     u32Timer = MsOS_GetSystemTime();
1776     while(1)
1777     {
1778         if (MsOS_GetSystemTime()-u32Timer > 1000)
1779         {
1780             MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsQueueFull() timeout...\n");
1781             break;
1782         }
1783         MsOS_ReadMemory();
1784         if(pShareMem->u8MJPEG_bQueueFull!=0xff)
1785         {
1786             MJPEG_DEBUG_DRV_MSG("[%td]ms\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1787             break;
1788         }
1789     }
1790     return (MS_BOOL)(pShareMem->u8MJPEG_bQueueFull);
1791 
1792 }
1793 
MDrv_MJPEG_SetConnectStatus(MS_U32 u32Id,MS_U8 u8Status)1794 void MDrv_MJPEG_SetConnectStatus(MS_U32 u32Id, MS_U8 u8Status)
1795 {
1796     volatile HVD_ShareMem *pShareMem = NULL;
1797     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1798     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1799     {
1800         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1801         return;
1802     }
1803     pShareMem->stDynmcDispPath.u8ConnectStatus = u8Status;
1804     MsOS_FlushMemory();
1805 
1806 }
1807 
MDrv_MJPEG_GetConnectStatus(MS_U32 u32Id)1808 MS_U8 MDrv_MJPEG_GetConnectStatus(MS_U32 u32Id)
1809 {
1810     volatile HVD_ShareMem *pShareMem = NULL;
1811     MsOS_ReadMemory();
1812     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1813     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1814     {
1815         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1816         return FALSE;
1817     }
1818 
1819     return pShareMem->stDynmcDispPath.u8ConnectStatus;
1820 }
1821 
1822 #ifdef VDEC3
MDrv_MJPEG_Init_GetFrameBuffer(MS_U32 u32Id)1823 void MDrv_MJPEG_Init_GetFrameBuffer(MS_U32 u32Id)
1824 {
1825     volatile HVD_ShareMem *pShareMem = NULL;
1826     MsOS_ReadMemory();
1827     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1828     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1829     {
1830         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1831         return;
1832     }
1833     pShareMem->u32FrameBufAddr = 0;
1834     pShareMem->u32FrameBufSize = 0;
1835     MsOS_FlushMemory();
1836 }
1837 
MDrv_MJPEG_GetFrameBuffer(MS_U32 u32Id)1838 MS_BOOL MDrv_MJPEG_GetFrameBuffer(MS_U32 u32Id)
1839 {
1840     MS_BOOL bRet = FALSE;
1841     MS_U8 u8DrvId = MDrv_MJPEG_GetDrvId(u32Id);
1842     volatile HVD_ShareMem *pShareMem = NULL;
1843     MsOS_ReadMemory();
1844     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1845     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1846     {
1847         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1848         return FALSE;
1849     }
1850     MS_U32 u32Timer;
1851 
1852     u32Timer = MsOS_GetSystemTime();
1853     while(1)
1854     {
1855         if (MsOS_GetSystemTime()-u32Timer > 1000)
1856         {
1857             MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_GetFrameBuffer() timeout...\n");
1858             return FALSE;
1859         }
1860         MsOS_ReadMemory();
1861         if(pShareMem->u32FrameBufAddr!=0)
1862         {
1863             MJPEG_DEBUG_DRV_MSG("[%td]ms, get ok\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1864             break;
1865         }
1866     }
1867     if(pShareMem->u32FrameBufAddr!=MJPEG_U32_MAX
1868         && pShareMem->u32FrameBufSize!=MJPEG_U32_MAX)
1869     {
1870         bRet = TRUE;
1871         u32FrameBuffStAddr[u8DrvId] = (MS_VIRT)pShareMem->u32FrameBufAddr;
1872         u32FrameBuffTotalSize[u8DrvId] = pShareMem->u32FrameBufSize;
1873         MJPEG_DEBUG_DRV_MSG("Get addr=0x%tx, size=0x%tx\n", (ptrdiff_t)pShareMem->u32FrameBufAddr, (ptrdiff_t)pShareMem->u32FrameBufSize);
1874     }
1875     else
1876     {
1877         MJPEG_DEBUG_DRV_ERR("[fail]Get addr=0x%tx, size=0x%tx\n", (ptrdiff_t)pShareMem->u32FrameBufAddr, (ptrdiff_t)pShareMem->u32FrameBufSize);
1878     }
1879     return bRet;
1880 }
1881 
MDrv_MJPEG_IsFreeFinish(MS_U32 u32Id)1882 MS_BOOL MDrv_MJPEG_IsFreeFinish(MS_U32 u32Id)
1883 {
1884     MS_BOOL bRet = FALSE;
1885     volatile HVD_ShareMem *pShareMem = NULL;
1886     MsOS_ReadMemory();
1887     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1888     if((MS_VIRT)pShareMem==MJPEG_U32_MAX)
1889     {
1890         MJPEG_DEBUG_DRV_ERR("Cannot get pShareMem correctly!!!\n");
1891         return FALSE;
1892     }
1893     MS_U32 u32Timer;
1894 
1895     u32Timer = MsOS_GetSystemTime();
1896     while(1)
1897     {
1898         if (MsOS_GetSystemTime()-u32Timer > 1000)
1899         {
1900             MJPEG_DEBUG_DRV_ERR("MDrv_MJPEG_IsFreeFinish() timeout...\n");
1901             break;
1902         }
1903         MsOS_ReadMemory();
1904         if(pShareMem->u32FrameBufAddr==0)
1905         {
1906             MJPEG_DEBUG_DRV_MSG("[%td]ms, free ok\n", (ptrdiff_t)(MsOS_GetSystemTime()-u32Timer));
1907             bRet = TRUE;
1908             break;
1909         }
1910     }
1911     return bRet;
1912 }
1913 
1914 #if defined(MSOS_TYPE_LINUX) && defined(SUPPORT_CMA)
MDrv_MJPEG_GetCMAInformation(MS_U32 u32Id,MS_PHY * u32Addr,MS_U32 * u32Size,MS_BOOL * bAllocDone)1915 void MDrv_MJPEG_GetCMAInformation(MS_U32 u32Id, MS_PHY* u32Addr,MS_U32* u32Size,MS_BOOL* bAllocDone)
1916 {
1917     volatile HVD_ShareMem *pShareMem = NULL;
1918     pShareMem = (HVD_ShareMem *)MDrv_MJPEG_GetShareMemAddr(u32Id);
1919     *u32Addr = pShareMem->u32FrameBufAddr;
1920     *u32Size = pShareMem->u32FrameBufSize;
1921     *bAllocDone = pShareMem->bCMA_AllocDone;
1922 
1923     MsOS_ReadMemory();
1924     MsOS_FlushMemory();
1925 }
1926 #endif
1927 #endif
1928 #endif
1929 
1930