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