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