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 drvHVD_EX.c
98*53ee8cc1Swenshuai.xi /// @brief HVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi // Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Common Definition
107*53ee8cc1Swenshuai.xi #include <string.h>
108*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
109*53ee8cc1Swenshuai.xi #include "drvHVD_EX.h"
110*53ee8cc1Swenshuai.xi #include "drvHVD_def.h"
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi #include "fwHVD_if.h"
113*53ee8cc1Swenshuai.xi #include "halVPU_EX.h"
114*53ee8cc1Swenshuai.xi #include "halHVD_EX.h"
115*53ee8cc1Swenshuai.xi #include "drvSYS.h"
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
118*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
119*53ee8cc1Swenshuai.xi #endif
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_NUTTX) || defined(SUPPORT_X_MODEL_FEATURE)
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
124*53ee8cc1Swenshuai.xi // Driver Compiler Options
125*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
126*53ee8cc1Swenshuai.xi //#define SUPPORT_X_MODEL_FEATURE
127*53ee8cc1Swenshuai.xi //#define SUPPORT_X_MODEL_HVD_FEATURE //there is a side effect for CB when enable this define.should find the root cause then enable it
128*53ee8cc1Swenshuai.xi #define DISABLE_ISR_DETACH
129*53ee8cc1Swenshuai.xi
130*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
131*53ee8cc1Swenshuai.xi // Local Defines
132*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi
134*53ee8cc1Swenshuai.xi // Drv memory usage
135*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
136*53ee8cc1Swenshuai.xi #define HVD_DTV_VIDEO_DELAY 0 // ms
137*53ee8cc1Swenshuai.xi #else
138*53ee8cc1Swenshuai.xi #define HVD_DTV_VIDEO_DELAY 0 // ms
139*53ee8cc1Swenshuai.xi #endif
140*53ee8cc1Swenshuai.xi #define HVD_FW_CMD_TIMEOUT_DEFAULT 100 // ms
141*53ee8cc1Swenshuai.xi #define HVD_FW_EXIT_ACTION_TIMEOUT 3500 // ms
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi #define HVD_MAX_STREAMS 2
144*53ee8cc1Swenshuai.xi
145*53ee8cc1Swenshuai.xi #define HVD_CTRL_INIT_FINISHED BIT(0) // deflaut: 0
146*53ee8cc1Swenshuai.xi #define HVD_CTRL_PROCESSING BIT(1) // deflaut: 0
147*53ee8cc1Swenshuai.xi #define HVD_CTRL_DATA_END BIT(2) // deflaut: 0
148*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISPLAY_CTRL BIT(3) // deflaut: 0
149*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_INFO_RDY BIT(4) // deflaut: 0
150*53ee8cc1Swenshuai.xi
151*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_OUTSIDE BIT(5)//BIT(9) // deflaut: 0
152*53ee8cc1Swenshuai.xi typedef enum
153*53ee8cc1Swenshuai.xi {
154*53ee8cc1Swenshuai.xi E_HVD_CHECK_CMD_NONE = 0, //decode -> decode_finish
155*53ee8cc1Swenshuai.xi E_HVD_CHECK_CMD_INIT,
156*53ee8cc1Swenshuai.xi E_HVD_CHECK_CMD_TRIGGER_DISP,
157*53ee8cc1Swenshuai.xi E_HVD_CHECK_CMD_SEEK2PTS,
158*53ee8cc1Swenshuai.xi E_HVD_CHECK_CMD_MAX,
159*53ee8cc1Swenshuai.xi } HVD_Check_Cmd;
160*53ee8cc1Swenshuai.xi
161*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_HVD BIT(0)
162*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_MVD BIT(1)
163*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_VPU BIT(2)
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi #define _DRV_HVD_EX_Entry(u8DrvId) \
166*53ee8cc1Swenshuai.xi do \
167*53ee8cc1Swenshuai.xi { \
168*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_PROCESSING; \
169*53ee8cc1Swenshuai.xi } while (0)
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi #define _DRV_HVD_EX_RET(u8DrvId, _ret_) \
172*53ee8cc1Swenshuai.xi do \
173*53ee8cc1Swenshuai.xi { \
174*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= (~HVD_CTRL_PROCESSING); \
175*53ee8cc1Swenshuai.xi return (_ret_); \
176*53ee8cc1Swenshuai.xi } while (0)
177*53ee8cc1Swenshuai.xi
178*53ee8cc1Swenshuai.xi #define _DRV_HVD_Inited(u8DrvId,_ret_) \
179*53ee8cc1Swenshuai.xi do \
180*53ee8cc1Swenshuai.xi { \
181*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->bHVDIsInited[u8DrvId])) \
182*53ee8cc1Swenshuai.xi { \
183*53ee8cc1Swenshuai.xi return _ret_; \
184*53ee8cc1Swenshuai.xi } \
185*53ee8cc1Swenshuai.xi } while (0)
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi #define _DRV_HVD_Rsting(u8DrvId,_ret_) \
188*53ee8cc1Swenshuai.xi do \
189*53ee8cc1Swenshuai.xi { \
190*53ee8cc1Swenshuai.xi if (pHVDDrvContext->bHVDIsIniting[u8DrvId]) \
191*53ee8cc1Swenshuai.xi { \
192*53ee8cc1Swenshuai.xi return _ret_; \
193*53ee8cc1Swenshuai.xi } \
194*53ee8cc1Swenshuai.xi } while (0)
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi #define _DRV_HVD_Ctrl(u8DrvId, x) ( pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & (x) )
197*53ee8cc1Swenshuai.xi
198*53ee8cc1Swenshuai.xi #define _DRV_HVD_SetCtrl(u8DrvId, x) \
199*53ee8cc1Swenshuai.xi do \
200*53ee8cc1Swenshuai.xi { \
201*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= (x); \
202*53ee8cc1Swenshuai.xi } while (0)
203*53ee8cc1Swenshuai.xi
204*53ee8cc1Swenshuai.xi #ifndef UNUSED
205*53ee8cc1Swenshuai.xi #define UNUSED(x) (void)(x)
206*53ee8cc1Swenshuai.xi #endif
207*53ee8cc1Swenshuai.xi
208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
209*53ee8cc1Swenshuai.xi // Local Structures
210*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
213*53ee8cc1Swenshuai.xi // Local Functions Prototype
214*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
215*53ee8cc1Swenshuai.xi static void _HVD_EX_SetShareInfoAddr(MS_U32 u32Id);
216*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitVariables(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams);
217*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_Check_Cmd(MS_U32 u32Id, HVD_Check_Cmd eCmd);
218*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitRegCPU(MS_U32 u32Id);
219*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_SetSyncMode(MS_U32 u32Id, HVD_Sync_Tbl_Type eMode);
220*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_AVC(MS_U32 u32Id);
221*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_RM(MS_U32 u32Id);
222*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_CheckFWVersion(MS_U32 u32Id);
223*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW(MS_U32 u32Id);
224*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty(MS_U32 u32Id);
225*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id);
226*53ee8cc1Swenshuai.xi static MS_U8 _HVD_EX_GetDrvId(MS_U32 u32Id);
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
229*53ee8cc1Swenshuai.xi static MS_S32 _HVD_EX_ISRHandler(void);
230*53ee8cc1Swenshuai.xi #else
231*53ee8cc1Swenshuai.xi static void _HVD_EX_ISRHandler(void);
232*53ee8cc1Swenshuai.xi #endif
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_ReportLow32BitPTS(MS_U32 u32Id, MS_U32 u32PTS);
235*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode);
236*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus);
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi #if 0
239*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
240*53ee8cc1Swenshuai.xi // Global Variables
241*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
242*53ee8cc1Swenshuai.xi MS_U32 u32UartCtrl = (E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_MUST);
243*53ee8cc1Swenshuai.xi MS_U32 u32InitSysTimeBase = 0;
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
246*53ee8cc1Swenshuai.xi // Local Variables
247*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
248*53ee8cc1Swenshuai.xi static MSIF_Version _drv_hvd_version =
249*53ee8cc1Swenshuai.xi {
250*53ee8cc1Swenshuai.xi .DDI = {HVD_DRV_VERSION,},
251*53ee8cc1Swenshuai.xi };
252*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsInited;
253*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsIniting;
254*53ee8cc1Swenshuai.xi static HVD_EX_DrvInfo DrvInfo;
255*53ee8cc1Swenshuai.xi static HVD_EX_Drv_Ctrl gHVDCtrl_EX[HVD_MAX_STREAMS] =
256*53ee8cc1Swenshuai.xi {
257*53ee8cc1Swenshuai.xi { .bUsed = FALSE,
258*53ee8cc1Swenshuai.xi },
259*53ee8cc1Swenshuai.xi { .bUsed = FALSE,
260*53ee8cc1Swenshuai.xi },
261*53ee8cc1Swenshuai.xi };
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsrAttached = FALSE;
264*53ee8cc1Swenshuai.xi #endif
265*53ee8cc1Swenshuai.xi MS_U32 u32UartCtrl = (E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_MUST);
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi typedef struct
268*53ee8cc1Swenshuai.xi {
269*53ee8cc1Swenshuai.xi MS_U32 u32InitSysTimeBase[HVD_MAX_STREAMS];
270*53ee8cc1Swenshuai.xi MS_BOOL bHVDIsInited[HVD_MAX_STREAMS];
271*53ee8cc1Swenshuai.xi MS_BOOL bHVDIsIniting[HVD_MAX_STREAMS];
272*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl gHVDCtrl_EX[HVD_MAX_STREAMS];
273*53ee8cc1Swenshuai.xi MS_BOOL bHVDIsIsrAttached; //check HVD isr already attached, avoid HVD+HVD re-attached
274*53ee8cc1Swenshuai.xi MS_BOOL bEVDIsIsrAttached; //check EVD isr already attached, avoid HVD+HVD re-attached
275*53ee8cc1Swenshuai.xi MS_BOOL bHVDDisableISRFlag;
276*53ee8cc1Swenshuai.xi MS_BOOL bEVDDisableISRFlag;
277*53ee8cc1Swenshuai.xi MS_BOOL bVPUIsSecureMode;
278*53ee8cc1Swenshuai.xi //pre_set
279*53ee8cc1Swenshuai.xi HVD_Pre_Ctrl gHVDPreCtrl[HVD_MAX_STREAMS];
280*53ee8cc1Swenshuai.xi } HVD_Drv_CTX;
281*53ee8cc1Swenshuai.xi
282*53ee8cc1Swenshuai.xi //global variables
283*53ee8cc1Swenshuai.xi HVD_Drv_CTX* pHVDDrvContext = NULL;
284*53ee8cc1Swenshuai.xi HVD_Drv_CTX gHVDDrvContext;
285*53ee8cc1Swenshuai.xi MSIF_Version _drv_hvd_version =
286*53ee8cc1Swenshuai.xi {
287*53ee8cc1Swenshuai.xi .DDI = {HVD_DRV_VERSION,},
288*53ee8cc1Swenshuai.xi };
289*53ee8cc1Swenshuai.xi HVD_EX_DrvInfo DrvInfo;
290*53ee8cc1Swenshuai.xi
291*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
292*53ee8cc1Swenshuai.xi // Debug Functions
293*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi
296*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
297*53ee8cc1Swenshuai.xi // Local Functions
298*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_HVD_EX_Context_Init(void)299*53ee8cc1Swenshuai.xi static void _HVD_EX_Context_Init(void)
300*53ee8cc1Swenshuai.xi {
301*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsIsrAttached = FALSE;
302*53ee8cc1Swenshuai.xi pHVDDrvContext->bEVDIsIsrAttached = FALSE;
303*53ee8cc1Swenshuai.xi return;
304*53ee8cc1Swenshuai.xi }
305*53ee8cc1Swenshuai.xi
_HVD_EX_SetShareInfoAddr(MS_U32 u32Id)306*53ee8cc1Swenshuai.xi static void _HVD_EX_SetShareInfoAddr(MS_U32 u32Id)
307*53ee8cc1Swenshuai.xi {
308*53ee8cc1Swenshuai.xi MS_VIRT u32ShmAddr = HAL_VPU_EX_GetSHMAddr();
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi HAL_VPU_EX_SetShareInfoAddr(u32Id, u32ShmAddr);
311*53ee8cc1Swenshuai.xi
312*53ee8cc1Swenshuai.xi return;
313*53ee8cc1Swenshuai.xi }
314*53ee8cc1Swenshuai.xi
_HVD_EX_InitVariables(MS_U32 u32Id,HVD_EX_MemCfg * pStMemCfg,HVD_Init_Params * pStInitParams)315*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitVariables(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams)
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
318*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi memset((void *) pCtrl, 0, sizeof(HVD_EX_Drv_Ctrl));
321*53ee8cc1Swenshuai.xi pCtrl->bFrmRateSupported = TRUE;
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.xi // PreSetControl
324*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetPreCtrlVariables(u32Id,(MS_VIRT)(&pHVDDrvContext->gHVDPreCtrl[u8DrvId]));
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi if (sizeof(HVD_Init_Params) == sizeof(HVD_EX_InitSettings))
327*53ee8cc1Swenshuai.xi {
328*53ee8cc1Swenshuai.xi HVD_memcpy((void *) &pCtrl->InitParams, pStInitParams, sizeof(HVD_Init_Params));
329*53ee8cc1Swenshuai.xi }
330*53ee8cc1Swenshuai.xi else
331*53ee8cc1Swenshuai.xi {
332*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("HVD struct define is diff: HVD_Init_Params(%u) vs HVD_Init_Settings(%u)\n",
333*53ee8cc1Swenshuai.xi (MS_U32) sizeof(HVD_Init_Params), (MS_U32) sizeof(HVD_EX_InitSettings));
334*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
335*53ee8cc1Swenshuai.xi }
336*53ee8cc1Swenshuai.xi
337*53ee8cc1Swenshuai.xi // fill memory
338*53ee8cc1Swenshuai.xi if (pStMemCfg->u32MIU1BaseAddr == 0)
339*53ee8cc1Swenshuai.xi {
340*53ee8cc1Swenshuai.xi // Get physical address from MIU selection= E_CHIP_MIU_2 and offset=0x10000000
341*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_1, 0, pCtrl->MemMap.u32MIU1BaseAddr);
342*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_2, 0, pCtrl->MemMap.u32MIU2BaseAddr);
343*53ee8cc1Swenshuai.xi
344*53ee8cc1Swenshuai.xi }
345*53ee8cc1Swenshuai.xi else
346*53ee8cc1Swenshuai.xi {
347*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr; /// TODO : pStMemCfg need member u32MIU2BaseAddr
348*53ee8cc1Swenshuai.xi }
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi pCtrl->MemMap.eFWSourceType = (HVD_FWInputSourceType) pStMemCfg->eFWSourceType;
351*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FWBinaryVAddr = pStMemCfg->u32FWBinaryVAddr;
352*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FWBinaryAddr = (MS_U32) pStMemCfg->u32FWBinaryAddr;
353*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FWBinarySize = pStMemCfg->u32FWBinarySize;
354*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32VLCBinaryVAddr = pStMemCfg->u32VLCBinaryVAddr;
355*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32VLCBinaryAddr = (MS_U32) pStMemCfg->u32VLCBinaryAddr;
356*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32VLCBinarySize = pStMemCfg->u32VLCBinarySize;
357*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32CodeBufVAddr = pStMemCfg->u32CodeBufVAddr;
358*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32CodeBufAddr = (MS_U32) pStMemCfg->u32CodeBufAddr;
359*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32CodeBufSize = pStMemCfg->u32CodeBufSize;
360*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FrameBufVAddr = pStMemCfg->u32FrameBufVAddr;
361*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FrameBufAddr = (MS_U32) pStMemCfg->u32FrameBufAddr;
362*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FrameBufSize = pStMemCfg->u32FrameBufSize;
363*53ee8cc1Swenshuai.xi
364*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
365*53ee8cc1Swenshuai.xi if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC) &&
366*53ee8cc1Swenshuai.xi ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_DUAL_ES_MASK) == HVD_INIT_DUAL_ES_ENABLE))
367*53ee8cc1Swenshuai.xi {
368*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
369*53ee8cc1Swenshuai.xi memset((void *) pDrvCtrl_sub, 0, sizeof(HVD_EX_Drv_Ctrl));
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi /// Copy to sub view ctrl
372*53ee8cc1Swenshuai.xi HVD_memcpy((void *) &pDrvCtrl_sub->InitParams, pStInitParams, sizeof(HVD_Init_Params));
373*53ee8cc1Swenshuai.xi
374*53ee8cc1Swenshuai.xi // fill memory
375*53ee8cc1Swenshuai.xi if (pStMemCfg->u32MIU1BaseAddr == 0)
376*53ee8cc1Swenshuai.xi {
377*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_1, 0, pDrvCtrl_sub->MemMap.u32MIU1BaseAddr);
378*53ee8cc1Swenshuai.xi _miu_offset_to_phy(E_CHIP_MIU_2, 0, pDrvCtrl_sub->MemMap.u32MIU2BaseAddr);
379*53ee8cc1Swenshuai.xi }
380*53ee8cc1Swenshuai.xi else
381*53ee8cc1Swenshuai.xi {
382*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr; /// TODO : pStMemCfg need member u32MIU2BaseAddr
383*53ee8cc1Swenshuai.xi }
384*53ee8cc1Swenshuai.xi
385*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufVAddr= pStMemCfg->u32BitstreamBufVAddr;
386*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr ;
387*53ee8cc1Swenshuai.xi #if 1
388*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize/2 ;
389*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr + pStMemCfg->u32BitstreamBufSize/2;
390*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr + pStMemCfg->u32BitstreamBufSize/2;
391*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize/2 ;
392*53ee8cc1Swenshuai.xi #else
393*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufSize = (pStMemCfg->u32BitstreamBufSize*57/128) ;
394*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr + (pStMemCfg->u32BitstreamBufSize*57/128);
395*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr + (pStMemCfg->u32BitstreamBufSize*57/128);
396*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufSize = (pStMemCfg->u32BitstreamBufSize*71/128) ;
397*53ee8cc1Swenshuai.xi #endif
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufVAddr = pDrvCtrl_sub->MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
400*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufAddr = pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr = (MS_U32) pStMemCfg->u32DrvProcessBufAddr;
401*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufSize = pDrvCtrl_sub->MemMap.u32DrvProcessBufSize = pStMemCfg->u32DrvProcessBufSize;
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32CodeBufVAddr = pStMemCfg->u32CodeBufVAddr;
404*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32CodeBufAddr = (MS_U32) pStMemCfg->u32CodeBufAddr;
405*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32CodeBufSize = pStMemCfg->u32CodeBufSize;
406*53ee8cc1Swenshuai.xi
407*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("[MVC] Bitstream buffer: 1st = [0x%lx, 0x%lx, 0x%lx], 2nd = [0x%lx, 0x%lx, 0x%lx].\n",
408*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufVAddr,
409*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufAddr,
410*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufSize,
411*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufVAddr,
412*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufAddr,
413*53ee8cc1Swenshuai.xi pDrvCtrl_sub->MemMap.u32BitstreamBufSize);
414*53ee8cc1Swenshuai.xi }
415*53ee8cc1Swenshuai.xi else
416*53ee8cc1Swenshuai.xi #endif
417*53ee8cc1Swenshuai.xi {
418*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufVAddr = pStMemCfg->u32BitstreamBufVAddr;
419*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr;
420*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize;
421*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
422*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufAddr = (MS_U32) pStMemCfg->u32DrvProcessBufAddr;
423*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufSize = pStMemCfg->u32DrvProcessBufSize;
424*53ee8cc1Swenshuai.xi }
425*53ee8cc1Swenshuai.xi
426*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD mmap: MIU1base:0x%lx, MIU2base:0x%lx,FW(type:%d addr=0x%lx size=0x%lx), VLC(addr=0x%lx size=0x%lx), Code(addr=0x%lx size=0x%lx), FB(addr=0x%lx size=0x%lx), Bit(addr=0x%lx size=0x%lx), Drv(addr=0x%lx size=0x%lx)\n",
427*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32MIU1BaseAddr,
428*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32MIU2BaseAddr,
429*53ee8cc1Swenshuai.xi pCtrl->MemMap.eFWSourceType, pCtrl->MemMap.u32FWBinaryAddr, pCtrl->MemMap.u32FWBinarySize,
430*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32VLCBinaryAddr, pCtrl->MemMap.u32VLCBinarySize,
431*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32CodeBufAddr, pCtrl->MemMap.u32CodeBufSize,
432*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32FrameBufAddr, pCtrl->MemMap.u32FrameBufSize,
433*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32BitstreamBufAddr, pCtrl->MemMap.u32BitstreamBufSize,
434*53ee8cc1Swenshuai.xi pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32DrvProcessBufSize);
435*53ee8cc1Swenshuai.xi
436*53ee8cc1Swenshuai.xi pCtrl->InitParams.u16DecoderClock = HAL_HVD_EX_GetCorretClock(pStInitParams->u16DecoderClock);
437*53ee8cc1Swenshuai.xi pCtrl->InitParams.u16ChipECONum = (MS_U16)MDrv_SYS_GetChipRev();
438*53ee8cc1Swenshuai.xi
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("[VDEC]pCtrl->InitParams.u16ChipECONum : %d \n ", pCtrl->InitParams.u16ChipECONum);
441*53ee8cc1Swenshuai.xi
442*53ee8cc1Swenshuai.xi MS_U32 i;
443*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u8ParsingStatus = 0xff;
444*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u8BufMiuSel[0] = pCtrl->CloseCaptionInfo.u8BufMiuSel[1] = E_CHIP_MIU_0;
445*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.b708Enable = FALSE;
446*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32FWUsrDataRIdx = pCtrl->CloseCaptionInfo.u32FWUsrDataWIdx = 0;
447*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32PktLen708 = 0;
448*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32PktHdrAddr708 = 0;
449*53ee8cc1Swenshuai.xi
450*53ee8cc1Swenshuai.xi
451*53ee8cc1Swenshuai.xi for (i=0;i<2;i++)
452*53ee8cc1Swenshuai.xi {
453*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32RingBufStartPAddr[i] = 0;
454*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32RingBufLen[i] = 0;
455*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32RingBufVacancy[i] = 0;
456*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32RingBufRPAddr[i] = 0;
457*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.u32RingBufWPAddr[i] = 0;
458*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.bOverFlow[i] = FALSE;
459*53ee8cc1Swenshuai.xi }
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi pCtrl->CloseCaptionInfo.b608InfoEnhance = FALSE;
462*53ee8cc1Swenshuai.xi
463*53ee8cc1Swenshuai.xi #if HVD_ENABLE_STOP_ACCESS_OVER_256
464*53ee8cc1Swenshuai.xi pCtrl->bCannotAccessMIU256 = TRUE;
465*53ee8cc1Swenshuai.xi #endif
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi pCtrl->bAutoRmLastZeroByte = TRUE;
468*53ee8cc1Swenshuai.xi pCtrl->u32CmdTimeout = HVD_FW_CMD_TIMEOUT_DEFAULT;
469*53ee8cc1Swenshuai.xi
470*53ee8cc1Swenshuai.xi if (pStInitParams->u8TurboInit & E_HVD_EX_TURBOINIT_FW_RELOAD)
471*53ee8cc1Swenshuai.xi {
472*53ee8cc1Swenshuai.xi pCtrl->bTurboFWMode = TRUE;
473*53ee8cc1Swenshuai.xi }
474*53ee8cc1Swenshuai.xi
475*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetMiuBurstLevel(pCtrl, E_HVD_BURST_CNT_DISABLE);
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi pCtrl->u32FlushRstPtr = 0;
478*53ee8cc1Swenshuai.xi
479*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi
_HVD_EX_Check_Cmd(MS_U32 u32Id,HVD_Check_Cmd eCmd)482*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_Check_Cmd(MS_U32 u32Id, HVD_Check_Cmd eCmd)
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi MS_U32 u32Tmp0 = 0;
485*53ee8cc1Swenshuai.xi MS_U32 u32Tmp1 = 0;
486*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
487*53ee8cc1Swenshuai.xi
488*53ee8cc1Swenshuai.xi switch (eCmd)
489*53ee8cc1Swenshuai.xi {
490*53ee8cc1Swenshuai.xi case E_HVD_CHECK_CMD_INIT:
491*53ee8cc1Swenshuai.xi {
492*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
493*53ee8cc1Swenshuai.xi {
494*53ee8cc1Swenshuai.xi // Check mode
495*53ee8cc1Swenshuai.xi u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK;
496*53ee8cc1Swenshuai.xi
497*53ee8cc1Swenshuai.xi if (!MDrv_HVD_EX_GetCaps((HVD_EX_Codec) u32Tmp0))
498*53ee8cc1Swenshuai.xi {
499*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: HW not support type:%d\n", eCmd);
500*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_UNSUPPORTED;
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi
503*53ee8cc1Swenshuai.xi u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi if (u32Tmp0 == HVD_INIT_MAIN_LIVE_STREAM)
506*53ee8cc1Swenshuai.xi {
507*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_DRV)
508*53ee8cc1Swenshuai.xi {
509*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: Live stream mode can not use Drv input\n");
510*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
511*53ee8cc1Swenshuai.xi }
512*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi // need not to check this under debug mode
515*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK) ==
516*53ee8cc1Swenshuai.xi HVD_INIT_START_CODE_REMOVED)
517*53ee8cc1Swenshuai.xi {
518*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: Live stream mode must have start code\n");
519*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
520*53ee8cc1Swenshuai.xi }
521*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON)
522*53ee8cc1Swenshuai.xi {
523*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: Live stream mode can not use none ATS sync mode\n");
524*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi }
527*53ee8cc1Swenshuai.xi }
528*53ee8cc1Swenshuai.xi else if ((u32Tmp0 == HVD_INIT_MAIN_FILE_RAW) || (u32Tmp0 == HVD_INIT_MAIN_FILE_TS))
529*53ee8cc1Swenshuai.xi {
530*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
531*53ee8cc1Swenshuai.xi {
532*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_DTS)
533*53ee8cc1Swenshuai.xi && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_STS)
534*53ee8cc1Swenshuai.xi && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_PTS)
535*53ee8cc1Swenshuai.xi && (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON))
536*53ee8cc1Swenshuai.xi {
537*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: sync mode is not set. use default value:%d\n",
538*53ee8cc1Swenshuai.xi (MS_U16) E_HVD_SYNC_TBL_TYPE_PTS);
539*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8SyncType = E_HVD_SYNC_TBL_TYPE_PTS;
540*53ee8cc1Swenshuai.xi }
541*53ee8cc1Swenshuai.xi }
542*53ee8cc1Swenshuai.xi }
543*53ee8cc1Swenshuai.xi else if ((u32Tmp0 != HVD_INIT_MAIN_FILE_RAW) && (u32Tmp0 != HVD_INIT_MAIN_FILE_TS))
544*53ee8cc1Swenshuai.xi {
545*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: main type can not be recognized:%ld\n", u32Tmp0);
546*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
547*53ee8cc1Swenshuai.xi }
548*53ee8cc1Swenshuai.xi
549*53ee8cc1Swenshuai.xi // check memory map
550*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr == 0)
551*53ee8cc1Swenshuai.xi {
552*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: MIU 1 Base addr should not be zero\n");
553*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
554*53ee8cc1Swenshuai.xi }
555*53ee8cc1Swenshuai.xi
556*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr & 0x7FF) != 0)
557*53ee8cc1Swenshuai.xi {
558*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: Error HVD code address(0x%lx) must 2048 byte alignment\n",
559*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
560*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
561*53ee8cc1Swenshuai.xi }
562*53ee8cc1Swenshuai.xi }
563*53ee8cc1Swenshuai.xi
564*53ee8cc1Swenshuai.xi u32Tmp0 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
565*53ee8cc1Swenshuai.xi u32Tmp1 = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK;
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi if (u32Tmp0 != HVD_INIT_MAIN_LIVE_STREAM)
568*53ee8cc1Swenshuai.xi {
569*53ee8cc1Swenshuai.xi if (u32Tmp1 == HVD_INIT_INPUT_DRV)
570*53ee8cc1Swenshuai.xi {
571*53ee8cc1Swenshuai.xi // check if driver process buffer is in bitstream buffer.
572*53ee8cc1Swenshuai.xi MS_U32 tmpAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr;
573*53ee8cc1Swenshuai.xi
574*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr == 0)
575*53ee8cc1Swenshuai.xi {
576*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init: Drv process buffer address should not be zero\n");
577*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
578*53ee8cc1Swenshuai.xi //return E_HVD_EX_RET_INVALID_PARAMETER;
579*53ee8cc1Swenshuai.xi }
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr > tmpAddr)
582*53ee8cc1Swenshuai.xi || (tmpAddr >
583*53ee8cc1Swenshuai.xi (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr +
584*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)))
585*53ee8cc1Swenshuai.xi {
586*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
587*53ee8cc1Swenshuai.xi ("Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or MP4) and Drv input.\n");
588*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
589*53ee8cc1Swenshuai.xi //return E_HVD_EX_RET_INVALID_PARAMETER;
590*53ee8cc1Swenshuai.xi }
591*53ee8cc1Swenshuai.xi
592*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize
593*53ee8cc1Swenshuai.xi <
594*53ee8cc1Swenshuai.xi (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) +
595*53ee8cc1Swenshuai.xi 8))
596*53ee8cc1Swenshuai.xi {
597*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
598*53ee8cc1Swenshuai.xi ("Init: File mode(TS or MP4) and Drv input must set the process buffer size and must be larger than %lu Bytes:%ld\n",
599*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize,
600*53ee8cc1Swenshuai.xi (MS_U32) (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF +
601*53ee8cc1Swenshuai.xi (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) + 8));
602*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
603*53ee8cc1Swenshuai.xi //return E_HVD_EX_RET_OUTOF_MEMORY;
604*53ee8cc1Swenshuai.xi }
605*53ee8cc1Swenshuai.xi
606*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize > 1)
607*53ee8cc1Swenshuai.xi {
608*53ee8cc1Swenshuai.xi tmpAddr =
609*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr +
610*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufSize - 1;
611*53ee8cc1Swenshuai.xi }
612*53ee8cc1Swenshuai.xi else
613*53ee8cc1Swenshuai.xi {
614*53ee8cc1Swenshuai.xi tmpAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32DrvProcessBufAddr;
615*53ee8cc1Swenshuai.xi }
616*53ee8cc1Swenshuai.xi
617*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr > tmpAddr)
618*53ee8cc1Swenshuai.xi || (tmpAddr >
619*53ee8cc1Swenshuai.xi (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr +
620*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)))
621*53ee8cc1Swenshuai.xi {
622*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
623*53ee8cc1Swenshuai.xi ("Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or PS) and Drv input.\n");
624*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bNoDrvProccBuf = TRUE;
625*53ee8cc1Swenshuai.xi //return E_HVD_EX_RET_INVALID_PARAMETER;
626*53ee8cc1Swenshuai.xi }
627*53ee8cc1Swenshuai.xi }
628*53ee8cc1Swenshuai.xi else
629*53ee8cc1Swenshuai.xi {
630*53ee8cc1Swenshuai.xi // TODO: check if the TSP MIU sel is the same with the MIU lacation of process buffer.
631*53ee8cc1Swenshuai.xi }
632*53ee8cc1Swenshuai.xi }
633*53ee8cc1Swenshuai.xi break;
634*53ee8cc1Swenshuai.xi }
635*53ee8cc1Swenshuai.xi case E_HVD_CHECK_CMD_SEEK2PTS:
636*53ee8cc1Swenshuai.xi case E_HVD_CHECK_CMD_TRIGGER_DISP:
637*53ee8cc1Swenshuai.xi {
638*53ee8cc1Swenshuai.xi #if 0
639*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_GetPlayMode(E_HVD_EX_GMODE_IS_SYNC_ON))
640*53ee8cc1Swenshuai.xi {
641*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Cmd type:%d Sync Active: %lx\n", (MS_U16) eCmd,
642*53ee8cc1Swenshuai.xi (MS_S32) MDrv_HVD_EX_GetPlayMode(E_HVD_EX_GMODE_IS_SYNC_ON));
643*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_ILLEGAL_ACCESS;
644*53ee8cc1Swenshuai.xi }
645*53ee8cc1Swenshuai.xi #endif
646*53ee8cc1Swenshuai.xi break;
647*53ee8cc1Swenshuai.xi }
648*53ee8cc1Swenshuai.xi default:
649*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi
652*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
653*53ee8cc1Swenshuai.xi }
654*53ee8cc1Swenshuai.xi
_HVD_EX_InitRegCPU(MS_U32 u32Id)655*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitRegCPU(MS_U32 u32Id)
656*53ee8cc1Swenshuai.xi {
657*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
658*53ee8cc1Swenshuai.xi
659*53ee8cc1Swenshuai.xi // check MIU select
660*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
661*53ee8cc1Swenshuai.xi {
662*53ee8cc1Swenshuai.xi HAL_HVD_EX_CheckMIUSel(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_UTOPIA_ENVI);
663*53ee8cc1Swenshuai.xi }
664*53ee8cc1Swenshuai.xi
665*53ee8cc1Swenshuai.xi return (HVD_EX_Result) HAL_HVD_EX_InitRegCPU(u32Id);
666*53ee8cc1Swenshuai.xi }
667*53ee8cc1Swenshuai.xi
_HVD_EX_RstVariables(MS_U32 u32Id)668*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_RstVariables(MS_U32 u32Id)
669*53ee8cc1Swenshuai.xi {
670*53ee8cc1Swenshuai.xi //MS_BOOL bBitMIU1 = FALSE;
671*53ee8cc1Swenshuai.xi //MS_BOOL bCodeMIU1 = FALSE;
672*53ee8cc1Swenshuai.xi MS_U8 u8BitMiuSel;
673*53ee8cc1Swenshuai.xi MS_U32 u32BitStartOffset;
674*53ee8cc1Swenshuai.xi MS_U8 u8CodeMiuSel;
675*53ee8cc1Swenshuai.xi MS_U32 u32CodeStartOffset;
676*53ee8cc1Swenshuai.xi MS_U8 u8FrmMiuSel;
677*53ee8cc1Swenshuai.xi MS_U32 u32FrmStartOffset;
678*53ee8cc1Swenshuai.xi MS_U8 u8DrvProccMiuSel;
679*53ee8cc1Swenshuai.xi MS_U32 u32DrvProccStartOffset;
680*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
681*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
682*53ee8cc1Swenshuai.xi
683*53ee8cc1Swenshuai.xi // Init control flg
684*53ee8cc1Swenshuai.xi pCtrl->u32CtrlMode = 0;
685*53ee8cc1Swenshuai.xi
686*53ee8cc1Swenshuai.xi #if 1
687*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8CodeMiuSel, u32CodeStartOffset, pCtrl->MemMap.u32CodeBufAddr);
688*53ee8cc1Swenshuai.xi pCtrl->u8CodeMiuSel = u8CodeMiuSel;
689*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8BitMiuSel, u32BitStartOffset, pCtrl->MemMap.u32BitstreamBufAddr);
690*53ee8cc1Swenshuai.xi pCtrl->u8ESMiuSel = u8BitMiuSel;
691*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8FrmMiuSel, u32FrmStartOffset, pCtrl->MemMap.u32FrameBufAddr);
692*53ee8cc1Swenshuai.xi pCtrl->u8FrmMiuSel = u8FrmMiuSel;
693*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8DrvProccMiuSel, u32DrvProccStartOffset, pCtrl->MemMap.u32DrvProcessBufAddr);
694*53ee8cc1Swenshuai.xi pCtrl->u8DrvProccMiuSel = u8DrvProccMiuSel;
695*53ee8cc1Swenshuai.xi #else
696*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
697*53ee8cc1Swenshuai.xi {
698*53ee8cc1Swenshuai.xi pCtrl->u32CtrlMode |= HVD_CTRL_CODE_MIU_1;
699*53ee8cc1Swenshuai.xi bCodeMIU1 = TRUE;
700*53ee8cc1Swenshuai.xi }
701*53ee8cc1Swenshuai.xi
702*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32BitstreamBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
703*53ee8cc1Swenshuai.xi {
704*53ee8cc1Swenshuai.xi pCtrl->u32CtrlMode |= HVD_CTRL_ES_MIU_1;
705*53ee8cc1Swenshuai.xi bBitMIU1 = TRUE;
706*53ee8cc1Swenshuai.xi }
707*53ee8cc1Swenshuai.xi
708*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32FrameBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
709*53ee8cc1Swenshuai.xi {
710*53ee8cc1Swenshuai.xi pCtrl->u32CtrlMode |= HVD_CTRL_FRM_MIU_1;
711*53ee8cc1Swenshuai.xi }
712*53ee8cc1Swenshuai.xi
713*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32DrvProcessBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr)
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi pCtrl->u32CtrlMode |= HVD_CTRL_DRVPROCC_MIU_1;
716*53ee8cc1Swenshuai.xi }
717*53ee8cc1Swenshuai.xi #endif
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi if (!pCtrl->bNoDrvProccBuf)
720*53ee8cc1Swenshuai.xi {
721*53ee8cc1Swenshuai.xi // init nal table buffer start address.
722*53ee8cc1Swenshuai.xi if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
723*53ee8cc1Swenshuai.xi {
724*53ee8cc1Swenshuai.xi if (u8BitMiuSel != u8CodeMiuSel)
725*53ee8cc1Swenshuai.xi {
726*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
727*53ee8cc1Swenshuai.xi if( ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC) &&
728*53ee8cc1Swenshuai.xi ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_DUAL_ES_MASK) == HVD_INIT_DUAL_ES_ENABLE) &&
729*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32DrvProcessBufSize > (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<1 ) <<3) + 8) ))
730*53ee8cc1Swenshuai.xi {
731*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
732*53ee8cc1Swenshuai.xi if( (( pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr) % 8) != 0)
733*53ee8cc1Swenshuai.xi {
734*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr = pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr + 7;
735*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr -= (pCtrl->u32BBUTblInBitstreamBufAddr ) % 8;
736*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr -= pCtrl->MemMap.u32DrvProcessBufAddr;
737*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx" , (MS_U32)HVD_BBU_ST_ADDR_IN_BITSTREAMBUF , pCtrl->u32BBUTblInBitstreamBufAddr );
738*53ee8cc1Swenshuai.xi }
739*53ee8cc1Swenshuai.xi
740*53ee8cc1Swenshuai.xi /// Setting BBU for MVC dual bbu input
741*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
742*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3); //// need to check
743*53ee8cc1Swenshuai.xi if( (( pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr + pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr) % 8) != 0)
744*53ee8cc1Swenshuai.xi {
745*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr = pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr + pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr + 7;
746*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr -= (pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr ) % 8;
747*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUTblInBitstreamBufAddr -= pDrvCtrl_sub->MemMap.u32DrvProcessBufAddr;
748*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("[MVC]: Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx" , (MS_U32)HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) , pCtrl->u32BBUTblInBitstreamBufAddr );
749*53ee8cc1Swenshuai.xi }
750*53ee8cc1Swenshuai.xi
751*53ee8cc1Swenshuai.xi }
752*53ee8cc1Swenshuai.xi else
753*53ee8cc1Swenshuai.xi #endif
754*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32DrvProcessBufSize >
755*53ee8cc1Swenshuai.xi (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) + 8)))
756*53ee8cc1Swenshuai.xi {
757*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
758*53ee8cc1Swenshuai.xi
759*53ee8cc1Swenshuai.xi if (((pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr) % 8) != 0)
760*53ee8cc1Swenshuai.xi {
761*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr =
762*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr + pCtrl->MemMap.u32DrvProcessBufAddr + 7;
763*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr -= (pCtrl->u32BBUTblInBitstreamBufAddr) % 8;
764*53ee8cc1Swenshuai.xi pCtrl->u32BBUTblInBitstreamBufAddr -= pCtrl->MemMap.u32DrvProcessBufAddr;
765*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
766*53ee8cc1Swenshuai.xi ("Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx",
767*53ee8cc1Swenshuai.xi (MS_U32) HVD_BBU_ST_ADDR_IN_BITSTREAMBUF, pCtrl->u32BBUTblInBitstreamBufAddr);
768*53ee8cc1Swenshuai.xi }
769*53ee8cc1Swenshuai.xi }
770*53ee8cc1Swenshuai.xi else
771*53ee8cc1Swenshuai.xi {
772*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
773*53ee8cc1Swenshuai.xi ("Driver process buffer size is not enough for driver input path. input:%lx required:%lx",
774*53ee8cc1Swenshuai.xi (MS_U32) pCtrl->MemMap.u32DrvProcessBufSize,
775*53ee8cc1Swenshuai.xi (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) << 3) +
776*53ee8cc1Swenshuai.xi 8));
777*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_OUTOF_MEMORY;
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi }
780*53ee8cc1Swenshuai.xi }
781*53ee8cc1Swenshuai.xi
782*53ee8cc1Swenshuai.xi // init AVI NULL packet pattern && RM flush pattern
783*53ee8cc1Swenshuai.xi if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
784*53ee8cc1Swenshuai.xi {
785*53ee8cc1Swenshuai.xi MS_U8 *pNULLPattern = NULL;
786*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketAddr = pCtrl->MemMap.u32DrvProcessBufAddr;
787*53ee8cc1Swenshuai.xi // TODO: use other non-cachable VA addr
788*53ee8cc1Swenshuai.xi //Use shared memory instead of f/w code buffer.
789*53ee8cc1Swenshuai.xi pNULLPattern = (MS_U8 *) HAL_HVD_EX_GetShmAddr(u32Id);
790*53ee8cc1Swenshuai.xi if(pNULLPattern == NULL)
791*53ee8cc1Swenshuai.xi {
792*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("########## VDEC patch for Debug %s %d###########\n", __FUNCTION__, __LINE__);
793*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
794*53ee8cc1Swenshuai.xi }
795*53ee8cc1Swenshuai.xi memset((void *) pNULLPattern, 0, 12);
796*53ee8cc1Swenshuai.xi
797*53ee8cc1Swenshuai.xi switch ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
798*53ee8cc1Swenshuai.xi {
799*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
800*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
801*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
802*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
803*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9: // MStar VP9 or G2 VP9
804*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
805*53ee8cc1Swenshuai.xi #endif
806*53ee8cc1Swenshuai.xi {
807*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK)
808*53ee8cc1Swenshuai.xi {
809*53ee8cc1Swenshuai.xi // start code removed
810*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize = 8;
811*53ee8cc1Swenshuai.xi
812*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32NULLPacketSize)
813*53ee8cc1Swenshuai.xi {
814*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_OUTOF_MEMORY;
815*53ee8cc1Swenshuai.xi }
816*53ee8cc1Swenshuai.xi
817*53ee8cc1Swenshuai.xi memset((void *) pNULLPattern, 0xAA, pCtrl->u32NULLPacketSize);
818*53ee8cc1Swenshuai.xi pNULLPattern[4] = 0X55;
819*53ee8cc1Swenshuai.xi }
820*53ee8cc1Swenshuai.xi else // start code remained
821*53ee8cc1Swenshuai.xi {
822*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize = 12;
823*53ee8cc1Swenshuai.xi
824*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32NULLPacketSize)
825*53ee8cc1Swenshuai.xi {
826*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_OUTOF_MEMORY;
827*53ee8cc1Swenshuai.xi }
828*53ee8cc1Swenshuai.xi
829*53ee8cc1Swenshuai.xi memset((void *) pNULLPattern, 0xAA, pCtrl->u32NULLPacketSize);
830*53ee8cc1Swenshuai.xi
831*53ee8cc1Swenshuai.xi pNULLPattern[0] = 0;
832*53ee8cc1Swenshuai.xi pNULLPattern[1] = 0;
833*53ee8cc1Swenshuai.xi pNULLPattern[2] = 1;
834*53ee8cc1Swenshuai.xi pNULLPattern[3] = 0xFF;
835*53ee8cc1Swenshuai.xi pNULLPattern[8] = 0X55;
836*53ee8cc1Swenshuai.xi }
837*53ee8cc1Swenshuai.xi
838*53ee8cc1Swenshuai.xi //if (bBitMIU1 != bCodeMIU1)
839*53ee8cc1Swenshuai.xi if(u8BitMiuSel != u8CodeMiuSel)
840*53ee8cc1Swenshuai.xi {
841*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
842*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushMemory();
843*53ee8cc1Swenshuai.xi HVD_dmacpy(pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32CodeBufAddr,
844*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize);
845*53ee8cc1Swenshuai.xi #else
846*53ee8cc1Swenshuai.xi HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
847*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize);
848*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushMemory();
849*53ee8cc1Swenshuai.xi #endif
850*53ee8cc1Swenshuai.xi }
851*53ee8cc1Swenshuai.xi else
852*53ee8cc1Swenshuai.xi {
853*53ee8cc1Swenshuai.xi HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
854*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize);
855*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushMemory();
856*53ee8cc1Swenshuai.xi }
857*53ee8cc1Swenshuai.xi
858*53ee8cc1Swenshuai.xi break;
859*53ee8cc1Swenshuai.xi }
860*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
861*53ee8cc1Swenshuai.xi {
862*53ee8cc1Swenshuai.xi // RM has no NULL packet
863*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize = 0;
864*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketAddr = 0;
865*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
866*53ee8cc1Swenshuai.xi pCtrl->u32RV_FlushPacketAddr = pCtrl->MemMap.u32DrvProcessBufAddr;
867*53ee8cc1Swenshuai.xi pCtrl->u32RV_FlushPacketSize = 8;
868*53ee8cc1Swenshuai.xi
869*53ee8cc1Swenshuai.xi if (pCtrl->MemMap.u32DrvProcessBufSize < pCtrl->u32RV_FlushPacketSize)
870*53ee8cc1Swenshuai.xi {
871*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_OUTOF_MEMORY;
872*53ee8cc1Swenshuai.xi }
873*53ee8cc1Swenshuai.xi memset((void *) pNULLPattern, 0xFF, pCtrl->u32RV_FlushPacketSize);
874*53ee8cc1Swenshuai.xi {
875*53ee8cc1Swenshuai.xi #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
876*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushMemory();
877*53ee8cc1Swenshuai.xi HVD_dmacpy(pCtrl->MemMap.u32DrvProcessBufAddr, pCtrl->MemMap.u32CodeBufAddr,
878*53ee8cc1Swenshuai.xi pCtrl->u32RV_FlushPacketSize);
879*53ee8cc1Swenshuai.xi #else
880*53ee8cc1Swenshuai.xi HVD_memcpy((void *) (pCtrl->MemMap.u32DrvProcessBufVAddr), pNULLPattern,
881*53ee8cc1Swenshuai.xi pCtrl->u32RV_FlushPacketSize);
882*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushMemory();
883*53ee8cc1Swenshuai.xi #endif
884*53ee8cc1Swenshuai.xi }
885*53ee8cc1Swenshuai.xi #endif
886*53ee8cc1Swenshuai.xi break;
887*53ee8cc1Swenshuai.xi }
888*53ee8cc1Swenshuai.xi default:
889*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize = 0;
890*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketAddr = 0;
891*53ee8cc1Swenshuai.xi break;
892*53ee8cc1Swenshuai.xi }
893*53ee8cc1Swenshuai.xi }
894*53ee8cc1Swenshuai.xi else
895*53ee8cc1Swenshuai.xi {
896*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketSize = 0;
897*53ee8cc1Swenshuai.xi pCtrl->u32NULLPacketAddr = 0;
898*53ee8cc1Swenshuai.xi }
899*53ee8cc1Swenshuai.xi }
900*53ee8cc1Swenshuai.xi
901*53ee8cc1Swenshuai.xi // reset other driver control variables
902*53ee8cc1Swenshuai.xi pCtrl->u32StepDecodeCnt = 0;
903*53ee8cc1Swenshuai.xi pCtrl->u32LastESRptr = 0;
904*53ee8cc1Swenshuai.xi pCtrl->u32BBUPacketCnt = 0;
905*53ee8cc1Swenshuai.xi pCtrl->u32BBUWptr_Fired = 0;
906*53ee8cc1Swenshuai.xi pCtrl->u32LastErrCode = 0;
907*53ee8cc1Swenshuai.xi pCtrl->bIsDispInfoChg = 0;
908*53ee8cc1Swenshuai.xi
909*53ee8cc1Swenshuai.xi memset((void *) &(pCtrl->LastNal), 0, sizeof(HVD_Nal_Entry));
910*53ee8cc1Swenshuai.xi memset((void *) &(pCtrl->LivingStatus), 0, sizeof(HVD_Alive_Status));
911*53ee8cc1Swenshuai.xi
912*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
913*53ee8cc1Swenshuai.xi if((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
914*53ee8cc1Swenshuai.xi {
915*53ee8cc1Swenshuai.xi /// TODO: MVC want to used 2nd HVDCtrl data.
916*53ee8cc1Swenshuai.xi //u8DrvId = _HVD_EX_GetDrvId(u32Id);
917*53ee8cc1Swenshuai.xi //pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId + 1]);
918*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pDrvCtrl_sub = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]);
919*53ee8cc1Swenshuai.xi
920*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32StepDecodeCnt = 0;
921*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32LastESRptr = 0;
922*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUPacketCnt = 0;
923*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32BBUWptr_Fired = 0;
924*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32LastErrCode = 0;
925*53ee8cc1Swenshuai.xi pDrvCtrl_sub->bIsDispInfoChg = 0;
926*53ee8cc1Swenshuai.xi
927*53ee8cc1Swenshuai.xi memset((void *) &(pDrvCtrl_sub->LastNal), 0, sizeof(HVD_Nal_Entry));
928*53ee8cc1Swenshuai.xi
929*53ee8cc1Swenshuai.xi pDrvCtrl_sub->bNoDrvProccBuf = pCtrl->bNoDrvProccBuf;
930*53ee8cc1Swenshuai.xi pDrvCtrl_sub->bAutoRmLastZeroByte = pCtrl->bAutoRmLastZeroByte;
931*53ee8cc1Swenshuai.xi pDrvCtrl_sub->bCannotAccessMIU256 = pCtrl->bCannotAccessMIU256;
932*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32CmdTimeout = pCtrl->u32CmdTimeout;
933*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32CtrlMode = pCtrl->u32CtrlMode;
934*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32DummyWriteBuf = pCtrl->u32DummyWriteBuf;
935*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32NULLPacketSize = pCtrl->u32NULLPacketSize;
936*53ee8cc1Swenshuai.xi pDrvCtrl_sub->u32NULLPacketAddr = pCtrl->u32NULLPacketAddr;
937*53ee8cc1Swenshuai.xi }
938*53ee8cc1Swenshuai.xi #endif
939*53ee8cc1Swenshuai.xi // Init HAL variables
940*53ee8cc1Swenshuai.xi return (HVD_EX_Result) HAL_HVD_EX_InitVariables(u32Id);
941*53ee8cc1Swenshuai.xi }
942*53ee8cc1Swenshuai.xi
943*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
944*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: _HVD_EX_SetSyncMode()
945*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: specify the way to sync video time stamp and STC.
946*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : sync type
947*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : only work under (eMode == E_HVD_EX_SYNC_ATS) , video delay toward Audio time stamp. It's minimun value is 0, and maximun value is 4500 ( unit:ms)
948*53ee8cc1Swenshuai.xi /// @return -The result of command set sync type
949*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
_HVD_EX_SetSyncMode(MS_U32 u32Id,HVD_Sync_Tbl_Type eMode)950*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_SetSyncMode(MS_U32 u32Id, HVD_Sync_Tbl_Type eMode)
951*53ee8cc1Swenshuai.xi {
952*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
953*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
954*53ee8cc1Swenshuai.xi
955*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
956*53ee8cc1Swenshuai.xi
957*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TYPE, eMode);
958*53ee8cc1Swenshuai.xi
959*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
960*53ee8cc1Swenshuai.xi }
961*53ee8cc1Swenshuai.xi
_HVD_EX_InitFW_AVC(MS_U32 u32Id)962*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_AVC(MS_U32 u32Id)
963*53ee8cc1Swenshuai.xi {
964*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
965*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
966*53ee8cc1Swenshuai.xi MS_U32 u32InitMode = pCtrl->InitParams.u32ModeFlag;
967*53ee8cc1Swenshuai.xi
968*53ee8cc1Swenshuai.xi // common settings
969*53ee8cc1Swenshuai.xi if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
970*53ee8cc1Swenshuai.xi {
971*53ee8cc1Swenshuai.xi _HVD_EX_SetSyncMode(u32Id, (HVD_Sync_Tbl_Type) pCtrl->InitParams.u8SyncType);
972*53ee8cc1Swenshuai.xi
973*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u8MinFrmGap)
974*53ee8cc1Swenshuai.xi {
975*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MIN_FRAME_GAP, pCtrl->InitParams.u8MinFrmGap);
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi
978*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u32MaxDecTick)
979*53ee8cc1Swenshuai.xi {
980*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MAX_DEC_TICK, pCtrl->InitParams.u32MaxDecTick);
981*53ee8cc1Swenshuai.xi }
982*53ee8cc1Swenshuai.xi
983*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u16Pitch)
984*53ee8cc1Swenshuai.xi {
985*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PITCH, pCtrl->InitParams.u16Pitch);
986*53ee8cc1Swenshuai.xi }
987*53ee8cc1Swenshuai.xi
988*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bSyncEachFrm)
989*53ee8cc1Swenshuai.xi {
990*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_EACH_FRM, TRUE);
991*53ee8cc1Swenshuai.xi }
992*53ee8cc1Swenshuai.xi
993*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bFastDisplay)
994*53ee8cc1Swenshuai.xi {
995*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, TRUE);
996*53ee8cc1Swenshuai.xi }
997*53ee8cc1Swenshuai.xi
998*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bDynamicScaling)
999*53ee8cc1Swenshuai.xi {
1000*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE, TRUE);
1001*53ee8cc1Swenshuai.xi }
1002*53ee8cc1Swenshuai.xi
1003*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bUserData)
1004*53ee8cc1Swenshuai.xi {
1005*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DPO_CC, TRUE);
1006*53ee8cc1Swenshuai.xi }
1007*53ee8cc1Swenshuai.xi }
1008*53ee8cc1Swenshuai.xi
1009*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u8TimeUnit)
1010*53ee8cc1Swenshuai.xi {
1011*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_TIME_UNIT_TYPE, pCtrl->InitParams.u8TimeUnit);
1012*53ee8cc1Swenshuai.xi }
1013*53ee8cc1Swenshuai.xi
1014*53ee8cc1Swenshuai.xi // specific settings
1015*53ee8cc1Swenshuai.xi switch (u32InitMode & HVD_INIT_MAIN_MASK)
1016*53ee8cc1Swenshuai.xi {
1017*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_FILE_RAW:
1018*53ee8cc1Swenshuai.xi {
1019*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_VDEAD, TRUE);
1020*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1021*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1022*53ee8cc1Swenshuai.xi
1023*53ee8cc1Swenshuai.xi if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1024*53ee8cc1Swenshuai.xi {
1025*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
1026*53ee8cc1Swenshuai.xi }
1027*53ee8cc1Swenshuai.xi
1028*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PARSER_BYPASS, TRUE);
1029*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_GET_MORE_FRM_BUF, TRUE);
1030*53ee8cc1Swenshuai.xi
1031*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, TRUE);
1032*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, TRUE);
1033*53ee8cc1Swenshuai.xi break;
1034*53ee8cc1Swenshuai.xi }
1035*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_FILE_TS:
1036*53ee8cc1Swenshuai.xi {
1037*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_VDEAD, TRUE);
1038*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1039*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1040*53ee8cc1Swenshuai.xi
1041*53ee8cc1Swenshuai.xi if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1042*53ee8cc1Swenshuai.xi {
1043*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
1044*53ee8cc1Swenshuai.xi }
1045*53ee8cc1Swenshuai.xi
1046*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, TRUE);
1047*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVOID_PTS_TBL_OVERFLOW, TRUE);
1048*53ee8cc1Swenshuai.xi
1049*53ee8cc1Swenshuai.xi if((u32InitMode & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
1050*53ee8cc1Swenshuai.xi {
1051*53ee8cc1Swenshuai.xi HAL_HVD_EX_SpareBandwidth(u32Id); //// For MVC
1052*53ee8cc1Swenshuai.xi }
1053*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, TRUE);
1054*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, TRUE);
1055*53ee8cc1Swenshuai.xi break;
1056*53ee8cc1Swenshuai.xi }
1057*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_LIVE_STREAM:
1058*53ee8cc1Swenshuai.xi {
1059*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, TRUE);
1060*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1061*53ee8cc1Swenshuai.xi
1062*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u8TimeUnit)
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) HVD_DTV_VIDEO_DELAY);
1065*53ee8cc1Swenshuai.xi }
1066*53ee8cc1Swenshuai.xi else
1067*53ee8cc1Swenshuai.xi {
1068*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) HVD_DTV_VIDEO_DELAY * 90);
1069*53ee8cc1Swenshuai.xi }
1070*53ee8cc1Swenshuai.xi
1071*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ES_FULL_STOP, TRUE);
1072*53ee8cc1Swenshuai.xi
1073*53ee8cc1Swenshuai.xi break;
1074*53ee8cc1Swenshuai.xi }
1075*53ee8cc1Swenshuai.xi default:
1076*53ee8cc1Swenshuai.xi break;
1077*53ee8cc1Swenshuai.xi }
1078*53ee8cc1Swenshuai.xi
1079*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
1080*53ee8cc1Swenshuai.xi }
1081*53ee8cc1Swenshuai.xi
_HVD_EX_InitFW_RM(MS_U32 u32Id)1082*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW_RM(MS_U32 u32Id)
1083*53ee8cc1Swenshuai.xi {
1084*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1085*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1086*53ee8cc1Swenshuai.xi MS_U32 u32InitMode = pCtrl->InitParams.u32ModeFlag;
1087*53ee8cc1Swenshuai.xi
1088*53ee8cc1Swenshuai.xi // common settings
1089*53ee8cc1Swenshuai.xi if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_DISPLAY))
1090*53ee8cc1Swenshuai.xi {
1091*53ee8cc1Swenshuai.xi _HVD_EX_SetSyncMode(u32Id, (HVD_Sync_Tbl_Type) pCtrl->InitParams.u8SyncType);
1092*53ee8cc1Swenshuai.xi
1093*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u16Pitch)
1094*53ee8cc1Swenshuai.xi {
1095*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PITCH, pCtrl->InitParams.u16Pitch);
1096*53ee8cc1Swenshuai.xi }
1097*53ee8cc1Swenshuai.xi
1098*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bSyncEachFrm)
1099*53ee8cc1Swenshuai.xi {
1100*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_EACH_FRM, TRUE);
1101*53ee8cc1Swenshuai.xi }
1102*53ee8cc1Swenshuai.xi
1103*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bFastDisplay)
1104*53ee8cc1Swenshuai.xi {
1105*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, TRUE);
1106*53ee8cc1Swenshuai.xi }
1107*53ee8cc1Swenshuai.xi
1108*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.bDynamicScaling)
1109*53ee8cc1Swenshuai.xi {
1110*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE, TRUE);
1111*53ee8cc1Swenshuai.xi }
1112*53ee8cc1Swenshuai.xi }
1113*53ee8cc1Swenshuai.xi
1114*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u8TimeUnit)
1115*53ee8cc1Swenshuai.xi {
1116*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_TIME_UNIT_TYPE, pCtrl->InitParams.u8TimeUnit);
1117*53ee8cc1Swenshuai.xi }
1118*53ee8cc1Swenshuai.xi // specific settings
1119*53ee8cc1Swenshuai.xi switch (u32InitMode & HVD_INIT_MAIN_MASK)
1120*53ee8cc1Swenshuai.xi {
1121*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_FILE_RAW:
1122*53ee8cc1Swenshuai.xi break;
1123*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_FILE_TS:
1124*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_LIVE_STREAM:
1125*53ee8cc1Swenshuai.xi default:
1126*53ee8cc1Swenshuai.xi break;
1127*53ee8cc1Swenshuai.xi }
1128*53ee8cc1Swenshuai.xi
1129*53ee8cc1Swenshuai.xi // fix FFx4 display error
1130*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_RESET_HW, TRUE);
1131*53ee8cc1Swenshuai.xi
1132*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
1133*53ee8cc1Swenshuai.xi }
1134*53ee8cc1Swenshuai.xi
_HVD_EX_CheckFWVersion(MS_U32 u32Id)1135*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_CheckFWVersion(MS_U32 u32Id)
1136*53ee8cc1Swenshuai.xi {
1137*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1138*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1139*53ee8cc1Swenshuai.xi
1140*53ee8cc1Swenshuai.xi // check FW version ID
1141*53ee8cc1Swenshuai.xi if (!(pCtrl->InitParams.u8TurboInit & E_HVD_EX_TURBOINIT_CHECK))
1142*53ee8cc1Swenshuai.xi {
1143*53ee8cc1Swenshuai.xi if ((HVD_FW_IF_VERSION >> 16) != (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IF_VERSION_ID) >> 16))
1144*53ee8cc1Swenshuai.xi {
1145*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("fw interface and binary is not the same. fw ID: interface:%lx binary:%lx\n",
1146*53ee8cc1Swenshuai.xi (MS_U32) HVD_FW_IF_VERSION, HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_IF_VERSION_ID));
1147*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
1148*53ee8cc1Swenshuai.xi }
1149*53ee8cc1Swenshuai.xi }
1150*53ee8cc1Swenshuai.xi
1151*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
1152*53ee8cc1Swenshuai.xi }
1153*53ee8cc1Swenshuai.xi
_HVD_EX_InitFW(MS_U32 u32Id)1154*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_InitFW(MS_U32 u32Id)
1155*53ee8cc1Swenshuai.xi {
1156*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
1157*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1158*53ee8cc1Swenshuai.xi
1159*53ee8cc1Swenshuai.xi eRet = _HVD_EX_CheckFWVersion(u32Id);
1160*53ee8cc1Swenshuai.xi
1161*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
1162*53ee8cc1Swenshuai.xi {
1163*53ee8cc1Swenshuai.xi return eRet;
1164*53ee8cc1Swenshuai.xi }
1165*53ee8cc1Swenshuai.xi
1166*53ee8cc1Swenshuai.xi switch (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK)
1167*53ee8cc1Swenshuai.xi {
1168*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
1169*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
1170*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
1171*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
1172*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9: // MStar VP9 or G2 VP9
1173*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
1174*53ee8cc1Swenshuai.xi #endif
1175*53ee8cc1Swenshuai.xi eRet = _HVD_EX_InitFW_AVC(u32Id);
1176*53ee8cc1Swenshuai.xi break;
1177*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
1178*53ee8cc1Swenshuai.xi eRet = _HVD_EX_InitFW_RM(u32Id);
1179*53ee8cc1Swenshuai.xi break;
1180*53ee8cc1Swenshuai.xi default:
1181*53ee8cc1Swenshuai.xi break;
1182*53ee8cc1Swenshuai.xi }
1183*53ee8cc1Swenshuai.xi
1184*53ee8cc1Swenshuai.xi return eRet;
1185*53ee8cc1Swenshuai.xi }
1186*53ee8cc1Swenshuai.xi
_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)1187*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1190*53ee8cc1Swenshuai.xi MS_U32 u32PlaybackType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
1191*53ee8cc1Swenshuai.xi MS_U32 u32FwIdleThreshold = 5000;
1192*53ee8cc1Swenshuai.xi MS_U32 u8DispCntThreshold = 0;
1193*53ee8cc1Swenshuai.xi if (u32PlaybackType == HVD_INIT_MAIN_FILE_RAW)
1194*53ee8cc1Swenshuai.xi {
1195*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) != 0)
1196*53ee8cc1Swenshuai.xi {
1197*53ee8cc1Swenshuai.xi return FALSE;
1198*53ee8cc1Swenshuai.xi }
1199*53ee8cc1Swenshuai.xi }
1200*53ee8cc1Swenshuai.xi else //if( u32PlaybackType == HVD_INIT_MAIN_FILE_TS ) TSP input
1201*53ee8cc1Swenshuai.xi {
1202*53ee8cc1Swenshuai.xi #if 0
1203*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR) != HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR))
1204*53ee8cc1Swenshuai.xi {
1205*53ee8cc1Swenshuai.xi return FALSE;
1206*53ee8cc1Swenshuai.xi }
1207*53ee8cc1Swenshuai.xi #endif
1208*53ee8cc1Swenshuai.xi }
1209*53ee8cc1Swenshuai.xi if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1210*53ee8cc1Swenshuai.xi {
1211*53ee8cc1Swenshuai.xi if ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0 && HAL_HVD_EX_DispFrameAllViewed(u32Id)) &&
1212*53ee8cc1Swenshuai.xi ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold)||((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) )))
1213*53ee8cc1Swenshuai.xi {
1214*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS, (MS_U32)E_HVD_EX_FLUSH_NONE);
1215*53ee8cc1Swenshuai.xi
1216*53ee8cc1Swenshuai.xi return TRUE;
1217*53ee8cc1Swenshuai.xi }
1218*53ee8cc1Swenshuai.xi
1219*53ee8cc1Swenshuai.xi return FALSE;
1220*53ee8cc1Swenshuai.xi }
1221*53ee8cc1Swenshuai.xi //other Queues
1222*53ee8cc1Swenshuai.xi //LOGD("R: %d %d %d", HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT));
1223*53ee8cc1Swenshuai.xi if (( (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB) == u8DispCntThreshold) ) &&
1224*53ee8cc1Swenshuai.xi ( (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD) || ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE)) ))
1225*53ee8cc1Swenshuai.xi {
1226*53ee8cc1Swenshuai.xi //HVD_PRINT("Flush success, flush_status: %d !!!\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS));
1227*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS, (MS_U32)E_HVD_EX_FLUSH_NONE);
1228*53ee8cc1Swenshuai.xi
1229*53ee8cc1Swenshuai.xi return TRUE;
1230*53ee8cc1Swenshuai.xi }
1231*53ee8cc1Swenshuai.xi else
1232*53ee8cc1Swenshuai.xi {
1233*53ee8cc1Swenshuai.xi return FALSE;
1234*53ee8cc1Swenshuai.xi }
1235*53ee8cc1Swenshuai.xi }
1236*53ee8cc1Swenshuai.xi
_HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id)1237*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_IsAllBufferEmpty_VP8(MS_U32 u32Id)
1238*53ee8cc1Swenshuai.xi {
1239*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1240*53ee8cc1Swenshuai.xi MS_U32 u32PlaybackType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
1241*53ee8cc1Swenshuai.xi MS_U32 u32FwIdleThreshold = 5000;
1242*53ee8cc1Swenshuai.xi MS_U32 u8DispCntThreshold = 0;
1243*53ee8cc1Swenshuai.xi
1244*53ee8cc1Swenshuai.xi if (u32PlaybackType == HVD_INIT_MAIN_FILE_RAW)
1245*53ee8cc1Swenshuai.xi {
1246*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) != 0)
1247*53ee8cc1Swenshuai.xi {
1248*53ee8cc1Swenshuai.xi return FALSE;
1249*53ee8cc1Swenshuai.xi }
1250*53ee8cc1Swenshuai.xi }
1251*53ee8cc1Swenshuai.xi
1252*53ee8cc1Swenshuai.xi #if 0
1253*53ee8cc1Swenshuai.xi if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1254*53ee8cc1Swenshuai.xi {
1255*53ee8cc1Swenshuai.xi u32FwIdleThreshold = 5;
1256*53ee8cc1Swenshuai.xi }
1257*53ee8cc1Swenshuai.xi #endif
1258*53ee8cc1Swenshuai.xi if(_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE))
1259*53ee8cc1Swenshuai.xi {
1260*53ee8cc1Swenshuai.xi if ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR) == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR) && HAL_HVD_EX_DispFrameAllViewed(u32Id)) &&
1261*53ee8cc1Swenshuai.xi ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold)||((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) )))
1262*53ee8cc1Swenshuai.xi {
1263*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS, (MS_U32)E_HVD_EX_FLUSH_NONE);
1264*53ee8cc1Swenshuai.xi
1265*53ee8cc1Swenshuai.xi return TRUE;
1266*53ee8cc1Swenshuai.xi }
1267*53ee8cc1Swenshuai.xi
1268*53ee8cc1Swenshuai.xi return FALSE;
1269*53ee8cc1Swenshuai.xi }
1270*53ee8cc1Swenshuai.xi // other Queues
1271*53ee8cc1Swenshuai.xi if (((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB) == 0) && (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB) == u8DispCntThreshold)) &&
1272*53ee8cc1Swenshuai.xi ((HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > u32FwIdleThreshold) || (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_FLUSH_STATUS) == E_HVD_EX_FLUSH_DONE) ))
1273*53ee8cc1Swenshuai.xi {
1274*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS, (MS_U32)E_HVD_EX_FLUSH_NONE);
1275*53ee8cc1Swenshuai.xi return TRUE;
1276*53ee8cc1Swenshuai.xi }
1277*53ee8cc1Swenshuai.xi else
1278*53ee8cc1Swenshuai.xi {
1279*53ee8cc1Swenshuai.xi return FALSE;
1280*53ee8cc1Swenshuai.xi }
1281*53ee8cc1Swenshuai.xi }
1282*53ee8cc1Swenshuai.xi
1283*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
_HVD_EX_ISRHandler(void)1284*53ee8cc1Swenshuai.xi static MS_S32 _HVD_EX_ISRHandler(void)
1285*53ee8cc1Swenshuai.xi {
1286*53ee8cc1Swenshuai.xi if (gHVDISRCtrl.pfnISRCallBack != NULL)
1287*53ee8cc1Swenshuai.xi {
1288*53ee8cc1Swenshuai.xi gHVDISRCtrl.bInISR = TRUE;
1289*53ee8cc1Swenshuai.xi gHVDISRCtrl.u32ISRInfo = HAL_HVD_EX_GetData(E_HVD_GDATA_HVD_ISR_STATUS);
1290*53ee8cc1Swenshuai.xi
1291*53ee8cc1Swenshuai.xi if (gHVDISRCtrl.u32ISRInfo)
1292*53ee8cc1Swenshuai.xi {
1293*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
1294*53ee8cc1Swenshuai.xi gHVDISRCtrl.pfnISRCallBack();
1295*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(TRUE);
1296*53ee8cc1Swenshuai.xi }
1297*53ee8cc1Swenshuai.xi }
1298*53ee8cc1Swenshuai.xi else
1299*53ee8cc1Swenshuai.xi {
1300*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1301*53ee8cc1Swenshuai.xi }
1302*53ee8cc1Swenshuai.xi
1303*53ee8cc1Swenshuai.xi gHVDISRCtrl.bInISR = FALSE;
1304*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetClearISR();
1305*53ee8cc1Swenshuai.xi if(TRUE == OSAL_HVD_ISR_Enable())//enable cpu interrupt mask
1306*53ee8cc1Swenshuai.xi {
1307*53ee8cc1Swenshuai.xi _bHVDDisableISRFlag = FALSE;
1308*53ee8cc1Swenshuai.xi }
1309*53ee8cc1Swenshuai.xi return 1;
1310*53ee8cc1Swenshuai.xi }
1311*53ee8cc1Swenshuai.xi #else
_HVD_EX_ISRHandler(void)1312*53ee8cc1Swenshuai.xi static void _HVD_EX_ISRHandler(void)
1313*53ee8cc1Swenshuai.xi {
1314*53ee8cc1Swenshuai.xi MS_U8 u8Idx;
1315*53ee8cc1Swenshuai.xi HVD_ISRCallBack pfnCb = NULL;
1316*53ee8cc1Swenshuai.xi MS_U8 hvd_index = 0;
1317*53ee8cc1Swenshuai.xi MS_U8 evd_index = 0;
1318*53ee8cc1Swenshuai.xi MS_BOOL hvd_exist = FALSE;
1319*53ee8cc1Swenshuai.xi MS_BOOL evd_exist = FALSE;
1320*53ee8cc1Swenshuai.xi
1321*53ee8cc1Swenshuai.xi
1322*53ee8cc1Swenshuai.xi //we can attach only one ISR, so we need to check the INT is from which decoder.
1323*53ee8cc1Swenshuai.xi for (u8Idx = 0; u8Idx < HVD_MAX_STREAMS; u8Idx++)
1324*53ee8cc1Swenshuai.xi {
1325*53ee8cc1Swenshuai.xi pfnCb = pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.pfnISRCallBack;
1326*53ee8cc1Swenshuai.xi
1327*53ee8cc1Swenshuai.xi if(pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bIsHvdIsr == TRUE)
1328*53ee8cc1Swenshuai.xi {
1329*53ee8cc1Swenshuai.xi hvd_exist = TRUE;
1330*53ee8cc1Swenshuai.xi hvd_index = u8Idx;
1331*53ee8cc1Swenshuai.xi }
1332*53ee8cc1Swenshuai.xi else
1333*53ee8cc1Swenshuai.xi {
1334*53ee8cc1Swenshuai.xi evd_exist = TRUE;
1335*53ee8cc1Swenshuai.xi evd_index = u8Idx;
1336*53ee8cc1Swenshuai.xi }
1337*53ee8cc1Swenshuai.xi
1338*53ee8cc1Swenshuai.xi if (pfnCb)
1339*53ee8cc1Swenshuai.xi {
1340*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = TRUE;
1341*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo =
1342*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid, E_HVD_GDATA_HVD_ISR_STATUS);
1343*53ee8cc1Swenshuai.xi
1344*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.u32ISRInfo)
1345*53ee8cc1Swenshuai.xi {
1346*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1347*53ee8cc1Swenshuai.xi //make fake stream id to disable/enable ISR.(only for calling HAL_HVD_EX_EnableISR)
1348*53ee8cc1Swenshuai.xi MS_U32 u32tempIdx = 0;
1349*53ee8cc1Swenshuai.xi u32tempIdx |= (u8Idx << 8);
1350*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32tempIdx, FALSE);
1351*53ee8cc1Swenshuai.xi pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1352*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32tempIdx, TRUE);
1353*53ee8cc1Swenshuai.xi #else
1354*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
1355*53ee8cc1Swenshuai.xi pfnCb(pHVDDrvContext->gHVDCtrl_EX[u8Idx].u32Sid);
1356*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(TRUE);
1357*53ee8cc1Swenshuai.xi #endif
1358*53ee8cc1Swenshuai.xi }
1359*53ee8cc1Swenshuai.xi }
1360*53ee8cc1Swenshuai.xi else
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("ISR callback is NULL.\n");
1363*53ee8cc1Swenshuai.xi }
1364*53ee8cc1Swenshuai.xi
1365*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8Idx].HVDISRCtrl.bInISR = FALSE;
1366*53ee8cc1Swenshuai.xi }
1367*53ee8cc1Swenshuai.xi
1368*53ee8cc1Swenshuai.xi if(hvd_exist == TRUE)
1369*53ee8cc1Swenshuai.xi {
1370*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1371*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetClearISR(hvd_index);
1372*53ee8cc1Swenshuai.xi #else
1373*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetClearISR();
1374*53ee8cc1Swenshuai.xi #endif
1375*53ee8cc1Swenshuai.xi if(TRUE == OSAL_HVD_ISR_Enable(pHVDDrvContext->gHVDCtrl_EX[hvd_index].HVDISRCtrl.bIsHvdIsr))//enable cpu interrupt mask
1376*53ee8cc1Swenshuai.xi {
1377*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDDisableISRFlag = FALSE;
1378*53ee8cc1Swenshuai.xi }
1379*53ee8cc1Swenshuai.xi }
1380*53ee8cc1Swenshuai.xi
1381*53ee8cc1Swenshuai.xi if(evd_exist == TRUE)
1382*53ee8cc1Swenshuai.xi {
1383*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1384*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetClearISR(evd_index);
1385*53ee8cc1Swenshuai.xi #else
1386*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetClearISR();
1387*53ee8cc1Swenshuai.xi #endif
1388*53ee8cc1Swenshuai.xi if(TRUE == OSAL_HVD_ISR_Enable(pHVDDrvContext->gHVDCtrl_EX[evd_index].HVDISRCtrl.bIsHvdIsr))//enable cpu interrupt mask
1389*53ee8cc1Swenshuai.xi {
1390*53ee8cc1Swenshuai.xi pHVDDrvContext->bEVDDisableISRFlag = FALSE;
1391*53ee8cc1Swenshuai.xi }
1392*53ee8cc1Swenshuai.xi }
1393*53ee8cc1Swenshuai.xi }
1394*53ee8cc1Swenshuai.xi #endif
1395*53ee8cc1Swenshuai.xi
_HVD_EX_RecoverySettings(MS_U32 u32Id)1396*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_RecoverySettings(MS_U32 u32Id)
1397*53ee8cc1Swenshuai.xi {
1398*53ee8cc1Swenshuai.xi // TODO: complete this function. and consider more cases. step decoder, display?
1399*53ee8cc1Swenshuai.xi HVD_EX_Result eRst = E_HVD_EX_OK;
1400*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1401*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1402*53ee8cc1Swenshuai.xi
1403*53ee8cc1Swenshuai.xi switch (pCtrl->InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK)
1404*53ee8cc1Swenshuai.xi {
1405*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_LIVE_STREAM:
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi // temp solution
1408*53ee8cc1Swenshuai.xi // must before play().
1409*53ee8cc1Swenshuai.xi if ((pCtrl->Settings.DispInfoTH.u32FrmrateLowBound != 0) ||
1410*53ee8cc1Swenshuai.xi (pCtrl->Settings.DispInfoTH.u32FrmrateUpBound != 0) ||
1411*53ee8cc1Swenshuai.xi (pCtrl->Settings.DispInfoTH.u32MvopLowBound != 0) || (pCtrl->Settings.DispInfoTH.u32MvopUpBound != 0))
1412*53ee8cc1Swenshuai.xi {
1413*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISP_INFO_TH, (MS_U32) (&pCtrl->Settings.DispInfoTH));
1414*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
1415*53ee8cc1Swenshuai.xi }
1416*53ee8cc1Swenshuai.xi
1417*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u32IsrEvent)
1418*53ee8cc1Swenshuai.xi {
1419*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, pCtrl->Settings.u32IsrEvent);
1420*53ee8cc1Swenshuai.xi }
1421*53ee8cc1Swenshuai.xi
1422*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1423*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, pCtrl->Settings.bEnISR);
1424*53ee8cc1Swenshuai.xi #else
1425*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(pCtrl->Settings.bEnISR);
1426*53ee8cc1Swenshuai.xi #endif
1427*53ee8cc1Swenshuai.xi // play()
1428*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
1429*53ee8cc1Swenshuai.xi
1430*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u8SkipMode)
1431*53ee8cc1Swenshuai.xi {
1432*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK != (eRst = MDrv_HVD_EX_SetSkipDecMode(u32Id, (HVD_EX_SkipDecode) (pCtrl->Settings.u8SkipMode))))
1433*53ee8cc1Swenshuai.xi {
1434*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Set Skip Mode fail!!.\n");
1435*53ee8cc1Swenshuai.xi return eRst;
1436*53ee8cc1Swenshuai.xi }
1437*53ee8cc1Swenshuai.xi }
1438*53ee8cc1Swenshuai.xi
1439*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bIsShowErrFrm)
1440*53ee8cc1Swenshuai.xi {
1441*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ERR_FRM, TRUE);
1442*53ee8cc1Swenshuai.xi }
1443*53ee8cc1Swenshuai.xi
1444*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u8FrcMode)
1445*53ee8cc1Swenshuai.xi {
1446*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK != (eRst = MDrv_HVD_EX_SetFrcMode(u8DrvId, (HVD_EX_FrmRateConvMode) (pCtrl->Settings.u8FrcMode))))
1447*53ee8cc1Swenshuai.xi {
1448*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Set Frc Mode fail!!.\n");
1449*53ee8cc1Swenshuai.xi return eRst;
1450*53ee8cc1Swenshuai.xi }
1451*53ee8cc1Swenshuai.xi }
1452*53ee8cc1Swenshuai.xi
1453*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bIsErrConceal)
1454*53ee8cc1Swenshuai.xi {
1455*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL, TRUE);
1456*53ee8cc1Swenshuai.xi }
1457*53ee8cc1Swenshuai.xi
1458*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bAutoFreeES)
1459*53ee8cc1Swenshuai.xi {
1460*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AUTO_FREE_ES, TRUE);
1461*53ee8cc1Swenshuai.xi }
1462*53ee8cc1Swenshuai.xi
1463*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bDisDeblocking)
1464*53ee8cc1Swenshuai.xi {
1465*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_DBF, TRUE);
1466*53ee8cc1Swenshuai.xi }
1467*53ee8cc1Swenshuai.xi
1468*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bDisQuarterPixel)
1469*53ee8cc1Swenshuai.xi {
1470*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
1471*53ee8cc1Swenshuai.xi }
1472*53ee8cc1Swenshuai.xi
1473*53ee8cc1Swenshuai.xi if (pCtrl->Settings.bIsSyncOn)
1474*53ee8cc1Swenshuai.xi {
1475*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_ACTIVE, TRUE);
1476*53ee8cc1Swenshuai.xi }
1477*53ee8cc1Swenshuai.xi
1478*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u32SyncTolerance)
1479*53ee8cc1Swenshuai.xi {
1480*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TOLERANCE, pCtrl->Settings.u32SyncTolerance);
1481*53ee8cc1Swenshuai.xi }
1482*53ee8cc1Swenshuai.xi
1483*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u32SyncRepeatTH)
1484*53ee8cc1Swenshuai.xi {
1485*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_THRESHOLD, pCtrl->Settings.u32SyncRepeatTH);
1486*53ee8cc1Swenshuai.xi }
1487*53ee8cc1Swenshuai.xi
1488*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u32SyncVideoDelay)
1489*53ee8cc1Swenshuai.xi {
1490*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, pCtrl->Settings.u32SyncVideoDelay);
1491*53ee8cc1Swenshuai.xi }
1492*53ee8cc1Swenshuai.xi
1493*53ee8cc1Swenshuai.xi if (pCtrl->Settings.u32SyncFreeRunTH)
1494*53ee8cc1Swenshuai.xi {
1495*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREERUN_THRESHOLD, pCtrl->Settings.u32SyncFreeRunTH);
1496*53ee8cc1Swenshuai.xi }
1497*53ee8cc1Swenshuai.xi
1498*53ee8cc1Swenshuai.xi if (E_HVD_BURST_CNT_DISABLE != (HVD_MIU_Burst_Cnt_Ctrl) pCtrl->Settings.u32MiuBurstLevel)
1499*53ee8cc1Swenshuai.xi {
1500*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_MIU_BURST_CNT, pCtrl->Settings.u32MiuBurstLevel);
1501*53ee8cc1Swenshuai.xi }
1502*53ee8cc1Swenshuai.xi
1503*53ee8cc1Swenshuai.xi //HAL_HVD_EX_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
1504*53ee8cc1Swenshuai.xi pCtrl->bStepDecoding = 0;
1505*53ee8cc1Swenshuai.xi
1506*53ee8cc1Swenshuai.xi break;
1507*53ee8cc1Swenshuai.xi }
1508*53ee8cc1Swenshuai.xi case HVD_INIT_MAIN_FILE_RAW:
1509*53ee8cc1Swenshuai.xi default:
1510*53ee8cc1Swenshuai.xi pCtrl->bStepDecoding = 0;
1511*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
1512*53ee8cc1Swenshuai.xi break;
1513*53ee8cc1Swenshuai.xi }
1514*53ee8cc1Swenshuai.xi
1515*53ee8cc1Swenshuai.xi return eRst;
1516*53ee8cc1Swenshuai.xi }
1517*53ee8cc1Swenshuai.xi
_HVD_EX_Rst(MS_U32 u32Id,MS_BOOL bErrHandle)1518*53ee8cc1Swenshuai.xi HVD_EX_Result _HVD_EX_Rst(MS_U32 u32Id, MS_BOOL bErrHandle)
1519*53ee8cc1Swenshuai.xi {
1520*53ee8cc1Swenshuai.xi HVD_EX_Result eRst = E_HVD_EX_RET_ILLEGAL_ACCESS;
1521*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1522*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1523*53ee8cc1Swenshuai.xi
1524*53ee8cc1Swenshuai.xi if (bErrHandle == TRUE)
1525*53ee8cc1Swenshuai.xi {
1526*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
1527*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
1528*53ee8cc1Swenshuai.xi }
1529*53ee8cc1Swenshuai.xi
1530*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsIniting[u8DrvId] = TRUE;
1531*53ee8cc1Swenshuai.xi
1532*53ee8cc1Swenshuai.xi #if (defined(CHIP_EAGLE) || defined(CHIP_EMERALD) || defined(CHIP_EDISON) || defined(CHIP_AGATE) || defined(CHIP_NUGGET) || defined(CHIP_NIKON) || defined(CHIP_MUJI) || defined(CHIP_MONET))
1533*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
1534*53ee8cc1Swenshuai.xi {
1535*53ee8cc1Swenshuai.xi HAL_HVD_EX_RM_PATCH(u32Id);
1536*53ee8cc1Swenshuai.xi }
1537*53ee8cc1Swenshuai.xi #endif
1538*53ee8cc1Swenshuai.xi
1539*53ee8cc1Swenshuai.xi #if (defined(CHIP_NAPOLI))
1540*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
1541*53ee8cc1Swenshuai.xi {
1542*53ee8cc1Swenshuai.xi if(!HAL_HVD_EX_Is_RM_Supported(u32Id))
1543*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_UNSUPPORTED;
1544*53ee8cc1Swenshuai.xi }
1545*53ee8cc1Swenshuai.xi #endif
1546*53ee8cc1Swenshuai.xi
1547*53ee8cc1Swenshuai.xi
1548*53ee8cc1Swenshuai.xi #if defined(HIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1549*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, FALSE);
1550*53ee8cc1Swenshuai.xi #else
1551*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
1552*53ee8cc1Swenshuai.xi #endif
1553*53ee8cc1Swenshuai.xi
1554*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1555*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1556*53ee8cc1Swenshuai.xi #endif
1557*53ee8cc1Swenshuai.xi
1558*53ee8cc1Swenshuai.xi eRst = _HVD_EX_RstVariables(u32Id);
1559*53ee8cc1Swenshuai.xi
1560*53ee8cc1Swenshuai.xi if (eRst != E_HVD_EX_OK)
1561*53ee8cc1Swenshuai.xi {
1562*53ee8cc1Swenshuai.xi goto DRV_HVD_Rst_Failed;
1563*53ee8cc1Swenshuai.xi }
1564*53ee8cc1Swenshuai.xi
1565*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1566*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1567*53ee8cc1Swenshuai.xi #endif
1568*53ee8cc1Swenshuai.xi
1569*53ee8cc1Swenshuai.xi eRst = (HVD_EX_Result) HAL_HVD_EX_InitShareMem(u32Id);
1570*53ee8cc1Swenshuai.xi
1571*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK != eRst)
1572*53ee8cc1Swenshuai.xi {
1573*53ee8cc1Swenshuai.xi goto DRV_HVD_Rst_Failed;
1574*53ee8cc1Swenshuai.xi }
1575*53ee8cc1Swenshuai.xi
1576*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1577*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1578*53ee8cc1Swenshuai.xi #endif
1579*53ee8cc1Swenshuai.xi
1580*53ee8cc1Swenshuai.xi eRst = _HVD_EX_InitRegCPU(u32Id);
1581*53ee8cc1Swenshuai.xi
1582*53ee8cc1Swenshuai.xi if (eRst != E_HVD_EX_OK)
1583*53ee8cc1Swenshuai.xi {
1584*53ee8cc1Swenshuai.xi goto DRV_HVD_Rst_Failed;
1585*53ee8cc1Swenshuai.xi }
1586*53ee8cc1Swenshuai.xi
1587*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1588*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
1589*53ee8cc1Swenshuai.xi #endif
1590*53ee8cc1Swenshuai.xi
1591*53ee8cc1Swenshuai.xi eRst = _HVD_EX_InitFW(u32Id);
1592*53ee8cc1Swenshuai.xi
1593*53ee8cc1Swenshuai.xi if (eRst != E_HVD_EX_OK)
1594*53ee8cc1Swenshuai.xi {
1595*53ee8cc1Swenshuai.xi goto DRV_HVD_Rst_Failed;
1596*53ee8cc1Swenshuai.xi }
1597*53ee8cc1Swenshuai.xi
1598*53ee8cc1Swenshuai.xi eRst = E_HVD_EX_OK;
1599*53ee8cc1Swenshuai.xi
1600*53ee8cc1Swenshuai.xi DRV_HVD_Rst_Failed:
1601*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
1602*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, pCtrl->Settings.bEnISR);
1603*53ee8cc1Swenshuai.xi #else
1604*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(pCtrl->Settings.bEnISR);
1605*53ee8cc1Swenshuai.xi #endif
1606*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsIniting[u8DrvId] = FALSE;
1607*53ee8cc1Swenshuai.xi
1608*53ee8cc1Swenshuai.xi return eRst;
1609*53ee8cc1Swenshuai.xi }
1610*53ee8cc1Swenshuai.xi
_HVD_EX_GetDrvId(MS_U32 u32Id)1611*53ee8cc1Swenshuai.xi static MS_U8 _HVD_EX_GetDrvId(MS_U32 u32Id)
1612*53ee8cc1Swenshuai.xi {
1613*53ee8cc1Swenshuai.xi return (0xFF & (u32Id >> 16));
1614*53ee8cc1Swenshuai.xi }
1615*53ee8cc1Swenshuai.xi
_HVD_EX_GetDispInfo(MS_U32 u32Id,HVD_EX_DispInfo * pInfo,MS_BOOL bClearSeqChg)1616*53ee8cc1Swenshuai.xi static HVD_EX_Result _HVD_EX_GetDispInfo(MS_U32 u32Id, HVD_EX_DispInfo *pInfo, MS_BOOL bClearSeqChg)
1617*53ee8cc1Swenshuai.xi {
1618*53ee8cc1Swenshuai.xi MS_U32 u32Seqtimes = 10;
1619*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
1620*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1621*53ee8cc1Swenshuai.xi MS_U32 u32DispInfoAddr = 0;
1622*53ee8cc1Swenshuai.xi
1623*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
1624*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
1625*53ee8cc1Swenshuai.xi
1626*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
1627*53ee8cc1Swenshuai.xi {
1628*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_CheckDispInfoRdy(u32Id) == E_HVD_EX_RET_NOTREADY)
1629*53ee8cc1Swenshuai.xi {
1630*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_NOTREADY;
1631*53ee8cc1Swenshuai.xi }
1632*53ee8cc1Swenshuai.xi }
1633*53ee8cc1Swenshuai.xi
1634*53ee8cc1Swenshuai.xi if (pInfo == NULL)
1635*53ee8cc1Swenshuai.xi {
1636*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
1637*53ee8cc1Swenshuai.xi }
1638*53ee8cc1Swenshuai.xi
1639*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
1640*53ee8cc1Swenshuai.xi
1641*53ee8cc1Swenshuai.xi if (TRUE == bClearSeqChg)
1642*53ee8cc1Swenshuai.xi {
1643*53ee8cc1Swenshuai.xi HVD_GETDISPINFO_START:
1644*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_GET_DISP_INFO_START, 0);
1645*53ee8cc1Swenshuai.xi u32DispInfoAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
1646*53ee8cc1Swenshuai.xi if(u32DispInfoAddr == 0)
1647*53ee8cc1Swenshuai.xi {
1648*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_NOTREADY;
1649*53ee8cc1Swenshuai.xi }
1650*53ee8cc1Swenshuai.xi HVD_memcpy((void *) pInfo, (void *) u32DispInfoAddr, sizeof(HVD_Display_Info));
1651*53ee8cc1Swenshuai.xi //Check if another SeqChg occurs
1652*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_UNCOPYED))
1653*53ee8cc1Swenshuai.xi {
1654*53ee8cc1Swenshuai.xi u32Seqtimes--;
1655*53ee8cc1Swenshuai.xi if (u32Seqtimes > 0)
1656*53ee8cc1Swenshuai.xi {
1657*53ee8cc1Swenshuai.xi goto HVD_GETDISPINFO_START;
1658*53ee8cc1Swenshuai.xi }
1659*53ee8cc1Swenshuai.xi else
1660*53ee8cc1Swenshuai.xi {
1661*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("GetDispInfo Timeout:%d\n",
1662*53ee8cc1Swenshuai.xi (MS_S16) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_UNCOPYED));
1663*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, E_HVD_EX_RET_TIMEOUT);
1664*53ee8cc1Swenshuai.xi }
1665*53ee8cc1Swenshuai.xi }
1666*53ee8cc1Swenshuai.xi }
1667*53ee8cc1Swenshuai.xi else
1668*53ee8cc1Swenshuai.xi {
1669*53ee8cc1Swenshuai.xi u32DispInfoAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
1670*53ee8cc1Swenshuai.xi if(u32DispInfoAddr == 0)
1671*53ee8cc1Swenshuai.xi {
1672*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_NOTREADY;
1673*53ee8cc1Swenshuai.xi }
1674*53ee8cc1Swenshuai.xi HVD_memcpy((void *) pInfo, (void *)u32DispInfoAddr, sizeof(HVD_Display_Info));
1675*53ee8cc1Swenshuai.xi }
1676*53ee8cc1Swenshuai.xi
1677*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
1678*53ee8cc1Swenshuai.xi
1679*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg)
1680*53ee8cc1Swenshuai.xi {
1681*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u32FrameRate=%lu, u8Interlace=%x, u16HorSize=%u, u16VerSize=%u, \
1682*53ee8cc1Swenshuai.xi u16Crop R/L=%u/%u, u16Crop B/T=%u/%u, u8AspectRate=%u, u16SarWidth=%u \
1683*53ee8cc1Swenshuai.xi u16SarHeight=%u, u16Pitch=%u, u8ColourPrimaries=%u\n",
1684*53ee8cc1Swenshuai.xi pInfo->u32FrameRate,
1685*53ee8cc1Swenshuai.xi pInfo->u8Interlace,
1686*53ee8cc1Swenshuai.xi pInfo->u16HorSize,
1687*53ee8cc1Swenshuai.xi pInfo->u16VerSize,
1688*53ee8cc1Swenshuai.xi pInfo->u16CropRight, pInfo->u16CropLeft,
1689*53ee8cc1Swenshuai.xi pInfo->u16CropBottom, pInfo->u16CropTop,
1690*53ee8cc1Swenshuai.xi pInfo->u8AspectRate,
1691*53ee8cc1Swenshuai.xi pInfo->u16SarWidth,
1692*53ee8cc1Swenshuai.xi pInfo->u16SarHeight,
1693*53ee8cc1Swenshuai.xi pInfo->u16Pitch,
1694*53ee8cc1Swenshuai.xi pInfo->u8ColourPrimaries);
1695*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = FALSE;
1696*53ee8cc1Swenshuai.xi }
1697*53ee8cc1Swenshuai.xi
1698*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
1699*53ee8cc1Swenshuai.xi }
1700*53ee8cc1Swenshuai.xi
_HVD_EX_ReportLow32BitPTS(MS_U32 u32Id,MS_U32 u32PTS)1701*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_ReportLow32BitPTS(MS_U32 u32Id, MS_U32 u32PTS)
1702*53ee8cc1Swenshuai.xi {
1703*53ee8cc1Swenshuai.xi MS_U32 u32RetPTS = u32PTS;
1704*53ee8cc1Swenshuai.xi MS_U32 u32UpperInMs = (HVD_U32_MAX/90);
1705*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1706*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1707*53ee8cc1Swenshuai.xi
1708*53ee8cc1Swenshuai.xi if(u32RetPTS != HVD_U32_MAX)
1709*53ee8cc1Swenshuai.xi {
1710*53ee8cc1Swenshuai.xi if (pCtrl->InitParams.u8TimeUnit)
1711*53ee8cc1Swenshuai.xi {
1712*53ee8cc1Swenshuai.xi //unit: ms
1713*53ee8cc1Swenshuai.xi if (u32RetPTS > u32UpperInMs)
1714*53ee8cc1Swenshuai.xi {
1715*53ee8cc1Swenshuai.xi u32RetPTS = u32RetPTS - u32UpperInMs;
1716*53ee8cc1Swenshuai.xi }
1717*53ee8cc1Swenshuai.xi }
1718*53ee8cc1Swenshuai.xi else
1719*53ee8cc1Swenshuai.xi {
1720*53ee8cc1Swenshuai.xi //unit: 90KHz, bit 33 is not included in u32PTS, no need to handle
1721*53ee8cc1Swenshuai.xi }
1722*53ee8cc1Swenshuai.xi }
1723*53ee8cc1Swenshuai.xi return u32RetPTS;
1724*53ee8cc1Swenshuai.xi }
1725*53ee8cc1Swenshuai.xi
_HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode)1726*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDErrCode(MS_U32 u32ErrCode)
1727*53ee8cc1Swenshuai.xi {
1728*53ee8cc1Swenshuai.xi
1729*53ee8cc1Swenshuai.xi MS_U32 u32Ret=E_HVD_EX_ERRCODE_GENERAL_BASE;
1730*53ee8cc1Swenshuai.xi
1731*53ee8cc1Swenshuai.xi
1732*53ee8cc1Swenshuai.xi switch (u32ErrCode)
1733*53ee8cc1Swenshuai.xi {
1734*53ee8cc1Swenshuai.xi case E_HVD_ERR_OUT_OF_SPEC:
1735*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_OUT_OF_SPEC;
1736*53ee8cc1Swenshuai.xi break;
1737*53ee8cc1Swenshuai.xi case E_HVD_ERR_UNKNOW_ERR:
1738*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_UNKNOW_ERR;
1739*53ee8cc1Swenshuai.xi break;
1740*53ee8cc1Swenshuai.xi case E_HVD_ERR_HW_BREAK_DOWN:
1741*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_HW_BREAK_DOWN;
1742*53ee8cc1Swenshuai.xi break;
1743*53ee8cc1Swenshuai.xi case E_HVD_ERR_HW_DEC_TIMEOUT:
1744*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_HW_DEC_TIMEOUT;
1745*53ee8cc1Swenshuai.xi break;
1746*53ee8cc1Swenshuai.xi case E_HVD_ERR_OUT_OF_MEMORY:
1747*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_OUT_OF_MEMORY;
1748*53ee8cc1Swenshuai.xi break;
1749*53ee8cc1Swenshuai.xi case E_HVD_ERR_UNKNOWN_CODEC:
1750*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_UNKNOWN_CODEC;
1751*53ee8cc1Swenshuai.xi break;
1752*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_SPS_BROKEN:
1753*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_BROKEN;
1754*53ee8cc1Swenshuai.xi break;
1755*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_SPS_NOT_IN_SPEC:
1756*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_NOT_IN_SPEC;
1757*53ee8cc1Swenshuai.xi break;
1758*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_SPS_NOT_ENOUGH_FRM:
1759*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_SPS_NOT_ENOUGH_FRM;
1760*53ee8cc1Swenshuai.xi break;
1761*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_PPS_BROKEN:
1762*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_PPS_BROKEN;
1763*53ee8cc1Swenshuai.xi break;
1764*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_REF_LIST:
1765*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_REF_LIST;
1766*53ee8cc1Swenshuai.xi break;
1767*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_NO_REF:
1768*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_NO_REF;
1769*53ee8cc1Swenshuai.xi break;
1770*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVC_RES:
1771*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVC_RES;
1772*53ee8cc1Swenshuai.xi break;
1773*53ee8cc1Swenshuai.xi case E_HVD_ERR_AVS_RES:
1774*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_AVS_RES;
1775*53ee8cc1Swenshuai.xi break;
1776*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_PACKET_HEADER:
1777*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_PACKET_HEADER;
1778*53ee8cc1Swenshuai.xi break;
1779*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_FRAME_HEADER:
1780*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_FRAME_HEADER;
1781*53ee8cc1Swenshuai.xi break;
1782*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_SLICE_HEADER:
1783*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_SLICE_HEADER;
1784*53ee8cc1Swenshuai.xi break;
1785*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_BYTE_CNT:
1786*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_BYTE_CNT;
1787*53ee8cc1Swenshuai.xi break;
1788*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_DISP_TIMEOUT:
1789*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_DISP_TIMEOUT;
1790*53ee8cc1Swenshuai.xi break;
1791*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_NO_REF:
1792*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_NO_REF;
1793*53ee8cc1Swenshuai.xi break;
1794*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_RES:
1795*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_RES;
1796*53ee8cc1Swenshuai.xi break;
1797*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_VLC:
1798*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_VLC;
1799*53ee8cc1Swenshuai.xi break;
1800*53ee8cc1Swenshuai.xi case E_HVD_ERR_RM_SIZE_OUT_FB_LAYOUT:
1801*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ERRCODE_RM_SIZE_OUT_FB_LAYOUT;
1802*53ee8cc1Swenshuai.xi break;
1803*53ee8cc1Swenshuai.xi default:
1804*53ee8cc1Swenshuai.xi break;
1805*53ee8cc1Swenshuai.xi }
1806*53ee8cc1Swenshuai.xi return u32Ret;
1807*53ee8cc1Swenshuai.xi }
1808*53ee8cc1Swenshuai.xi
_HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus)1809*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_Map2HVDESBufStatus(MS_U32 u32ESBufStatus)
1810*53ee8cc1Swenshuai.xi {
1811*53ee8cc1Swenshuai.xi
1812*53ee8cc1Swenshuai.xi MS_U32 u32Ret = E_HVD_EX_ES_BUF_STATUS_UNKNOWN;
1813*53ee8cc1Swenshuai.xi
1814*53ee8cc1Swenshuai.xi
1815*53ee8cc1Swenshuai.xi switch (u32ESBufStatus)
1816*53ee8cc1Swenshuai.xi {
1817*53ee8cc1Swenshuai.xi case E_HVD_ES_BUF_STATUS_UNDERFLOW:
1818*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ES_BUF_STATUS_UNDERFLOW;
1819*53ee8cc1Swenshuai.xi break;
1820*53ee8cc1Swenshuai.xi case E_HVD_ES_BUF_STATUS_OVERFLOW:
1821*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ES_BUF_STATUS_OVERFLOW;
1822*53ee8cc1Swenshuai.xi break;
1823*53ee8cc1Swenshuai.xi case E_HVD_ES_BUF_STATUS_NORMAL:
1824*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_ES_BUF_STATUS_NORMAL;
1825*53ee8cc1Swenshuai.xi break;
1826*53ee8cc1Swenshuai.xi default:
1827*53ee8cc1Swenshuai.xi break;
1828*53ee8cc1Swenshuai.xi }
1829*53ee8cc1Swenshuai.xi return u32Ret;
1830*53ee8cc1Swenshuai.xi }
1831*53ee8cc1Swenshuai.xi
1832*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1833*53ee8cc1Swenshuai.xi // Global Functions
1834*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1835*53ee8cc1Swenshuai.xi
1836*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1837*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetOSRegBase()
1838*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set system register base
1839*53ee8cc1Swenshuai.xi /// @param -u32RegBaseAddr \b IN : system register base
1840*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetOSRegBase(MS_U32 u32RegBaseAddr)1841*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetOSRegBase(MS_U32 u32RegBaseAddr)
1842*53ee8cc1Swenshuai.xi {
1843*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u32RiuBaseAddr=%lx\n", u32RegBaseAddr);
1844*53ee8cc1Swenshuai.xi HAL_HVD_EX_InitRegBase(u32RegBaseAddr);
1845*53ee8cc1Swenshuai.xi }
1846*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetCtrlsBase(MS_U32 u32Id)1847*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetCtrlsBase(MS_U32 u32Id)
1848*53ee8cc1Swenshuai.xi {
1849*53ee8cc1Swenshuai.xi // for MJPEG, need to be modified later
1850*53ee8cc1Swenshuai.xi MS_U8 u8Offset = HAL_VPU_EX_GetTaskId(u32Id);
1851*53ee8cc1Swenshuai.xi UNUSED(u8Offset);
1852*53ee8cc1Swenshuai.xi // The Driver Ctrl base should be set with parameter [0]
1853*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
1854*53ee8cc1Swenshuai.xi
1855*53ee8cc1Swenshuai.xi }
1856*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_MJPEG_InitSharemem(MS_U32 u32Id,MS_U32 u32CodeBufVAddr)1857*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_MJPEG_InitSharemem(MS_U32 u32Id, MS_U32 u32CodeBufVAddr)
1858*53ee8cc1Swenshuai.xi {
1859*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1860*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl1 = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
1861*53ee8cc1Swenshuai.xi memset((void *) pCtrl1, 0, sizeof(HVD_EX_Drv_Ctrl));
1862*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufVAddr = u32CodeBufVAddr;
1863*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr = MS_VA2PA(u32CodeBufVAddr);
1864*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
1865*53ee8cc1Swenshuai.xi HVD_Pre_Ctrl *pCtrl = &(pHVDDrvContext->gHVDPreCtrl[u8DrvId]);
1866*53ee8cc1Swenshuai.xi
1867*53ee8cc1Swenshuai.xi memset((void *) pCtrl, 0, sizeof(HVD_Pre_Ctrl));
1868*53ee8cc1Swenshuai.xi
1869*53ee8cc1Swenshuai.xi // PreSetControl
1870*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetPreCtrlVariables(u32Id,(MS_U32)(&pHVDDrvContext->gHVDPreCtrl[u8DrvId]));
1871*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("u8DrvId=%d, PA:[0x%lx, 0x%lx], VA:[0x%lx, 0x%lx], [0x%lx]\n", u8DrvId,
1872*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[0].MemMap.u32CodeBufAddr,
1873*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[1].MemMap.u32CodeBufAddr,
1874*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[0].MemMap.u32CodeBufVAddr,
1875*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[1].MemMap.u32CodeBufVAddr,
1876*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetShmAddr(u32Id));
1877*53ee8cc1Swenshuai.xi
1878*53ee8cc1Swenshuai.xi HAL_HVD_EX_InitShareMem(u32Id);
1879*53ee8cc1Swenshuai.xi
1880*53ee8cc1Swenshuai.xi }
1881*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_MJPEG_Exit(MS_U32 u32Id)1882*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_MJPEG_Exit(MS_U32 u32Id)
1883*53ee8cc1Swenshuai.xi {
1884*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
1885*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId] = FALSE;
1886*53ee8cc1Swenshuai.xi }
1887*53ee8cc1Swenshuai.xi
MDrv_HVD_Init_Share_Mem(void)1888*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_Init_Share_Mem(void)
1889*53ee8cc1Swenshuai.xi {
1890*53ee8cc1Swenshuai.xi #if ((defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_ECOS)) && (!defined(SUPPORT_X_MODEL_FEATURE)))
1891*53ee8cc1Swenshuai.xi MS_U32 u32ShmId;
1892*53ee8cc1Swenshuai.xi MS_VIRT u32Addr;
1893*53ee8cc1Swenshuai.xi MS_U32 u32BufSize;
1894*53ee8cc1Swenshuai.xi
1895*53ee8cc1Swenshuai.xi
1896*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId( (MS_U8*)"Linux HVD driver",
1897*53ee8cc1Swenshuai.xi sizeof(HVD_Drv_CTX),
1898*53ee8cc1Swenshuai.xi &u32ShmId,
1899*53ee8cc1Swenshuai.xi &u32Addr,
1900*53ee8cc1Swenshuai.xi &u32BufSize,
1901*53ee8cc1Swenshuai.xi MSOS_SHM_QUERY))
1902*53ee8cc1Swenshuai.xi {
1903*53ee8cc1Swenshuai.xi if (FALSE == MsOS_SHM_GetId((MS_U8*)"Linux HVD driver",
1904*53ee8cc1Swenshuai.xi sizeof(HVD_Drv_CTX),
1905*53ee8cc1Swenshuai.xi &u32ShmId,
1906*53ee8cc1Swenshuai.xi &u32Addr,
1907*53ee8cc1Swenshuai.xi &u32BufSize,
1908*53ee8cc1Swenshuai.xi MSOS_SHM_CREATE))
1909*53ee8cc1Swenshuai.xi {
1910*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("[%s]SHM allocation failed!!!use global structure instead!!!\n",__FUNCTION__);
1911*53ee8cc1Swenshuai.xi if(pHVDDrvContext == NULL)
1912*53ee8cc1Swenshuai.xi {
1913*53ee8cc1Swenshuai.xi pHVDDrvContext = &gHVDDrvContext;
1914*53ee8cc1Swenshuai.xi memset(pHVDDrvContext,0,sizeof(HVD_Drv_CTX));
1915*53ee8cc1Swenshuai.xi _HVD_EX_Context_Init();
1916*53ee8cc1Swenshuai.xi HVD_PRINT("[%s]Global structure init Success!!!\n",__FUNCTION__);
1917*53ee8cc1Swenshuai.xi }
1918*53ee8cc1Swenshuai.xi else
1919*53ee8cc1Swenshuai.xi {
1920*53ee8cc1Swenshuai.xi HVD_PRINT("[%s]Global structure exists!!!\n",__FUNCTION__);
1921*53ee8cc1Swenshuai.xi }
1922*53ee8cc1Swenshuai.xi //return E_HVD_EX_FAIL;
1923*53ee8cc1Swenshuai.xi }
1924*53ee8cc1Swenshuai.xi else
1925*53ee8cc1Swenshuai.xi {
1926*53ee8cc1Swenshuai.xi memset((MS_U8*)u32Addr,0,sizeof(HVD_Drv_CTX));
1927*53ee8cc1Swenshuai.xi pHVDDrvContext = (HVD_Drv_CTX*)u32Addr; // for one process
1928*53ee8cc1Swenshuai.xi _HVD_EX_Context_Init();
1929*53ee8cc1Swenshuai.xi }
1930*53ee8cc1Swenshuai.xi }
1931*53ee8cc1Swenshuai.xi else
1932*53ee8cc1Swenshuai.xi {
1933*53ee8cc1Swenshuai.xi pHVDDrvContext = (HVD_Drv_CTX*)u32Addr; // for another process
1934*53ee8cc1Swenshuai.xi }
1935*53ee8cc1Swenshuai.xi #else
1936*53ee8cc1Swenshuai.xi if(pHVDDrvContext == NULL)
1937*53ee8cc1Swenshuai.xi {
1938*53ee8cc1Swenshuai.xi pHVDDrvContext = &gHVDDrvContext;
1939*53ee8cc1Swenshuai.xi memset(pHVDDrvContext,0,sizeof(HVD_Drv_CTX));
1940*53ee8cc1Swenshuai.xi _HVD_EX_Context_Init();
1941*53ee8cc1Swenshuai.xi }
1942*53ee8cc1Swenshuai.xi #endif
1943*53ee8cc1Swenshuai.xi
1944*53ee8cc1Swenshuai.xi if(HAL_HVD_EX_Init_Share_Mem() != TRUE)
1945*53ee8cc1Swenshuai.xi {
1946*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
1947*53ee8cc1Swenshuai.xi }
1948*53ee8cc1Swenshuai.xi
1949*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
1950*53ee8cc1Swenshuai.xi
1951*53ee8cc1Swenshuai.xi if(HAL_VPU_EX_Init_Share_Mem() != TRUE)
1952*53ee8cc1Swenshuai.xi {
1953*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
1954*53ee8cc1Swenshuai.xi }
1955*53ee8cc1Swenshuai.xi
1956*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
1957*53ee8cc1Swenshuai.xi }
1958*53ee8cc1Swenshuai.xi
1959*53ee8cc1Swenshuai.xi // Action
MDrv_HVD_EX_GetFreeStream(MS_U32 * pu32Id,HVD_EX_DRV_StreamType eStreamType)1960*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFreeStream(MS_U32 *pu32Id, HVD_EX_DRV_StreamType eStreamType)
1961*53ee8cc1Swenshuai.xi {
1962*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
1963*53ee8cc1Swenshuai.xi MS_U32 i = 0;
1964*53ee8cc1Swenshuai.xi MS_U32 u32VPUStreamId = 0;
1965*53ee8cc1Swenshuai.xi MS_U32 u32HVDStreamId = 0;
1966*53ee8cc1Swenshuai.xi
1967*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
1968*53ee8cc1Swenshuai.xi
1969*53ee8cc1Swenshuai.xi //Get drvIdx
1970*53ee8cc1Swenshuai.xi switch (eStreamType)
1971*53ee8cc1Swenshuai.xi {
1972*53ee8cc1Swenshuai.xi case E_HVD_EX_DRV_MAIN_STREAM:
1973*53ee8cc1Swenshuai.xi i = 0;
1974*53ee8cc1Swenshuai.xi break;
1975*53ee8cc1Swenshuai.xi case E_HVD_EX_DRV_SUB_STREAM:
1976*53ee8cc1Swenshuai.xi i = 1;
1977*53ee8cc1Swenshuai.xi break;
1978*53ee8cc1Swenshuai.xi case E_HVD_EX_DRV_MVC_STREAM:
1979*53ee8cc1Swenshuai.xi i = 0;
1980*53ee8cc1Swenshuai.xi break;
1981*53ee8cc1Swenshuai.xi case E_HVD_EX_DRV_STREAM_NONE:
1982*53ee8cc1Swenshuai.xi default:
1983*53ee8cc1Swenshuai.xi i = HVD_MAX_STREAMS;
1984*53ee8cc1Swenshuai.xi break;
1985*53ee8cc1Swenshuai.xi }
1986*53ee8cc1Swenshuai.xi
1987*53ee8cc1Swenshuai.xi if (i == HVD_MAX_STREAMS)
1988*53ee8cc1Swenshuai.xi {
1989*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
1990*53ee8cc1Swenshuai.xi }
1991*53ee8cc1Swenshuai.xi
1992*53ee8cc1Swenshuai.xi if (E_HVD_EX_DRV_MAIN_STREAM == eStreamType)
1993*53ee8cc1Swenshuai.xi {
1994*53ee8cc1Swenshuai.xi u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MAIN_STREAM);
1995*53ee8cc1Swenshuai.xi u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MAIN_STREAM);
1996*53ee8cc1Swenshuai.xi
1997*53ee8cc1Swenshuai.xi if (u32VPUStreamId && u32HVDStreamId)
1998*53ee8cc1Swenshuai.xi {
1999*53ee8cc1Swenshuai.xi *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2000*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2001*53ee8cc1Swenshuai.xi }
2002*53ee8cc1Swenshuai.xi }
2003*53ee8cc1Swenshuai.xi else if (E_HVD_EX_DRV_SUB_STREAM == eStreamType)
2004*53ee8cc1Swenshuai.xi {
2005*53ee8cc1Swenshuai.xi u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_SUB_STREAM);
2006*53ee8cc1Swenshuai.xi if(u32VPUStreamId == E_HAL_VPU_STREAM_NONE)
2007*53ee8cc1Swenshuai.xi {
2008*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
2009*53ee8cc1Swenshuai.xi }
2010*53ee8cc1Swenshuai.xi u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_SUB_STREAM);
2011*53ee8cc1Swenshuai.xi
2012*53ee8cc1Swenshuai.xi if (u32VPUStreamId && u32HVDStreamId)
2013*53ee8cc1Swenshuai.xi {
2014*53ee8cc1Swenshuai.xi *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2015*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2016*53ee8cc1Swenshuai.xi }
2017*53ee8cc1Swenshuai.xi }
2018*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2019*53ee8cc1Swenshuai.xi else if (E_HVD_EX_DRV_MVC_STREAM == eStreamType)
2020*53ee8cc1Swenshuai.xi {
2021*53ee8cc1Swenshuai.xi u32VPUStreamId = (MS_U32) HAL_VPU_EX_GetFreeStream(E_HAL_VPU_MVC_STREAM);
2022*53ee8cc1Swenshuai.xi u32HVDStreamId = (MS_U32) HAL_HVD_EX_GetFreeStream(E_HAL_HVD_MVC_STREAM);
2023*53ee8cc1Swenshuai.xi
2024*53ee8cc1Swenshuai.xi if (u32VPUStreamId && u32HVDStreamId)
2025*53ee8cc1Swenshuai.xi {
2026*53ee8cc1Swenshuai.xi *pu32Id = (i << 16 | u32HVDStreamId << 8 | u32VPUStreamId);
2027*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2028*53ee8cc1Swenshuai.xi }
2029*53ee8cc1Swenshuai.xi }
2030*53ee8cc1Swenshuai.xi #endif
2031*53ee8cc1Swenshuai.xi else
2032*53ee8cc1Swenshuai.xi {
2033*53ee8cc1Swenshuai.xi HVD_PRINT("%s:%s:Stream type=%d is unexpected\n", __FILE__, __FUNCTION__, eStreamType);
2034*53ee8cc1Swenshuai.xi }
2035*53ee8cc1Swenshuai.xi
2036*53ee8cc1Swenshuai.xi return eRet;
2037*53ee8cc1Swenshuai.xi }
2038*53ee8cc1Swenshuai.xi
2039*53ee8cc1Swenshuai.xi
2040*53ee8cc1Swenshuai.xi
2041*53ee8cc1Swenshuai.xi
2042*53ee8cc1Swenshuai.xi
2043*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_HVD_AUTH_IPCheck(MS_U32 u32CodecType);
2044*53ee8cc1Swenshuai.xi extern HVD_EX_Result _HVD_EX_Init_(MS_U32 u32Id);
2045*53ee8cc1Swenshuai.xi
2046*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2047*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Init()
2048*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: HVD driver initialization
2049*53ee8cc1Swenshuai.xi /// @param -pStMemCfg \b IN : pointer to the memory config of HVD driver
2050*53ee8cc1Swenshuai.xi /// @param -pStInitSettings \b IN : Initialization of HVD driver
2051*53ee8cc1Swenshuai.xi /// @return -The result of initialization process
2052*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Init(MS_U32 u32Id,HVD_EX_MemCfg * pStMemCfg,HVD_EX_InitSettings * pStInitSettings)2053*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Init(MS_U32 u32Id, HVD_EX_MemCfg *pStMemCfg, HVD_EX_InitSettings *pStInitSettings)
2054*53ee8cc1Swenshuai.xi {
2055*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
2056*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2057*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2058*53ee8cc1Swenshuai.xi
2059*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2060*53ee8cc1Swenshuai.xi
2061*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2062*53ee8cc1Swenshuai.xi pHVDDrvContext->u32InitSysTimeBase[u8DrvId] = HVD_GetSysTime_ms();
2063*53ee8cc1Swenshuai.xi #endif
2064*53ee8cc1Swenshuai.xi
2065*53ee8cc1Swenshuai.xi if ((pStMemCfg == NULL) || (pStInitSettings == NULL))
2066*53ee8cc1Swenshuai.xi {
2067*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init params are invalid\n");
2068*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
2069*53ee8cc1Swenshuai.xi }
2070*53ee8cc1Swenshuai.xi
2071*53ee8cc1Swenshuai.xi if(_MDrv_HVD_AUTH_IPCheck(pStInitSettings->u32ModeFlag) == FALSE)
2072*53ee8cc1Swenshuai.xi {
2073*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("[%s]User using invaild key !!!\n",__FUNCTION__);
2074*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
2075*53ee8cc1Swenshuai.xi }
2076*53ee8cc1Swenshuai.xi
2077*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetDrvCtrlsBase(&(pHVDDrvContext->gHVDCtrl_EX[0]));
2078*53ee8cc1Swenshuai.xi
2079*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
2080*53ee8cc1Swenshuai.xi {
2081*53ee8cc1Swenshuai.xi MS_U32 u32NonPMBankSize = 0, u32RiuBaseAdd = 0;
2082*53ee8cc1Swenshuai.xi
2083*53ee8cc1Swenshuai.xi if (!MDrv_MMIO_GetBASE(&u32RiuBaseAdd, &u32NonPMBankSize, MS_MODULE_HW))
2084*53ee8cc1Swenshuai.xi {
2085*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("MMIO_GetBASE failure\n");
2086*53ee8cc1Swenshuai.xi return eRet;
2087*53ee8cc1Swenshuai.xi }
2088*53ee8cc1Swenshuai.xi else
2089*53ee8cc1Swenshuai.xi {
2090*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u32RiuBaseAdd=0x%lx\n", u32RiuBaseAdd);
2091*53ee8cc1Swenshuai.xi HAL_HVD_EX_InitRegBase(u32RiuBaseAdd);
2092*53ee8cc1Swenshuai.xi }
2093*53ee8cc1Swenshuai.xi
2094*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
2095*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetHwRegBase(u32Id, pStInitSettings->u32ModeFlag); //HVD or EVD
2096*53ee8cc1Swenshuai.xi #endif
2097*53ee8cc1Swenshuai.xi }
2098*53ee8cc1Swenshuai.xi #endif
2099*53ee8cc1Swenshuai.xi
2100*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("system call type: Mutex:%d clock:%d delay:%d asm_sync:%d\n",
2101*53ee8cc1Swenshuai.xi HVD_ENABLE_MUTEX_PROTECT, HVD_SYSTEM_CLOCK_TYPE, HVD_SYSTEM_DELAY_MS_TYPE, HVD_MEMORY_BARRIER_TYPE);
2102*53ee8cc1Swenshuai.xi
2103*53ee8cc1Swenshuai.xi if (u32UartCtrl & E_HVD_UART_CTRL_INFO)
2104*53ee8cc1Swenshuai.xi {
2105*53ee8cc1Swenshuai.xi MS_U32 u32delaytime = 5;
2106*53ee8cc1Swenshuai.xi MS_U32 u32FirstTime = HVD_GetSysTime_ms();
2107*53ee8cc1Swenshuai.xi MS_U32 u32SecondTime = 0;
2108*53ee8cc1Swenshuai.xi
2109*53ee8cc1Swenshuai.xi HVD_Delay_ms(u32delaytime);
2110*53ee8cc1Swenshuai.xi u32SecondTime = HVD_GetSysTime_ms();
2111*53ee8cc1Swenshuai.xi
2112*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("MSOS API check: 1st:%lu 2nd:%lu delay:%lu dif:%lu\n",
2113*53ee8cc1Swenshuai.xi u32FirstTime, u32SecondTime, u32delaytime, u32SecondTime - u32FirstTime);
2114*53ee8cc1Swenshuai.xi }
2115*53ee8cc1Swenshuai.xi
2116*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2117*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2118*53ee8cc1Swenshuai.xi #endif
2119*53ee8cc1Swenshuai.xi
2120*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bUsed)
2121*53ee8cc1Swenshuai.xi {
2122*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("re-init HVD Driver\n");
2123*53ee8cc1Swenshuai.xi
2124*53ee8cc1Swenshuai.xi #if HVD_ENABLE_REINIT_FAILED
2125*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_RE_INIT;
2126*53ee8cc1Swenshuai.xi return eRet;
2127*53ee8cc1Swenshuai.xi #endif
2128*53ee8cc1Swenshuai.xi }
2129*53ee8cc1Swenshuai.xi
2130*53ee8cc1Swenshuai.xi // disable ISR first
2131*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
2132*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, FALSE);
2133*53ee8cc1Swenshuai.xi #else
2134*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
2135*53ee8cc1Swenshuai.xi #endif
2136*53ee8cc1Swenshuai.xi // For TEE
2137*53ee8cc1Swenshuai.xi _HVD_EX_SetShareInfoAddr(u32Id);
2138*53ee8cc1Swenshuai.xi
2139*53ee8cc1Swenshuai.xi eRet = _HVD_EX_InitVariables(u32Id, pStMemCfg, (HVD_Init_Params *) pStInitSettings);
2140*53ee8cc1Swenshuai.xi
2141*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2142*53ee8cc1Swenshuai.xi {
2143*53ee8cc1Swenshuai.xi return eRet;
2144*53ee8cc1Swenshuai.xi }
2145*53ee8cc1Swenshuai.xi
2146*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
2147*53ee8cc1Swenshuai.xi if ((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_HEVC ||
2148*53ee8cc1Swenshuai.xi (pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2149*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bIsHvdIsr = FALSE;
2150*53ee8cc1Swenshuai.xi else
2151*53ee8cc1Swenshuai.xi #endif
2152*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bIsHvdIsr = TRUE;
2153*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
2154*53ee8cc1Swenshuai.xi if ((pStInitSettings->u32ModeFlag & E_HVD_INIT_HW_MASK) == E_HVD_INIT_HW_VP9)
2155*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bIsG2Vp9Isr = TRUE;
2156*53ee8cc1Swenshuai.xi else
2157*53ee8cc1Swenshuai.xi #endif
2158*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bIsG2Vp9Isr = FALSE;
2159*53ee8cc1Swenshuai.xi
2160*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2161*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2162*53ee8cc1Swenshuai.xi #endif
2163*53ee8cc1Swenshuai.xi
2164*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2165*53ee8cc1Swenshuai.xi
2166*53ee8cc1Swenshuai.xi eRet = _HVD_EX_Check_Cmd(u32Id, E_HVD_CHECK_CMD_INIT);
2167*53ee8cc1Swenshuai.xi
2168*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2169*53ee8cc1Swenshuai.xi {
2170*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2171*53ee8cc1Swenshuai.xi }
2172*53ee8cc1Swenshuai.xi
2173*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2174*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2175*53ee8cc1Swenshuai.xi #endif
2176*53ee8cc1Swenshuai.xi
2177*53ee8cc1Swenshuai.xi
2178*53ee8cc1Swenshuai.xi eRet = _HVD_EX_Init_(u32Id);
2179*53ee8cc1Swenshuai.xi
2180*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2181*53ee8cc1Swenshuai.xi {
2182*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2183*53ee8cc1Swenshuai.xi }
2184*53ee8cc1Swenshuai.xi
2185*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
2186*53ee8cc1Swenshuai.xi HVD_EX_MSG_MUST("HVD Time Measure:%d (%s %d) \n", HVD_GetSysTime_ms() - pHVDDrvContext->u32InitSysTimeBase[u8DrvId], __FUNCTION__, __LINE__);
2187*53ee8cc1Swenshuai.xi #endif
2188*53ee8cc1Swenshuai.xi
2189*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32DummyWriteBuf = MsOS_PA2KSEG1(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DUMMY_WRITE_ADDR));
2190*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2191*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bUsed = TRUE;
2192*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32Sid = u32Id;
2193*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2194*53ee8cc1Swenshuai.xi if((pStInitSettings->u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2195*53ee8cc1Swenshuai.xi {
2196*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2197*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].bUsed = TRUE;
2198*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1].u32Sid = u32Id+0x00011000;
2199*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId+1] = TRUE;
2200*53ee8cc1Swenshuai.xi }
2201*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2202*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
2203*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2204*53ee8cc1Swenshuai.xi
2205*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("driver Init successfully.\n");
2206*53ee8cc1Swenshuai.xi
2207*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2208*53ee8cc1Swenshuai.xi }
2209*53ee8cc1Swenshuai.xi
2210*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2211*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Rst()
2212*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Reset HVD driver
2213*53ee8cc1Swenshuai.xi /// @param -bErrHandle \b IN : reset option HVD driver
2214*53ee8cc1Swenshuai.xi /// -FALSE(0): Reset HVD to clear mode.( do not recovery SPS)
2215*53ee8cc1Swenshuai.xi /// -TRUE(1): Reset HVD to clear mode, and recovery SPS.
2216*53ee8cc1Swenshuai.xi /// @return -The result of reset process
2217*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Rst(MS_U32 u32Id,MS_BOOL bErrHandle)2218*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Rst(MS_U32 u32Id, MS_BOOL bErrHandle)
2219*53ee8cc1Swenshuai.xi {
2220*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2221*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2222*53ee8cc1Swenshuai.xi
2223*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2224*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2225*53ee8cc1Swenshuai.xi
2226*53ee8cc1Swenshuai.xi if (bErrHandle == TRUE)
2227*53ee8cc1Swenshuai.xi {
2228*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
2229*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
2230*53ee8cc1Swenshuai.xi }
2231*53ee8cc1Swenshuai.xi
2232*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) != HVD_INIT_MAIN_LIVE_STREAM)
2233*53ee8cc1Swenshuai.xi {
2234*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("HVD rst() only support live stream mode\n");
2235*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_INVALID_PARAMETER;
2236*53ee8cc1Swenshuai.xi }
2237*53ee8cc1Swenshuai.xi
2238*53ee8cc1Swenshuai.xi //In this function we should delete task and then create task.
2239*53ee8cc1Swenshuai.xi HVD_EX_SetRstFlag(TRUE);
2240*53ee8cc1Swenshuai.xi
2241*53ee8cc1Swenshuai.xi eRet = _HVD_EX_Rst(u32Id, bErrHandle);
2242*53ee8cc1Swenshuai.xi
2243*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2244*53ee8cc1Swenshuai.xi {
2245*53ee8cc1Swenshuai.xi return (eRet);
2246*53ee8cc1Swenshuai.xi }
2247*53ee8cc1Swenshuai.xi
2248*53ee8cc1Swenshuai.xi eRet = _HVD_EX_RecoverySettings(u32Id);
2249*53ee8cc1Swenshuai.xi
2250*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2251*53ee8cc1Swenshuai.xi {
2252*53ee8cc1Swenshuai.xi return (eRet);
2253*53ee8cc1Swenshuai.xi }
2254*53ee8cc1Swenshuai.xi
2255*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
2256*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId] = TRUE;
2257*53ee8cc1Swenshuai.xi
2258*53ee8cc1Swenshuai.xi return eRet;
2259*53ee8cc1Swenshuai.xi }
2260*53ee8cc1Swenshuai.xi
2261*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2262*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Play()
2263*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Play HVD
2264*53ee8cc1Swenshuai.xi /// @return -The result of command play
2265*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Play(MS_U32 u32Id)2266*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Play(MS_U32 u32Id)
2267*53ee8cc1Swenshuai.xi {
2268*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2269*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2270*53ee8cc1Swenshuai.xi
2271*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2272*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2273*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2274*53ee8cc1Swenshuai.xi
2275*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2276*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_GetPlayState(u32Id) != E_HVD_EX_GSTATE_PLAY || pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
2277*53ee8cc1Swenshuai.xi #endif
2278*53ee8cc1Swenshuai.xi {
2279*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
2280*53ee8cc1Swenshuai.xi
2281*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2282*53ee8cc1Swenshuai.xi {
2283*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2284*53ee8cc1Swenshuai.xi }
2285*53ee8cc1Swenshuai.xi }
2286*53ee8cc1Swenshuai.xi
2287*53ee8cc1Swenshuai.xi // step display off
2288*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2289*53ee8cc1Swenshuai.xi
2290*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
2291*53ee8cc1Swenshuai.xi {
2292*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2293*53ee8cc1Swenshuai.xi }
2294*53ee8cc1Swenshuai.xi
2295*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2296*53ee8cc1Swenshuai.xi }
2297*53ee8cc1Swenshuai.xi
2298*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2299*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Exit()
2300*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Stop HVD and release resource.
2301*53ee8cc1Swenshuai.xi /// @return -The result of command stop
2302*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Exit(MS_U32 u32Id)2303*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Exit(MS_U32 u32Id)
2304*53ee8cc1Swenshuai.xi {
2305*53ee8cc1Swenshuai.xi MS_U32 u32Timer = 0;
2306*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2307*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2308*53ee8cc1Swenshuai.xi
2309*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2310*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2311*53ee8cc1Swenshuai.xi _DRV_HVD_Rsting(u8DrvId,eRet);
2312*53ee8cc1Swenshuai.xi
2313*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2314*53ee8cc1Swenshuai.xi if((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2315*53ee8cc1Swenshuai.xi {
2316*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId+1] = FALSE;
2317*53ee8cc1Swenshuai.xi }
2318*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2319*53ee8cc1Swenshuai.xi
2320*53ee8cc1Swenshuai.xi do
2321*53ee8cc1Swenshuai.xi {
2322*53ee8cc1Swenshuai.xi u32Timer++;
2323*53ee8cc1Swenshuai.xi
2324*53ee8cc1Swenshuai.xi if (u32Timer >= HVD_FW_EXIT_ACTION_TIMEOUT)
2325*53ee8cc1Swenshuai.xi {
2326*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_TIMEOUT;
2327*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("exit time out~~~`\n");
2328*53ee8cc1Swenshuai.xi //return eRet;
2329*53ee8cc1Swenshuai.xi break;
2330*53ee8cc1Swenshuai.xi }
2331*53ee8cc1Swenshuai.xi else
2332*53ee8cc1Swenshuai.xi {
2333*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
2334*53ee8cc1Swenshuai.xi }
2335*53ee8cc1Swenshuai.xi } while (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_PROCESSING));
2336*53ee8cc1Swenshuai.xi
2337*53ee8cc1Swenshuai.xi // release ISR callback
2338*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.bRegISR)
2339*53ee8cc1Swenshuai.xi {
2340*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK != MDrv_HVD_EX_SetISREvent(u32Id, E_HVD_EX_ISR_NONE, NULL))
2341*53ee8cc1Swenshuai.xi {
2342*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("MDrv_HVD_EX_Exit: dettach isr fail\n");
2343*53ee8cc1Swenshuai.xi }
2344*53ee8cc1Swenshuai.xi }
2345*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsInited[u8DrvId] = FALSE;
2346*53ee8cc1Swenshuai.xi // close HVD FW
2347*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_DeInit(u32Id);
2348*53ee8cc1Swenshuai.xi
2349*53ee8cc1Swenshuai.xi if(eRet == E_HVD_EX_RET_TIMEOUT)
2350*53ee8cc1Swenshuai.xi {
2351*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("force delete task ,cause cmd timeout \n");
2352*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2353*53ee8cc1Swenshuai.xi }
2354*53ee8cc1Swenshuai.xi
2355*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
2356*53ee8cc1Swenshuai.xi if((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_MVC)
2357*53ee8cc1Swenshuai.xi {
2358*53ee8cc1Swenshuai.xi memset((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId+1]), 0, sizeof(HVD_EX_Drv_Ctrl));
2359*53ee8cc1Swenshuai.xi }
2360*53ee8cc1Swenshuai.xi #endif /// HVD_ENABLE_MVC
2361*53ee8cc1Swenshuai.xi
2362*53ee8cc1Swenshuai.xi // reset internal control variables
2363*53ee8cc1Swenshuai.xi memset((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]), 0, sizeof(HVD_EX_Drv_Ctrl));
2364*53ee8cc1Swenshuai.xi memset((void *) &(pHVDDrvContext->gHVDPreCtrl[u8DrvId]), 0, sizeof(HVD_Pre_Ctrl));
2365*53ee8cc1Swenshuai.xi
2366*53ee8cc1Swenshuai.xi return eRet;
2367*53ee8cc1Swenshuai.xi }
2368*53ee8cc1Swenshuai.xi
2369*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2370*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Pause()
2371*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Pause HVD
2372*53ee8cc1Swenshuai.xi /// @return -The result of command pause
2373*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Pause(MS_U32 u32Id)2374*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Pause(MS_U32 u32Id)
2375*53ee8cc1Swenshuai.xi {
2376*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2377*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2378*53ee8cc1Swenshuai.xi
2379*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2380*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2381*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2382*53ee8cc1Swenshuai.xi
2383*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
2384*53ee8cc1Swenshuai.xi
2385*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2386*53ee8cc1Swenshuai.xi {
2387*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2388*53ee8cc1Swenshuai.xi }
2389*53ee8cc1Swenshuai.xi
2390*53ee8cc1Swenshuai.xi // step display off
2391*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2392*53ee8cc1Swenshuai.xi
2393*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
2394*53ee8cc1Swenshuai.xi {
2395*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2396*53ee8cc1Swenshuai.xi }
2397*53ee8cc1Swenshuai.xi
2398*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2399*53ee8cc1Swenshuai.xi }
2400*53ee8cc1Swenshuai.xi
2401*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2402*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Flush()
2403*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Flush queue and buffer
2404*53ee8cc1Swenshuai.xi /// @param -bShowLast \b IN : TRUE / FALSE
2405*53ee8cc1Swenshuai.xi /// -FALSE(0): show current displayed frame
2406*53ee8cc1Swenshuai.xi /// -TRUE(1): show last decoded frame
2407*53ee8cc1Swenshuai.xi /// @return -The result of command flush
2408*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Flush(MS_U32 u32Id,MS_BOOL bShowLast)2409*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Flush(MS_U32 u32Id, MS_BOOL bShowLast)
2410*53ee8cc1Swenshuai.xi {
2411*53ee8cc1Swenshuai.xi MS_U32 u32Times = 0;
2412*53ee8cc1Swenshuai.xi MS_U32 u32FlushTime = 0;
2413*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2414*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2415*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2416*53ee8cc1Swenshuai.xi
2417*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2418*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2419*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2420*53ee8cc1Swenshuai.xi
2421*53ee8cc1Swenshuai.xi // pause first
2422*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_GetPlayState(u32Id) != E_HVD_EX_GSTATE_PAUSE)
2423*53ee8cc1Swenshuai.xi {
2424*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
2425*53ee8cc1Swenshuai.xi
2426*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2427*53ee8cc1Swenshuai.xi {
2428*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2429*53ee8cc1Swenshuai.xi }
2430*53ee8cc1Swenshuai.xi
2431*53ee8cc1Swenshuai.xi // check flush done
2432*53ee8cc1Swenshuai.xi while (1)
2433*53ee8cc1Swenshuai.xi {
2434*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_GetPlayState(u32Id) == E_HVD_EX_GSTATE_PAUSE)
2435*53ee8cc1Swenshuai.xi {
2436*53ee8cc1Swenshuai.xi break;
2437*53ee8cc1Swenshuai.xi }
2438*53ee8cc1Swenshuai.xi
2439*53ee8cc1Swenshuai.xi u32Times++;
2440*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
2441*53ee8cc1Swenshuai.xi
2442*53ee8cc1Swenshuai.xi if (u32Times > 100)
2443*53ee8cc1Swenshuai.xi {
2444*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("pause in flush() not finished.\n");
2445*53ee8cc1Swenshuai.xi break;
2446*53ee8cc1Swenshuai.xi }
2447*53ee8cc1Swenshuai.xi }
2448*53ee8cc1Swenshuai.xi }
2449*53ee8cc1Swenshuai.xi
2450*53ee8cc1Swenshuai.xi // step display off
2451*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 0);
2452*53ee8cc1Swenshuai.xi
2453*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
2454*53ee8cc1Swenshuai.xi {
2455*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
2456*53ee8cc1Swenshuai.xi }
2457*53ee8cc1Swenshuai.xi
2458*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
2459*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
2460*53ee8cc1Swenshuai.xi {
2461*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LastNal.bRVBrokenPacket)
2462*53ee8cc1Swenshuai.xi {
2463*53ee8cc1Swenshuai.xi HVD_BBU_Info bbuInfo = {0,0,0,0,0,0,0,0,0,0} ;
2464*53ee8cc1Swenshuai.xi
2465*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("push dummy packet for broken by us packet\n");
2466*53ee8cc1Swenshuai.xi
2467*53ee8cc1Swenshuai.xi bbuInfo.u32Length = bbuInfo.u32AllocLength = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32RV_FlushPacketSize;
2468*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32RV_FlushPacketAddr - pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr;
2469*53ee8cc1Swenshuai.xi bbuInfo.u32OriPktAddr = bbuInfo.u32Staddr;
2470*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = FALSE;
2471*53ee8cc1Swenshuai.xi
2472*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
2473*53ee8cc1Swenshuai.xi }
2474*53ee8cc1Swenshuai.xi }
2475*53ee8cc1Swenshuai.xi #endif
2476*53ee8cc1Swenshuai.xi
2477*53ee8cc1Swenshuai.xi // fire all packet to FW
2478*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR_FIRED) != HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR))
2479*53ee8cc1Swenshuai.xi {
2480*53ee8cc1Swenshuai.xi HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
2481*53ee8cc1Swenshuai.xi }
2482*53ee8cc1Swenshuai.xi
2483*53ee8cc1Swenshuai.xi // send command
2484*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_FW_FLUSH_STATUS, (MS_U32)E_HVD_EX_FLUSH_RUNNING);
2485*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FLUSH, (MS_U32) bShowLast);
2486*53ee8cc1Swenshuai.xi
2487*53ee8cc1Swenshuai.xi u32FlushTime = 0;
2488*53ee8cc1Swenshuai.xi
2489*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2490*53ee8cc1Swenshuai.xi {
2491*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2492*53ee8cc1Swenshuai.xi }
2493*53ee8cc1Swenshuai.xi
2494*53ee8cc1Swenshuai.xi // check flush done only for raw file mode
2495*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
2496*53ee8cc1Swenshuai.xi {
2497*53ee8cc1Swenshuai.xi while (1)
2498*53ee8cc1Swenshuai.xi {
2499*53ee8cc1Swenshuai.xi //_DRV_HVD_PushDummy();
2500*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP8)
2501*53ee8cc1Swenshuai.xi {
2502*53ee8cc1Swenshuai.xi if (_HVD_EX_IsAllBufferEmpty_VP8(u32Id))
2503*53ee8cc1Swenshuai.xi {
2504*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2505*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("[Check Flush Done] flush queue empty\n");
2506*53ee8cc1Swenshuai.xi break;
2507*53ee8cc1Swenshuai.xi }
2508*53ee8cc1Swenshuai.xi }
2509*53ee8cc1Swenshuai.xi else
2510*53ee8cc1Swenshuai.xi {
2511*53ee8cc1Swenshuai.xi if (_HVD_EX_IsAllBufferEmpty(u32Id) && (u32FlushTime >= 50))
2512*53ee8cc1Swenshuai.xi {
2513*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2514*53ee8cc1Swenshuai.xi break;
2515*53ee8cc1Swenshuai.xi }
2516*53ee8cc1Swenshuai.xi }
2517*53ee8cc1Swenshuai.xi u32Times++;
2518*53ee8cc1Swenshuai.xi u32FlushTime++;
2519*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
2520*53ee8cc1Swenshuai.xi if (u32Times > 1000)
2521*53ee8cc1Swenshuai.xi {
2522*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Flush() timeout failed: BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx\n",
2523*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB),
2524*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_Q_NUMB),
2525*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB),
2526*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT),
2527*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR));
2528*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
2529*53ee8cc1Swenshuai.xi break;
2530*53ee8cc1Swenshuai.xi }
2531*53ee8cc1Swenshuai.xi }
2532*53ee8cc1Swenshuai.xi // reset byte_cnt
2533*53ee8cc1Swenshuai.xi HAL_HVD_EX_RstPTSCtrlVariable(u32Id);
2534*53ee8cc1Swenshuai.xi }
2535*53ee8cc1Swenshuai.xi switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
2536*53ee8cc1Swenshuai.xi {
2537*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP8:
2538*53ee8cc1Swenshuai.xi //HVD_PRINT("[DRV1] BBU WRp = %x, RDp = %x\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR),HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2539*53ee8cc1Swenshuai.xi //HAL_HVD_EX_SetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR, HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2540*53ee8cc1Swenshuai.xi //HVD_PRINT("[DRV2] BBU WRp = %x, RDp = %x\n",HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR),HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR));
2541*53ee8cc1Swenshuai.xi HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
2542*53ee8cc1Swenshuai.xi break;
2543*53ee8cc1Swenshuai.xi default:
2544*53ee8cc1Swenshuai.xi break;
2545*53ee8cc1Swenshuai.xi }
2546*53ee8cc1Swenshuai.xi
2547*53ee8cc1Swenshuai.xi HAL_HVD_EX_FlushRstShareMem(u32Id);
2548*53ee8cc1Swenshuai.xi pCtrl->u32FlushRstPtr = 1;
2549*53ee8cc1Swenshuai.xi
2550*53ee8cc1Swenshuai.xi // MediaCodec need this to let scan mode to be normal.
2551*53ee8cc1Swenshuai.xi if (0) //bPlayback)
2552*53ee8cc1Swenshuai.xi {
2553*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
2554*53ee8cc1Swenshuai.xi
2555*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2556*53ee8cc1Swenshuai.xi {
2557*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2558*53ee8cc1Swenshuai.xi }
2559*53ee8cc1Swenshuai.xi }
2560*53ee8cc1Swenshuai.xi
2561*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2562*53ee8cc1Swenshuai.xi }
2563*53ee8cc1Swenshuai.xi
2564*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2565*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_StepDisp()
2566*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Trigger HVD to show one frame
2567*53ee8cc1Swenshuai.xi /// @return -The result of command trigger display
2568*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_StepDisp(MS_U32 u32Id)2569*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_StepDisp(MS_U32 u32Id)
2570*53ee8cc1Swenshuai.xi {
2571*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2572*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2573*53ee8cc1Swenshuai.xi
2574*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2575*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2576*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2577*53ee8cc1Swenshuai.xi
2578*53ee8cc1Swenshuai.xi // check command
2579*53ee8cc1Swenshuai.xi eRet = _HVD_EX_Check_Cmd(u8DrvId, E_HVD_CHECK_CMD_TRIGGER_DISP);
2580*53ee8cc1Swenshuai.xi
2581*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2582*53ee8cc1Swenshuai.xi {
2583*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2584*53ee8cc1Swenshuai.xi }
2585*53ee8cc1Swenshuai.xi
2586*53ee8cc1Swenshuai.xi // step display on
2587*53ee8cc1Swenshuai.xi if (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL))
2588*53ee8cc1Swenshuai.xi {
2589*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_IsFrameShowed(u32Id))
2590*53ee8cc1Swenshuai.xi {
2591*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 1);
2592*53ee8cc1Swenshuai.xi }
2593*53ee8cc1Swenshuai.xi else
2594*53ee8cc1Swenshuai.xi {
2595*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("Previous Step Display command is not finished\n");
2596*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2597*53ee8cc1Swenshuai.xi }
2598*53ee8cc1Swenshuai.xi }
2599*53ee8cc1Swenshuai.xi else
2600*53ee8cc1Swenshuai.xi {
2601*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_TRIGGER_DISP, 1);
2602*53ee8cc1Swenshuai.xi
2603*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
2604*53ee8cc1Swenshuai.xi {
2605*53ee8cc1Swenshuai.xi _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL);
2606*53ee8cc1Swenshuai.xi }
2607*53ee8cc1Swenshuai.xi }
2608*53ee8cc1Swenshuai.xi // enter play mode
2609*53ee8cc1Swenshuai.xi if (1) //HAL_HVD_EX_GetData(E_HVD_GDATA_FW_STATE) == E_HVD_FW_PAUSE )
2610*53ee8cc1Swenshuai.xi {
2611*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAY, 0);
2612*53ee8cc1Swenshuai.xi
2613*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2614*53ee8cc1Swenshuai.xi {
2615*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2616*53ee8cc1Swenshuai.xi }
2617*53ee8cc1Swenshuai.xi }
2618*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2619*53ee8cc1Swenshuai.xi }
2620*53ee8cc1Swenshuai.xi
2621*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2622*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_StepDecode()
2623*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Step decode one frame
2624*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_StepDecode(MS_U32 u32Id)2625*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_StepDecode(MS_U32 u32Id)
2626*53ee8cc1Swenshuai.xi {
2627*53ee8cc1Swenshuai.xi MS_U32 u32Times = 0;
2628*53ee8cc1Swenshuai.xi MS_U32 FWState = 0;
2629*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2630*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2631*53ee8cc1Swenshuai.xi
2632*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2633*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2634*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2635*53ee8cc1Swenshuai.xi
2636*53ee8cc1Swenshuai.xi // check if step decoding
2637*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
2638*53ee8cc1Swenshuai.xi {
2639*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt == HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT))
2640*53ee8cc1Swenshuai.xi {
2641*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_NOTREADY;
2642*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2643*53ee8cc1Swenshuai.xi }
2644*53ee8cc1Swenshuai.xi }
2645*53ee8cc1Swenshuai.xi
2646*53ee8cc1Swenshuai.xi // Pause first
2647*53ee8cc1Swenshuai.xi FWState = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
2648*53ee8cc1Swenshuai.xi
2649*53ee8cc1Swenshuai.xi if (FWState != (MS_U32) E_HVD_FW_PAUSE)
2650*53ee8cc1Swenshuai.xi {
2651*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PAUSE, 0);
2652*53ee8cc1Swenshuai.xi
2653*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
2654*53ee8cc1Swenshuai.xi {
2655*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2656*53ee8cc1Swenshuai.xi }
2657*53ee8cc1Swenshuai.xi while (FWState != ((MS_U32) E_HVD_FW_PAUSE) && u32Times <= 10000)
2658*53ee8cc1Swenshuai.xi {
2659*53ee8cc1Swenshuai.xi FWState = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
2660*53ee8cc1Swenshuai.xi u32Times++;
2661*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
2662*53ee8cc1Swenshuai.xi }
2663*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE) != E_HVD_FW_PAUSE)
2664*53ee8cc1Swenshuai.xi {
2665*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
2666*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2667*53ee8cc1Swenshuai.xi }
2668*53ee8cc1Swenshuai.xi }
2669*53ee8cc1Swenshuai.xi
2670*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding = TRUE;
2671*53ee8cc1Swenshuai.xi // get decode cnt
2672*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
2673*53ee8cc1Swenshuai.xi // step decode
2674*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_STEP_DECODE, 0);
2675*53ee8cc1Swenshuai.xi
2676*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2677*53ee8cc1Swenshuai.xi }
2678*53ee8cc1Swenshuai.xi
2679*53ee8cc1Swenshuai.xi // set command, action, status, input
2680*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2681*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PushQueue()
2682*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: push one entry into the decoding table(BBU table).
2683*53ee8cc1Swenshuai.xi /// @param -pInfo \b IN : Pointer to the information of input packet.
2684*53ee8cc1Swenshuai.xi /// @return -The result of command push queue
2685*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PushQueue(MS_U32 u32Id,HVD_EX_PacketInfo * pInfo)2686*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushQueue(MS_U32 u32Id, HVD_EX_PacketInfo *pInfo)
2687*53ee8cc1Swenshuai.xi {
2688*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2689*53ee8cc1Swenshuai.xi MS_BOOL bNULLPacket = FALSE;
2690*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
2691*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
2692*53ee8cc1Swenshuai.xi HVD_BBU_Info bbuInfo;
2693*53ee8cc1Swenshuai.xi
2694*53ee8cc1Swenshuai.xi //******** for 4kx2k stream ********//
2695*53ee8cc1Swenshuai.xi MS_U8 u8Part = 0;
2696*53ee8cc1Swenshuai.xi MS_BOOL bPartToBeSend[QUANTITY_AFTER_BROKEN_BY_US]={0};
2697*53ee8cc1Swenshuai.xi MS_U32 u32PartLen[QUANTITY_AFTER_BROKEN_BY_US]={0};
2698*53ee8cc1Swenshuai.xi MS_U32 u32PartAllocLen[QUANTITY_AFTER_BROKEN_BY_US]={0};
2699*53ee8cc1Swenshuai.xi
2700*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
2701*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
2702*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
2703*53ee8cc1Swenshuai.xi
2704*53ee8cc1Swenshuai.xi if (pInfo == NULL)
2705*53ee8cc1Swenshuai.xi {
2706*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
2707*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2708*53ee8cc1Swenshuai.xi }
2709*53ee8cc1Swenshuai.xi else if ((pInfo->u32Length >= HVD_BBU_TAG_LIMITATION) && (pInfo->u32Length < MAX_QUANTITY))
2710*53ee8cc1Swenshuai.xi {
2711*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("input packet size(0x%lx) larger than HW_bbu_tag_limit max packet size(0x%x), AllocLength(0x%lx); to play 4kx2k stream, break it by us \n",
2712*53ee8cc1Swenshuai.xi pInfo->u32Length, HVD_BBU_TAG_LIMITATION, pInfo->u32AllocLength);
2713*53ee8cc1Swenshuai.xi
2714*53ee8cc1Swenshuai.xi bPartToBeSend[1] = TRUE;
2715*53ee8cc1Swenshuai.xi u32PartLen[1] = pInfo->u32Length - QUANTITY_LENGTH;
2716*53ee8cc1Swenshuai.xi u32PartAllocLen[1] = pInfo->u32AllocLength - QUANTITY_LENGTH;
2717*53ee8cc1Swenshuai.xi
2718*53ee8cc1Swenshuai.xi pInfo->u32Length = QUANTITY_LENGTH;
2719*53ee8cc1Swenshuai.xi pInfo->u32AllocLength = QUANTITY_LENGTH;
2720*53ee8cc1Swenshuai.xi pInfo->u32Staddr |= HVD_RV_BROKEN_BY_US_MASK;
2721*53ee8cc1Swenshuai.xi
2722*53ee8cc1Swenshuai.xi MS_U32 i;
2723*53ee8cc1Swenshuai.xi for(i=2; i< QUANTITY_AFTER_BROKEN_BY_US; i++)
2724*53ee8cc1Swenshuai.xi {
2725*53ee8cc1Swenshuai.xi if (u32PartLen[i-1] >= QUANTITY_LENGTH)
2726*53ee8cc1Swenshuai.xi {
2727*53ee8cc1Swenshuai.xi bPartToBeSend[i] = TRUE;
2728*53ee8cc1Swenshuai.xi u32PartLen[i] = u32PartLen[i-1] - QUANTITY_LENGTH;
2729*53ee8cc1Swenshuai.xi u32PartAllocLen[i] = u32PartAllocLen[i-1] - QUANTITY_LENGTH;
2730*53ee8cc1Swenshuai.xi u32PartLen[i-1] = QUANTITY_LENGTH;
2731*53ee8cc1Swenshuai.xi u32PartAllocLen[i-1] = QUANTITY_LENGTH;
2732*53ee8cc1Swenshuai.xi }
2733*53ee8cc1Swenshuai.xi else
2734*53ee8cc1Swenshuai.xi {
2735*53ee8cc1Swenshuai.xi break;
2736*53ee8cc1Swenshuai.xi }
2737*53ee8cc1Swenshuai.xi }
2738*53ee8cc1Swenshuai.xi
2739*53ee8cc1Swenshuai.xi }
2740*53ee8cc1Swenshuai.xi else if (pInfo->u32Length >= MAX_QUANTITY)
2741*53ee8cc1Swenshuai.xi {
2742*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet size(0x%lx) larger than SW_defined_4kx2k max packet size(0x%x), AllocLength(0x%lx) \n",
2743*53ee8cc1Swenshuai.xi pInfo->u32Length, MAX_QUANTITY, pInfo->u32AllocLength);
2744*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
2745*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2746*53ee8cc1Swenshuai.xi }
2747*53ee8cc1Swenshuai.xi else if ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_TSP)
2748*53ee8cc1Swenshuai.xi {
2749*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Init mode is TSP input and PushQueue() is not supported in TSP input\n");
2750*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2751*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2752*53ee8cc1Swenshuai.xi }
2753*53ee8cc1Swenshuai.xi /*
2754*53ee8cc1Swenshuai.xi else if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
2755*53ee8cc1Swenshuai.xi (pInfo->u32Staddr >= pCtrl->MemMap.u32BitstreamBufSize))
2756*53ee8cc1Swenshuai.xi {
2757*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
2758*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2759*53ee8cc1Swenshuai.xi }*/
2760*53ee8cc1Swenshuai.xi
2761*53ee8cc1Swenshuai.xi bbuInfo.u32ID_H = pInfo->u32ID_H;
2762*53ee8cc1Swenshuai.xi bbuInfo.u32ID_L = pInfo->u32ID_L;
2763*53ee8cc1Swenshuai.xi bbuInfo.u32Length = pInfo->u32Length;
2764*53ee8cc1Swenshuai.xi bbuInfo.u32TimeStamp = pInfo->u32TimeStamp;
2765*53ee8cc1Swenshuai.xi bbuInfo.u32AllocLength = pInfo->u32AllocLength;
2766*53ee8cc1Swenshuai.xi
2767*53ee8cc1Swenshuai.xi if (pInfo->u32Staddr & HVD_RV_BROKEN_BY_US_MASK)
2768*53ee8cc1Swenshuai.xi {
2769*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = TRUE;
2770*53ee8cc1Swenshuai.xi bbuInfo.u32OriPktAddr = pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
2771*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr = pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
2772*53ee8cc1Swenshuai.xi }
2773*53ee8cc1Swenshuai.xi else
2774*53ee8cc1Swenshuai.xi {
2775*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = FALSE;
2776*53ee8cc1Swenshuai.xi bbuInfo.u32OriPktAddr = pInfo->u32Staddr;
2777*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr = pInfo->u32Staddr;
2778*53ee8cc1Swenshuai.xi }
2779*53ee8cc1Swenshuai.xi
2780*53ee8cc1Swenshuai.xi
2781*53ee8cc1Swenshuai.xi if ( !bbuInfo.bRVBrokenPacket &&
2782*53ee8cc1Swenshuai.xi (pInfo->u32Staddr >= pCtrl->MemMap.u32BitstreamBufSize))
2783*53ee8cc1Swenshuai.xi {
2784*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
2785*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2786*53ee8cc1Swenshuai.xi }
2787*53ee8cc1Swenshuai.xi
2788*53ee8cc1Swenshuai.xi
2789*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr2 = pInfo->u32Staddr2;
2790*53ee8cc1Swenshuai.xi bbuInfo.u32Length2 = pInfo->u32Length2;
2791*53ee8cc1Swenshuai.xi
2792*53ee8cc1Swenshuai.xi // invalid packet
2793*53ee8cc1Swenshuai.xi if ((bbuInfo.u32TimeStamp != HVD_U32_MAX) && (bbuInfo.u32Length == 0))
2794*53ee8cc1Swenshuai.xi {
2795*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("Invalid Packet(size:0x%lx PTS:0x%lx)\n ", bbuInfo.u32Length, bbuInfo.u32TimeStamp);
2796*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
2797*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2798*53ee8cc1Swenshuai.xi }
2799*53ee8cc1Swenshuai.xi // AVI NULL packet
2800*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_AVI_NULL_PACKET
2801*53ee8cc1Swenshuai.xi else if ((bbuInfo.u32TimeStamp == HVD_U32_MAX) && (bbuInfo.u32Length == 0))
2802*53ee8cc1Swenshuai.xi {
2803*53ee8cc1Swenshuai.xi if (pCtrl->bNoDrvProccBuf)
2804*53ee8cc1Swenshuai.xi {
2805*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF
2806*53ee8cc1Swenshuai.xi ("AVI Null Packet(size:0x%lx PTS:0x%lx), but do not have enough driver process buffer(0x%lx)\n ",
2807*53ee8cc1Swenshuai.xi pInfo->u32Length, bbuInfo.u32TimeStamp, pCtrl->MemMap.u32DrvProcessBufSize);
2808*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
2809*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2810*53ee8cc1Swenshuai.xi }
2811*53ee8cc1Swenshuai.xi else
2812*53ee8cc1Swenshuai.xi {
2813*53ee8cc1Swenshuai.xi bNULLPacket = TRUE;
2814*53ee8cc1Swenshuai.xi bbuInfo.u32Length = pCtrl->u32NULLPacketSize;
2815*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr = pCtrl->u32NULLPacketAddr - pCtrl->MemMap.u32BitstreamBufAddr;
2816*53ee8cc1Swenshuai.xi }
2817*53ee8cc1Swenshuai.xi }
2818*53ee8cc1Swenshuai.xi #endif
2819*53ee8cc1Swenshuai.xi
2820*53ee8cc1Swenshuai.xi // the else are all normal cases.
2821*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_GetBBUVacancy(u32Id) != 0)
2822*53ee8cc1Swenshuai.xi {
2823*53ee8cc1Swenshuai.xi MS_U32 u32ESRptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
2824*53ee8cc1Swenshuai.xi MS_U32 u32ESWptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
2825*53ee8cc1Swenshuai.xi
2826*53ee8cc1Swenshuai.xi if ((u32ESRptr <= u32ESWptr) &&
2827*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32BitstreamBufSize < bbuInfo.u32Staddr + bbuInfo.u32Length))
2828*53ee8cc1Swenshuai.xi {
2829*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) may cause bitstream buffer overflow (0x%lx 0x%lx) 0x%lx\n ",
2830*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
2831*53ee8cc1Swenshuai.xi u32ESRptr, u32ESWptr, pCtrl->MemMap.u32BitstreamBufSize);
2832*53ee8cc1Swenshuai.xi }
2833*53ee8cc1Swenshuai.xi
2834*53ee8cc1Swenshuai.xi if ((u32ESWptr < u32ESRptr) &&
2835*53ee8cc1Swenshuai.xi (u32ESWptr < bbuInfo.u32Staddr) &&
2836*53ee8cc1Swenshuai.xi (bbuInfo.u32Staddr < u32ESRptr) &&
2837*53ee8cc1Swenshuai.xi (u32ESRptr <= bbuInfo.u32Staddr + bbuInfo.u32Length))
2838*53ee8cc1Swenshuai.xi {
2839*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (staddr=0x%lx, len=0x%lx) may overwrite undecoded data (rptr=0x%lx wptr=0x%lx)\n ",
2840*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, u32ESRptr, u32ESWptr);
2841*53ee8cc1Swenshuai.xi }
2842*53ee8cc1Swenshuai.xi
2843*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) &&
2844*53ee8cc1Swenshuai.xi (!bNULLPacket) &&
2845*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32DrvProcessBufSize != 0) &&
2846*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32BitstreamBufAddr <= pCtrl->MemMap.u32DrvProcessBufAddr) &&
2847*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32DrvProcessBufAddr < (pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->MemMap.u32BitstreamBufSize)))
2848*53ee8cc1Swenshuai.xi {
2849*53ee8cc1Swenshuai.xi MS_U32 u32Lower = pCtrl->MemMap.u32DrvProcessBufAddr - pCtrl->MemMap.u32BitstreamBufAddr;
2850*53ee8cc1Swenshuai.xi MS_U32 u32Upper = u32Lower + pCtrl->MemMap.u32DrvProcessBufSize;
2851*53ee8cc1Swenshuai.xi
2852*53ee8cc1Swenshuai.xi if (((u32Lower <= bbuInfo.u32Staddr) && (bbuInfo.u32Staddr < u32Upper)) ||
2853*53ee8cc1Swenshuai.xi ((u32Lower <= (bbuInfo.u32Staddr + bbuInfo.u32Length)) && ((bbuInfo.u32Staddr + bbuInfo.u32Length) < u32Upper)) ||
2854*53ee8cc1Swenshuai.xi ((bbuInfo.u32Staddr < u32Lower) && (u32Upper <= (bbuInfo.u32Staddr + bbuInfo.u32Length))))
2855*53ee8cc1Swenshuai.xi {
2856*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) is located in HVD driver process buffer(0x%lx 0x%lx)\n ",
2857*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
2858*53ee8cc1Swenshuai.xi u32Lower, u32Upper);
2859*53ee8cc1Swenshuai.xi }
2860*53ee8cc1Swenshuai.xi }
2861*53ee8cc1Swenshuai.xi
2862*53ee8cc1Swenshuai.xi //for debug
2863*53ee8cc1Swenshuai.xi #if 0
2864*53ee8cc1Swenshuai.xi {
2865*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD : %lu (%lu %lu) ID:%lx input packet (%lx %lx %lx) (%lx %lx %lx) (%lu %lu %lu)\n ",
2866*53ee8cc1Swenshuai.xi pCtrl->u32BBUPacketCnt, MDrv_HVD_EX_GetDataErrCnt(u32Id), MDrv_HVD_EX_GetDecErrCnt(u32Id),
2867*53ee8cc1Swenshuai.xi bbuInfo.u32ID_L, bbuInfo.u32Staddr + bbuInfo.u32Length, bbuInfo.u32Length,
2868*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, u32ESRptr, pCtrl->MemMap.u32BitstreamBufSize, u32ESWptr,
2869*53ee8cc1Swenshuai.xi MDrv_HVD_EX_GetBBUVacancy(u32Id), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR),
2870*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR));
2871*53ee8cc1Swenshuai.xi }
2872*53ee8cc1Swenshuai.xi #endif
2873*53ee8cc1Swenshuai.xi
2874*53ee8cc1Swenshuai.xi if ( (!bbuInfo.bRVBrokenPacket)&&
2875*53ee8cc1Swenshuai.xi ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
2876*53ee8cc1Swenshuai.xi ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_VP8) &&
2877*53ee8cc1Swenshuai.xi (pCtrl->bAutoRmLastZeroByte) &&
2878*53ee8cc1Swenshuai.xi ((!pCtrl->bCannotAccessMIU256) || ((pCtrl->bCannotAccessMIU256) && (pCtrl->MemMap.u32BitstreamBufAddr < pCtrl->MemMap.u32MIU1BaseAddr))))
2879*53ee8cc1Swenshuai.xi {
2880*53ee8cc1Swenshuai.xi if ((pCtrl->u8SecureMode == E_HVD_SECURE_MODE_NONE) && (!(pHVDDrvContext->bVPUIsSecureMode)))
2881*53ee8cc1Swenshuai.xi {
2882*53ee8cc1Swenshuai.xi MS_U32 ModifyCnt = 0;
2883*53ee8cc1Swenshuai.xi MS_U32 u32tmp = 0;
2884*53ee8cc1Swenshuai.xi MS_U8 *pByte = NULL;
2885*53ee8cc1Swenshuai.xi u32tmp = (bbuInfo.u32Staddr + bbuInfo.u32Length - 1);
2886*53ee8cc1Swenshuai.xi if (u32tmp >= pCtrl->MemMap.u32BitstreamBufSize)
2887*53ee8cc1Swenshuai.xi {
2888*53ee8cc1Swenshuai.xi u32tmp -= pCtrl->MemMap.u32BitstreamBufSize;
2889*53ee8cc1Swenshuai.xi }
2890*53ee8cc1Swenshuai.xi u32tmp += pCtrl->MemMap.u32BitstreamBufVAddr;
2891*53ee8cc1Swenshuai.xi pByte = (MS_U8 *) u32tmp;
2892*53ee8cc1Swenshuai.xi
2893*53ee8cc1Swenshuai.xi if((bbuInfo.u32Length > 2)
2894*53ee8cc1Swenshuai.xi && ((*pByte == 0) && (*(pByte-1) == 0) && (*(pByte-2) == 0)))
2895*53ee8cc1Swenshuai.xi {
2896*53ee8cc1Swenshuai.xi //301385:
2897*53ee8cc1Swenshuai.xi //more then 2 zero bytes after valid bytes.
2898*53ee8cc1Swenshuai.xi //no need to remove pending zero bytes to prevent system busy
2899*53ee8cc1Swenshuai.xi //printf("no need to remove pending zero~~\n");
2900*53ee8cc1Swenshuai.xi }
2901*53ee8cc1Swenshuai.xi else
2902*53ee8cc1Swenshuai.xi {
2903*53ee8cc1Swenshuai.xi #if 1 //use if-condition instead of while-loop
2904*53ee8cc1Swenshuai.xi if(*pByte == 0)
2905*53ee8cc1Swenshuai.xi {
2906*53ee8cc1Swenshuai.xi ModifyCnt++;
2907*53ee8cc1Swenshuai.xi bbuInfo.u32Length--;
2908*53ee8cc1Swenshuai.xi pByte--;
2909*53ee8cc1Swenshuai.xi
2910*53ee8cc1Swenshuai.xi if(bbuInfo.u32Length && (*pByte == 0))
2911*53ee8cc1Swenshuai.xi {
2912*53ee8cc1Swenshuai.xi ModifyCnt++;
2913*53ee8cc1Swenshuai.xi bbuInfo.u32Length--;
2914*53ee8cc1Swenshuai.xi }
2915*53ee8cc1Swenshuai.xi }
2916*53ee8cc1Swenshuai.xi #else
2917*53ee8cc1Swenshuai.xi while (1) //for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
2918*53ee8cc1Swenshuai.xi {
2919*53ee8cc1Swenshuai.xi if (bbuInfo.u32Length)
2920*53ee8cc1Swenshuai.xi {
2921*53ee8cc1Swenshuai.xi if (*pByte == 0)
2922*53ee8cc1Swenshuai.xi {
2923*53ee8cc1Swenshuai.xi /*
2924*53ee8cc1Swenshuai.xi if( ModifyCnt == 2 )
2925*53ee8cc1Swenshuai.xi {
2926*53ee8cc1Swenshuai.xi gHVDPacket.u32Length+=ModifyCnt;
2927*53ee8cc1Swenshuai.xi }
2928*53ee8cc1Swenshuai.xi else
2929*53ee8cc1Swenshuai.xi */
2930*53ee8cc1Swenshuai.xi {
2931*53ee8cc1Swenshuai.xi ModifyCnt++;
2932*53ee8cc1Swenshuai.xi bbuInfo.u32Length--;
2933*53ee8cc1Swenshuai.xi pByte--;
2934*53ee8cc1Swenshuai.xi }
2935*53ee8cc1Swenshuai.xi }
2936*53ee8cc1Swenshuai.xi else
2937*53ee8cc1Swenshuai.xi {
2938*53ee8cc1Swenshuai.xi break;
2939*53ee8cc1Swenshuai.xi }
2940*53ee8cc1Swenshuai.xi }
2941*53ee8cc1Swenshuai.xi else
2942*53ee8cc1Swenshuai.xi {
2943*53ee8cc1Swenshuai.xi break;
2944*53ee8cc1Swenshuai.xi }
2945*53ee8cc1Swenshuai.xi }
2946*53ee8cc1Swenshuai.xi #endif
2947*53ee8cc1Swenshuai.xi }
2948*53ee8cc1Swenshuai.xi
2949*53ee8cc1Swenshuai.xi if (ModifyCnt != 0)
2950*53ee8cc1Swenshuai.xi {
2951*53ee8cc1Swenshuai.xi //HVD_MSG_INFO("HVD remove last zero byte:%lu\n" , ModifyCnt);
2952*53ee8cc1Swenshuai.xi }
2953*53ee8cc1Swenshuai.xi
2954*53ee8cc1Swenshuai.xi if (bbuInfo.u32Length == 0)
2955*53ee8cc1Swenshuai.xi {
2956*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Packet with all zero bytes(staddr:0x%lx remove zero bytes:%lu)\n ",
2957*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, ModifyCnt);
2958*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
2959*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
2960*53ee8cc1Swenshuai.xi }
2961*53ee8cc1Swenshuai.xi }
2962*53ee8cc1Swenshuai.xi }
2963*53ee8cc1Swenshuai.xi /*
2964*53ee8cc1Swenshuai.xi {
2965*53ee8cc1Swenshuai.xi MS_U8 *pByte=NULL;
2966*53ee8cc1Swenshuai.xi pByte = (MS_U8 *)((gHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
2967*53ee8cc1Swenshuai.xi HVD_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
2968*53ee8cc1Swenshuai.xi *pByte , *(pByte+1) , *(pByte+2) , *(pByte+3) );
2969*53ee8cc1Swenshuai.xi }
2970*53ee8cc1Swenshuai.xi */
2971*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
2972*53ee8cc1Swenshuai.xi pCtrl->u32FlushRstPtr = 0;
2973*53ee8cc1Swenshuai.xi }
2974*53ee8cc1Swenshuai.xi else
2975*53ee8cc1Swenshuai.xi {
2976*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("Push queue full\n");
2977*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_QUEUE_FULL;
2978*53ee8cc1Swenshuai.xi }
2979*53ee8cc1Swenshuai.xi
2980*53ee8cc1Swenshuai.xi for ( u8Part = 1; u8Part < QUANTITY_AFTER_BROKEN_BY_US; u8Part++)
2981*53ee8cc1Swenshuai.xi {
2982*53ee8cc1Swenshuai.xi if (bPartToBeSend[u8Part])
2983*53ee8cc1Swenshuai.xi {
2984*53ee8cc1Swenshuai.xi pInfo->u32Staddr &= (~HVD_RV_BROKEN_BY_US_MASK);
2985*53ee8cc1Swenshuai.xi pInfo->u32Staddr += QUANTITY_LENGTH;
2986*53ee8cc1Swenshuai.xi
2987*53ee8cc1Swenshuai.xi bbuInfo.u32ID_H = pInfo->u32ID_H;
2988*53ee8cc1Swenshuai.xi bbuInfo.u32ID_L = pInfo->u32ID_L;
2989*53ee8cc1Swenshuai.xi bbuInfo.u32Length = u32PartLen[u8Part];
2990*53ee8cc1Swenshuai.xi bbuInfo.u32TimeStamp = pInfo->u32TimeStamp;
2991*53ee8cc1Swenshuai.xi bbuInfo.u32AllocLength = u32PartAllocLen[u8Part];
2992*53ee8cc1Swenshuai.xi
2993*53ee8cc1Swenshuai.xi if (u8Part != (QUANTITY_AFTER_BROKEN_BY_US - 1))
2994*53ee8cc1Swenshuai.xi {
2995*53ee8cc1Swenshuai.xi if (bPartToBeSend[u8Part+1])
2996*53ee8cc1Swenshuai.xi {
2997*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = TRUE;
2998*53ee8cc1Swenshuai.xi }
2999*53ee8cc1Swenshuai.xi else
3000*53ee8cc1Swenshuai.xi {
3001*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = FALSE;
3002*53ee8cc1Swenshuai.xi }
3003*53ee8cc1Swenshuai.xi }
3004*53ee8cc1Swenshuai.xi else
3005*53ee8cc1Swenshuai.xi {
3006*53ee8cc1Swenshuai.xi bbuInfo.bRVBrokenPacket = FALSE;
3007*53ee8cc1Swenshuai.xi }
3008*53ee8cc1Swenshuai.xi
3009*53ee8cc1Swenshuai.xi bbuInfo.u32OriPktAddr = pInfo->u32Staddr;
3010*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr = pInfo->u32Staddr;
3011*53ee8cc1Swenshuai.xi
3012*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr2 = pInfo->u32Staddr2;
3013*53ee8cc1Swenshuai.xi bbuInfo.u32Length2 = pInfo->u32Length2;
3014*53ee8cc1Swenshuai.xi
3015*53ee8cc1Swenshuai.xi //if (MDrv_HVD_EX_GetBBUVacancy(u32Id) != 0)
3016*53ee8cc1Swenshuai.xi {
3017*53ee8cc1Swenshuai.xi MS_U32 u32ESRptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
3018*53ee8cc1Swenshuai.xi MS_U32 u32ESWptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
3019*53ee8cc1Swenshuai.xi
3020*53ee8cc1Swenshuai.xi if ((u32ESRptr <= u32ESWptr) &&
3021*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32BitstreamBufSize < bbuInfo.u32Staddr + bbuInfo.u32Length))
3022*53ee8cc1Swenshuai.xi {
3023*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) may cause bitstream buffer overflow (0x%lx 0x%lx) 0x%lx\n ",
3024*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3025*53ee8cc1Swenshuai.xi u32ESRptr, u32ESWptr, pCtrl->MemMap.u32BitstreamBufSize);
3026*53ee8cc1Swenshuai.xi }
3027*53ee8cc1Swenshuai.xi
3028*53ee8cc1Swenshuai.xi if ((u32ESWptr < u32ESRptr) &&
3029*53ee8cc1Swenshuai.xi (u32ESWptr < bbuInfo.u32Staddr) &&
3030*53ee8cc1Swenshuai.xi (bbuInfo.u32Staddr < u32ESRptr) &&
3031*53ee8cc1Swenshuai.xi (u32ESRptr <= bbuInfo.u32Staddr + bbuInfo.u32Length))
3032*53ee8cc1Swenshuai.xi {
3033*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (staddr=0x%lx, len=0x%lx) may overwrite undecoded data (rptr=0x%lx wptr=0x%lx)\n ",
3034*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, u32ESRptr, u32ESWptr);
3035*53ee8cc1Swenshuai.xi }
3036*53ee8cc1Swenshuai.xi
3037*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB) &&
3038*53ee8cc1Swenshuai.xi (!bNULLPacket) &&
3039*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32DrvProcessBufSize != 0) &&
3040*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32BitstreamBufAddr <= pCtrl->MemMap.u32DrvProcessBufAddr) &&
3041*53ee8cc1Swenshuai.xi (pCtrl->MemMap.u32DrvProcessBufAddr < (pCtrl->MemMap.u32BitstreamBufAddr + pCtrl->MemMap.u32BitstreamBufSize)))
3042*53ee8cc1Swenshuai.xi {
3043*53ee8cc1Swenshuai.xi MS_U32 u32Lower = pCtrl->MemMap.u32DrvProcessBufAddr - pCtrl->MemMap.u32BitstreamBufAddr;
3044*53ee8cc1Swenshuai.xi MS_U32 u32Upper = u32Lower + pCtrl->MemMap.u32DrvProcessBufSize;
3045*53ee8cc1Swenshuai.xi
3046*53ee8cc1Swenshuai.xi if (((u32Lower <= bbuInfo.u32Staddr) && (bbuInfo.u32Staddr < u32Upper)) ||
3047*53ee8cc1Swenshuai.xi ((u32Lower <= (bbuInfo.u32Staddr + bbuInfo.u32Length)) && ((bbuInfo.u32Staddr + bbuInfo.u32Length) < u32Upper)) ||
3048*53ee8cc1Swenshuai.xi ((bbuInfo.u32Staddr < u32Lower) && (u32Upper <= (bbuInfo.u32Staddr + bbuInfo.u32Length))))
3049*53ee8cc1Swenshuai.xi {
3050*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input packet (0x%lx 0x%lx 0x%lx) is located in HVD driver process buffer(0x%lx 0x%lx)\n ",
3051*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, bbuInfo.u32Length, bbuInfo.u32Staddr + bbuInfo.u32Length,
3052*53ee8cc1Swenshuai.xi u32Lower, u32Upper);
3053*53ee8cc1Swenshuai.xi }
3054*53ee8cc1Swenshuai.xi }
3055*53ee8cc1Swenshuai.xi
3056*53ee8cc1Swenshuai.xi //for debug
3057*53ee8cc1Swenshuai.xi #if 0
3058*53ee8cc1Swenshuai.xi {
3059*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD : %lu (%lu %lu) ID:%lx input packet (%lx %lx %lx) (%lx %lx %lx) (%lu %lu %lu)\n ",
3060*53ee8cc1Swenshuai.xi pCtrl->u32BBUPacketCnt, MDrv_HVD_EX_GetDataErrCnt(u32Id), MDrv_HVD_EX_GetDecErrCnt(u32Id),
3061*53ee8cc1Swenshuai.xi bbuInfo.u32ID_L, bbuInfo.u32Staddr + bbuInfo.u32Length, bbuInfo.u32Length,
3062*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, u32ESRptr, pCtrl->MemMap.u32BitstreamBufSize, u32ESWptr,
3063*53ee8cc1Swenshuai.xi MDrv_HVD_EX_GetBBUVacancy(u32Id), HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR),
3064*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR));
3065*53ee8cc1Swenshuai.xi }
3066*53ee8cc1Swenshuai.xi #endif
3067*53ee8cc1Swenshuai.xi
3068*53ee8cc1Swenshuai.xi if (((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
3069*53ee8cc1Swenshuai.xi ((pCtrl->InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_VP8) &&
3070*53ee8cc1Swenshuai.xi (pCtrl->bAutoRmLastZeroByte) &&
3071*53ee8cc1Swenshuai.xi ((!pCtrl->bCannotAccessMIU256) || ((pCtrl->bCannotAccessMIU256) && (pCtrl->MemMap.u32BitstreamBufAddr < pCtrl->MemMap.u32MIU1BaseAddr))))
3072*53ee8cc1Swenshuai.xi {
3073*53ee8cc1Swenshuai.xi MS_U32 ModifyCnt = 0;
3074*53ee8cc1Swenshuai.xi while (1) //for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
3075*53ee8cc1Swenshuai.xi {
3076*53ee8cc1Swenshuai.xi if (bbuInfo.u32Length)
3077*53ee8cc1Swenshuai.xi {
3078*53ee8cc1Swenshuai.xi MS_U8 *pByte = NULL;
3079*53ee8cc1Swenshuai.xi MS_U32 u32tmp = 0;
3080*53ee8cc1Swenshuai.xi u32tmp = (bbuInfo.u32Staddr + bbuInfo.u32Length - 1);
3081*53ee8cc1Swenshuai.xi if (u32tmp >= pCtrl->MemMap.u32BitstreamBufSize)
3082*53ee8cc1Swenshuai.xi {
3083*53ee8cc1Swenshuai.xi u32tmp -= pCtrl->MemMap.u32BitstreamBufSize;
3084*53ee8cc1Swenshuai.xi }
3085*53ee8cc1Swenshuai.xi u32tmp += pCtrl->MemMap.u32BitstreamBufVAddr;
3086*53ee8cc1Swenshuai.xi pByte = (MS_U8 *) u32tmp;
3087*53ee8cc1Swenshuai.xi if (*pByte == 0)
3088*53ee8cc1Swenshuai.xi {
3089*53ee8cc1Swenshuai.xi /*
3090*53ee8cc1Swenshuai.xi if( ModifyCnt == 2 )
3091*53ee8cc1Swenshuai.xi {
3092*53ee8cc1Swenshuai.xi gHVDPacket.u32Length+=ModifyCnt;
3093*53ee8cc1Swenshuai.xi }
3094*53ee8cc1Swenshuai.xi else
3095*53ee8cc1Swenshuai.xi */
3096*53ee8cc1Swenshuai.xi {
3097*53ee8cc1Swenshuai.xi ModifyCnt++;
3098*53ee8cc1Swenshuai.xi bbuInfo.u32Length--;
3099*53ee8cc1Swenshuai.xi }
3100*53ee8cc1Swenshuai.xi }
3101*53ee8cc1Swenshuai.xi else
3102*53ee8cc1Swenshuai.xi {
3103*53ee8cc1Swenshuai.xi break;
3104*53ee8cc1Swenshuai.xi }
3105*53ee8cc1Swenshuai.xi }
3106*53ee8cc1Swenshuai.xi else
3107*53ee8cc1Swenshuai.xi {
3108*53ee8cc1Swenshuai.xi break;
3109*53ee8cc1Swenshuai.xi }
3110*53ee8cc1Swenshuai.xi }
3111*53ee8cc1Swenshuai.xi if (ModifyCnt != 0)
3112*53ee8cc1Swenshuai.xi {
3113*53ee8cc1Swenshuai.xi //HVD_MSG_INFO("HVD remove last zero byte:%lu\n" , ModifyCnt);
3114*53ee8cc1Swenshuai.xi }
3115*53ee8cc1Swenshuai.xi if (bbuInfo.u32Length == 0)
3116*53ee8cc1Swenshuai.xi {
3117*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Packet with all zero bytes(staddr:0x%lx remove zero bytes:%lu)\n ",
3118*53ee8cc1Swenshuai.xi bbuInfo.u32Staddr, ModifyCnt);
3119*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3120*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3121*53ee8cc1Swenshuai.xi }
3122*53ee8cc1Swenshuai.xi }
3123*53ee8cc1Swenshuai.xi /*
3124*53ee8cc1Swenshuai.xi {
3125*53ee8cc1Swenshuai.xi MS_U8 *pByte=NULL;
3126*53ee8cc1Swenshuai.xi pByte = (MS_U8 *)((gHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
3127*53ee8cc1Swenshuai.xi HVD_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
3128*53ee8cc1Swenshuai.xi *pByte , *(pByte+1) , *(pByte+2) , *(pByte+3) );
3129*53ee8cc1Swenshuai.xi }
3130*53ee8cc1Swenshuai.xi */
3131*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_PushPacket(u32Id, (HVD_BBU_Info *) &bbuInfo);
3132*53ee8cc1Swenshuai.xi }
3133*53ee8cc1Swenshuai.xi }
3134*53ee8cc1Swenshuai.xi }
3135*53ee8cc1Swenshuai.xi
3136*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3137*53ee8cc1Swenshuai.xi }
3138*53ee8cc1Swenshuai.xi
3139*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3140*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PushQueue_Fire()
3141*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: fire all waiting entry into the decoding table(BBU table).
3142*53ee8cc1Swenshuai.xi /// @return -The result of command push queue fire
3143*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PushQueue_Fire(MS_U32 u32Id)3144*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushQueue_Fire(MS_U32 u32Id)
3145*53ee8cc1Swenshuai.xi {
3146*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3147*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3148*53ee8cc1Swenshuai.xi
3149*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3150*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3151*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3152*53ee8cc1Swenshuai.xi
3153*53ee8cc1Swenshuai.xi HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
3154*53ee8cc1Swenshuai.xi
3155*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3156*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3157*53ee8cc1Swenshuai.xi }
3158*53ee8cc1Swenshuai.xi
3159*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3160*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DecodeIFrame()
3161*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Decode I frame only under driver input path.
3162*53ee8cc1Swenshuai.xi /// @param -u32SrcSt \b IN : The physical address if user has input packet.
3163*53ee8cc1Swenshuai.xi /// @param -u32SrcSize \b IN : The packet size if user has input packet.
3164*53ee8cc1Swenshuai.xi /// @return -The result of command decode I frame.
3165*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DecodeIFrame(MS_U32 u32Id,MS_PHYADDR u32SrcSt,MS_U32 u32SrcSize)3166*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DecodeIFrame(MS_U32 u32Id, MS_PHYADDR u32SrcSt, MS_U32 u32SrcSize)
3167*53ee8cc1Swenshuai.xi {
3168*53ee8cc1Swenshuai.xi MS_U32 timer = 300;
3169*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3170*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3171*53ee8cc1Swenshuai.xi
3172*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3173*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3174*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3175*53ee8cc1Swenshuai.xi
3176*53ee8cc1Swenshuai.xi eRet = MDrv_HVD_EX_Pause(u32Id);
3177*53ee8cc1Swenshuai.xi
3178*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3179*53ee8cc1Swenshuai.xi {
3180*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3181*53ee8cc1Swenshuai.xi }
3182*53ee8cc1Swenshuai.xi
3183*53ee8cc1Swenshuai.xi // skip decode I
3184*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_DEC, E_HVD_EX_SKIP_DECODE_I);
3185*53ee8cc1Swenshuai.xi
3186*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3187*53ee8cc1Swenshuai.xi {
3188*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3189*53ee8cc1Swenshuai.xi }
3190*53ee8cc1Swenshuai.xi
3191*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, TRUE);
3192*53ee8cc1Swenshuai.xi
3193*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3194*53ee8cc1Swenshuai.xi {
3195*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3196*53ee8cc1Swenshuai.xi }
3197*53ee8cc1Swenshuai.xi eRet = MDrv_HVD_EX_StepDecode(u32Id);
3198*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3199*53ee8cc1Swenshuai.xi {
3200*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3201*53ee8cc1Swenshuai.xi }
3202*53ee8cc1Swenshuai.xi
3203*53ee8cc1Swenshuai.xi if (E_HVD_INIT_INPUT_DRV == (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK))
3204*53ee8cc1Swenshuai.xi {
3205*53ee8cc1Swenshuai.xi HVD_EX_PacketInfo packet = {0,0,0,0,0,0,0,0};
3206*53ee8cc1Swenshuai.xi
3207*53ee8cc1Swenshuai.xi if (u32SrcSize == 0)
3208*53ee8cc1Swenshuai.xi {
3209*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3210*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("decode I frame input packet size is zero\n");
3211*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3212*53ee8cc1Swenshuai.xi }
3213*53ee8cc1Swenshuai.xi
3214*53ee8cc1Swenshuai.xi packet.u32Staddr = u32SrcSt - pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufAddr;
3215*53ee8cc1Swenshuai.xi packet.u32Length = u32SrcSize;
3216*53ee8cc1Swenshuai.xi
3217*53ee8cc1Swenshuai.xi if ((packet.u32Staddr + packet.u32Length) > pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32BitstreamBufSize)
3218*53ee8cc1Swenshuai.xi {
3219*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3220*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
3221*53ee8cc1Swenshuai.xi ("decode I frame memory overflow, the packet end address is over ES buffer end address\n");
3222*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3223*53ee8cc1Swenshuai.xi }
3224*53ee8cc1Swenshuai.xi packet.u32TimeStamp = 0xFFFFFFFF;
3225*53ee8cc1Swenshuai.xi packet.u32ID_L = 0;
3226*53ee8cc1Swenshuai.xi packet.u32ID_H = 0;
3227*53ee8cc1Swenshuai.xi eRet = MDrv_HVD_EX_PushQueue(u32Id, &packet);
3228*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK != eRet)
3229*53ee8cc1Swenshuai.xi {
3230*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("decode I frame push queue fail %x\n", eRet);
3231*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3232*53ee8cc1Swenshuai.xi }
3233*53ee8cc1Swenshuai.xi
3234*53ee8cc1Swenshuai.xi HAL_HVD_EX_UpdateESWptr_Fire(u32Id);
3235*53ee8cc1Swenshuai.xi }
3236*53ee8cc1Swenshuai.xi while (timer)
3237*53ee8cc1Swenshuai.xi {
3238*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
3239*53ee8cc1Swenshuai.xi if (MDrv_HVD_EX_IsStepDecodeDone(u32Id))
3240*53ee8cc1Swenshuai.xi {
3241*53ee8cc1Swenshuai.xi break;
3242*53ee8cc1Swenshuai.xi }
3243*53ee8cc1Swenshuai.xi timer--;
3244*53ee8cc1Swenshuai.xi }
3245*53ee8cc1Swenshuai.xi if (timer == 0)
3246*53ee8cc1Swenshuai.xi {
3247*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
3248*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("decode I frame time out, not enough data\n");
3249*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3250*53ee8cc1Swenshuai.xi }
3251*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3252*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3253*53ee8cc1Swenshuai.xi }
3254*53ee8cc1Swenshuai.xi
3255*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3256*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDataEnd()
3257*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Upper layer set this to inform driver that there are no more data will be pushed.
3258*53ee8cc1Swenshuai.xi /// @param -bEnd \b IN : Enable/ Disable
3259*53ee8cc1Swenshuai.xi /// -FALSE(0): normal status( default )
3260*53ee8cc1Swenshuai.xi /// -TRUE(1): ending status
3261*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDataEnd(MS_U32 u32Id,MS_BOOL bEnd)3262*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDataEnd(MS_U32 u32Id, MS_BOOL bEnd)
3263*53ee8cc1Swenshuai.xi {
3264*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3265*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3266*53ee8cc1Swenshuai.xi
3267*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3268*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3269*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3270*53ee8cc1Swenshuai.xi
3271*53ee8cc1Swenshuai.xi if (bEnd)
3272*53ee8cc1Swenshuai.xi {
3273*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode |= HVD_CTRL_DATA_END;
3274*53ee8cc1Swenshuai.xi }
3275*53ee8cc1Swenshuai.xi else
3276*53ee8cc1Swenshuai.xi {
3277*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode &= ~HVD_CTRL_DATA_END;
3278*53ee8cc1Swenshuai.xi }
3279*53ee8cc1Swenshuai.xi
3280*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PLAYBACK_FINISH, bEnd);
3281*53ee8cc1Swenshuai.xi
3282*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3283*53ee8cc1Swenshuai.xi }
3284*53ee8cc1Swenshuai.xi
3285*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3286*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispErrFrm()
3287*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/ Disable to decode and show error(broken) frames
3288*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
3289*53ee8cc1Swenshuai.xi /// -FALSE(0): hide error frames
3290*53ee8cc1Swenshuai.xi /// -TRUE(1): show error frames
3291*53ee8cc1Swenshuai.xi /// @return -The result of command set display error frames
3292*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispErrFrm(MS_U32 u32Id,MS_BOOL bEnable)3293*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispErrFrm(MS_U32 u32Id, MS_BOOL bEnable)
3294*53ee8cc1Swenshuai.xi {
3295*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3296*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3297*53ee8cc1Swenshuai.xi
3298*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3299*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3300*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3301*53ee8cc1Swenshuai.xi
3302*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ERR_FRM, bEnable);
3303*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsShowErrFrm = bEnable;
3304*53ee8cc1Swenshuai.xi
3305*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3306*53ee8cc1Swenshuai.xi }
3307*53ee8cc1Swenshuai.xi
3308*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3309*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispRepeatField()
3310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/ Disable to show last field when FW needs to show repeated field
3311*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
3312*53ee8cc1Swenshuai.xi /// -FALSE(0): disable this mode
3313*53ee8cc1Swenshuai.xi /// -TRUE(1): enable this mode
3314*53ee8cc1Swenshuai.xi /// @return -The result of command set display repeated field
3315*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispRepeatField(MS_U32 u32Id,MS_BOOL bEnable)3316*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispRepeatField(MS_U32 u32Id, MS_BOOL bEnable)
3317*53ee8cc1Swenshuai.xi {
3318*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3319*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3320*53ee8cc1Swenshuai.xi
3321*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3322*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3323*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3324*53ee8cc1Swenshuai.xi
3325*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_REPEAT_LAST_FIELD, bEnable);
3326*53ee8cc1Swenshuai.xi
3327*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3328*53ee8cc1Swenshuai.xi }
3329*53ee8cc1Swenshuai.xi
3330*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3331*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSkipDecMode()
3332*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set the decoding frame type.
3333*53ee8cc1Swenshuai.xi /// @param -eDecType \b IN : decoding frame type
3334*53ee8cc1Swenshuai.xi /// @return -The result of command set skip decode mode
3335*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSkipDecMode(MS_U32 u32Id,HVD_EX_SkipDecode eDecType)3336*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSkipDecMode(MS_U32 u32Id, HVD_EX_SkipDecode eDecType)
3337*53ee8cc1Swenshuai.xi {
3338*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3339*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3340*53ee8cc1Swenshuai.xi
3341*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3342*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3343*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3344*53ee8cc1Swenshuai.xi
3345*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3346*53ee8cc1Swenshuai.xi if ((HVD_EX_SkipDecode) HAL_HVD_EX_GetData(E_HVD_GDATA_SKIP_MODE) != eDecType)
3347*53ee8cc1Swenshuai.xi #endif
3348*53ee8cc1Swenshuai.xi {
3349*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_DEC, eDecType);
3350*53ee8cc1Swenshuai.xi
3351*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3352*53ee8cc1Swenshuai.xi {
3353*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3354*53ee8cc1Swenshuai.xi }
3355*53ee8cc1Swenshuai.xi
3356*53ee8cc1Swenshuai.xi if (eDecType == E_HVD_EX_SKIP_DECODE_I)
3357*53ee8cc1Swenshuai.xi {
3358*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, TRUE);
3359*53ee8cc1Swenshuai.xi }
3360*53ee8cc1Swenshuai.xi else
3361*53ee8cc1Swenshuai.xi {
3362*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_I_DIRECT, FALSE);
3363*53ee8cc1Swenshuai.xi }
3364*53ee8cc1Swenshuai.xi }
3365*53ee8cc1Swenshuai.xi
3366*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u8SkipMode = (MS_U8) eDecType;
3367*53ee8cc1Swenshuai.xi
3368*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3369*53ee8cc1Swenshuai.xi }
3370*53ee8cc1Swenshuai.xi
3371*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3372*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispSpeed()
3373*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: specify the display speed type.
3374*53ee8cc1Swenshuai.xi /// @param -eSpeed \b IN : display speed type
3375*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
3376*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispSpeed(MS_U32 u32Id,HVD_EX_DispSpeed eSpeed)3377*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispSpeed(MS_U32 u32Id, HVD_EX_DispSpeed eSpeed)
3378*53ee8cc1Swenshuai.xi {
3379*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3380*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3381*53ee8cc1Swenshuai.xi
3382*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3383*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3384*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3385*53ee8cc1Swenshuai.xi
3386*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("%d\n", (MS_S16) eSpeed);
3387*53ee8cc1Swenshuai.xi
3388*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3389*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) != eSpeed)
3390*53ee8cc1Swenshuai.xi #endif
3391*53ee8cc1Swenshuai.xi {
3392*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_SPEED, eSpeed);
3393*53ee8cc1Swenshuai.xi }
3394*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
3395*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
3396*53ee8cc1Swenshuai.xi {
3397*53ee8cc1Swenshuai.xi MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
3398*53ee8cc1Swenshuai.xi while (timer)
3399*53ee8cc1Swenshuai.xi {
3400*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISPLAY_DURATION) == eSpeed)
3401*53ee8cc1Swenshuai.xi {
3402*53ee8cc1Swenshuai.xi break;
3403*53ee8cc1Swenshuai.xi }
3404*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
3405*53ee8cc1Swenshuai.xi timer--;
3406*53ee8cc1Swenshuai.xi }
3407*53ee8cc1Swenshuai.xi }
3408*53ee8cc1Swenshuai.xi #endif
3409*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3410*53ee8cc1Swenshuai.xi }
3411*53ee8cc1Swenshuai.xi
3412*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3413*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncActive()
3414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/disable the sync of video time stamp and STC.
3415*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
3416*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable sync mode
3417*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable sync mode
3418*53ee8cc1Swenshuai.xi /// @return -The result of command set sync active
3419*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncActive(MS_U32 u32Id,MS_BOOL bEnable)3420*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncActive(MS_U32 u32Id, MS_BOOL bEnable)
3421*53ee8cc1Swenshuai.xi {
3422*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3423*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3424*53ee8cc1Swenshuai.xi
3425*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3426*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3427*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3428*53ee8cc1Swenshuai.xi
3429*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
3430*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(E_HVD_GDATA_IS_SYNC_ON) != bEnable)
3431*53ee8cc1Swenshuai.xi #endif
3432*53ee8cc1Swenshuai.xi {
3433*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_ACTIVE, bEnable);
3434*53ee8cc1Swenshuai.xi }
3435*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
3436*53ee8cc1Swenshuai.xi if (eRet == E_HVD_EX_OK)
3437*53ee8cc1Swenshuai.xi {
3438*53ee8cc1Swenshuai.xi MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
3439*53ee8cc1Swenshuai.xi while (timer)
3440*53ee8cc1Swenshuai.xi {
3441*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(E_HVD_GDATA_IS_SYNC_ON) == bEnable)
3442*53ee8cc1Swenshuai.xi {
3443*53ee8cc1Swenshuai.xi break;
3444*53ee8cc1Swenshuai.xi }
3445*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
3446*53ee8cc1Swenshuai.xi timer--;
3447*53ee8cc1Swenshuai.xi }
3448*53ee8cc1Swenshuai.xi }
3449*53ee8cc1Swenshuai.xi #endif
3450*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsSyncOn = bEnable;
3451*53ee8cc1Swenshuai.xi
3452*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3453*53ee8cc1Swenshuai.xi }
3454*53ee8cc1Swenshuai.xi
3455*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3456*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDropMode()
3457*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: specify the way to drop decoded frames.
3458*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Drop display type.
3459*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The argument of eMode
3460*53ee8cc1Swenshuai.xi /// -( eMode == E_HVD_DROP_DISPLAY_AUTO) , Enable: (u32Arg = TRUE); Disable: (u32Arg = FALSE)
3461*53ee8cc1Swenshuai.xi /// -( eMode == E_HVD_EX_DROP_DISPLAY_ONCE) , u32Arg = not zero
3462*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
3463*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDropMode(MS_U32 u32Id,HVD_EX_DropDisp eMode,MS_U32 u32Arg)3464*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDropMode(MS_U32 u32Id, HVD_EX_DropDisp eMode, MS_U32 u32Arg)
3465*53ee8cc1Swenshuai.xi {
3466*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3467*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3468*53ee8cc1Swenshuai.xi
3469*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3470*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3471*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3472*53ee8cc1Swenshuai.xi
3473*53ee8cc1Swenshuai.xi if (eMode == E_HVD_EX_DROP_DISPLAY_AUTO)
3474*53ee8cc1Swenshuai.xi {
3475*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DROP_DISP_AUTO, u32Arg);
3476*53ee8cc1Swenshuai.xi }
3477*53ee8cc1Swenshuai.xi else if (eMode == E_HVD_EX_DROP_DISPLAY_ONCE)
3478*53ee8cc1Swenshuai.xi {
3479*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DROP_DISP_ONCE, u32Arg);
3480*53ee8cc1Swenshuai.xi }
3481*53ee8cc1Swenshuai.xi else
3482*53ee8cc1Swenshuai.xi {
3483*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
3484*53ee8cc1Swenshuai.xi }
3485*53ee8cc1Swenshuai.xi
3486*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3487*53ee8cc1Swenshuai.xi }
3488*53ee8cc1Swenshuai.xi
3489*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3490*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_RstPTS()
3491*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Reset HVD sync table
3492*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : PTS base
3493*53ee8cc1Swenshuai.xi /// @return -The result of command reset PTS
3494*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_RstPTS(MS_U32 u32Id,MS_U32 u32PTS)3495*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RstPTS(MS_U32 u32Id, MS_U32 u32PTS)
3496*53ee8cc1Swenshuai.xi {
3497*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3498*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3499*53ee8cc1Swenshuai.xi
3500*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3501*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3502*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3503*53ee8cc1Swenshuai.xi
3504*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RESET_PTS, u32PTS);
3505*53ee8cc1Swenshuai.xi
3506*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3507*53ee8cc1Swenshuai.xi }
3508*53ee8cc1Swenshuai.xi
3509*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3510*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFrcMode()
3511*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set the frame rate convert mode.
3512*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
3513*53ee8cc1Swenshuai.xi /// @return -The result of command set frame rate convert mode
3514*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFrcMode(MS_U32 u32Id,HVD_EX_FrmRateConvMode eMode)3515*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFrcMode(MS_U32 u32Id, HVD_EX_FrmRateConvMode eMode)
3516*53ee8cc1Swenshuai.xi {
3517*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3518*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3519*53ee8cc1Swenshuai.xi
3520*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3521*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3522*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3523*53ee8cc1Swenshuai.xi
3524*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_MODE, eMode);
3525*53ee8cc1Swenshuai.xi
3526*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u8FrcMode = (MS_U8) eMode;
3527*53ee8cc1Swenshuai.xi
3528*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3529*53ee8cc1Swenshuai.xi }
3530*53ee8cc1Swenshuai.xi
3531*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3532*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncTolerance()
3533*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the tolerance of FW reporting sync reach.
3534*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : tolerance.
3535*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
3536*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncTolerance(MS_U32 u32Id,MS_U32 u32Arg)3537*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncTolerance(MS_U32 u32Id, MS_U32 u32Arg)
3538*53ee8cc1Swenshuai.xi {
3539*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3540*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3541*53ee8cc1Swenshuai.xi
3542*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3543*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3544*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3545*53ee8cc1Swenshuai.xi
3546*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_TOLERANCE, u32Arg);
3547*53ee8cc1Swenshuai.xi
3548*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncTolerance = u32Arg;
3549*53ee8cc1Swenshuai.xi
3550*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3551*53ee8cc1Swenshuai.xi }
3552*53ee8cc1Swenshuai.xi
3553*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3554*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncVideoDelay()
3555*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the video delay from STC when sync mode active.
3556*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The video delay. unit:ms
3557*53ee8cc1Swenshuai.xi /// @return -The result of command set sync video delay
3558*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncVideoDelay(MS_U32 u32Id,MS_U32 u32Arg)3559*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncVideoDelay(MS_U32 u32Id, MS_U32 u32Arg)
3560*53ee8cc1Swenshuai.xi {
3561*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3562*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3563*53ee8cc1Swenshuai.xi
3564*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3565*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3566*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3567*53ee8cc1Swenshuai.xi
3568*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
3569*53ee8cc1Swenshuai.xi {
3570*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u8TimeUnit)
3571*53ee8cc1Swenshuai.xi {
3572*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32) (u32Arg + HVD_DTV_VIDEO_DELAY));
3573*53ee8cc1Swenshuai.xi }
3574*53ee8cc1Swenshuai.xi else
3575*53ee8cc1Swenshuai.xi {
3576*53ee8cc1Swenshuai.xi eRet =
3577*53ee8cc1Swenshuai.xi (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg + ((MS_U32) HVD_DTV_VIDEO_DELAY * 90));
3578*53ee8cc1Swenshuai.xi }
3579*53ee8cc1Swenshuai.xi }
3580*53ee8cc1Swenshuai.xi else
3581*53ee8cc1Swenshuai.xi {
3582*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg);
3583*53ee8cc1Swenshuai.xi }
3584*53ee8cc1Swenshuai.xi
3585*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncVideoDelay = u32Arg;
3586*53ee8cc1Swenshuai.xi
3587*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3588*53ee8cc1Swenshuai.xi }
3589*53ee8cc1Swenshuai.xi
3590*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3591*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncFreeRunTH()
3592*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the tolerance of FW reporting sync reach.
3593*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : theashold.
3594*53ee8cc1Swenshuai.xi /// - 0 : use FW default value
3595*53ee8cc1Swenshuai.xi /// - 0xFFFFFFFF : never free run, FW always do sync action.
3596*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
3597*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncFreeRunTH(MS_U32 u32Id,MS_U32 u32Arg)3598*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncFreeRunTH(MS_U32 u32Id, MS_U32 u32Arg)
3599*53ee8cc1Swenshuai.xi {
3600*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3601*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3602*53ee8cc1Swenshuai.xi
3603*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3604*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3605*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3606*53ee8cc1Swenshuai.xi
3607*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREERUN_THRESHOLD, u32Arg);
3608*53ee8cc1Swenshuai.xi
3609*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncFreeRunTH = u32Arg;
3610*53ee8cc1Swenshuai.xi
3611*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3612*53ee8cc1Swenshuai.xi }
3613*53ee8cc1Swenshuai.xi
3614*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3615*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSyncRepeatTH()
3616*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the repeat threashold under sync mode.
3617*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : repeat times. 0x01 ~ 0xFF
3618*53ee8cc1Swenshuai.xi /// 0xff - repeat current frame until STC catch up PTS.
3619*53ee8cc1Swenshuai.xi /// @return -The result of command set sync repeat threashold
3620*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSyncRepeatTH(MS_U32 u32Id,MS_U32 u32Arg)3621*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSyncRepeatTH(MS_U32 u32Id, MS_U32 u32Arg)
3622*53ee8cc1Swenshuai.xi {
3623*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3624*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3625*53ee8cc1Swenshuai.xi
3626*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3627*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3628*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3629*53ee8cc1Swenshuai.xi
3630*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SYNC_THRESHOLD, u32Arg);
3631*53ee8cc1Swenshuai.xi
3632*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32SyncRepeatTH = u32Arg;
3633*53ee8cc1Swenshuai.xi
3634*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3635*53ee8cc1Swenshuai.xi }
3636*53ee8cc1Swenshuai.xi
3637*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3638*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetErrConceal()
3639*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable error concealment.
3640*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
3641*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable error concealment.
3642*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable error concealment.
3643*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
3644*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetErrConceal(MS_U32 u32Id,MS_BOOL bEnable)3645*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetErrConceal(MS_U32 u32Id, MS_BOOL bEnable)
3646*53ee8cc1Swenshuai.xi {
3647*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3648*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3649*53ee8cc1Swenshuai.xi
3650*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3651*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3652*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3653*53ee8cc1Swenshuai.xi
3654*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL, bEnable);
3655*53ee8cc1Swenshuai.xi
3656*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bIsErrConceal = bEnable;
3657*53ee8cc1Swenshuai.xi
3658*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3659*53ee8cc1Swenshuai.xi }
3660*53ee8cc1Swenshuai.xi
3661*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3662*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDbgLevel()
3663*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set debug level
3664*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
3665*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDbgLevel(HVD_EX_UartLevel eLevel)3666*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetDbgLevel(HVD_EX_UartLevel eLevel)
3667*53ee8cc1Swenshuai.xi {
3668*53ee8cc1Swenshuai.xi VPU_EX_UartLevel eVpuLevel = E_VPU_EX_UART_LEVEL_NONE;
3669*53ee8cc1Swenshuai.xi
3670*53ee8cc1Swenshuai.xi switch (eLevel)
3671*53ee8cc1Swenshuai.xi {
3672*53ee8cc1Swenshuai.xi case E_HVD_EX_UART_LEVEL_ERR:
3673*53ee8cc1Swenshuai.xi {
3674*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_ERR;
3675*53ee8cc1Swenshuai.xi eVpuLevel = E_VPU_EX_UART_LEVEL_ERR;
3676*53ee8cc1Swenshuai.xi break;
3677*53ee8cc1Swenshuai.xi }
3678*53ee8cc1Swenshuai.xi case E_HVD_EX_UART_LEVEL_INFO:
3679*53ee8cc1Swenshuai.xi {
3680*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_INFO | E_HVD_UART_CTRL_ERR;
3681*53ee8cc1Swenshuai.xi eVpuLevel = E_VPU_EX_UART_LEVEL_INFO;
3682*53ee8cc1Swenshuai.xi break;
3683*53ee8cc1Swenshuai.xi }
3684*53ee8cc1Swenshuai.xi case E_HVD_EX_UART_LEVEL_DBG:
3685*53ee8cc1Swenshuai.xi {
3686*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_DBG | E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_INFO;
3687*53ee8cc1Swenshuai.xi eVpuLevel = E_VPU_EX_UART_LEVEL_DBG;
3688*53ee8cc1Swenshuai.xi break;
3689*53ee8cc1Swenshuai.xi }
3690*53ee8cc1Swenshuai.xi case E_HVD_EX_UART_LEVEL_TRACE:
3691*53ee8cc1Swenshuai.xi {
3692*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_TRACE | E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_INFO | E_HVD_UART_CTRL_DBG;
3693*53ee8cc1Swenshuai.xi eVpuLevel = E_VPU_EX_UART_LEVEL_TRACE;
3694*53ee8cc1Swenshuai.xi break;
3695*53ee8cc1Swenshuai.xi }
3696*53ee8cc1Swenshuai.xi case E_HVD_EX_UART_LEVEL_FW:
3697*53ee8cc1Swenshuai.xi {
3698*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_DISABLE;
3699*53ee8cc1Swenshuai.xi
3700*53ee8cc1Swenshuai.xi HAL_HVD_EX_UartSwitch2FW(TRUE);
3701*53ee8cc1Swenshuai.xi break;
3702*53ee8cc1Swenshuai.xi }
3703*53ee8cc1Swenshuai.xi default:
3704*53ee8cc1Swenshuai.xi {
3705*53ee8cc1Swenshuai.xi u32UartCtrl = E_HVD_UART_CTRL_DISABLE;
3706*53ee8cc1Swenshuai.xi eVpuLevel = E_VPU_EX_UART_LEVEL_ERR;
3707*53ee8cc1Swenshuai.xi break;
3708*53ee8cc1Swenshuai.xi }
3709*53ee8cc1Swenshuai.xi }
3710*53ee8cc1Swenshuai.xi HAL_VPU_EX_SetDbgLevel(eVpuLevel);
3711*53ee8cc1Swenshuai.xi }
3712*53ee8cc1Swenshuai.xi
3713*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3714*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SeekToPTS()
3715*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW decode to the input PTS by using full decoding speed. If FW reaches (equal to or larger than) input PTS, FW will pause automatically. This function can not work under MDrv_HVD_EX_SetSyncActive(TRUE).
3716*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
3717*53ee8cc1Swenshuai.xi /// -0: disable this mode. FW will go back to previous status (play or pause).
3718*53ee8cc1Swenshuai.xi /// -any not zero: enable this mode
3719*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
3720*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SeekToPTS(MS_U32 u32Id,MS_U32 u32PTS)3721*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SeekToPTS(MS_U32 u32Id, MS_U32 u32PTS)
3722*53ee8cc1Swenshuai.xi {
3723*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3724*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3725*53ee8cc1Swenshuai.xi
3726*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3727*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3728*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3729*53ee8cc1Swenshuai.xi
3730*53ee8cc1Swenshuai.xi eRet = _HVD_EX_Check_Cmd(u8DrvId, E_HVD_CHECK_CMD_SEEK2PTS);
3731*53ee8cc1Swenshuai.xi
3732*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3733*53ee8cc1Swenshuai.xi {
3734*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3735*53ee8cc1Swenshuai.xi }
3736*53ee8cc1Swenshuai.xi
3737*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_JUMP_TO_PTS, u32PTS);
3738*53ee8cc1Swenshuai.xi
3739*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3740*53ee8cc1Swenshuai.xi }
3741*53ee8cc1Swenshuai.xi
3742*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3743*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SkipToPTS()
3744*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW skip to the input PTS by using full decoding speed and start decode again after input PTS.
3745*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
3746*53ee8cc1Swenshuai.xi /// -0: disable this mode. FW will go back to previous status (play or pause).
3747*53ee8cc1Swenshuai.xi /// -any not zero: enable this mode
3748*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
3749*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SkipToPTS(MS_U32 u32Id,MS_U32 u32PTS)3750*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SkipToPTS(MS_U32 u32Id, MS_U32 u32PTS)
3751*53ee8cc1Swenshuai.xi {
3752*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3753*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3754*53ee8cc1Swenshuai.xi
3755*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3756*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3757*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3758*53ee8cc1Swenshuai.xi
3759*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SKIP_TO_PTS, u32PTS);
3760*53ee8cc1Swenshuai.xi
3761*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3762*53ee8cc1Swenshuai.xi }
3763*53ee8cc1Swenshuai.xi
3764*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3765*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFreezeImg()
3766*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync, but decoding process is still going.
3767*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
3768*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable freeze image.
3769*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable freeze image.
3770*53ee8cc1Swenshuai.xi /// @return -The result of command freeze image.
3771*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFreezeImg(MS_U32 u32Id,MS_BOOL bEnable)3772*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFreezeImg(MS_U32 u32Id, MS_BOOL bEnable)
3773*53ee8cc1Swenshuai.xi {
3774*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3775*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3776*53ee8cc1Swenshuai.xi
3777*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3778*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3779*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3780*53ee8cc1Swenshuai.xi
3781*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FREEZE_IMG, bEnable);
3782*53ee8cc1Swenshuai.xi
3783*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3784*53ee8cc1Swenshuai.xi }
3785*53ee8cc1Swenshuai.xi
3786*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3787*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetBlueScreen()
3788*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync and keep blue screen , but decoding process is still going.
3789*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
3790*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable blue screen.
3791*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable blue screen.
3792*53ee8cc1Swenshuai.xi /// @return -The result of command set blue screen.
3793*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetBlueScreen(MS_U32 u32Id,MS_BOOL bEnable)3794*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetBlueScreen(MS_U32 u32Id, MS_BOOL bEnable)
3795*53ee8cc1Swenshuai.xi {
3796*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3797*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3798*53ee8cc1Swenshuai.xi
3799*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3800*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3801*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3802*53ee8cc1Swenshuai.xi
3803*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BLUE_SCREEN, bEnable);
3804*53ee8cc1Swenshuai.xi
3805*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3806*53ee8cc1Swenshuai.xi }
3807*53ee8cc1Swenshuai.xi
3808*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3809*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispOneField()
3810*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW only show one field(top field only).
3811*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
3812*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable display one field.
3813*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable display one field.
3814*53ee8cc1Swenshuai.xi /// @return -The result of command display one field.
3815*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispOneField(MS_U32 u32Id,MS_BOOL bEnable)3816*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispOneField(MS_U32 u32Id, MS_BOOL bEnable)
3817*53ee8cc1Swenshuai.xi {
3818*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3819*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3820*53ee8cc1Swenshuai.xi
3821*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3822*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3823*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3824*53ee8cc1Swenshuai.xi
3825*53ee8cc1Swenshuai.xi if (bEnable)
3826*53ee8cc1Swenshuai.xi {
3827*53ee8cc1Swenshuai.xi // force to show top field only.
3828*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_TOP);
3829*53ee8cc1Swenshuai.xi }
3830*53ee8cc1Swenshuai.xi else
3831*53ee8cc1Swenshuai.xi {
3832*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_OFF);
3833*53ee8cc1Swenshuai.xi }
3834*53ee8cc1Swenshuai.xi
3835*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3836*53ee8cc1Swenshuai.xi }
3837*53ee8cc1Swenshuai.xi
3838*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3839*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetISREvent()
3840*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by HVD fw.
3841*53ee8cc1Swenshuai.xi /// @param -u32Event \b IN : event types
3842*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
3843*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
3844*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetISREvent(MS_U32 u32Id,MS_U32 u32Event,HVD_InterruptCb fnISRHandler)3845*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetISREvent(MS_U32 u32Id, MS_U32 u32Event, HVD_InterruptCb fnISRHandler)
3846*53ee8cc1Swenshuai.xi {
3847*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
3848*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
3849*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
3850*53ee8cc1Swenshuai.xi
3851*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
3852*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
3853*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
3854*53ee8cc1Swenshuai.xi
3855*53ee8cc1Swenshuai.xi if (u32Event == E_HVD_EX_ISR_NONE)
3856*53ee8cc1Swenshuai.xi {
3857*53ee8cc1Swenshuai.xi pCtrl->Settings.bEnISR = FALSE;
3858*53ee8cc1Swenshuai.xi ////OSAL_HVD_ISR_Disable();
3859*53ee8cc1Swenshuai.xi // Fix the ISR imbalance of Enable and Disable
3860*53ee8cc1Swenshuai.xi if(pCtrl->HVDISRCtrl.bIsHvdIsr == TRUE) // hvd case
3861*53ee8cc1Swenshuai.xi {
3862*53ee8cc1Swenshuai.xi if((pHVDDrvContext->bHVDDisableISRFlag != TRUE) && (FALSE == pHVDDrvContext->gHVDCtrl_EX[1-u8DrvId].bUsed))
3863*53ee8cc1Swenshuai.xi {
3864*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
3865*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, FALSE);
3866*53ee8cc1Swenshuai.xi #else
3867*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
3868*53ee8cc1Swenshuai.xi #endif
3869*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDDisableISRFlag = OSAL_HVD_ISR_Disable(TRUE);
3870*53ee8cc1Swenshuai.xi if(pHVDDrvContext->bHVDDisableISRFlag == FALSE)
3871*53ee8cc1Swenshuai.xi {
3872*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("%s Disable Interrupt Fail\n", __FUNCTION__);
3873*53ee8cc1Swenshuai.xi }
3874*53ee8cc1Swenshuai.xi //OSAL_HVD_ISR_Detach();
3875*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_HVD_FEATURE) && !defined(DISABLE_ISR_DETACH)
3876*53ee8cc1Swenshuai.xi if(TRUE == pHVDDrvContext->bHVDIsIsrAttached)
3877*53ee8cc1Swenshuai.xi {
3878*53ee8cc1Swenshuai.xi OSAL_HVD_ISR_Detach(pCtrl->HVDISRCtrl.bIsHvdIsr);
3879*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsIsrAttached = FALSE;
3880*53ee8cc1Swenshuai.xi }
3881*53ee8cc1Swenshuai.xi #endif
3882*53ee8cc1Swenshuai.xi }
3883*53ee8cc1Swenshuai.xi }
3884*53ee8cc1Swenshuai.xi else // evd case
3885*53ee8cc1Swenshuai.xi {
3886*53ee8cc1Swenshuai.xi if((pHVDDrvContext->bEVDDisableISRFlag != TRUE) && (FALSE == pHVDDrvContext->gHVDCtrl_EX[1-u8DrvId].bUsed))
3887*53ee8cc1Swenshuai.xi {
3888*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
3889*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, FALSE);
3890*53ee8cc1Swenshuai.xi #else
3891*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
3892*53ee8cc1Swenshuai.xi #endif
3893*53ee8cc1Swenshuai.xi pHVDDrvContext->bEVDDisableISRFlag = OSAL_HVD_ISR_Disable(FALSE);
3894*53ee8cc1Swenshuai.xi if(pHVDDrvContext->bEVDDisableISRFlag == FALSE)
3895*53ee8cc1Swenshuai.xi {
3896*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("%s Disable Interrupt Fail\n", __FUNCTION__);
3897*53ee8cc1Swenshuai.xi }
3898*53ee8cc1Swenshuai.xi //OSAL_HVD_ISR_Detach();
3899*53ee8cc1Swenshuai.xi #if !defined(SUPPORT_X_MODEL_HVD_FEATURE) && !defined(DISABLE_ISR_DETACH)
3900*53ee8cc1Swenshuai.xi if(TRUE == pHVDDrvContext->bEVDIsIsrAttached)
3901*53ee8cc1Swenshuai.xi {
3902*53ee8cc1Swenshuai.xi OSAL_HVD_ISR_Detach(pCtrl->HVDISRCtrl.bIsHvdIsr);
3903*53ee8cc1Swenshuai.xi pHVDDrvContext->bEVDIsIsrAttached = FALSE;
3904*53ee8cc1Swenshuai.xi }
3905*53ee8cc1Swenshuai.xi #endif
3906*53ee8cc1Swenshuai.xi }
3907*53ee8cc1Swenshuai.xi }
3908*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bRegISR = FALSE;
3909*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.pfnISRCallBack = NULL;
3910*53ee8cc1Swenshuai.xi pCtrl->Settings.u32IsrEvent = (MS_U32) E_HVD_EX_ISR_NONE;
3911*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3912*53ee8cc1Swenshuai.xi }
3913*53ee8cc1Swenshuai.xi else
3914*53ee8cc1Swenshuai.xi {
3915*53ee8cc1Swenshuai.xi if (fnISRHandler != NULL)
3916*53ee8cc1Swenshuai.xi {
3917*53ee8cc1Swenshuai.xi #if 1 //If ISR handler has been registerred, we only need to reset event flag.
3918*53ee8cc1Swenshuai.xi if (pCtrl->HVDISRCtrl.bRegISR)
3919*53ee8cc1Swenshuai.xi {
3920*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
3921*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
3922*53ee8cc1Swenshuai.xi
3923*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3924*53ee8cc1Swenshuai.xi {
3925*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3926*53ee8cc1Swenshuai.xi }
3927*53ee8cc1Swenshuai.xi
3928*53ee8cc1Swenshuai.xi pCtrl->Settings.u32IsrEvent = u32Event;
3929*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3930*53ee8cc1Swenshuai.xi }
3931*53ee8cc1Swenshuai.xi else
3932*53ee8cc1Swenshuai.xi {
3933*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
3934*53ee8cc1Swenshuai.xi //OSAL_HVD_ISR_Attach((void *) _HVD_EX_ISRHandler);
3935*53ee8cc1Swenshuai.xi //OSAL_HVD_ISR_Enable();
3936*53ee8cc1Swenshuai.xi if (TRUE == pCtrl->HVDISRCtrl.bIsHvdIsr)
3937*53ee8cc1Swenshuai.xi {
3938*53ee8cc1Swenshuai.xi if (FALSE == pHVDDrvContext->bHVDIsIsrAttached)
3939*53ee8cc1Swenshuai.xi {
3940*53ee8cc1Swenshuai.xi if (OSAL_HVD_ISR_Attach(pCtrl->HVDISRCtrl.bIsHvdIsr, (void*)_HVD_EX_ISRHandler) != TRUE)
3941*53ee8cc1Swenshuai.xi {
3942*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("fail to attach HVD_IsrProc!\n");
3943*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
3944*53ee8cc1Swenshuai.xi }
3945*53ee8cc1Swenshuai.xi HVD_PRINT("attach ISR number:%d\n", HVD_ISR_VECTOR);
3946*53ee8cc1Swenshuai.xi pHVDDrvContext->bHVDIsIsrAttached = TRUE;
3947*53ee8cc1Swenshuai.xi }
3948*53ee8cc1Swenshuai.xi }
3949*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
3950*53ee8cc1Swenshuai.xi else //evd
3951*53ee8cc1Swenshuai.xi {
3952*53ee8cc1Swenshuai.xi if (FALSE == pHVDDrvContext->bEVDIsIsrAttached)
3953*53ee8cc1Swenshuai.xi {
3954*53ee8cc1Swenshuai.xi if (OSAL_HVD_ISR_Attach(pCtrl->HVDISRCtrl.bIsHvdIsr, (void*)_HVD_EX_ISRHandler) != TRUE)
3955*53ee8cc1Swenshuai.xi {
3956*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("fail to attach HVD_IsrProc!\n");
3957*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
3958*53ee8cc1Swenshuai.xi }
3959*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
3960*53ee8cc1Swenshuai.xi if (pCtrl->HVDISRCtrl.bIsG2Vp9Isr)
3961*53ee8cc1Swenshuai.xi {
3962*53ee8cc1Swenshuai.xi HVD_PRINT("attach ISR number:%d\n", -1/*VP9_ISR_VECTOR*/);
3963*53ee8cc1Swenshuai.xi }
3964*53ee8cc1Swenshuai.xi else
3965*53ee8cc1Swenshuai.xi #endif
3966*53ee8cc1Swenshuai.xi {
3967*53ee8cc1Swenshuai.xi HVD_PRINT("attach ISR number:%d\n", EVD_ISR_VECTOR);
3968*53ee8cc1Swenshuai.xi }
3969*53ee8cc1Swenshuai.xi pHVDDrvContext->bEVDIsIsrAttached = TRUE;
3970*53ee8cc1Swenshuai.xi }
3971*53ee8cc1Swenshuai.xi }
3972*53ee8cc1Swenshuai.xi #endif
3973*53ee8cc1Swenshuai.xi
3974*53ee8cc1Swenshuai.xi if (OSAL_HVD_ISR_Enable(pCtrl->HVDISRCtrl.bIsHvdIsr) != TRUE)
3975*53ee8cc1Swenshuai.xi {
3976*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("fail to OSAL_HVD_IntEnable!\n");
3977*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
3978*53ee8cc1Swenshuai.xi }
3979*53ee8cc1Swenshuai.xi
3980*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
3981*53ee8cc1Swenshuai.xi
3982*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
3983*53ee8cc1Swenshuai.xi {
3984*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
3985*53ee8cc1Swenshuai.xi }
3986*53ee8cc1Swenshuai.xi
3987*53ee8cc1Swenshuai.xi pCtrl->Settings.u32IsrEvent = u32Event;
3988*53ee8cc1Swenshuai.xi pCtrl->Settings.bEnISR = TRUE;
3989*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
3990*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, TRUE);
3991*53ee8cc1Swenshuai.xi #else
3992*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(TRUE);
3993*53ee8cc1Swenshuai.xi #endif
3994*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bRegISR = TRUE;
3995*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
3996*53ee8cc1Swenshuai.xi }
3997*53ee8cc1Swenshuai.xi #else
3998*53ee8cc1Swenshuai.xi
3999*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(FALSE);
4000*53ee8cc1Swenshuai.xi
4001*53ee8cc1Swenshuai.xi if (pCtrl->HVDISRCtrl.bRegISR)
4002*53ee8cc1Swenshuai.xi {
4003*53ee8cc1Swenshuai.xi OSAL_HVD_ISR_Detach();
4004*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bRegISR = FALSE;
4005*53ee8cc1Swenshuai.xi }
4006*53ee8cc1Swenshuai.xi
4007*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack) fnISRHandler;
4008*53ee8cc1Swenshuai.xi OSAL_HVD_ISR_Attach((void *) _HVD_EX_ISRHandler);
4009*53ee8cc1Swenshuai.xi OSAL_HVD_ISR_Enable();
4010*53ee8cc1Swenshuai.xi
4011*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("attach ISR number:%d\n", HVD_ISR_VECTOR);
4012*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ISR_TYPE, u32Event);
4013*53ee8cc1Swenshuai.xi pCtrl->Settings.u32IsrEvent = u32Event;
4014*53ee8cc1Swenshuai.xi
4015*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
4016*53ee8cc1Swenshuai.xi {
4017*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4018*53ee8cc1Swenshuai.xi }
4019*53ee8cc1Swenshuai.xi
4020*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(TRUE);
4021*53ee8cc1Swenshuai.xi pCtrl->HVDISRCtrl.bRegISR = TRUE;
4022*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
4023*53ee8cc1Swenshuai.xi #endif
4024*53ee8cc1Swenshuai.xi }
4025*53ee8cc1Swenshuai.xi else
4026*53ee8cc1Swenshuai.xi {
4027*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("SetISREvent with NULL pointer. ISR type:%lu\n", u32Event);
4028*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
4029*53ee8cc1Swenshuai.xi }
4030*53ee8cc1Swenshuai.xi }
4031*53ee8cc1Swenshuai.xi
4032*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4033*53ee8cc1Swenshuai.xi }
4034*53ee8cc1Swenshuai.xi
4035*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4036*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetEnableISR()
4037*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable HVD interrupt.
4038*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4039*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable interrupt.
4040*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable interrupt.
4041*53ee8cc1Swenshuai.xi /// @return -The result of command set enable ISR.
4042*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetEnableISR(MS_U32 u32Id,MS_BOOL bEnable)4043*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetEnableISR(MS_U32 u32Id, MS_BOOL bEnable)
4044*53ee8cc1Swenshuai.xi {
4045*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4046*53ee8cc1Swenshuai.xi
4047*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4048*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4049*53ee8cc1Swenshuai.xi
4050*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
4051*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(u32Id, bEnable);
4052*53ee8cc1Swenshuai.xi #else
4053*53ee8cc1Swenshuai.xi HAL_HVD_EX_EnableISR(bEnable);
4054*53ee8cc1Swenshuai.xi #endif
4055*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bEnISR = bEnable;
4056*53ee8cc1Swenshuai.xi
4057*53ee8cc1Swenshuai.xi return TRUE;
4058*53ee8cc1Swenshuai.xi }
4059*53ee8cc1Swenshuai.xi
4060*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4061*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetForceISR()
4062*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: test the HVD interrupt function. Force FW send one interrupt.
4063*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
4064*53ee8cc1Swenshuai.xi /// -FALSE(0): Clear force interrupt status from HK.
4065*53ee8cc1Swenshuai.xi /// -TRUE(1): force one interrupt from HK.
4066*53ee8cc1Swenshuai.xi /// @return -The result of command set force ISR.
4067*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetForceISR(MS_U32 u32Id,MS_BOOL bEnable)4068*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetForceISR(MS_U32 u32Id, MS_BOOL bEnable)
4069*53ee8cc1Swenshuai.xi {
4070*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4071*53ee8cc1Swenshuai.xi //_DRV_HVD_Inited(FALSE);
4072*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
4073*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetForceISR(u32Id, bEnable);
4074*53ee8cc1Swenshuai.xi #else
4075*53ee8cc1Swenshuai.xi UNUSED(u32Id);
4076*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetForceISR(bEnable);
4077*53ee8cc1Swenshuai.xi #endif
4078*53ee8cc1Swenshuai.xi return TRUE;
4079*53ee8cc1Swenshuai.xi }
4080*53ee8cc1Swenshuai.xi
4081*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4082*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetMVOPDone()
4083*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: tell FW MVOP is ready for futher decode.
4084*53ee8cc1Swenshuai.xi /// @return -The result of command.
4085*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetMVOPDone(MS_U32 u32Id)4086*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetMVOPDone(MS_U32 u32Id)
4087*53ee8cc1Swenshuai.xi {
4088*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4089*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4090*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4091*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4092*53ee8cc1Swenshuai.xi
4093*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BLUE_SCREEN, FALSE);
4094*53ee8cc1Swenshuai.xi
4095*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK == eRet)
4096*53ee8cc1Swenshuai.xi {
4097*53ee8cc1Swenshuai.xi return TRUE;
4098*53ee8cc1Swenshuai.xi }
4099*53ee8cc1Swenshuai.xi else
4100*53ee8cc1Swenshuai.xi {
4101*53ee8cc1Swenshuai.xi return FALSE;
4102*53ee8cc1Swenshuai.xi }
4103*53ee8cc1Swenshuai.xi }
4104*53ee8cc1Swenshuai.xi
4105*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4106*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVirtualBox()
4107*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set DS width and Height to F/W
4108*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN : frame width
4109*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN : frame height
4110*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVirtualBox(MS_U32 u32Id,MS_U16 u16Width,MS_U16 u16Height)4111*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetVirtualBox(MS_U32 u32Id, MS_U16 u16Width, MS_U16 u16Height)
4112*53ee8cc1Swenshuai.xi {
4113*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4114*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4115*53ee8cc1Swenshuai.xi
4116*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4117*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4118*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4119*53ee8cc1Swenshuai.xi
4120*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_VIRTUAL_BOX_WIDTH, u16Width);
4121*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_VIRTUAL_BOX_HEIGHT, u16Height);
4122*53ee8cc1Swenshuai.xi
4123*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
4124*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4125*53ee8cc1Swenshuai.xi }
4126*53ee8cc1Swenshuai.xi
4127*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4128*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDynScalingParam()
4129*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Pass scalar parameters to decoder
4130*53ee8cc1Swenshuai.xi /// @return -The result of command.
4131*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDynScalingParam(MS_U32 u32Id,void * pStAddr,MS_U32 u32Size)4132*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDynScalingParam(MS_U32 u32Id, void *pStAddr, MS_U32 u32Size)
4133*53ee8cc1Swenshuai.xi {
4134*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4135*53ee8cc1Swenshuai.xi MS_U32 addr = 0;
4136*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4137*53ee8cc1Swenshuai.xi
4138*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4139*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4140*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4141*53ee8cc1Swenshuai.xi
4142*53ee8cc1Swenshuai.xi if ((pStAddr == NULL) || (u32Size == 0))
4143*53ee8cc1Swenshuai.xi {
4144*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
4145*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4146*53ee8cc1Swenshuai.xi }
4147*53ee8cc1Swenshuai.xi else
4148*53ee8cc1Swenshuai.xi {
4149*53ee8cc1Swenshuai.xi // 1. copy data input data array
4150*53ee8cc1Swenshuai.xi addr = MDrv_HVD_EX_GetDynamicScalingInfo(u32Id, E_HVD_EX_DS_INFO_ADDR);
4151*53ee8cc1Swenshuai.xi
4152*53ee8cc1Swenshuai.xi if(addr == 0x0)
4153*53ee8cc1Swenshuai.xi {
4154*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
4155*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4156*53ee8cc1Swenshuai.xi }
4157*53ee8cc1Swenshuai.xi
4158*53ee8cc1Swenshuai.xi HVD_memcpy(MS_PA2KSEG1(addr), pStAddr, u32Size);
4159*53ee8cc1Swenshuai.xi
4160*53ee8cc1Swenshuai.xi // 2. while till FW finish it.
4161*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SCALER_INFO_NOTIFY, ((MS_U8 *)pStAddr)[0]);
4162*53ee8cc1Swenshuai.xi }
4163*53ee8cc1Swenshuai.xi
4164*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4165*53ee8cc1Swenshuai.xi }
4166*53ee8cc1Swenshuai.xi
4167*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4168*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDispInfoTH()
4169*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the upper and lower limitation of a valid SPS.
4170*53ee8cc1Swenshuai.xi /// @param -DispInfoTH \b IN : tolerance.
4171*53ee8cc1Swenshuai.xi /// @return -The result of command set display inforation threshold
4172*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDispInfoTH(MS_U32 u32Id,HVD_EX_DispInfoThreshold * DispInfoTH)4173*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDispInfoTH(MS_U32 u32Id, HVD_EX_DispInfoThreshold *DispInfoTH)
4174*53ee8cc1Swenshuai.xi {
4175*53ee8cc1Swenshuai.xi HVD_Disp_Info_TH DispInfoTHTmp;
4176*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4177*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4178*53ee8cc1Swenshuai.xi
4179*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4180*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4181*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4182*53ee8cc1Swenshuai.xi
4183*53ee8cc1Swenshuai.xi if (DispInfoTH == NULL)
4184*53ee8cc1Swenshuai.xi {
4185*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4186*53ee8cc1Swenshuai.xi }
4187*53ee8cc1Swenshuai.xi
4188*53ee8cc1Swenshuai.xi DispInfoTHTmp.u32FrmrateLowBound = DispInfoTH->u32FrmrateLowBound;
4189*53ee8cc1Swenshuai.xi DispInfoTHTmp.u32FrmrateUpBound = DispInfoTH->u32FrmrateUpBound;
4190*53ee8cc1Swenshuai.xi DispInfoTHTmp.u32MvopLowBound = DispInfoTH->u32MvopLowBound;
4191*53ee8cc1Swenshuai.xi DispInfoTHTmp.u32MvopUpBound = DispInfoTH->u32MvopUpBound;
4192*53ee8cc1Swenshuai.xi
4193*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISP_INFO_TH, (MS_U32) (&DispInfoTHTmp));
4194*53ee8cc1Swenshuai.xi
4195*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
4196*53ee8cc1Swenshuai.xi
4197*53ee8cc1Swenshuai.xi HVD_memcpy((void *) &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.DispInfoTH), (void *) (DispInfoTH), sizeof(HVD_EX_DispInfoThreshold));
4198*53ee8cc1Swenshuai.xi
4199*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4200*53ee8cc1Swenshuai.xi }
4201*53ee8cc1Swenshuai.xi
4202*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4203*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetIgnoreErrRef()
4204*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on / off ignore error reference.
4205*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN : Enable/ Disable
4206*53ee8cc1Swenshuai.xi /// -FALSE(0): handle error reference
4207*53ee8cc1Swenshuai.xi /// -TRUE(1): ignore error reference
4208*53ee8cc1Swenshuai.xi /// @return -The result of command set ignore error reference
4209*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetIgnoreErrRef(MS_U32 u32Id,MS_BOOL bIgnore)4210*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetIgnoreErrRef(MS_U32 u32Id, MS_BOOL bIgnore)
4211*53ee8cc1Swenshuai.xi {
4212*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4213*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4214*53ee8cc1Swenshuai.xi
4215*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4216*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4217*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4218*53ee8cc1Swenshuai.xi
4219*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_ERR_REF, bIgnore);
4220*53ee8cc1Swenshuai.xi
4221*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4222*53ee8cc1Swenshuai.xi }
4223*53ee8cc1Swenshuai.xi
4224*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4225*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ForceFollowDTVSpec()
4226*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on / off Force follow DTV Spec
4227*53ee8cc1Swenshuai.xi /// @param -b bEnable \b IN : Enable/ Disable
4228*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable
4229*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable
4230*53ee8cc1Swenshuai.xi /// @return -The result of command set force follow DTV spec
4231*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ForceFollowDTVSpec(MS_U32 u32Id,MS_BOOL bEnable)4232*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ForceFollowDTVSpec(MS_U32 u32Id, MS_BOOL bEnable)
4233*53ee8cc1Swenshuai.xi {
4234*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4235*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4236*53ee8cc1Swenshuai.xi
4237*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4238*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4239*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4240*53ee8cc1Swenshuai.xi
4241*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_DTV_SPEC, bEnable);
4242*53ee8cc1Swenshuai.xi
4243*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4244*53ee8cc1Swenshuai.xi }
4245*53ee8cc1Swenshuai.xi
4246*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4247*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFastDisplay()
4248*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on / off fast display.
4249*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN : Enable/ Disable
4250*53ee8cc1Swenshuai.xi /// -FALSE(0): normal display
4251*53ee8cc1Swenshuai.xi /// -TRUE(1): fast display
4252*53ee8cc1Swenshuai.xi /// @return -The result of command set fast display
4253*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFastDisplay(MS_U32 u32Id,MS_BOOL bFastDisplay)4254*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFastDisplay(MS_U32 u32Id, MS_BOOL bFastDisplay)
4255*53ee8cc1Swenshuai.xi {
4256*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4257*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4258*53ee8cc1Swenshuai.xi
4259*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4260*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4261*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4262*53ee8cc1Swenshuai.xi
4263*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FAST_DISP, bFastDisplay);
4264*53ee8cc1Swenshuai.xi
4265*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4266*53ee8cc1Swenshuai.xi }
4267*53ee8cc1Swenshuai.xi
4268*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4269*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DispOutsideMode()
4270*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on / off Disp control method which handle by app side
4271*53ee8cc1Swenshuai.xi /// @param -b bEnable \b IN : Enable/ Disable
4272*53ee8cc1Swenshuai.xi /// -FALSE(0): Disable
4273*53ee8cc1Swenshuai.xi /// -TRUE(1): Enable
4274*53ee8cc1Swenshuai.xi /// @return -
4275*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DispOutsideMode(MS_U32 u32Id,MS_BOOL bEnable)4276*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DispOutsideMode(MS_U32 u32Id, MS_BOOL bEnable)
4277*53ee8cc1Swenshuai.xi {
4278*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4279*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4280*53ee8cc1Swenshuai.xi
4281*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4282*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4283*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
4284*53ee8cc1Swenshuai.xi _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_OUTSIDE);
4285*53ee8cc1Swenshuai.xi //change to open max setting ,wait f/w release new fwHVD_if
4286*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_DISP_OUTSIDE, bEnable);
4287*53ee8cc1Swenshuai.xi
4288*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
4289*53ee8cc1Swenshuai.xi }
4290*53ee8cc1Swenshuai.xi // check status
4291*53ee8cc1Swenshuai.xi
4292*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4293*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsISROccured()
4294*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check if the ISR is occured or not.
4295*53ee8cc1Swenshuai.xi /// @return - Is occured or not
4296*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): interrupt is not occured.
4297*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): interrupt has been occured.
4298*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsISROccured(MS_U32 u32Id)4299*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsISROccured(MS_U32 u32Id)
4300*53ee8cc1Swenshuai.xi {
4301*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4302*53ee8cc1Swenshuai.xi //_DRV_HVD_Inited(FALSE);
4303*53ee8cc1Swenshuai.xi #if defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MADISON) || defined(CHIP_MIAMI) || defined(CHIP_KERES) || defined(CHIP_KIRIN) || defined(CHIP_MUJI) || defined(CHIP_MUNICH) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
4304*53ee8cc1Swenshuai.xi return HAL_HVD_EX_IsISROccured(u32Id);
4305*53ee8cc1Swenshuai.xi #else
4306*53ee8cc1Swenshuai.xi UNUSED(u32Id);
4307*53ee8cc1Swenshuai.xi return HAL_HVD_EX_IsISROccured();
4308*53ee8cc1Swenshuai.xi #endif
4309*53ee8cc1Swenshuai.xi }
4310*53ee8cc1Swenshuai.xi
4311*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4312*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsDispFinish()
4313*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check this file mode display is finish or not. only work after MDrv_HVD_EX_SetDataEnd(TRUE)
4314*53ee8cc1Swenshuai.xi /// @return - Is finish or not
4315*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): Not finish or Not in file mode playback
4316*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Display Finished.
4317*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsDispFinish(MS_U32 u32Id)4318*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsDispFinish(MS_U32 u32Id)
4319*53ee8cc1Swenshuai.xi {
4320*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4321*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4322*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4323*53ee8cc1Swenshuai.xi
4324*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
4325*53ee8cc1Swenshuai.xi {
4326*53ee8cc1Swenshuai.xi return FALSE;
4327*53ee8cc1Swenshuai.xi }
4328*53ee8cc1Swenshuai.xi
4329*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DATA_END)
4330*53ee8cc1Swenshuai.xi {
4331*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_VP8)
4332*53ee8cc1Swenshuai.xi {
4333*53ee8cc1Swenshuai.xi if (_HVD_EX_IsAllBufferEmpty_VP8(u32Id))
4334*53ee8cc1Swenshuai.xi {
4335*53ee8cc1Swenshuai.xi return TRUE;
4336*53ee8cc1Swenshuai.xi }
4337*53ee8cc1Swenshuai.xi else
4338*53ee8cc1Swenshuai.xi {
4339*53ee8cc1Swenshuai.xi return FALSE;
4340*53ee8cc1Swenshuai.xi }
4341*53ee8cc1Swenshuai.xi }
4342*53ee8cc1Swenshuai.xi else
4343*53ee8cc1Swenshuai.xi {
4344*53ee8cc1Swenshuai.xi if (_HVD_EX_IsAllBufferEmpty(u32Id))
4345*53ee8cc1Swenshuai.xi {
4346*53ee8cc1Swenshuai.xi return TRUE;
4347*53ee8cc1Swenshuai.xi }
4348*53ee8cc1Swenshuai.xi else
4349*53ee8cc1Swenshuai.xi {
4350*53ee8cc1Swenshuai.xi //_DRV_HVD_PushDummy();
4351*53ee8cc1Swenshuai.xi return FALSE;
4352*53ee8cc1Swenshuai.xi }
4353*53ee8cc1Swenshuai.xi }
4354*53ee8cc1Swenshuai.xi }
4355*53ee8cc1Swenshuai.xi else
4356*53ee8cc1Swenshuai.xi {
4357*53ee8cc1Swenshuai.xi return FALSE;
4358*53ee8cc1Swenshuai.xi }
4359*53ee8cc1Swenshuai.xi }
4360*53ee8cc1Swenshuai.xi
4361*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4362*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsFrameShowed()
4363*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Is HVD Frame showed after TriggerDisp(TRUE) or first frame showed
4364*53ee8cc1Swenshuai.xi /// @return - Is frame showed or not
4365*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): New Framed showed
4366*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Not showed
4367*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsFrameShowed(MS_U32 u32Id)4368*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsFrameShowed(MS_U32 u32Id)
4369*53ee8cc1Swenshuai.xi {
4370*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4371*53ee8cc1Swenshuai.xi
4372*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4373*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4374*53ee8cc1Swenshuai.xi
4375*53ee8cc1Swenshuai.xi if (!HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_1ST_FRM_RDY))
4376*53ee8cc1Swenshuai.xi {
4377*53ee8cc1Swenshuai.xi // 1st frame not ready or AV sync not ready
4378*53ee8cc1Swenshuai.xi return FALSE;
4379*53ee8cc1Swenshuai.xi }
4380*53ee8cc1Swenshuai.xi else
4381*53ee8cc1Swenshuai.xi {
4382*53ee8cc1Swenshuai.xi // 1st frame showed or AV sync ready
4383*53ee8cc1Swenshuai.xi if (_DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL))
4384*53ee8cc1Swenshuai.xi {
4385*53ee8cc1Swenshuai.xi // control display
4386*53ee8cc1Swenshuai.xi return (MS_BOOL) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_FRAME_SHOWED);
4387*53ee8cc1Swenshuai.xi }
4388*53ee8cc1Swenshuai.xi else
4389*53ee8cc1Swenshuai.xi {
4390*53ee8cc1Swenshuai.xi // cotrol decode
4391*53ee8cc1Swenshuai.xi return TRUE;
4392*53ee8cc1Swenshuai.xi }
4393*53ee8cc1Swenshuai.xi }
4394*53ee8cc1Swenshuai.xi }
4395*53ee8cc1Swenshuai.xi
4396*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4397*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsStepDecodeDone()
4398*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Is HVD step decode done after step decode command.
4399*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
4400*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoding, or user did not send corresponding step decode command.
4401*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decode done
4402*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsStepDecodeDone(MS_U32 u32Id)4403*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsStepDecodeDone(MS_U32 u32Id)
4404*53ee8cc1Swenshuai.xi {
4405*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
4406*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4407*53ee8cc1Swenshuai.xi
4408*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4409*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4410*53ee8cc1Swenshuai.xi
4411*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding)
4412*53ee8cc1Swenshuai.xi {
4413*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt !=
4414*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT))
4415*53ee8cc1Swenshuai.xi {
4416*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32StepDecodeCnt = 0;
4417*53ee8cc1Swenshuai.xi bRet = TRUE;
4418*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bStepDecoding = FALSE;
4419*53ee8cc1Swenshuai.xi }
4420*53ee8cc1Swenshuai.xi }
4421*53ee8cc1Swenshuai.xi
4422*53ee8cc1Swenshuai.xi return bRet;
4423*53ee8cc1Swenshuai.xi }
4424*53ee8cc1Swenshuai.xi
4425*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4426*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_CheckDispInfoRdy()
4427*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check display info ready and correct or not
4428*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
4429*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_CheckDispInfoRdy(MS_U32 u32Id)4430*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CheckDispInfoRdy(MS_U32 u32Id)
4431*53ee8cc1Swenshuai.xi {
4432*53ee8cc1Swenshuai.xi MS_U32 u32ErrCode = 0;
4433*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
4434*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4435*53ee8cc1Swenshuai.xi
4436*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4437*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
4438*53ee8cc1Swenshuai.xi
4439*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
4440*53ee8cc1Swenshuai.xi {
4441*53ee8cc1Swenshuai.xi if (!HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_CHANGE))
4442*53ee8cc1Swenshuai.xi {
4443*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_NOTREADY;
4444*53ee8cc1Swenshuai.xi }
4445*53ee8cc1Swenshuai.xi else
4446*53ee8cc1Swenshuai.xi {
4447*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = TRUE;
4448*53ee8cc1Swenshuai.xi _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_INFO_RDY);
4449*53ee8cc1Swenshuai.xi }
4450*53ee8cc1Swenshuai.xi }
4451*53ee8cc1Swenshuai.xi
4452*53ee8cc1Swenshuai.xi // check if FW report error
4453*53ee8cc1Swenshuai.xi u32ErrCode = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ERROR_CODE);
4454*53ee8cc1Swenshuai.xi
4455*53ee8cc1Swenshuai.xi if (u32ErrCode != 0)
4456*53ee8cc1Swenshuai.xi {
4457*53ee8cc1Swenshuai.xi if (u32ErrCode == E_HVD_ERR_OUT_OF_MEMORY)
4458*53ee8cc1Swenshuai.xi {
4459*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR
4460*53ee8cc1Swenshuai.xi ("FW error that Out of Memory:%lx. Allocated frame buffer size is smaller than required.\n",
4461*53ee8cc1Swenshuai.xi u32ErrCode);
4462*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = FALSE;
4463*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_OUTOF_MEMORY;
4464*53ee8cc1Swenshuai.xi }
4465*53ee8cc1Swenshuai.xi }
4466*53ee8cc1Swenshuai.xi
4467*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
4468*53ee8cc1Swenshuai.xi }
4469*53ee8cc1Swenshuai.xi
4470*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4471*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsDispInfoChg()
4472*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check display info is changed or not
4473*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4474*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): not changed
4475*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): changed
4476*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsDispInfoChg(MS_U32 u32Id)4477*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsDispInfoChg(MS_U32 u32Id)
4478*53ee8cc1Swenshuai.xi {
4479*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
4480*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4481*53ee8cc1Swenshuai.xi
4482*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4483*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4484*53ee8cc1Swenshuai.xi
4485*53ee8cc1Swenshuai.xi bRet = (MS_BOOL) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_DISP_INFO_CHANGE);
4486*53ee8cc1Swenshuai.xi
4487*53ee8cc1Swenshuai.xi if (bRet)
4488*53ee8cc1Swenshuai.xi {
4489*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bIsDispInfoChg = TRUE;
4490*53ee8cc1Swenshuai.xi _DRV_HVD_SetCtrl(u8DrvId, HVD_CTRL_DISP_INFO_RDY);
4491*53ee8cc1Swenshuai.xi }
4492*53ee8cc1Swenshuai.xi #if 0 // debug use
4493*53ee8cc1Swenshuai.xi {
4494*53ee8cc1Swenshuai.xi static MS_U32 u32DecodeCnt = 0;
4495*53ee8cc1Swenshuai.xi static MS_U32 u32IdleCnt = 0;
4496*53ee8cc1Swenshuai.xi MS_U32 tmp = 0;
4497*53ee8cc1Swenshuai.xi tmp = MDrv_HVD_EX_GetDecodeCnt(u32Id);
4498*53ee8cc1Swenshuai.xi
4499*53ee8cc1Swenshuai.xi if (u32DecodeCnt != tmp)
4500*53ee8cc1Swenshuai.xi {
4501*53ee8cc1Swenshuai.xi HVD_PRINT("%lu decode cnt:%lx PTS:%lx\n", (MS_U32) bRet, tmp, MDrv_HVD_EX_GetPTS(u32Id));
4502*53ee8cc1Swenshuai.xi u32DecodeCnt = tmp;
4503*53ee8cc1Swenshuai.xi }
4504*53ee8cc1Swenshuai.xi else
4505*53ee8cc1Swenshuai.xi {
4506*53ee8cc1Swenshuai.xi u32IdleCnt++;
4507*53ee8cc1Swenshuai.xi }
4508*53ee8cc1Swenshuai.xi if (u32IdleCnt > 1000)
4509*53ee8cc1Swenshuai.xi {
4510*53ee8cc1Swenshuai.xi HVD_PRINT("HVD: seems IDLE: %lu decode cnt:%lx PTS:%lx\n", (MS_U32) bRet, tmp, MDrv_HVD_EX_GetPTS(u32Id));
4511*53ee8cc1Swenshuai.xi u32IdleCnt = 0;
4512*53ee8cc1Swenshuai.xi }
4513*53ee8cc1Swenshuai.xi }
4514*53ee8cc1Swenshuai.xi #endif
4515*53ee8cc1Swenshuai.xi return bRet;
4516*53ee8cc1Swenshuai.xi }
4517*53ee8cc1Swenshuai.xi
4518*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4519*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsIdle()
4520*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check decoder is idle or not
4521*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4522*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoder is not idle
4523*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decoder is idle
4524*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsIdle(MS_U32 u32Id)4525*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsIdle(MS_U32 u32Id)
4526*53ee8cc1Swenshuai.xi {
4527*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4528*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4529*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4530*53ee8cc1Swenshuai.xi
4531*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD)
4532*53ee8cc1Swenshuai.xi {
4533*53ee8cc1Swenshuai.xi return TRUE;
4534*53ee8cc1Swenshuai.xi }
4535*53ee8cc1Swenshuai.xi else
4536*53ee8cc1Swenshuai.xi {
4537*53ee8cc1Swenshuai.xi return FALSE;
4538*53ee8cc1Swenshuai.xi }
4539*53ee8cc1Swenshuai.xi }
4540*53ee8cc1Swenshuai.xi
4541*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4542*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsSyncStart()
4543*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check decoder starts to do sync action(drop or repeat) or not.
4544*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4545*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): decoder is not doing sync action
4546*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): decoder is doing sync action
4547*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsSyncStart(MS_U32 u32Id)4548*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsSyncStart(MS_U32 u32Id)
4549*53ee8cc1Swenshuai.xi {
4550*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4551*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4552*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4553*53ee8cc1Swenshuai.xi
4554*53ee8cc1Swenshuai.xi if ((MS_BOOL) MDrv_HVD_EX_GetPlayMode(u32Id, E_HVD_EX_GMODE_IS_SYNC_ON) == FALSE)
4555*53ee8cc1Swenshuai.xi {
4556*53ee8cc1Swenshuai.xi return FALSE;
4557*53ee8cc1Swenshuai.xi }
4558*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_SYNC_START))
4559*53ee8cc1Swenshuai.xi {
4560*53ee8cc1Swenshuai.xi return TRUE;
4561*53ee8cc1Swenshuai.xi }
4562*53ee8cc1Swenshuai.xi else
4563*53ee8cc1Swenshuai.xi {
4564*53ee8cc1Swenshuai.xi return FALSE;
4565*53ee8cc1Swenshuai.xi }
4566*53ee8cc1Swenshuai.xi }
4567*53ee8cc1Swenshuai.xi
4568*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4569*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsSyncReach()
4570*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: The distance of Video time stamp and STC is closed enough.
4571*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4572*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): The distance is not shorter than sync tolerance.
4573*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): The distance is shorter than sync tolerance.
4574*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsSyncReach(MS_U32 u32Id)4575*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsSyncReach(MS_U32 u32Id)
4576*53ee8cc1Swenshuai.xi {
4577*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4578*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4579*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4580*53ee8cc1Swenshuai.xi
4581*53ee8cc1Swenshuai.xi if ((MS_BOOL) MDrv_HVD_EX_GetPlayMode(u32Id, E_HVD_EX_GMODE_IS_SYNC_ON) == FALSE)
4582*53ee8cc1Swenshuai.xi {
4583*53ee8cc1Swenshuai.xi return FALSE;
4584*53ee8cc1Swenshuai.xi }
4585*53ee8cc1Swenshuai.xi
4586*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_SYNC_REACH))
4587*53ee8cc1Swenshuai.xi {
4588*53ee8cc1Swenshuai.xi return TRUE;
4589*53ee8cc1Swenshuai.xi }
4590*53ee8cc1Swenshuai.xi else
4591*53ee8cc1Swenshuai.xi {
4592*53ee8cc1Swenshuai.xi return FALSE;
4593*53ee8cc1Swenshuai.xi }
4594*53ee8cc1Swenshuai.xi }
4595*53ee8cc1Swenshuai.xi
4596*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4597*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsLowDelay()
4598*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check if current stream has low delay flag in SPS.
4599*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4600*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): Low delay flag not found.
4601*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Low delay flag found.
4602*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsLowDelay(MS_U32 u32Id)4603*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsLowDelay(MS_U32 u32Id)
4604*53ee8cc1Swenshuai.xi {
4605*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4606*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4607*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4608*53ee8cc1Swenshuai.xi
4609*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_LOW_DELAY))
4610*53ee8cc1Swenshuai.xi {
4611*53ee8cc1Swenshuai.xi return TRUE;
4612*53ee8cc1Swenshuai.xi }
4613*53ee8cc1Swenshuai.xi else
4614*53ee8cc1Swenshuai.xi {
4615*53ee8cc1Swenshuai.xi return FALSE;
4616*53ee8cc1Swenshuai.xi }
4617*53ee8cc1Swenshuai.xi }
4618*53ee8cc1Swenshuai.xi
4619*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4620*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsIFrmFound()
4621*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check if I frame found after Init() or flush().
4622*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4623*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): I frame is not found.
4624*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): I frame has been found.
4625*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsIFrmFound(MS_U32 u32Id)4626*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsIFrmFound(MS_U32 u32Id)
4627*53ee8cc1Swenshuai.xi {
4628*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4629*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4630*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4631*53ee8cc1Swenshuai.xi
4632*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_I_FRM_FOUND))
4633*53ee8cc1Swenshuai.xi {
4634*53ee8cc1Swenshuai.xi return TRUE;
4635*53ee8cc1Swenshuai.xi }
4636*53ee8cc1Swenshuai.xi else
4637*53ee8cc1Swenshuai.xi {
4638*53ee8cc1Swenshuai.xi return FALSE;
4639*53ee8cc1Swenshuai.xi }
4640*53ee8cc1Swenshuai.xi }
4641*53ee8cc1Swenshuai.xi
4642*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4643*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Is1stFrmRdy()
4644*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check if first frame showed on screen after Init() or flush().
4645*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4646*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): First frame is not showed.
4647*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): First frame is showed.
4648*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Is1stFrmRdy(MS_U32 u32Id)4649*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_Is1stFrmRdy(MS_U32 u32Id)
4650*53ee8cc1Swenshuai.xi {
4651*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4652*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4653*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4654*53ee8cc1Swenshuai.xi
4655*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_1ST_FRM_RDY))
4656*53ee8cc1Swenshuai.xi {
4657*53ee8cc1Swenshuai.xi return TRUE;
4658*53ee8cc1Swenshuai.xi }
4659*53ee8cc1Swenshuai.xi else
4660*53ee8cc1Swenshuai.xi {
4661*53ee8cc1Swenshuai.xi return FALSE;
4662*53ee8cc1Swenshuai.xi }
4663*53ee8cc1Swenshuai.xi }
4664*53ee8cc1Swenshuai.xi
4665*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4666*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsAllBufferEmpty()
4667*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check if all of the buffers(display, decoded, BBU, bitstream) are empty.
4668*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4669*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): Not Empty.
4670*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Empty.
4671*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)4672*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_IsAllBufferEmpty(MS_U32 u32Id)
4673*53ee8cc1Swenshuai.xi {
4674*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4675*53ee8cc1Swenshuai.xi //HVD_MSG_TRACE();
4676*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4677*53ee8cc1Swenshuai.xi
4678*53ee8cc1Swenshuai.xi if (_HVD_EX_IsAllBufferEmpty(u32Id))
4679*53ee8cc1Swenshuai.xi {
4680*53ee8cc1Swenshuai.xi return TRUE;
4681*53ee8cc1Swenshuai.xi }
4682*53ee8cc1Swenshuai.xi else
4683*53ee8cc1Swenshuai.xi {
4684*53ee8cc1Swenshuai.xi return FALSE;
4685*53ee8cc1Swenshuai.xi }
4686*53ee8cc1Swenshuai.xi #if 0
4687*53ee8cc1Swenshuai.xi if (u32Times > 200)
4688*53ee8cc1Swenshuai.xi {
4689*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("Flush() timeout failed:BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx \n",
4690*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(E_HVD_GDATA_BBU_Q_NUMB),
4691*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(E_HVD_GDATA_DEC_Q_NUMB),
4692*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB),
4693*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
4694*53ee8cc1Swenshuai.xi HAL_HVD_EX_GetData(E_HVD_GDATA_ES_READ_PTR), HAL_HVD_EX_GetData(E_HVD_GDATA_ES_WRITE_PTR));
4695*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
4696*53ee8cc1Swenshuai.xi break;
4697*53ee8cc1Swenshuai.xi }
4698*53ee8cc1Swenshuai.xi return TRUE;
4699*53ee8cc1Swenshuai.xi #endif
4700*53ee8cc1Swenshuai.xi }
4701*53ee8cc1Swenshuai.xi
4702*53ee8cc1Swenshuai.xi // get infomation
4703*53ee8cc1Swenshuai.xi
4704*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4705*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetBBUVacancy()
4706*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get the vacancy of BBU queue.
4707*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
4708*53ee8cc1Swenshuai.xi /// @retval -0: queue is full.
4709*53ee8cc1Swenshuai.xi /// @retval -not zero: queue is not full.
4710*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetBBUVacancy(MS_U32 u32Id)4711*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetBBUVacancy(MS_U32 u32Id)
4712*53ee8cc1Swenshuai.xi {
4713*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4714*53ee8cc1Swenshuai.xi MS_U32 u32BBUQnumb = 0;
4715*53ee8cc1Swenshuai.xi MS_U32 u32BBUTotal = 0;
4716*53ee8cc1Swenshuai.xi MS_U32 u32PTSQnumb = 0;
4717*53ee8cc1Swenshuai.xi MS_U32 u32PTSTotal = 0;
4718*53ee8cc1Swenshuai.xi
4719*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4720*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4721*53ee8cc1Swenshuai.xi
4722*53ee8cc1Swenshuai.xi u32BBUTotal = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY);
4723*53ee8cc1Swenshuai.xi u32BBUQnumb = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB);
4724*53ee8cc1Swenshuai.xi
4725*53ee8cc1Swenshuai.xi if (u32BBUTotal < u32BBUQnumb)
4726*53ee8cc1Swenshuai.xi {
4727*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Total BBUs(%lx) is less than the current(%lx)\n", u32BBUTotal, u32BBUQnumb);
4728*53ee8cc1Swenshuai.xi u32BBUQnumb = 0;
4729*53ee8cc1Swenshuai.xi }
4730*53ee8cc1Swenshuai.xi else
4731*53ee8cc1Swenshuai.xi {
4732*53ee8cc1Swenshuai.xi u32BBUQnumb = u32BBUTotal - u32BBUQnumb;
4733*53ee8cc1Swenshuai.xi
4734*53ee8cc1Swenshuai.xi if (u32BBUQnumb < MIN_BBU_VACANCY_FOR_4K2K)
4735*53ee8cc1Swenshuai.xi {
4736*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("BBU Vacancy(%lx) is less than MIN_BBU_VACANCY_FOR_4K2K(%x)\n", u32BBUQnumb, MIN_BBU_VACANCY_FOR_4K2K);
4737*53ee8cc1Swenshuai.xi u32BBUQnumb = 0;
4738*53ee8cc1Swenshuai.xi }
4739*53ee8cc1Swenshuai.xi }
4740*53ee8cc1Swenshuai.xi
4741*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
4742*53ee8cc1Swenshuai.xi if ( u32BBUQnumb &&
4743*53ee8cc1Swenshuai.xi ( (HAL_HVD_EX_CheckMVCID(u32Id) == FALSE) ||
4744*53ee8cc1Swenshuai.xi ((HAL_HVD_EX_CheckMVCID(u32Id) == TRUE) && (E_VDEC_EX_MAIN_VIEW == HAL_HVD_EX_GetView(u32Id))) )
4745*53ee8cc1Swenshuai.xi )
4746*53ee8cc1Swenshuai.xi #else
4747*53ee8cc1Swenshuai.xi if (u32BBUQnumb)
4748*53ee8cc1Swenshuai.xi #endif
4749*53ee8cc1Swenshuai.xi {
4750*53ee8cc1Swenshuai.xi u32PTSTotal = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB) - 1; // add -1 for full case
4751*53ee8cc1Swenshuai.xi u32PTSQnumb = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_PTS_Q_NUMB);
4752*53ee8cc1Swenshuai.xi
4753*53ee8cc1Swenshuai.xi if (u32PTSTotal <= u32PTSQnumb)
4754*53ee8cc1Swenshuai.xi {
4755*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG
4756*53ee8cc1Swenshuai.xi ("Warn: GetBBUVacancy has error that total PTS Q number(%lx) is smaller than current PTS Q number(%lx)\n",
4757*53ee8cc1Swenshuai.xi u32PTSTotal, u32PTSQnumb);
4758*53ee8cc1Swenshuai.xi u32BBUQnumb = 0;
4759*53ee8cc1Swenshuai.xi }
4760*53ee8cc1Swenshuai.xi }
4761*53ee8cc1Swenshuai.xi
4762*53ee8cc1Swenshuai.xi return u32BBUQnumb;
4763*53ee8cc1Swenshuai.xi }
4764*53ee8cc1Swenshuai.xi
4765*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4766*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDispInfo()
4767*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get video display information
4768*53ee8cc1Swenshuai.xi /// @param -pinfo \b OUT : pointer to video display information.
4769*53ee8cc1Swenshuai.xi /// @return -The result of command get display information
4770*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDispInfo(MS_U32 u32Id,HVD_EX_DispInfo * pInfo)4771*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetDispInfo(MS_U32 u32Id, HVD_EX_DispInfo *pInfo)
4772*53ee8cc1Swenshuai.xi {
4773*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
4774*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4775*53ee8cc1Swenshuai.xi
4776*53ee8cc1Swenshuai.xi eRet = _HVD_EX_GetDispInfo(u32Id, pInfo, TRUE);
4777*53ee8cc1Swenshuai.xi if (E_HVD_EX_OK == eRet)
4778*53ee8cc1Swenshuai.xi {
4779*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
4780*53ee8cc1Swenshuai.xi pCtrl->bFrmRateSupported = HAL_HVD_EX_GetFrmRateIsSupported(u32Id, pInfo->u16HorSize, pInfo->u16VerSize, pInfo->u32FrameRate);
4781*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("bFrmRateSupported[0x%x]=%x\n", u8DrvId, pCtrl->bFrmRateSupported);
4782*53ee8cc1Swenshuai.xi }
4783*53ee8cc1Swenshuai.xi
4784*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
4785*53ee8cc1Swenshuai.xi if (HVD_INIT_HW_RM == (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
4786*53ee8cc1Swenshuai.xi {
4787*53ee8cc1Swenshuai.xi //RM is always displayed by 60 frames per sec.
4788*53ee8cc1Swenshuai.xi pInfo->u32FrameRate = 60000;
4789*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("rm force set 60fps\n");
4790*53ee8cc1Swenshuai.xi }
4791*53ee8cc1Swenshuai.xi #endif
4792*53ee8cc1Swenshuai.xi
4793*53ee8cc1Swenshuai.xi return eRet;
4794*53ee8cc1Swenshuai.xi }
4795*53ee8cc1Swenshuai.xi
4796*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4797*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPtsStcDiff()
4798*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get the difference of PTS and STC
4799*53ee8cc1Swenshuai.xi /// @return - PTS
4800*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPtsStcDiff(MS_U32 u32Id)4801*53ee8cc1Swenshuai.xi MS_S64 MDrv_HVD_EX_GetPtsStcDiff(MS_U32 u32Id)
4802*53ee8cc1Swenshuai.xi {
4803*53ee8cc1Swenshuai.xi MS_S64 s64PTS = 0;
4804*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4805*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4806*53ee8cc1Swenshuai.xi
4807*53ee8cc1Swenshuai.xi s64PTS = HAL_HVD_EX_GetData_EX(u32Id, E_HVD_GDATA_PTS_STC_DIFF);
4808*53ee8cc1Swenshuai.xi
4809*53ee8cc1Swenshuai.xi return s64PTS;
4810*53ee8cc1Swenshuai.xi }
4811*53ee8cc1Swenshuai.xi
4812*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4813*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPTS()
4814*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get the pts of current displayed video frame. unit: ms
4815*53ee8cc1Swenshuai.xi /// @return - PTS
4816*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPTS(MS_U32 u32Id)4817*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPTS(MS_U32 u32Id)
4818*53ee8cc1Swenshuai.xi {
4819*53ee8cc1Swenshuai.xi MS_U32 u32PTS = 0;
4820*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4821*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4822*53ee8cc1Swenshuai.xi
4823*53ee8cc1Swenshuai.xi u32PTS = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_PTS);
4824*53ee8cc1Swenshuai.xi
4825*53ee8cc1Swenshuai.xi u32PTS = _HVD_EX_ReportLow32BitPTS(u32Id, u32PTS);
4826*53ee8cc1Swenshuai.xi
4827*53ee8cc1Swenshuai.xi return u32PTS;
4828*53ee8cc1Swenshuai.xi }
4829*53ee8cc1Swenshuai.xi
4830*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4831*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPTS()
4832*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get the 33 bits pts of current displayed video frame. unit: ms
4833*53ee8cc1Swenshuai.xi /// @return - PTS
4834*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetU64PTS(MS_U32 u32Id)4835*53ee8cc1Swenshuai.xi MS_U64 MDrv_HVD_EX_GetU64PTS(MS_U32 u32Id)
4836*53ee8cc1Swenshuai.xi {
4837*53ee8cc1Swenshuai.xi MS_U64 u64PTS = 0;
4838*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4839*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4840*53ee8cc1Swenshuai.xi
4841*53ee8cc1Swenshuai.xi u64PTS = *((MS_U64*)(HAL_HVD_EX_GetData(u32Id,E_HVD_GDATA_U64PTS)));
4842*53ee8cc1Swenshuai.xi
4843*53ee8cc1Swenshuai.xi return u64PTS;
4844*53ee8cc1Swenshuai.xi }
4845*53ee8cc1Swenshuai.xi
4846*53ee8cc1Swenshuai.xi
4847*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4848*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetNextPTS()
4849*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get the pts of next displayed video frame. unit: ms
4850*53ee8cc1Swenshuai.xi /// @return - PTS
4851*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetNextPTS(MS_U32 u32Id)4852*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetNextPTS(MS_U32 u32Id)
4853*53ee8cc1Swenshuai.xi {
4854*53ee8cc1Swenshuai.xi MS_U32 u32PTS = 0;
4855*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4856*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4857*53ee8cc1Swenshuai.xi
4858*53ee8cc1Swenshuai.xi u32PTS = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_NEXT_PTS);
4859*53ee8cc1Swenshuai.xi
4860*53ee8cc1Swenshuai.xi u32PTS = _HVD_EX_ReportLow32BitPTS(u32Id, u32PTS);
4861*53ee8cc1Swenshuai.xi
4862*53ee8cc1Swenshuai.xi return u32PTS;
4863*53ee8cc1Swenshuai.xi }
4864*53ee8cc1Swenshuai.xi
4865*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4866*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetNextDispQPtr()
4867*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get the pointer of next displayed video frame.
4868*53ee8cc1Swenshuai.xi /// @return - Pointer in the display queue
4869*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetNextDispQPtr(MS_U32 u32Id)4870*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetNextDispQPtr(MS_U32 u32Id)
4871*53ee8cc1Swenshuai.xi {
4872*53ee8cc1Swenshuai.xi MS_U32 u32Ptr = 0;
4873*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4874*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4875*53ee8cc1Swenshuai.xi
4876*53ee8cc1Swenshuai.xi //HVD_PRINT("GetNextDispQPtr DqNum=%ld, DqPtr=%ld\n", HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB), HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_PTR));
4877*53ee8cc1Swenshuai.xi //if (HAL_HVD_EX_GetData(E_HVD_GDATA_DISP_Q_NUMB) != 0)
4878*53ee8cc1Swenshuai.xi {
4879*53ee8cc1Swenshuai.xi u32Ptr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_PTR);
4880*53ee8cc1Swenshuai.xi }
4881*53ee8cc1Swenshuai.xi
4882*53ee8cc1Swenshuai.xi return u32Ptr;
4883*53ee8cc1Swenshuai.xi }
4884*53ee8cc1Swenshuai.xi
4885*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4886*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDataErrCnt()
4887*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get accumulated data Error Count
4888*53ee8cc1Swenshuai.xi /// @return -data error count
4889*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDataErrCnt(MS_U32 u32Id)4890*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDataErrCnt(MS_U32 u32Id)
4891*53ee8cc1Swenshuai.xi {
4892*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4893*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4894*53ee8cc1Swenshuai.xi
4895*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DATA_ERROR_CNT);
4896*53ee8cc1Swenshuai.xi }
4897*53ee8cc1Swenshuai.xi
4898*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4899*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDecErrCnt()
4900*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get accumulated decode Error Count
4901*53ee8cc1Swenshuai.xi /// @return -decode error count
4902*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDecErrCnt(MS_U32 u32Id)4903*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDecErrCnt(MS_U32 u32Id)
4904*53ee8cc1Swenshuai.xi {
4905*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4906*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4907*53ee8cc1Swenshuai.xi
4908*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_ERROR_CNT);
4909*53ee8cc1Swenshuai.xi }
4910*53ee8cc1Swenshuai.xi
4911*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4912*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetESWritePtr()
4913*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get Elementary Stream buffer write point
4914*53ee8cc1Swenshuai.xi /// @return - ES buffer write point offset from bitstream buffer base
4915*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESWritePtr(MS_U32 u32Id)4916*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESWritePtr(MS_U32 u32Id)
4917*53ee8cc1Swenshuai.xi {
4918*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4919*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4920*53ee8cc1Swenshuai.xi
4921*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_WRITE_PTR);
4922*53ee8cc1Swenshuai.xi }
4923*53ee8cc1Swenshuai.xi
4924*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4925*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetESReadPtr()
4926*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get Elementary Stream buffer read point
4927*53ee8cc1Swenshuai.xi /// @return - ES buffer read point offset from bitstream buffer base
4928*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESReadPtr(MS_U32 u32Id)4929*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESReadPtr(MS_U32 u32Id)
4930*53ee8cc1Swenshuai.xi {
4931*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4932*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4933*53ee8cc1Swenshuai.xi
4934*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_READ_PTR);
4935*53ee8cc1Swenshuai.xi }
4936*53ee8cc1Swenshuai.xi
4937*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4938*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetESLevel()
4939*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get Elementary Stream buffer level
4940*53ee8cc1Swenshuai.xi /// @return - ES buffer level (ES data size in bitstream buffer)
4941*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetESQuantity(MS_U32 u32Id)4942*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESQuantity(MS_U32 u32Id)
4943*53ee8cc1Swenshuai.xi {
4944*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4945*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4946*53ee8cc1Swenshuai.xi
4947*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_QUANTITY);
4948*53ee8cc1Swenshuai.xi }
4949*53ee8cc1Swenshuai.xi
4950*53ee8cc1Swenshuai.xi #define FATAL_ERROR(x) ((x)==E_HVD_RETURN_OUTOF_MEMORY)
4951*53ee8cc1Swenshuai.xi
4952*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4953*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetErrCode()
4954*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get error code
4955*53ee8cc1Swenshuai.xi /// @return - error code number
4956*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetErrCode(MS_U32 u32Id)4957*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetErrCode(MS_U32 u32Id)
4958*53ee8cc1Swenshuai.xi {
4959*53ee8cc1Swenshuai.xi // TODO: define driver error code for upper layer
4960*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
4961*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4962*53ee8cc1Swenshuai.xi
4963*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4964*53ee8cc1Swenshuai.xi
4965*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ERROR_CODE);
4966*53ee8cc1Swenshuai.xi
4967*53ee8cc1Swenshuai.xi u32Ret = _HVD_EX_Map2HVDErrCode(u32Ret);
4968*53ee8cc1Swenshuai.xi
4969*53ee8cc1Swenshuai.xi #ifdef SUPPORT_X_MODEL_FEATURE //We using the common compile option to handle X model
4970*53ee8cc1Swenshuai.xi if (!FATAL_ERROR(u32Ret))
4971*53ee8cc1Swenshuai.xi #else
4972*53ee8cc1Swenshuai.xi if (u32Ret)
4973*53ee8cc1Swenshuai.xi #endif
4974*53ee8cc1Swenshuai.xi {
4975*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_ERROR_CODE, 0);
4976*53ee8cc1Swenshuai.xi }
4977*53ee8cc1Swenshuai.xi
4978*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32LastErrCode = u32Ret;
4979*53ee8cc1Swenshuai.xi
4980*53ee8cc1Swenshuai.xi return u32Ret;
4981*53ee8cc1Swenshuai.xi }
4982*53ee8cc1Swenshuai.xi
4983*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4984*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPlayMode()
4985*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get current play mode status.
4986*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Mode type.
4987*53ee8cc1Swenshuai.xi /// @return - mode status
4988*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPlayMode(MS_U32 u32Id,HVD_EX_GetModeStatus eMode)4989*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPlayMode(MS_U32 u32Id, HVD_EX_GetModeStatus eMode)
4990*53ee8cc1Swenshuai.xi {
4991*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
4992*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
4993*53ee8cc1Swenshuai.xi
4994*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
4995*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
4996*53ee8cc1Swenshuai.xi
4997*53ee8cc1Swenshuai.xi switch (eMode)
4998*53ee8cc1Swenshuai.xi {
4999*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_SHOW_ERR_FRM:
5000*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_REPEAT_LAST_FIELD:
5001*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_ERR_CONCEAL:
5002*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_SYNC_ON:
5003*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_PLAYBACK_FINISH:
5004*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_SYNC_MODE:
5005*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_SKIP_MODE:
5006*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_DROP_MODE:
5007*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_DISPLAY_SPEED:
5008*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_FRC_MODE:
5009*53ee8cc1Swenshuai.xi // TODO: add isr type here
5010*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_ISR_TYPE:
5011*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, (HVD_GetData) ((MS_U32) eMode + (MS_U32) E_HVD_GDATA_IS_SHOW_ERR_FRM));
5012*53ee8cc1Swenshuai.xi break;
5013*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_IS_STEP_DISPLAY:
5014*53ee8cc1Swenshuai.xi u32Ret = _DRV_HVD_Ctrl(u8DrvId, HVD_CTRL_DISPLAY_CTRL);
5015*53ee8cc1Swenshuai.xi break;
5016*53ee8cc1Swenshuai.xi case E_HVD_EX_GMODE_STREAM_TYPE:
5017*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK;
5018*53ee8cc1Swenshuai.xi break;
5019*53ee8cc1Swenshuai.xi default:
5020*53ee8cc1Swenshuai.xi break;
5021*53ee8cc1Swenshuai.xi }
5022*53ee8cc1Swenshuai.xi
5023*53ee8cc1Swenshuai.xi return u32Ret;
5024*53ee8cc1Swenshuai.xi }
5025*53ee8cc1Swenshuai.xi
5026*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5027*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPlayState()
5028*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get current play state
5029*53ee8cc1Swenshuai.xi /// @return - play state
5030*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPlayState(MS_U32 u32Id)5031*53ee8cc1Swenshuai.xi HVD_EX_GetPlayState MDrv_HVD_EX_GetPlayState(MS_U32 u32Id)
5032*53ee8cc1Swenshuai.xi {
5033*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5034*53ee8cc1Swenshuai.xi MS_U32 u32FWstate = 0;
5035*53ee8cc1Swenshuai.xi HVD_EX_GetPlayState eRet = E_HVD_EX_GSTATE_INIT;
5036*53ee8cc1Swenshuai.xi
5037*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5038*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
5039*53ee8cc1Swenshuai.xi
5040*53ee8cc1Swenshuai.xi u32FWstate = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATE);
5041*53ee8cc1Swenshuai.xi u32FWstate &= E_HVD_FW_STATE_MASK;
5042*53ee8cc1Swenshuai.xi
5043*53ee8cc1Swenshuai.xi switch (u32FWstate)
5044*53ee8cc1Swenshuai.xi {
5045*53ee8cc1Swenshuai.xi case E_HVD_FW_INIT:
5046*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_GSTATE_INIT;
5047*53ee8cc1Swenshuai.xi break;
5048*53ee8cc1Swenshuai.xi case E_HVD_FW_PLAY:
5049*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_GSTATE_PLAY;
5050*53ee8cc1Swenshuai.xi break;
5051*53ee8cc1Swenshuai.xi case E_HVD_FW_PAUSE:
5052*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_GSTATE_PAUSE;
5053*53ee8cc1Swenshuai.xi break;
5054*53ee8cc1Swenshuai.xi case E_HVD_FW_STOP:
5055*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_GSTATE_STOP;
5056*53ee8cc1Swenshuai.xi break;
5057*53ee8cc1Swenshuai.xi default:
5058*53ee8cc1Swenshuai.xi break;
5059*53ee8cc1Swenshuai.xi }
5060*53ee8cc1Swenshuai.xi return eRet;
5061*53ee8cc1Swenshuai.xi }
5062*53ee8cc1Swenshuai.xi
5063*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5064*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDecodeCnt()
5065*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: get accumulated decoded frame Count
5066*53ee8cc1Swenshuai.xi /// @return - decoded frame Count
5067*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDecodeCnt(MS_U32 u32Id)5068*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDecodeCnt(MS_U32 u32Id)
5069*53ee8cc1Swenshuai.xi {
5070*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5071*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5072*53ee8cc1Swenshuai.xi
5073*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
5074*53ee8cc1Swenshuai.xi }
5075*53ee8cc1Swenshuai.xi
5076*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5077*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetActiveFormat()
5078*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get current AFD ID
5079*53ee8cc1Swenshuai.xi /// @return - AFD ID, 0xFF:invalid value
5080*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetActiveFormat(MS_U32 u32Id)5081*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_GetActiveFormat(MS_U32 u32Id)
5082*53ee8cc1Swenshuai.xi {
5083*53ee8cc1Swenshuai.xi HVD_Display_Info *pDispInfo = NULL;
5084*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5085*53ee8cc1Swenshuai.xi
5086*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5087*53ee8cc1Swenshuai.xi
5088*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,~0);
5089*53ee8cc1Swenshuai.xi
5090*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
5091*53ee8cc1Swenshuai.xi {
5092*53ee8cc1Swenshuai.xi return 0;
5093*53ee8cc1Swenshuai.xi }
5094*53ee8cc1Swenshuai.xi
5095*53ee8cc1Swenshuai.xi pDispInfo = (HVD_Display_Info *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_INFO_ADDR);
5096*53ee8cc1Swenshuai.xi
5097*53ee8cc1Swenshuai.xi if (pDispInfo != NULL)
5098*53ee8cc1Swenshuai.xi {
5099*53ee8cc1Swenshuai.xi return pDispInfo->u8AFD;
5100*53ee8cc1Swenshuai.xi }
5101*53ee8cc1Swenshuai.xi else
5102*53ee8cc1Swenshuai.xi {
5103*53ee8cc1Swenshuai.xi return ~0;
5104*53ee8cc1Swenshuai.xi }
5105*53ee8cc1Swenshuai.xi }
5106*53ee8cc1Swenshuai.xi
5107*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5108*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetInfo()
5109*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get information of HVD driver.
5110*53ee8cc1Swenshuai.xi /// @return - driver information
5111*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetInfo(void)5112*53ee8cc1Swenshuai.xi const HVD_EX_DrvInfo *MDrv_HVD_EX_GetInfo(void)
5113*53ee8cc1Swenshuai.xi {
5114*53ee8cc1Swenshuai.xi DrvInfo.bAVC = MDrv_HVD_EX_GetCaps(E_HVD_EX_AVC);
5115*53ee8cc1Swenshuai.xi DrvInfo.bAVS = MDrv_HVD_EX_GetCaps(E_HVD_EX_AVS);
5116*53ee8cc1Swenshuai.xi DrvInfo.bRM = MDrv_HVD_EX_GetCaps(E_HVD_EX_RM);
5117*53ee8cc1Swenshuai.xi DrvInfo.FWversion = HVD_FW_VERSION;
5118*53ee8cc1Swenshuai.xi return &DrvInfo;
5119*53ee8cc1Swenshuai.xi }
5120*53ee8cc1Swenshuai.xi
5121*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5122*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetLibVer()
5123*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get verion ID of HVD library.
5124*53ee8cc1Swenshuai.xi /// @param -pVerString \b OUT : pointer to HVD driver version ID.
5125*53ee8cc1Swenshuai.xi /// @return - driver library verion ID
5126*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetLibVer(const MSIF_Version ** ppVersion)5127*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetLibVer(const MSIF_Version ** ppVersion)
5128*53ee8cc1Swenshuai.xi {
5129*53ee8cc1Swenshuai.xi if (!ppVersion)
5130*53ee8cc1Swenshuai.xi {
5131*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
5132*53ee8cc1Swenshuai.xi }
5133*53ee8cc1Swenshuai.xi
5134*53ee8cc1Swenshuai.xi *ppVersion = &_drv_hvd_version;
5135*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
5136*53ee8cc1Swenshuai.xi }
5137*53ee8cc1Swenshuai.xi
5138*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5139*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetStatus()
5140*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get status of HVD driver
5141*53ee8cc1Swenshuai.xi /// @param -pstatus \b OUT : driver status
5142*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
5143*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): Low delay flag not found.
5144*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): Low delay flag found.
5145*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetStatus(MS_U32 u32Id,HVD_EX_DrvStatus * pstatus)5146*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetStatus(MS_U32 u32Id, HVD_EX_DrvStatus *pstatus)
5147*53ee8cc1Swenshuai.xi {
5148*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5149*53ee8cc1Swenshuai.xi
5150*53ee8cc1Swenshuai.xi if (pstatus == NULL)
5151*53ee8cc1Swenshuai.xi {
5152*53ee8cc1Swenshuai.xi return FALSE;
5153*53ee8cc1Swenshuai.xi }
5154*53ee8cc1Swenshuai.xi
5155*53ee8cc1Swenshuai.xi pstatus->bInit = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_INIT_FINISHED;
5156*53ee8cc1Swenshuai.xi pstatus->bBusy = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32CtrlMode & HVD_CTRL_PROCESSING;
5157*53ee8cc1Swenshuai.xi
5158*53ee8cc1Swenshuai.xi return TRUE;
5159*53ee8cc1Swenshuai.xi }
5160*53ee8cc1Swenshuai.xi
5161*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5162*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetFrmInfo()
5163*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get current displayed or decoded frame information of HVD driver
5164*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
5165*53ee8cc1Swenshuai.xi /// @param -pInfo \b OUT : frame information
5166*53ee8cc1Swenshuai.xi /// @return -The result of command get frame information
5167*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmInfo(MS_U32 u32Id,HVD_EX_GetFrmInfoType eType,HVD_EX_FrameInfo * pInfo)5168*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFrmInfo(MS_U32 u32Id, HVD_EX_GetFrmInfoType eType, HVD_EX_FrameInfo * pInfo)
5169*53ee8cc1Swenshuai.xi {
5170*53ee8cc1Swenshuai.xi HVD_Frm_Information *pFrmInfo = NULL;
5171*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5172*53ee8cc1Swenshuai.xi
5173*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5174*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,E_HVD_EX_FAIL);
5175*53ee8cc1Swenshuai.xi
5176*53ee8cc1Swenshuai.xi if (pInfo == NULL)
5177*53ee8cc1Swenshuai.xi {
5178*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
5179*53ee8cc1Swenshuai.xi }
5180*53ee8cc1Swenshuai.xi
5181*53ee8cc1Swenshuai.xi if (eType == E_HVD_EX_GFRMINFO_DISPLAY)
5182*53ee8cc1Swenshuai.xi {
5183*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO);
5184*53ee8cc1Swenshuai.xi }
5185*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_DECODE)
5186*53ee8cc1Swenshuai.xi {
5187*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO);
5188*53ee8cc1Swenshuai.xi }
5189*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_NEXT_DISPLAY)
5190*53ee8cc1Swenshuai.xi {
5191*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_NEXT_DISP_FRM_INFO);
5192*53ee8cc1Swenshuai.xi }
5193*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MVC
5194*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_DISPLAY_SUB)
5195*53ee8cc1Swenshuai.xi {
5196*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO_SUB);
5197*53ee8cc1Swenshuai.xi }
5198*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_DECODE_SUB)
5199*53ee8cc1Swenshuai.xi {
5200*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO_SUB);
5201*53ee8cc1Swenshuai.xi }
5202*53ee8cc1Swenshuai.xi #endif ///HVD_ENABLE_MVC
5203*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_LAST_DISPLAY)
5204*53ee8cc1Swenshuai.xi {
5205*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo;
5206*53ee8cc1Swenshuai.xi }
5207*53ee8cc1Swenshuai.xi
5208*53ee8cc1Swenshuai.xi if (pFrmInfo != NULL)
5209*53ee8cc1Swenshuai.xi {
5210*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr = (MS_PHYADDR) (pFrmInfo->u32LumaAddr);
5211*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr = (MS_PHYADDR) (pFrmInfo->u32ChromaAddr);
5212*53ee8cc1Swenshuai.xi
5213*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_1/*u32CtrlMode & HVD_CTRL_FRM_MIU_1*/)
5214*53ee8cc1Swenshuai.xi {
5215*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
5216*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
5217*53ee8cc1Swenshuai.xi }
5218*53ee8cc1Swenshuai.xi else if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_2)
5219*53ee8cc1Swenshuai.xi {
5220*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
5221*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
5222*53ee8cc1Swenshuai.xi }
5223*53ee8cc1Swenshuai.xi
5224*53ee8cc1Swenshuai.xi pInfo->u32TimeStamp = pFrmInfo->u32TimeStamp;
5225*53ee8cc1Swenshuai.xi pInfo->u32ID_L = pFrmInfo->u32ID_L;
5226*53ee8cc1Swenshuai.xi pInfo->u32ID_H = pFrmInfo->u32ID_H;
5227*53ee8cc1Swenshuai.xi pInfo->u32PrivateData = pFrmInfo->u32PrivateData; //[STB]only for AVC
5228*53ee8cc1Swenshuai.xi pInfo->u16Pitch = pFrmInfo->u16Pitch;
5229*53ee8cc1Swenshuai.xi pInfo->u16Height = pFrmInfo->u16Height;
5230*53ee8cc1Swenshuai.xi pInfo->u16Width = pFrmInfo->u16Width;
5231*53ee8cc1Swenshuai.xi pInfo->eFrmType = (HVD_EX_FrmType) (pFrmInfo->u8FrmType);
5232*53ee8cc1Swenshuai.xi pInfo->eFieldType = (HVD_EX_FieldType) (pFrmInfo->u8FieldType);
5233*53ee8cc1Swenshuai.xi
5234*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr_2bit = (MS_PHYADDR) (pFrmInfo->u32LumaAddr_2bit);
5235*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr_2bit = (MS_PHYADDR) (pFrmInfo->u32ChromaAddr_2bit);
5236*53ee8cc1Swenshuai.xi
5237*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_1/*u32CtrlMode & HVD_CTRL_FRM_MIU_1*/)
5238*53ee8cc1Swenshuai.xi {
5239*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr_2bit += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
5240*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr_2bit += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
5241*53ee8cc1Swenshuai.xi }
5242*53ee8cc1Swenshuai.xi else if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_2)
5243*53ee8cc1Swenshuai.xi {
5244*53ee8cc1Swenshuai.xi pInfo->u32LumaAddr_2bit += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
5245*53ee8cc1Swenshuai.xi pInfo->u32ChromaAddr_2bit += pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
5246*53ee8cc1Swenshuai.xi }
5247*53ee8cc1Swenshuai.xi
5248*53ee8cc1Swenshuai.xi pInfo->u16Pitch_2bit = pFrmInfo->u16Pitch_2bit;
5249*53ee8cc1Swenshuai.xi pInfo->u8LumaBitdepth = pFrmInfo->u8LumaBitdepth;
5250*53ee8cc1Swenshuai.xi pInfo->u8ChromaBitdepth = pFrmInfo->u8ChromaBitdepth;
5251*53ee8cc1Swenshuai.xi
5252*53ee8cc1Swenshuai.xi if ((pInfo->u16Pitch == 0) && (pInfo->u16Width == 0) && (pInfo->u16Height == 0))
5253*53ee8cc1Swenshuai.xi {
5254*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
5255*53ee8cc1Swenshuai.xi }
5256*53ee8cc1Swenshuai.xi
5257*53ee8cc1Swenshuai.xi if (eType == E_HVD_EX_GFRMINFO_NEXT_DISPLAY)
5258*53ee8cc1Swenshuai.xi {
5259*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].pLastFrmInfo = pFrmInfo;
5260*53ee8cc1Swenshuai.xi }
5261*53ee8cc1Swenshuai.xi }
5262*53ee8cc1Swenshuai.xi else
5263*53ee8cc1Swenshuai.xi {
5264*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
5265*53ee8cc1Swenshuai.xi }
5266*53ee8cc1Swenshuai.xi
5267*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
5268*53ee8cc1Swenshuai.xi }
5269*53ee8cc1Swenshuai.xi
5270*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5271*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetISRInfo()
5272*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get information of HVD driver interrupt
5273*53ee8cc1Swenshuai.xi /// @param -eType \b OUT : ISR information
5274*53ee8cc1Swenshuai.xi /// @return -the result of get ISR information
5275*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetISRInfo(MS_U32 u32Id,MS_U32 * eType)5276*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetISRInfo(MS_U32 u32Id, MS_U32 *eType)
5277*53ee8cc1Swenshuai.xi {
5278*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5279*53ee8cc1Swenshuai.xi
5280*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5281*53ee8cc1Swenshuai.xi
5282*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.bInISR)
5283*53ee8cc1Swenshuai.xi {
5284*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.u32ISRInfo |= HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_ISR_STATUS);
5285*53ee8cc1Swenshuai.xi *eType = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].HVDISRCtrl.u32ISRInfo;
5286*53ee8cc1Swenshuai.xi }
5287*53ee8cc1Swenshuai.xi else
5288*53ee8cc1Swenshuai.xi {
5289*53ee8cc1Swenshuai.xi *eType = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_ISR_STATUS);
5290*53ee8cc1Swenshuai.xi }
5291*53ee8cc1Swenshuai.xi
5292*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("ISR=0x%lx\n", *eType);
5293*53ee8cc1Swenshuai.xi
5294*53ee8cc1Swenshuai.xi return TRUE;
5295*53ee8cc1Swenshuai.xi }
5296*53ee8cc1Swenshuai.xi
5297*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5298*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_CalLumaSum()
5299*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get the sum of luma data in a frame.
5300*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
5301*53ee8cc1Swenshuai.xi /// @return -the sum
5302*53ee8cc1Swenshuai.xi /// @retval -0xFFFFFFFF: error occer.
5303*53ee8cc1Swenshuai.xi /// @retval -not zero: the sum.
5304*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_CalLumaSum(MS_U32 u32Id,HVD_EX_GetFrmInfoType eType)5305*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CalLumaSum(MS_U32 u32Id, HVD_EX_GetFrmInfoType eType)
5306*53ee8cc1Swenshuai.xi {
5307*53ee8cc1Swenshuai.xi HVD_Frm_Information *pFrmInfo = NULL;
5308*53ee8cc1Swenshuai.xi MS_U32 u32Ret = HVD_U32_MAX;
5309*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5310*53ee8cc1Swenshuai.xi
5311*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5312*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,u32Ret);
5313*53ee8cc1Swenshuai.xi
5314*53ee8cc1Swenshuai.xi if (eType == E_HVD_EX_GFRMINFO_DISPLAY)
5315*53ee8cc1Swenshuai.xi {
5316*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_FRM_INFO);
5317*53ee8cc1Swenshuai.xi }
5318*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_GFRMINFO_DECODE)
5319*53ee8cc1Swenshuai.xi {
5320*53ee8cc1Swenshuai.xi pFrmInfo = (HVD_Frm_Information *) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DEC_FRM_INFO);
5321*53ee8cc1Swenshuai.xi }
5322*53ee8cc1Swenshuai.xi
5323*53ee8cc1Swenshuai.xi if (pFrmInfo != NULL)
5324*53ee8cc1Swenshuai.xi {
5325*53ee8cc1Swenshuai.xi MS_U32 u32tmp = 0;
5326*53ee8cc1Swenshuai.xi MS_U32 u32PitchCnt = 0;
5327*53ee8cc1Swenshuai.xi MS_U32 u32HeightCnt = 0;
5328*53ee8cc1Swenshuai.xi volatile MS_U8 *pLumaData = NULL;
5329*53ee8cc1Swenshuai.xi // PA2VA
5330*53ee8cc1Swenshuai.xi u32tmp = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32FrameBufAddr;
5331*53ee8cc1Swenshuai.xi
5332*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_1/*u32CtrlMode & HVD_CTRL_FRM_MIU_1*/)
5333*53ee8cc1Swenshuai.xi {
5334*53ee8cc1Swenshuai.xi u32tmp -= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr;
5335*53ee8cc1Swenshuai.xi }
5336*53ee8cc1Swenshuai.xi else if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8FrmMiuSel == E_CHIP_MIU_2)
5337*53ee8cc1Swenshuai.xi {
5338*53ee8cc1Swenshuai.xi u32tmp -= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU2BaseAddr;
5339*53ee8cc1Swenshuai.xi }
5340*53ee8cc1Swenshuai.xi
5341*53ee8cc1Swenshuai.xi pLumaData = (volatile MS_U8 *) (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32FrameBufVAddr + (pFrmInfo->u32LumaAddr - u32tmp));
5342*53ee8cc1Swenshuai.xi
5343*53ee8cc1Swenshuai.xi for (u32HeightCnt = 0; u32HeightCnt < pFrmInfo->u16Height; u32HeightCnt++)
5344*53ee8cc1Swenshuai.xi {
5345*53ee8cc1Swenshuai.xi for (u32PitchCnt = 0; u32PitchCnt < pFrmInfo->u16Pitch; u32PitchCnt++)
5346*53ee8cc1Swenshuai.xi {
5347*53ee8cc1Swenshuai.xi if (u32PitchCnt < pFrmInfo->u16Pitch)
5348*53ee8cc1Swenshuai.xi {
5349*53ee8cc1Swenshuai.xi u32Ret += (MS_U32) (*pLumaData);
5350*53ee8cc1Swenshuai.xi }
5351*53ee8cc1Swenshuai.xi pLumaData++;
5352*53ee8cc1Swenshuai.xi }
5353*53ee8cc1Swenshuai.xi }
5354*53ee8cc1Swenshuai.xi }
5355*53ee8cc1Swenshuai.xi
5356*53ee8cc1Swenshuai.xi return u32Ret;
5357*53ee8cc1Swenshuai.xi }
5358*53ee8cc1Swenshuai.xi
5359*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5360*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetUserData_Wptr()
5361*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get write pointer of user data.
5362*53ee8cc1Swenshuai.xi /// @return -the information of write pointer of user data.
5363*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetUserData_Wptr(MS_U32 u32Id)5364*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetUserData_Wptr(MS_U32 u32Id)
5365*53ee8cc1Swenshuai.xi {
5366*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5367*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
5368*53ee8cc1Swenshuai.xi
5369*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5370*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5371*53ee8cc1Swenshuai.xi
5372*53ee8cc1Swenshuai.xi u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_WPTR);
5373*53ee8cc1Swenshuai.xi
5374*53ee8cc1Swenshuai.xi return u32Ret;
5375*53ee8cc1Swenshuai.xi }
5376*53ee8cc1Swenshuai.xi
5377*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5378*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetUserData_Packet()
5379*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get information of user data packet.
5380*53ee8cc1Swenshuai.xi /// @param -u32Idx \b IN : the pointer of required user data packet( valid range is 0 ~ 11 )
5381*53ee8cc1Swenshuai.xi /// @param -u32Size \b OUT : the size of required user data packet
5382*53ee8cc1Swenshuai.xi /// @return -the offset of user data packet form code buffer start address
5383*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetUserData_Packet(MS_U32 u32Id,MS_U32 u32Idx,MS_U32 * u32Size)5384*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetUserData_Packet(MS_U32 u32Id, MS_U32 u32Idx, MS_U32 *u32Size)
5385*53ee8cc1Swenshuai.xi {
5386*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5387*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
5388*53ee8cc1Swenshuai.xi MS_U32 tmp = 0;
5389*53ee8cc1Swenshuai.xi MS_U8 *pIdx = NULL;
5390*53ee8cc1Swenshuai.xi
5391*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5392*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5393*53ee8cc1Swenshuai.xi
5394*53ee8cc1Swenshuai.xi *u32Size = 0;
5395*53ee8cc1Swenshuai.xi tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
5396*53ee8cc1Swenshuai.xi
5397*53ee8cc1Swenshuai.xi if (u32Idx >= tmp)
5398*53ee8cc1Swenshuai.xi {
5399*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("input user data index(%lu) is larger than max index(%lu)\n", u32Idx, tmp);
5400*53ee8cc1Swenshuai.xi return 0;
5401*53ee8cc1Swenshuai.xi }
5402*53ee8cc1Swenshuai.xi tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_ADDR);
5403*53ee8cc1Swenshuai.xi if (tmp == 0)
5404*53ee8cc1Swenshuai.xi {
5405*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD FW ERR: user data packet idx tbl base addr(%lx) is zero\n", tmp);
5406*53ee8cc1Swenshuai.xi return 0;
5407*53ee8cc1Swenshuai.xi }
5408*53ee8cc1Swenshuai.xi pIdx = (MS_U8 *) (tmp + u32Idx);
5409*53ee8cc1Swenshuai.xi tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE);
5410*53ee8cc1Swenshuai.xi if ((*pIdx) >= tmp)
5411*53ee8cc1Swenshuai.xi {
5412*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD FW ERR: user data packet tbl ptr(%lu) is larger than max size(%lu)\n", (MS_U32) (*pIdx), tmp);
5413*53ee8cc1Swenshuai.xi return 0;
5414*53ee8cc1Swenshuai.xi }
5415*53ee8cc1Swenshuai.xi tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR);
5416*53ee8cc1Swenshuai.xi if (tmp == 0)
5417*53ee8cc1Swenshuai.xi {
5418*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD FW ERR: user data packet packet tbl base offset(%lx) is zero\n", tmp);
5419*53ee8cc1Swenshuai.xi return 0;
5420*53ee8cc1Swenshuai.xi }
5421*53ee8cc1Swenshuai.xi u32Ret = tmp;
5422*53ee8cc1Swenshuai.xi tmp = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_SIZE);
5423*53ee8cc1Swenshuai.xi if (tmp == 0)
5424*53ee8cc1Swenshuai.xi {
5425*53ee8cc1Swenshuai.xi HVD_EX_MSG_INF("HVD FW ERR: user data packet packet size(%lu) is zero\n", tmp);
5426*53ee8cc1Swenshuai.xi return 0;
5427*53ee8cc1Swenshuai.xi }
5428*53ee8cc1Swenshuai.xi *u32Size = tmp;
5429*53ee8cc1Swenshuai.xi u32Ret += (MS_U32) (*pIdx) * tmp;
5430*53ee8cc1Swenshuai.xi return u32Ret;
5431*53ee8cc1Swenshuai.xi }
5432*53ee8cc1Swenshuai.xi
5433*53ee8cc1Swenshuai.xi // VDEC Interal control
5434*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5435*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GenPattern()
5436*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Generate spcific pattern to support some special function.
5437*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the virtual address of spcific pattern
5438*53ee8cc1Swenshuai.xi /// @param -u32VAddr \b IN : the virtual address of spcific pattern
5439*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN, OUT :
5440*53ee8cc1Swenshuai.xi /// IN: the input array size.
5441*53ee8cc1Swenshuai.xi /// OUT: the used array size.
5442*53ee8cc1Swenshuai.xi /// @return -The result of command generate spcific pattern
5443*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GenPattern(MS_U32 u32Id,HVD_EX_PatternType eType,MS_U32 u32VAddr,MS_U32 * pu32Size)5444*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GenPattern(MS_U32 u32Id, HVD_EX_PatternType eType, MS_U32 u32VAddr, MS_U32 * pu32Size)
5445*53ee8cc1Swenshuai.xi {
5446*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
5447*53ee8cc1Swenshuai.xi MS_U8 *pDummyData = NULL;
5448*53ee8cc1Swenshuai.xi MS_U32 u32MinPatternSize = 0;
5449*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5450*53ee8cc1Swenshuai.xi
5451*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5452*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
5453*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
5454*53ee8cc1Swenshuai.xi
5455*53ee8cc1Swenshuai.xi if (eType == E_HVD_EX_PATTERN_FLUSH) // flush pattern
5456*53ee8cc1Swenshuai.xi {
5457*53ee8cc1Swenshuai.xi // Driver input need not to push flush pattern
5458*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
5459*53ee8cc1Swenshuai.xi {
5460*53ee8cc1Swenshuai.xi *pu32Size = 0;
5461*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
5462*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5463*53ee8cc1Swenshuai.xi }
5464*53ee8cc1Swenshuai.xi
5465*53ee8cc1Swenshuai.xi // TSP input process
5466*53ee8cc1Swenshuai.xi if (u32VAddr == 0)
5467*53ee8cc1Swenshuai.xi {
5468*53ee8cc1Swenshuai.xi *pu32Size = 8 + 144;
5469*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Flush Pattern address shall not be zero\n");
5470*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
5471*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5472*53ee8cc1Swenshuai.xi }
5473*53ee8cc1Swenshuai.xi
5474*53ee8cc1Swenshuai.xi switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
5475*53ee8cc1Swenshuai.xi {
5476*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
5477*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
5478*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP8:
5479*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
5480*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
5481*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9:
5482*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
5483*53ee8cc1Swenshuai.xi #endif
5484*53ee8cc1Swenshuai.xi {
5485*53ee8cc1Swenshuai.xi u32MinPatternSize = 8 + 144;
5486*53ee8cc1Swenshuai.xi break;
5487*53ee8cc1Swenshuai.xi }
5488*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
5489*53ee8cc1Swenshuai.xi default:
5490*53ee8cc1Swenshuai.xi u32MinPatternSize = 0;
5491*53ee8cc1Swenshuai.xi break;
5492*53ee8cc1Swenshuai.xi }
5493*53ee8cc1Swenshuai.xi
5494*53ee8cc1Swenshuai.xi if (*pu32Size < u32MinPatternSize)
5495*53ee8cc1Swenshuai.xi {
5496*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Flush Pattern must have at least %lu bytes, input:%lu\n", u32MinPatternSize,
5497*53ee8cc1Swenshuai.xi (MS_U32) (*pu32Size));
5498*53ee8cc1Swenshuai.xi *pu32Size = u32MinPatternSize;
5499*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_OUTOF_MEMORY;
5500*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5501*53ee8cc1Swenshuai.xi }
5502*53ee8cc1Swenshuai.xi
5503*53ee8cc1Swenshuai.xi *pu32Size = u32MinPatternSize;
5504*53ee8cc1Swenshuai.xi pDummyData = (MS_U8 *) u32VAddr;
5505*53ee8cc1Swenshuai.xi
5506*53ee8cc1Swenshuai.xi memset((void *) pDummyData, 0, *pu32Size);
5507*53ee8cc1Swenshuai.xi
5508*53ee8cc1Swenshuai.xi switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
5509*53ee8cc1Swenshuai.xi {
5510*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
5511*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
5512*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP8:
5513*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
5514*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9:
5515*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
5516*53ee8cc1Swenshuai.xi #endif
5517*53ee8cc1Swenshuai.xi {
5518*53ee8cc1Swenshuai.xi pDummyData[0] = 0;
5519*53ee8cc1Swenshuai.xi pDummyData[1] = 0;
5520*53ee8cc1Swenshuai.xi pDummyData[2] = 1;
5521*53ee8cc1Swenshuai.xi pDummyData[3] = 0xFF;
5522*53ee8cc1Swenshuai.xi pDummyData[4] = 0xAA;
5523*53ee8cc1Swenshuai.xi pDummyData[5] = 0x55;
5524*53ee8cc1Swenshuai.xi pDummyData[6] = 0xAA;
5525*53ee8cc1Swenshuai.xi pDummyData[7] = 0x55;
5526*53ee8cc1Swenshuai.xi
5527*53ee8cc1Swenshuai.xi break;
5528*53ee8cc1Swenshuai.xi }
5529*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
5530*53ee8cc1Swenshuai.xi {
5531*53ee8cc1Swenshuai.xi pDummyData[0] = 0;
5532*53ee8cc1Swenshuai.xi pDummyData[1] = 0;
5533*53ee8cc1Swenshuai.xi pDummyData[2] = 1;
5534*53ee8cc1Swenshuai.xi pDummyData[3] = 0xB4;
5535*53ee8cc1Swenshuai.xi pDummyData[4] = 0xAA;
5536*53ee8cc1Swenshuai.xi pDummyData[5] = 0x55;
5537*53ee8cc1Swenshuai.xi pDummyData[6] = 0xAA;
5538*53ee8cc1Swenshuai.xi pDummyData[7] = 0x55;
5539*53ee8cc1Swenshuai.xi
5540*53ee8cc1Swenshuai.xi break;
5541*53ee8cc1Swenshuai.xi }
5542*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
5543*53ee8cc1Swenshuai.xi default:
5544*53ee8cc1Swenshuai.xi break;
5545*53ee8cc1Swenshuai.xi }
5546*53ee8cc1Swenshuai.xi }
5547*53ee8cc1Swenshuai.xi else if (eType == E_HVD_EX_PATTERN_FILEEND) // dummy pattern
5548*53ee8cc1Swenshuai.xi {
5549*53ee8cc1Swenshuai.xi // Driver input need not to push dummy pattern
5550*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
5551*53ee8cc1Swenshuai.xi {
5552*53ee8cc1Swenshuai.xi *pu32Size = 0;
5553*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
5554*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5555*53ee8cc1Swenshuai.xi }
5556*53ee8cc1Swenshuai.xi
5557*53ee8cc1Swenshuai.xi // TSP input process
5558*53ee8cc1Swenshuai.xi if (u32VAddr == 0)
5559*53ee8cc1Swenshuai.xi {
5560*53ee8cc1Swenshuai.xi *pu32Size = 8 + 144;
5561*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Dummy Pattern address shall not be zero\n");
5562*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
5563*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5564*53ee8cc1Swenshuai.xi }
5565*53ee8cc1Swenshuai.xi
5566*53ee8cc1Swenshuai.xi switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
5567*53ee8cc1Swenshuai.xi {
5568*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
5569*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
5570*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP8:
5571*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
5572*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
5573*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9:
5574*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
5575*53ee8cc1Swenshuai.xi #endif
5576*53ee8cc1Swenshuai.xi u32MinPatternSize = 8 + 144;
5577*53ee8cc1Swenshuai.xi break;
5578*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
5579*53ee8cc1Swenshuai.xi default:
5580*53ee8cc1Swenshuai.xi u32MinPatternSize = 0;
5581*53ee8cc1Swenshuai.xi break;
5582*53ee8cc1Swenshuai.xi }
5583*53ee8cc1Swenshuai.xi
5584*53ee8cc1Swenshuai.xi if (*pu32Size < u32MinPatternSize)
5585*53ee8cc1Swenshuai.xi {
5586*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Dummy Pattern must have at least %lu bytes, input:%lu\n", u32MinPatternSize,
5587*53ee8cc1Swenshuai.xi (MS_U32) (*pu32Size));
5588*53ee8cc1Swenshuai.xi *pu32Size = u32MinPatternSize;
5589*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_OUTOF_MEMORY;
5590*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5591*53ee8cc1Swenshuai.xi }
5592*53ee8cc1Swenshuai.xi
5593*53ee8cc1Swenshuai.xi pDummyData = (MS_U8 *) u32VAddr;
5594*53ee8cc1Swenshuai.xi
5595*53ee8cc1Swenshuai.xi memset((void *) pDummyData, 0, *pu32Size);
5596*53ee8cc1Swenshuai.xi
5597*53ee8cc1Swenshuai.xi switch ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
5598*53ee8cc1Swenshuai.xi {
5599*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVC:
5600*53ee8cc1Swenshuai.xi case HVD_INIT_HW_MVC:
5601*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP8:
5602*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
5603*53ee8cc1Swenshuai.xi case HVD_INIT_HW_VP9:
5604*53ee8cc1Swenshuai.xi case HVD_INIT_HW_HEVC:
5605*53ee8cc1Swenshuai.xi #endif
5606*53ee8cc1Swenshuai.xi {
5607*53ee8cc1Swenshuai.xi pDummyData[0] = 0;
5608*53ee8cc1Swenshuai.xi pDummyData[1] = 0;
5609*53ee8cc1Swenshuai.xi pDummyData[2] = 1;
5610*53ee8cc1Swenshuai.xi pDummyData[3] = 0xFF;
5611*53ee8cc1Swenshuai.xi pDummyData[4] = 0xFF;
5612*53ee8cc1Swenshuai.xi pDummyData[5] = 0xFF;
5613*53ee8cc1Swenshuai.xi pDummyData[6] = 0xFF;
5614*53ee8cc1Swenshuai.xi pDummyData[7] = 0xFF;
5615*53ee8cc1Swenshuai.xi
5616*53ee8cc1Swenshuai.xi break;
5617*53ee8cc1Swenshuai.xi }
5618*53ee8cc1Swenshuai.xi case HVD_INIT_HW_AVS:
5619*53ee8cc1Swenshuai.xi {
5620*53ee8cc1Swenshuai.xi pDummyData[0] = 0;
5621*53ee8cc1Swenshuai.xi pDummyData[1] = 0;
5622*53ee8cc1Swenshuai.xi pDummyData[2] = 1;
5623*53ee8cc1Swenshuai.xi pDummyData[3] = 0xB4;
5624*53ee8cc1Swenshuai.xi pDummyData[4] = 0xAA;
5625*53ee8cc1Swenshuai.xi pDummyData[5] = 0x66;
5626*53ee8cc1Swenshuai.xi pDummyData[6] = 0xAA;
5627*53ee8cc1Swenshuai.xi pDummyData[7] = 0x66;
5628*53ee8cc1Swenshuai.xi
5629*53ee8cc1Swenshuai.xi break;
5630*53ee8cc1Swenshuai.xi }
5631*53ee8cc1Swenshuai.xi case HVD_INIT_HW_RM:
5632*53ee8cc1Swenshuai.xi default:
5633*53ee8cc1Swenshuai.xi *pu32Size = u32MinPatternSize;
5634*53ee8cc1Swenshuai.xi break;
5635*53ee8cc1Swenshuai.xi }
5636*53ee8cc1Swenshuai.xi }
5637*53ee8cc1Swenshuai.xi
5638*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
5639*53ee8cc1Swenshuai.xi
5640*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
5641*53ee8cc1Swenshuai.xi }
5642*53ee8cc1Swenshuai.xi
5643*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5644*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetPatternInfo()
5645*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver specific data information
5646*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific data information
5647*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
5648*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetPatternInfo(MS_U32 u32Id,HVD_EX_PatternInfo eType)5649*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetPatternInfo(MS_U32 u32Id, HVD_EX_PatternInfo eType)
5650*53ee8cc1Swenshuai.xi {
5651*53ee8cc1Swenshuai.xi MS_U32 eRet = 0;
5652*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5653*53ee8cc1Swenshuai.xi
5654*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5655*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5656*53ee8cc1Swenshuai.xi
5657*53ee8cc1Swenshuai.xi switch (eType)
5658*53ee8cc1Swenshuai.xi {
5659*53ee8cc1Swenshuai.xi case E_HVD_EX_FLUSH_PATTERN_SIZE:
5660*53ee8cc1Swenshuai.xi {
5661*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
5662*53ee8cc1Swenshuai.xi {
5663*53ee8cc1Swenshuai.xi eRet = 0;
5664*53ee8cc1Swenshuai.xi }
5665*53ee8cc1Swenshuai.xi else if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
5666*53ee8cc1Swenshuai.xi {
5667*53ee8cc1Swenshuai.xi eRet = 8 + 144;
5668*53ee8cc1Swenshuai.xi }
5669*53ee8cc1Swenshuai.xi break;
5670*53ee8cc1Swenshuai.xi }
5671*53ee8cc1Swenshuai.xi case E_HVD_EX_DUMMY_HW_FIFO:
5672*53ee8cc1Swenshuai.xi {
5673*53ee8cc1Swenshuai.xi if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
5674*53ee8cc1Swenshuai.xi {
5675*53ee8cc1Swenshuai.xi eRet = 0;
5676*53ee8cc1Swenshuai.xi }
5677*53ee8cc1Swenshuai.xi else if ((pHVDDrvContext->gHVDCtrl_EX[u8DrvId].InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
5678*53ee8cc1Swenshuai.xi {
5679*53ee8cc1Swenshuai.xi eRet = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_MAX_DUMMY_FIFO);
5680*53ee8cc1Swenshuai.xi }
5681*53ee8cc1Swenshuai.xi break;
5682*53ee8cc1Swenshuai.xi }
5683*53ee8cc1Swenshuai.xi default:
5684*53ee8cc1Swenshuai.xi break;
5685*53ee8cc1Swenshuai.xi }
5686*53ee8cc1Swenshuai.xi
5687*53ee8cc1Swenshuai.xi return eRet;
5688*53ee8cc1Swenshuai.xi }
5689*53ee8cc1Swenshuai.xi
5690*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_GetDSBufMiuSelect(MS_U32 u32Id)5691*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_GetDSBufMiuSelect(MS_U32 u32Id)
5692*53ee8cc1Swenshuai.xi {
5693*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
5694*53ee8cc1Swenshuai.xi MS_U32 u32StartOffset;
5695*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5696*53ee8cc1Swenshuai.xi
5697*53ee8cc1Swenshuai.xi
5698*53ee8cc1Swenshuai.xi if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
5699*53ee8cc1Swenshuai.xi {
5700*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf);
5701*53ee8cc1Swenshuai.xi }
5702*53ee8cc1Swenshuai.xi else
5703*53ee8cc1Swenshuai.xi {
5704*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
5705*53ee8cc1Swenshuai.xi }
5706*53ee8cc1Swenshuai.xi return u8MiuSel;
5707*53ee8cc1Swenshuai.xi }
5708*53ee8cc1Swenshuai.xi
5709*53ee8cc1Swenshuai.xi
5710*53ee8cc1Swenshuai.xi
5711*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5712*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDynamicScalingInfo()
5713*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get information of Dynamic Scaling
5714*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific information
5715*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
5716*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDynamicScalingInfo(MS_U32 u32Id,HVD_EX_DynamicScalingInfo eType)5717*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDynamicScalingInfo(MS_U32 u32Id, HVD_EX_DynamicScalingInfo eType)
5718*53ee8cc1Swenshuai.xi {
5719*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
5720*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5721*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
5722*53ee8cc1Swenshuai.xi MS_U32 u32StartOffset;
5723*53ee8cc1Swenshuai.xi
5724*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
5725*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5726*53ee8cc1Swenshuai.xi
5727*53ee8cc1Swenshuai.xi switch (eType)
5728*53ee8cc1Swenshuai.xi {
5729*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_BUF_MIUSEL:
5730*53ee8cc1Swenshuai.xi if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
5731*53ee8cc1Swenshuai.xi {
5732*53ee8cc1Swenshuai.xi if(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf >= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr)
5733*53ee8cc1Swenshuai.xi {
5734*53ee8cc1Swenshuai.xi u32Ret = TRUE;
5735*53ee8cc1Swenshuai.xi }
5736*53ee8cc1Swenshuai.xi else
5737*53ee8cc1Swenshuai.xi {
5738*53ee8cc1Swenshuai.xi u32Ret = FALSE;
5739*53ee8cc1Swenshuai.xi }
5740*53ee8cc1Swenshuai.xi
5741*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf);
5742*53ee8cc1Swenshuai.xi
5743*53ee8cc1Swenshuai.xi if(u8MiuSel >= E_CHIP_MIU_2)
5744*53ee8cc1Swenshuai.xi {
5745*53ee8cc1Swenshuai.xi
5746*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",u8MiuSel);
5747*53ee8cc1Swenshuai.xi }
5748*53ee8cc1Swenshuai.xi }
5749*53ee8cc1Swenshuai.xi else
5750*53ee8cc1Swenshuai.xi {
5751*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr >= pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32MIU1BaseAddr)
5752*53ee8cc1Swenshuai.xi {
5753*53ee8cc1Swenshuai.xi u32Ret = TRUE;
5754*53ee8cc1Swenshuai.xi }
5755*53ee8cc1Swenshuai.xi else
5756*53ee8cc1Swenshuai.xi {
5757*53ee8cc1Swenshuai.xi u32Ret = FALSE;
5758*53ee8cc1Swenshuai.xi }
5759*53ee8cc1Swenshuai.xi
5760*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr);
5761*53ee8cc1Swenshuai.xi
5762*53ee8cc1Swenshuai.xi if(u8MiuSel >= E_CHIP_MIU_2)
5763*53ee8cc1Swenshuai.xi {
5764*53ee8cc1Swenshuai.xi
5765*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u8MiuSel is %d !!, but return type is only Boolean. Please use MDrv_HVD_EX_GetDSBufMiuSelect() to get right miu select of DS buffer!\n",u8MiuSel);
5766*53ee8cc1Swenshuai.xi }
5767*53ee8cc1Swenshuai.xi }
5768*53ee8cc1Swenshuai.xi break;
5769*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_BUF_ADDR:
5770*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
5771*53ee8cc1Swenshuai.xi {
5772*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf;
5773*53ee8cc1Swenshuai.xi ///printf("[EDS] E_HVD_EX_DS_BUF_ADDR 0x%lx.\n",u32Ret);
5774*53ee8cc1Swenshuai.xi }
5775*53ee8cc1Swenshuai.xi else
5776*53ee8cc1Swenshuai.xi {
5777*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_ADDR);
5778*53ee8cc1Swenshuai.xi
5779*53ee8cc1Swenshuai.xi ///printf("[DS] DS_BUF_ADDR 0x%lx \n", u32Ret);
5780*53ee8cc1Swenshuai.xi ///printf("[EDS] E_HVD_EX_DS_BUF_ADDR Old.\n");
5781*53ee8cc1Swenshuai.xi }
5782*53ee8cc1Swenshuai.xi break;
5783*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_BUF_SIZE:
5784*53ee8cc1Swenshuai.xi u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_SIZE);
5785*53ee8cc1Swenshuai.xi break;
5786*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_VECTOR_DEPTH:
5787*53ee8cc1Swenshuai.xi u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_VECTOR_DEPTH);
5788*53ee8cc1Swenshuai.xi break;
5789*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_INFO_ADDR:
5790*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SettingMode & HVD_DRV_MODE_EXTERNAL_DS_BUFFER)
5791*53ee8cc1Swenshuai.xi {
5792*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32ExternalDSbuf + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_BUF_SIZE);//0xC00;
5793*53ee8cc1Swenshuai.xi ///printf("[EDS] E_HVD_EX_DS_INFO_ADDR 0x%lx.\n",u32Ret);
5794*53ee8cc1Swenshuai.xi }
5795*53ee8cc1Swenshuai.xi else
5796*53ee8cc1Swenshuai.xi {
5797*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_INFO_ADDR);
5798*53ee8cc1Swenshuai.xi
5799*53ee8cc1Swenshuai.xi ///printf("[DS] DS_INFO_ADDR 0x%lx \n", u32Ret);
5800*53ee8cc1Swenshuai.xi }
5801*53ee8cc1Swenshuai.xi break;
5802*53ee8cc1Swenshuai.xi case E_HVD_EX_DS_IS_ENABLED:
5803*53ee8cc1Swenshuai.xi u32Ret = (MS_U32) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_DS_IS_ENABLED);
5804*53ee8cc1Swenshuai.xi break;
5805*53ee8cc1Swenshuai.xi default:
5806*53ee8cc1Swenshuai.xi break;
5807*53ee8cc1Swenshuai.xi }
5808*53ee8cc1Swenshuai.xi return u32Ret;
5809*53ee8cc1Swenshuai.xi }
5810*53ee8cc1Swenshuai.xi
5811*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5812*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetData()
5813*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get target data from HVD driver
5814*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of the target data
5815*53ee8cc1Swenshuai.xi /// @return -the value of the target data
5816*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetData(MS_U32 u32Id,HVD_EX_GDataType eType)5817*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetData(MS_U32 u32Id, HVD_EX_GDataType eType)
5818*53ee8cc1Swenshuai.xi {
5819*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
5820*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
5821*53ee8cc1Swenshuai.xi
5822*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
5823*53ee8cc1Swenshuai.xi
5824*53ee8cc1Swenshuai.xi switch (eType)
5825*53ee8cc1Swenshuai.xi {
5826*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_DISP_CNT:
5827*53ee8cc1Swenshuai.xi {
5828*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_CNT);
5829*53ee8cc1Swenshuai.xi break;
5830*53ee8cc1Swenshuai.xi }
5831*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_SKIP_CNT:
5832*53ee8cc1Swenshuai.xi {
5833*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT);
5834*53ee8cc1Swenshuai.xi break;
5835*53ee8cc1Swenshuai.xi }
5836*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_DROP_CNT:
5837*53ee8cc1Swenshuai.xi {
5838*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DROP_CNT);
5839*53ee8cc1Swenshuai.xi break;
5840*53ee8cc1Swenshuai.xi }
5841*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_IDLE_CNT:
5842*53ee8cc1Swenshuai.xi {
5843*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT);
5844*53ee8cc1Swenshuai.xi break;
5845*53ee8cc1Swenshuai.xi }
5846*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_VSYNC_CNT:
5847*53ee8cc1Swenshuai.xi {
5848*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VSYNC_CNT);
5849*53ee8cc1Swenshuai.xi break;
5850*53ee8cc1Swenshuai.xi }
5851*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_MAIN_LOOP_CNT:
5852*53ee8cc1Swenshuai.xi {
5853*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT);
5854*53ee8cc1Swenshuai.xi break;
5855*53ee8cc1Swenshuai.xi }
5856*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_AVC_LEVEL_IDC:
5857*53ee8cc1Swenshuai.xi {
5858*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_LEVEL_IDC);
5859*53ee8cc1Swenshuai.xi break;
5860*53ee8cc1Swenshuai.xi }
5861*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_DISP_Q_SIZE:
5862*53ee8cc1Swenshuai.xi {
5863*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_Q_NUMB);
5864*53ee8cc1Swenshuai.xi break;
5865*53ee8cc1Swenshuai.xi }
5866*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_ES_LEVEL:
5867*53ee8cc1Swenshuai.xi {
5868*53ee8cc1Swenshuai.xi u32Ret = (MS_U32) (HVD_EX_ESLevel) HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_ES_LEVEL);
5869*53ee8cc1Swenshuai.xi break;
5870*53ee8cc1Swenshuai.xi }
5871*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_AVC_VUI_DISP_INFO:
5872*53ee8cc1Swenshuai.xi {
5873*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_AVC_VUI_DISP_INFO);
5874*53ee8cc1Swenshuai.xi break;
5875*53ee8cc1Swenshuai.xi }
5876*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_DISP_STC:
5877*53ee8cc1Swenshuai.xi {
5878*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DISP_STC);
5879*53ee8cc1Swenshuai.xi break;
5880*53ee8cc1Swenshuai.xi }
5881*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_USERDATA_IDX_TBL_SIZE:
5882*53ee8cc1Swenshuai.xi {
5883*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
5884*53ee8cc1Swenshuai.xi break;
5885*53ee8cc1Swenshuai.xi }
5886*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_USERDATA_PACKET_SIZE:
5887*53ee8cc1Swenshuai.xi {
5888*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_PACKET_SIZE);
5889*53ee8cc1Swenshuai.xi break;
5890*53ee8cc1Swenshuai.xi }
5891*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_REAL_FRAMERATE:
5892*53ee8cc1Swenshuai.xi {
5893*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_REAL_FRAMERATE);
5894*53ee8cc1Swenshuai.xi break;
5895*53ee8cc1Swenshuai.xi }
5896*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_IS_ORI_INTERLACE_MODE:
5897*53ee8cc1Swenshuai.xi {
5898*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_IS_ORI_INTERLACE_MODE);
5899*53ee8cc1Swenshuai.xi break;
5900*53ee8cc1Swenshuai.xi }
5901*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_FRAME_MBS_ONLY_FLAG:
5902*53ee8cc1Swenshuai.xi {
5903*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TYPE_FRAME_MBS_ONLY_FLAG);
5904*53ee8cc1Swenshuai.xi break;
5905*53ee8cc1Swenshuai.xi }
5906*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_IS_LEAST_DISPQ_SIZE:
5907*53ee8cc1Swenshuai.xi {
5908*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TYPE_IS_LEAST_DISPQ_SIZE);
5909*53ee8cc1Swenshuai.xi break;
5910*53ee8cc1Swenshuai.xi }
5911*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_FIELD_PIC_FLAG:
5912*53ee8cc1Swenshuai.xi {
5913*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FIELD_PIC_FLAG);
5914*53ee8cc1Swenshuai.xi break;
5915*53ee8cc1Swenshuai.xi }
5916*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_FW_CODEC_TYPE:
5917*53ee8cc1Swenshuai.xi {
5918*53ee8cc1Swenshuai.xi //u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_CODEC_TYPE);
5919*53ee8cc1Swenshuai.xi switch(HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_CODEC_TYPE))
5920*53ee8cc1Swenshuai.xi {
5921*53ee8cc1Swenshuai.xi case E_HVD_Codec_AVC:
5922*53ee8cc1Swenshuai.xi {
5923*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_AVC;
5924*53ee8cc1Swenshuai.xi break;
5925*53ee8cc1Swenshuai.xi }
5926*53ee8cc1Swenshuai.xi case E_HVD_Codec_AVS:
5927*53ee8cc1Swenshuai.xi {
5928*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_AVS;
5929*53ee8cc1Swenshuai.xi break;
5930*53ee8cc1Swenshuai.xi }
5931*53ee8cc1Swenshuai.xi case E_HVD_Codec_RM:
5932*53ee8cc1Swenshuai.xi {
5933*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_RM;
5934*53ee8cc1Swenshuai.xi break;
5935*53ee8cc1Swenshuai.xi }
5936*53ee8cc1Swenshuai.xi case E_HVD_Codec_MVC:
5937*53ee8cc1Swenshuai.xi {
5938*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_MVC;
5939*53ee8cc1Swenshuai.xi break;
5940*53ee8cc1Swenshuai.xi }
5941*53ee8cc1Swenshuai.xi case E_HVD_Codec_VP8:
5942*53ee8cc1Swenshuai.xi {
5943*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_VP8;
5944*53ee8cc1Swenshuai.xi break;
5945*53ee8cc1Swenshuai.xi }
5946*53ee8cc1Swenshuai.xi case E_HVD_Codec_MJPEG:
5947*53ee8cc1Swenshuai.xi {
5948*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_NONE;
5949*53ee8cc1Swenshuai.xi break;
5950*53ee8cc1Swenshuai.xi }
5951*53ee8cc1Swenshuai.xi case E_HVD_Codec_HEVC:
5952*53ee8cc1Swenshuai.xi {
5953*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_HEVC;
5954*53ee8cc1Swenshuai.xi break;
5955*53ee8cc1Swenshuai.xi }
5956*53ee8cc1Swenshuai.xi case E_HVD_EX_VP9:
5957*53ee8cc1Swenshuai.xi {
5958*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_VP9;
5959*53ee8cc1Swenshuai.xi break;
5960*53ee8cc1Swenshuai.xi }
5961*53ee8cc1Swenshuai.xi default:
5962*53ee8cc1Swenshuai.xi {
5963*53ee8cc1Swenshuai.xi u32Ret = E_HVD_EX_NONE;
5964*53ee8cc1Swenshuai.xi break;
5965*53ee8cc1Swenshuai.xi }
5966*53ee8cc1Swenshuai.xi }
5967*53ee8cc1Swenshuai.xi break;
5968*53ee8cc1Swenshuai.xi }
5969*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_FRC_MODE:
5970*53ee8cc1Swenshuai.xi {
5971*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRC_MODE);
5972*53ee8cc1Swenshuai.xi break;
5973*53ee8cc1Swenshuai.xi }
5974*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_VSYNC_BRIDGE_ADDR:
5975*53ee8cc1Swenshuai.xi {
5976*53ee8cc1Swenshuai.xi u32Ret = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr + HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VSYNC_BRIDGE_ADDR);
5977*53ee8cc1Swenshuai.xi break;
5978*53ee8cc1Swenshuai.xi }
5979*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_FW_STATUS_FLAG:
5980*53ee8cc1Swenshuai.xi {
5981*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_STATUS_FLAG);
5982*53ee8cc1Swenshuai.xi break;
5983*53ee8cc1Swenshuai.xi }
5984*53ee8cc1Swenshuai.xi case E_HVD_EX_GDATA_TYPE_HVD_HW_MAX_PIXEL:
5985*53ee8cc1Swenshuai.xi {
5986*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_HVD_HW_MAX_PIXEL);
5987*53ee8cc1Swenshuai.xi break;
5988*53ee8cc1Swenshuai.xi }
5989*53ee8cc1Swenshuai.xi default:
5990*53ee8cc1Swenshuai.xi break;
5991*53ee8cc1Swenshuai.xi }
5992*53ee8cc1Swenshuai.xi
5993*53ee8cc1Swenshuai.xi return u32Ret;
5994*53ee8cc1Swenshuai.xi }
5995*53ee8cc1Swenshuai.xi
5996*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
5997*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetMem_Dbg()
5998*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get any data from any memory address
5999*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target data
6000*53ee8cc1Swenshuai.xi /// @return -the value of the memory
6001*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetMem_Dbg(MS_U32 u32Id,MS_VIRT u32Addr)6002*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetMem_Dbg(MS_U32 u32Id, MS_VIRT u32Addr)
6003*53ee8cc1Swenshuai.xi {
6004*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6005*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
6006*53ee8cc1Swenshuai.xi
6007*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6008*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,u32Ret);
6009*53ee8cc1Swenshuai.xi
6010*53ee8cc1Swenshuai.xi switch (u32Addr)
6011*53ee8cc1Swenshuai.xi {
6012*53ee8cc1Swenshuai.xi case 1:
6013*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_READ_PTR);
6014*53ee8cc1Swenshuai.xi break;
6015*53ee8cc1Swenshuai.xi case 2:
6016*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_PC_CNT);
6017*53ee8cc1Swenshuai.xi break;
6018*53ee8cc1Swenshuai.xi case 3:
6019*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_WRITE_PTR);
6020*53ee8cc1Swenshuai.xi break;
6021*53ee8cc1Swenshuai.xi default:
6022*53ee8cc1Swenshuai.xi break;
6023*53ee8cc1Swenshuai.xi }
6024*53ee8cc1Swenshuai.xi
6025*53ee8cc1Swenshuai.xi return u32Ret;
6026*53ee8cc1Swenshuai.xi }
6027*53ee8cc1Swenshuai.xi
6028*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6029*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DbgDumpStatus()
6030*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Dump specific information to standard output.
6031*53ee8cc1Swenshuai.xi /// @param -eFlag \b IN : the type of information.
6032*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DbgDumpStatus(MS_U32 u32Id,HVD_EX_DumpStatus eFlag)6033*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_DbgDumpStatus(MS_U32 u32Id, HVD_EX_DumpStatus eFlag)
6034*53ee8cc1Swenshuai.xi {
6035*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6036*53ee8cc1Swenshuai.xi
6037*53ee8cc1Swenshuai.xi if (!(pHVDDrvContext->bHVDIsInited[u8DrvId]))
6038*53ee8cc1Swenshuai.xi {
6039*53ee8cc1Swenshuai.xi return;
6040*53ee8cc1Swenshuai.xi }
6041*53ee8cc1Swenshuai.xi
6042*53ee8cc1Swenshuai.xi if (eFlag & E_HVD_EX_DUMP_STATUS_FW)
6043*53ee8cc1Swenshuai.xi {
6044*53ee8cc1Swenshuai.xi HAL_HVD_EX_Dump_FW_Status(u32Id);
6045*53ee8cc1Swenshuai.xi }
6046*53ee8cc1Swenshuai.xi
6047*53ee8cc1Swenshuai.xi if (eFlag & E_HVD_EX_DUMP_STATUS_HW)
6048*53ee8cc1Swenshuai.xi {
6049*53ee8cc1Swenshuai.xi HAL_HVD_EX_Dump_HW_Status(HVD_U32_MAX);
6050*53ee8cc1Swenshuai.xi }
6051*53ee8cc1Swenshuai.xi }
6052*53ee8cc1Swenshuai.xi
6053*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6054*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetMem_Dbg()
6055*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set any data into any memory address
6056*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target destination
6057*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : the value of input content
6058*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetMem_Dbg(MS_U32 u32Id,MS_VIRT u32Addr,MS_U32 u32Arg)6059*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetMem_Dbg(MS_U32 u32Id, MS_VIRT u32Addr, MS_U32 u32Arg)
6060*53ee8cc1Swenshuai.xi {
6061*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6062*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData_Dbg(u32Addr, u32Arg);
6063*53ee8cc1Swenshuai.xi }
6064*53ee8cc1Swenshuai.xi
6065*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6066*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetData_Dbg()
6067*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set any FW debug command
6068*53ee8cc1Swenshuai.xi /// @param -u32Cmd \b IN : specify the FW command ID.
6069*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of FW command.
6070*53ee8cc1Swenshuai.xi /// @return -the result of debug command
6071*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetCmd_Dbg(MS_U32 u32Id,MS_U32 u32Cmd,MS_U32 u32Arg)6072*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetCmd_Dbg(MS_U32 u32Id, MS_U32 u32Cmd, MS_U32 u32Arg)
6073*53ee8cc1Swenshuai.xi {
6074*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6075*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6076*53ee8cc1Swenshuai.xi
6077*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6078*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6079*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6080*53ee8cc1Swenshuai.xi
6081*53ee8cc1Swenshuai.xi // todo: consider more...
6082*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, (HVD_User_Cmd) u32Cmd, u32Arg);
6083*53ee8cc1Swenshuai.xi
6084*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6085*53ee8cc1Swenshuai.xi }
6086*53ee8cc1Swenshuai.xi
6087*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6088*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Set_Err_Tolerance()
6089*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set display error tolerance
6090*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : //[15:8]+[7:0] = (err_tolerance(0%~100%)+enable or disable)
6091*53ee8cc1Swenshuai.xi /// @return -the result of set err tolerance
6092*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Set_Err_Tolerance(MS_U32 u32Id,MS_U32 u32Arg)6093*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Set_Err_Tolerance(MS_U32 u32Id, MS_U32 u32Arg)
6094*53ee8cc1Swenshuai.xi {
6095*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6096*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6097*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6098*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6099*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6100*53ee8cc1Swenshuai.xi
6101*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_DISP_ERROR_TOLERANCE, u32Arg);
6102*53ee8cc1Swenshuai.xi
6103*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6104*53ee8cc1Swenshuai.xi
6105*53ee8cc1Swenshuai.xi }
6106*53ee8cc1Swenshuai.xi
6107*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6108*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetSettings_Pro()
6109*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set any FW debug command
6110*53ee8cc1Swenshuai.xi /// @param -eType \b IN : specify the type of setting.
6111*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of the setting.
6112*53ee8cc1Swenshuai.xi /// @return -the result of set professional settings.
6113*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetSettings_Pro(MS_U32 u32Id,HVD_EX_SSettingsType eType,MS_U32 u32Arg)6114*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSettings_Pro(MS_U32 u32Id, HVD_EX_SSettingsType eType, MS_U32 u32Arg)
6115*53ee8cc1Swenshuai.xi {
6116*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6117*53ee8cc1Swenshuai.xi HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
6118*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6119*53ee8cc1Swenshuai.xi
6120*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6121*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6122*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6123*53ee8cc1Swenshuai.xi
6124*53ee8cc1Swenshuai.xi switch (eType)
6125*53ee8cc1Swenshuai.xi {
6126*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_TIME_UNIT:
6127*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_TIME_UNIT_TYPE;
6128*53ee8cc1Swenshuai.xi break;
6129*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_PITCH:
6130*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_PITCH;
6131*53ee8cc1Swenshuai.xi break;
6132*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_SYNC_EACH_FRM:
6133*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_SYNC_EACH_FRM;
6134*53ee8cc1Swenshuai.xi break;
6135*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_MAX_DEC_TICK:
6136*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_MAX_DEC_TICK;
6137*53ee8cc1Swenshuai.xi break;
6138*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_AUTO_FREE_ES:
6139*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_AUTO_FREE_ES;
6140*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bAutoFreeES = u32Arg;
6141*53ee8cc1Swenshuai.xi break;
6142*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_MIN_FRAME_GAP:
6143*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_MIN_FRAME_GAP;
6144*53ee8cc1Swenshuai.xi break;
6145*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_DISABLE_DEBLOCKING:
6146*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_DIS_DBF;
6147*53ee8cc1Swenshuai.xi if (u32Arg > 2)
6148*53ee8cc1Swenshuai.xi {
6149*53ee8cc1Swenshuai.xi u32Arg = 1;
6150*53ee8cc1Swenshuai.xi }
6151*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bDisDeblocking = u32Arg;
6152*53ee8cc1Swenshuai.xi break;
6153*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_DISABLE_QUARTER_PIXEL:
6154*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_DIS_QUART_PIXEL;
6155*53ee8cc1Swenshuai.xi if (u32Arg > 2)
6156*53ee8cc1Swenshuai.xi {
6157*53ee8cc1Swenshuai.xi u32Arg = 1;
6158*53ee8cc1Swenshuai.xi }
6159*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.bDisQuarterPixel = u32Arg;
6160*53ee8cc1Swenshuai.xi break;
6161*53ee8cc1Swenshuai.xi case E_HVD_EX_SSET_MIU_BURST_CNT_LEVEL:
6162*53ee8cc1Swenshuai.xi {
6163*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].Settings.u32MiuBurstLevel = u32Arg;
6164*53ee8cc1Swenshuai.xi eCmd = E_HVD_CMD_MIU_BURST_CNT;
6165*53ee8cc1Swenshuai.xi
6166*53ee8cc1Swenshuai.xi break;
6167*53ee8cc1Swenshuai.xi }
6168*53ee8cc1Swenshuai.xi default:
6169*53ee8cc1Swenshuai.xi break;
6170*53ee8cc1Swenshuai.xi }
6171*53ee8cc1Swenshuai.xi
6172*53ee8cc1Swenshuai.xi if (eCmd != E_HVD_CMD_INVALID_CMD)
6173*53ee8cc1Swenshuai.xi {
6174*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, eCmd, u32Arg);
6175*53ee8cc1Swenshuai.xi }
6176*53ee8cc1Swenshuai.xi else
6177*53ee8cc1Swenshuai.xi {
6178*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
6179*53ee8cc1Swenshuai.xi }
6180*53ee8cc1Swenshuai.xi
6181*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6182*53ee8cc1Swenshuai.xi }
6183*53ee8cc1Swenshuai.xi
6184*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6185*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetCaps()
6186*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: check if HW support this format
6187*53ee8cc1Swenshuai.xi /// @param -u32Type \b IN : specify the format type
6188*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
6189*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): not supported by HW
6190*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): supported by HW
6191*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetCaps(HVD_EX_Codec u32Type)6192*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetCaps(HVD_EX_Codec u32Type)
6193*53ee8cc1Swenshuai.xi {
6194*53ee8cc1Swenshuai.xi if(E_HVD_EX_HEVC == u32Type)
6195*53ee8cc1Swenshuai.xi #if SUPPORT_EVD
6196*53ee8cc1Swenshuai.xi return TRUE;
6197*53ee8cc1Swenshuai.xi #else
6198*53ee8cc1Swenshuai.xi return FALSE;
6199*53ee8cc1Swenshuai.xi #endif
6200*53ee8cc1Swenshuai.xi #if SUPPORT_G2VP9
6201*53ee8cc1Swenshuai.xi if(E_HVD_EX_VP9 == u32Type)
6202*53ee8cc1Swenshuai.xi return TRUE;
6203*53ee8cc1Swenshuai.xi #endif
6204*53ee8cc1Swenshuai.xi
6205*53ee8cc1Swenshuai.xi #if ( HVD_HW_VERSION == HVD_HW_HVD)
6206*53ee8cc1Swenshuai.xi MS_U32 verID = HAL_HVD_EX_GetHWVersionID();
6207*53ee8cc1Swenshuai.xi verID = verID >> 12;
6208*53ee8cc1Swenshuai.xi switch (u32Type)
6209*53ee8cc1Swenshuai.xi {
6210*53ee8cc1Swenshuai.xi case E_HVD_EX_AVC:
6211*53ee8cc1Swenshuai.xi case E_HVD_EX_AVS:
6212*53ee8cc1Swenshuai.xi case E_HVD_EX_RM:
6213*53ee8cc1Swenshuai.xi case E_HVD_EX_MVC:
6214*53ee8cc1Swenshuai.xi if ((verID & BIT(u32Type)) == 0)
6215*53ee8cc1Swenshuai.xi {
6216*53ee8cc1Swenshuai.xi return FALSE;
6217*53ee8cc1Swenshuai.xi }
6218*53ee8cc1Swenshuai.xi break;
6219*53ee8cc1Swenshuai.xi case E_HVD_EX_VP8:
6220*53ee8cc1Swenshuai.xi #if !SUPPORT_G2VP9 && SUPPORT_EVD && defined(VDEC3)
6221*53ee8cc1Swenshuai.xi case E_HVD_EX_VP9: // Mstar VP9
6222*53ee8cc1Swenshuai.xi #endif
6223*53ee8cc1Swenshuai.xi return TRUE;
6224*53ee8cc1Swenshuai.xi default:
6225*53ee8cc1Swenshuai.xi return FALSE;
6226*53ee8cc1Swenshuai.xi }
6227*53ee8cc1Swenshuai.xi #else
6228*53ee8cc1Swenshuai.xi if (u32Type != E_HVD_EX_AVC)
6229*53ee8cc1Swenshuai.xi {
6230*53ee8cc1Swenshuai.xi return FALSE;
6231*53ee8cc1Swenshuai.xi }
6232*53ee8cc1Swenshuai.xi #endif
6233*53ee8cc1Swenshuai.xi return TRUE;
6234*53ee8cc1Swenshuai.xi }
6235*53ee8cc1Swenshuai.xi
MDrv_HVD_LinkWeakSymbolPatch(void)6236*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_LinkWeakSymbolPatch(void)
6237*53ee8cc1Swenshuai.xi {
6238*53ee8cc1Swenshuai.xi return TRUE;
6239*53ee8cc1Swenshuai.xi }
6240*53ee8cc1Swenshuai.xi
6241*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6242*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetAutoRmLstZeroByte
6243*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on/off auto remove last zero byte
6244*53ee8cc1Swenshuai.xi /// @param -bOn \b IN : Turn on/off auto remove last zero byte
6245*53ee8cc1Swenshuai.xi /// @return -the result of turn on/off auto remove last zero byte
6246*53ee8cc1Swenshuai.xi ///\b NOTE: The default mode after initialization is On.
6247*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetAutoRmLstZeroByte(MS_U32 u32Id,MS_BOOL bOn)6248*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetAutoRmLstZeroByte(MS_U32 u32Id, MS_BOOL bOn)
6249*53ee8cc1Swenshuai.xi {
6250*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6251*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6252*53ee8cc1Swenshuai.xi
6253*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6254*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6255*53ee8cc1Swenshuai.xi
6256*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].bAutoRmLastZeroByte = bOn;
6257*53ee8cc1Swenshuai.xi
6258*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6259*53ee8cc1Swenshuai.xi }
6260*53ee8cc1Swenshuai.xi
6261*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6262*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IsAlive
6263*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:Check Whether HVD is alive or not(check cnt)
6264*53ee8cc1Swenshuai.xi /// @return -the result of HVD alive status(E_HVD_EX_OK/E_HVD_EX_RET_NOT_RUNNING)
6265*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IsAlive(MS_U32 u32Id)6266*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IsAlive(MS_U32 u32Id)
6267*53ee8cc1Swenshuai.xi {
6268*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6269*53ee8cc1Swenshuai.xi
6270*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6271*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,E_HVD_EX_FAIL);
6272*53ee8cc1Swenshuai.xi
6273*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_IsAlive(u32Id))
6274*53ee8cc1Swenshuai.xi {
6275*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32DecCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_DECODE_CNT);
6276*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32SkipCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_SKIP_CNT);
6277*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32IdleCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_VPU_IDLE_CNT);
6278*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].LivingStatus.u32MainLoopCnt = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_MAIN_LOOP_CNT);
6279*53ee8cc1Swenshuai.xi
6280*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6281*53ee8cc1Swenshuai.xi }
6282*53ee8cc1Swenshuai.xi else
6283*53ee8cc1Swenshuai.xi {
6284*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_NOT_RUNNING;
6285*53ee8cc1Swenshuai.xi }
6286*53ee8cc1Swenshuai.xi }
6287*53ee8cc1Swenshuai.xi
6288*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6289*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetBalanceBW
6290*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: bandwidth adjustment
6291*53ee8cc1Swenshuai.xi /// @param -qp_cnt \b IN : QP threshold for overtime counter
6292*53ee8cc1Swenshuai.xi /// @param -db_cnt \b IN : Deblocking threshod for overtime counter
6293*53ee8cc1Swenshuai.xi /// @param -upper \b IN : upper bound for overtime counter
6294*53ee8cc1Swenshuai.xi /// @return -the result of command E_HVD_CMD_BALANCE_BW
6295*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetBalanceBW(MS_U32 u32Id,MS_U8 u8QPCnt,MS_U8 u8DBCnt,MS_U8 u8Upper)6296*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetBalanceBW(MS_U32 u32Id, MS_U8 u8QPCnt, MS_U8 u8DBCnt, MS_U8 u8Upper)
6297*53ee8cc1Swenshuai.xi {
6298*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
6299*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6300*53ee8cc1Swenshuai.xi
6301*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6302*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6303*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6304*53ee8cc1Swenshuai.xi
6305*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_BALANCE_BW, u8QPCnt | (u8DBCnt << 8) | (u8Upper << 16));
6306*53ee8cc1Swenshuai.xi
6307*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6308*53ee8cc1Swenshuai.xi }
6309*53ee8cc1Swenshuai.xi
6310*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6311*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetFdMaskDelayCnt()
6312*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set fd mask muting count
6313*53ee8cc1Swenshuai.xi /// @param -u8DelayCnt \b IN : 0~0xFF, Fdmask delay count, arg >= 0xFF -> use default
6314*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
6315*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetFdMaskDelayCnt(MS_U32 u32Id,MS_U8 u8DelayCnt)6316*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFdMaskDelayCnt(MS_U32 u32Id, MS_U8 u8DelayCnt)
6317*53ee8cc1Swenshuai.xi {
6318*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6319*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6320*53ee8cc1Swenshuai.xi
6321*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6322*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6323*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6324*53ee8cc1Swenshuai.xi
6325*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FDMASK_DELAY_CNT, u8DelayCnt);
6326*53ee8cc1Swenshuai.xi
6327*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6328*53ee8cc1Swenshuai.xi }
6329*53ee8cc1Swenshuai.xi
6330*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6331*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetOutputFRCMode()
6332*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set output frame rate convert mode.
6333*53ee8cc1Swenshuai.xi /// @param -u8FrameRate \b IN : output vsync count.
6334*53ee8cc1Swenshuai.xi /// @param -u8Interlace \b IN : output scan type: 0:progress, 1:interlace.
6335*53ee8cc1Swenshuai.xi /// @return -The result of command setting output FRC mode
6336*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetOutputFRCMode(MS_U32 u32Id,MS_U8 u8FrameRate,MS_U8 u8Interlace)6337*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetOutputFRCMode(MS_U32 u32Id, MS_U8 u8FrameRate, MS_U8 u8Interlace)
6338*53ee8cc1Swenshuai.xi {
6339*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6340*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6341*53ee8cc1Swenshuai.xi
6342*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6343*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6344*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6345*53ee8cc1Swenshuai.xi
6346*53ee8cc1Swenshuai.xi if ((u8Interlace != 0) && (u8Interlace != 1))
6347*53ee8cc1Swenshuai.xi {
6348*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6349*53ee8cc1Swenshuai.xi }
6350*53ee8cc1Swenshuai.xi
6351*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_OUTPUT_FRAMERATE, u8FrameRate);
6352*53ee8cc1Swenshuai.xi
6353*53ee8cc1Swenshuai.xi if (eRet != E_HVD_EX_OK)
6354*53ee8cc1Swenshuai.xi {
6355*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6356*53ee8cc1Swenshuai.xi }
6357*53ee8cc1Swenshuai.xi
6358*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_OUTPUT_INTERLACE, u8Interlace);
6359*53ee8cc1Swenshuai.xi
6360*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6361*53ee8cc1Swenshuai.xi }
6362*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_DispFrame(MS_U32 u32Id,MS_U32 u32FrmIdx)6363*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DispFrame(MS_U32 u32Id, MS_U32 u32FrmIdx)
6364*53ee8cc1Swenshuai.xi {
6365*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6366*53ee8cc1Swenshuai.xi
6367*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISPQ_STATUS_DISP, u32FrmIdx);
6368*53ee8cc1Swenshuai.xi
6369*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6370*53ee8cc1Swenshuai.xi }
6371*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_FreeFrame(MS_U32 u32Id,MS_U32 u32FrmIdx)6372*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_FreeFrame(MS_U32 u32Id, MS_U32 u32FrmIdx)
6373*53ee8cc1Swenshuai.xi {
6374*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6375*53ee8cc1Swenshuai.xi
6376*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DISPQ_STATUS_FREE, u32FrmIdx);
6377*53ee8cc1Swenshuai.xi
6378*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6379*53ee8cc1Swenshuai.xi }
6380*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_EnableDispQue(MS_U32 u32Id,MS_BOOL bEnable)6381*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_EnableDispQue(MS_U32 u32Id, MS_BOOL bEnable)
6382*53ee8cc1Swenshuai.xi {
6383*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6384*53ee8cc1Swenshuai.xi
6385*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_DISP_QUEUE, bEnable);
6386*53ee8cc1Swenshuai.xi
6387*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6388*53ee8cc1Swenshuai.xi }
6389*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_EnableVSizeAlign(MS_U32 u32Id,MS_BOOL bEnable)6390*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_EnableVSizeAlign(MS_U32 u32Id, MS_BOOL bEnable)
6391*53ee8cc1Swenshuai.xi {
6392*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6393*53ee8cc1Swenshuai.xi
6394*53ee8cc1Swenshuai.xi HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_ALIGN_VSIZE, bEnable);
6395*53ee8cc1Swenshuai.xi
6396*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
6397*53ee8cc1Swenshuai.xi }
6398*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_ShowDecodeOrder(MS_U32 u32Id,MS_BOOL bEnable)6399*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ShowDecodeOrder(MS_U32 u32Id, MS_BOOL bEnable)
6400*53ee8cc1Swenshuai.xi {
6401*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6402*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6403*53ee8cc1Swenshuai.xi
6404*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6405*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6406*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6407*53ee8cc1Swenshuai.xi
6408*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SHOW_DECODE_ORDER, bEnable);
6409*53ee8cc1Swenshuai.xi
6410*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6411*53ee8cc1Swenshuai.xi }
6412*53ee8cc1Swenshuai.xi
6413*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Disp_Ignore_Crop()
6415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: ingore corp info
6416*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
6417*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
6418*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Disp_Ignore_Crop(MS_U32 u32Id,MS_BOOL bEnable)6419*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Disp_Ignore_Crop(MS_U32 u32Id, MS_BOOL bEnable)
6420*53ee8cc1Swenshuai.xi {
6421*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6422*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6423*53ee8cc1Swenshuai.xi
6424*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6425*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6426*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6427*53ee8cc1Swenshuai.xi
6428*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DISP_IGNORE_CROP, bEnable);
6429*53ee8cc1Swenshuai.xi
6430*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6431*53ee8cc1Swenshuai.xi }
6432*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SuspendDynamicScale(MS_U32 u32Id,MS_BOOL bEnable)6433*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SuspendDynamicScale(MS_U32 u32Id, MS_BOOL bEnable)
6434*53ee8cc1Swenshuai.xi {
6435*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6436*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6437*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6438*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6439*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6440*53ee8cc1Swenshuai.xi
6441*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SUSPEND_DYNAMIC_SCALE, bEnable);
6442*53ee8cc1Swenshuai.xi
6443*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6444*53ee8cc1Swenshuai.xi }
6445*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_RmEnablePtsTbl(MS_U32 u32Id,MS_BOOL bEnable)6446*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RmEnablePtsTbl(MS_U32 u32Id, MS_BOOL bEnable)
6447*53ee8cc1Swenshuai.xi {
6448*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6449*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6450*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6451*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6452*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6453*53ee8cc1Swenshuai.xi
6454*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RM_ENABLE_PTS_TBL, bEnable);
6455*53ee8cc1Swenshuai.xi
6456*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6457*53ee8cc1Swenshuai.xi }
6458*53ee8cc1Swenshuai.xi
6459*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_AutoExhaustESMode(MS_U32 u32Id,MS_U32 u32ESbound)6460*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AutoExhaustESMode(MS_U32 u32Id, MS_U32 u32ESbound)
6461*53ee8cc1Swenshuai.xi {
6462*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6463*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6464*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6465*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6466*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6467*53ee8cc1Swenshuai.xi
6468*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AUTO_EXHAUST_ES_MODE, u32ESbound);
6469*53ee8cc1Swenshuai.xi
6470*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6471*53ee8cc1Swenshuai.xi }
6472*53ee8cc1Swenshuai.xi
6473*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetMinTspSize(MS_U32 u32Id,MS_U32 u32Size)6474*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetMinTspSize(MS_U32 u32Id, MS_U32 u32Size)
6475*53ee8cc1Swenshuai.xi {
6476*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6477*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6478*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6479*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6480*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6481*53ee8cc1Swenshuai.xi
6482*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_MIN_TSP_DATA_SIZE, u32Size);
6483*53ee8cc1Swenshuai.xi
6484*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6485*53ee8cc1Swenshuai.xi }
6486*53ee8cc1Swenshuai.xi
6487*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6488*53ee8cc1Swenshuai.xi /// Set HVD FRC drop type.
6489*53ee8cc1Swenshuai.xi /// @param u8DropType \b IN : drop type. 0:drop frame, 1:drop field. default:0
6490*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
6491*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_SetFRCDropType(MS_U32 u32Id,MS_U8 u8DropType)6492*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetFRCDropType(MS_U32 u32Id, MS_U8 u8DropType)
6493*53ee8cc1Swenshuai.xi {
6494*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
6495*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6496*53ee8cc1Swenshuai.xi
6497*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6498*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6499*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6500*53ee8cc1Swenshuai.xi
6501*53ee8cc1Swenshuai.xi if (u8DropType != 0 && u8DropType != 1)
6502*53ee8cc1Swenshuai.xi {
6503*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_RET_INVALID_PARAMETER;
6504*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6505*53ee8cc1Swenshuai.xi }
6506*53ee8cc1Swenshuai.xi
6507*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRC_DROP_MODE, u8DropType);
6508*53ee8cc1Swenshuai.xi
6509*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6510*53ee8cc1Swenshuai.xi }
6511*53ee8cc1Swenshuai.xi
6512*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6513*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDrvFwVer()
6514*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
6515*53ee8cc1Swenshuai.xi /// @return - Driver's FW version
6516*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDrvFwVer(void)6517*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDrvFwVer(void)
6518*53ee8cc1Swenshuai.xi {
6519*53ee8cc1Swenshuai.xi return HVD_FW_VERSION;
6520*53ee8cc1Swenshuai.xi }
6521*53ee8cc1Swenshuai.xi
6522*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6523*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetFwVer()
6524*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
6525*53ee8cc1Swenshuai.xi /// @return - FW version obtained by querying FW
6526*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFwVer(MS_U32 u32Id)6527*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetFwVer(MS_U32 u32Id)
6528*53ee8cc1Swenshuai.xi {
6529*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_VERSION_ID);
6530*53ee8cc1Swenshuai.xi }
6531*53ee8cc1Swenshuai.xi
MDrv_HVD_SetSingleDecodeMode(MS_BOOL bEnable)6532*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetSingleDecodeMode(MS_BOOL bEnable)
6533*53ee8cc1Swenshuai.xi {
6534*53ee8cc1Swenshuai.xi return HAL_VPU_EX_SetSingleDecodeMode(bEnable);
6535*53ee8cc1Swenshuai.xi }
6536*53ee8cc1Swenshuai.xi
MDrv_HVD_SetDecodeMode(HVD_EX_DecModCfg * pstCfg)6537*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetDecodeMode(HVD_EX_DecModCfg *pstCfg)
6538*53ee8cc1Swenshuai.xi {
6539*53ee8cc1Swenshuai.xi return HAL_VPU_EX_SetDecodeMode((VPU_EX_DecModCfg*)pstCfg);
6540*53ee8cc1Swenshuai.xi }
6541*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetBurstMode(MS_U32 u32Id,MS_BOOL bBurst)6542*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_SetBurstMode(MS_U32 u32Id, MS_BOOL bBurst)
6543*53ee8cc1Swenshuai.xi {
6544*53ee8cc1Swenshuai.xi HVD_Return eCtrlRet = E_HVD_RETURN_FAIL;
6545*53ee8cc1Swenshuai.xi
6546*53ee8cc1Swenshuai.xi eCtrlRet = HAL_HVD_EX_SetCmd(u32Id, E_DUAL_BURST_MODE, bBurst);
6547*53ee8cc1Swenshuai.xi if (E_HVD_RETURN_SUCCESS != eCtrlRet)
6548*53ee8cc1Swenshuai.xi {
6549*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("E_DUAL_BURST_MODE NG eCtrlRet=%x\n", eCtrlRet);
6550*53ee8cc1Swenshuai.xi }
6551*53ee8cc1Swenshuai.xi else
6552*53ee8cc1Swenshuai.xi {
6553*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("MJPEG!!! Set burst mode =%d success!!!!\n", bBurst);
6554*53ee8cc1Swenshuai.xi }
6555*53ee8cc1Swenshuai.xi }
6556*53ee8cc1Swenshuai.xi
6557*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6558*53ee8cc1Swenshuai.xi /// Force into interlace mode
6559*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
6560*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6561*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_ForceInterlaceMode(MS_U32 u32Id,MS_U8 u8Mode)6562*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ForceInterlaceMode(MS_U32 u32Id, MS_U8 u8Mode)
6563*53ee8cc1Swenshuai.xi {
6564*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
6565*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6566*53ee8cc1Swenshuai.xi
6567*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6568*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6569*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6570*53ee8cc1Swenshuai.xi
6571*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FORCE_INTERLACE, u8Mode);
6572*53ee8cc1Swenshuai.xi
6573*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6574*53ee8cc1Swenshuai.xi }
6575*53ee8cc1Swenshuai.xi
6576*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6577*53ee8cc1Swenshuai.xi /// Push Disp Q with Ref num
6578*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
6579*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6580*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_PushDispQWithRefNum(MS_U32 u32Id,MS_U8 u8Mode)6581*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PushDispQWithRefNum(MS_U32 u32Id, MS_U8 u8Mode)
6582*53ee8cc1Swenshuai.xi {
6583*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6584*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6585*53ee8cc1Swenshuai.xi
6586*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6587*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6588*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6589*53ee8cc1Swenshuai.xi
6590*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PUSH_DISPQ_WITH_REF_NUM, u8Mode);
6591*53ee8cc1Swenshuai.xi
6592*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6593*53ee8cc1Swenshuai.xi }
6594*53ee8cc1Swenshuai.xi
6595*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6596*53ee8cc1Swenshuai.xi /// Ignore HW error - PIC_OVERRUN
6597*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
6598*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
6599*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_IgnorePicOverrun(MS_U32 u32Id,MS_BOOL bEnable)6600*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IgnorePicOverrun(MS_U32 u32Id, MS_BOOL bEnable)
6601*53ee8cc1Swenshuai.xi {
6602*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6603*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6604*53ee8cc1Swenshuai.xi
6605*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6606*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6607*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6608*53ee8cc1Swenshuai.xi
6609*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_PIC_OVERRUN, bEnable);
6610*53ee8cc1Swenshuai.xi
6611*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6612*53ee8cc1Swenshuai.xi }
6613*53ee8cc1Swenshuai.xi
6614*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6615*53ee8cc1Swenshuai.xi /// Control speed in displaying time only.
6616*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Original, control in decoding and displaying time, 1: Enable,control speed in displaying time only
6617*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
6618*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_CtlSpeedInDispOnly(MS_U32 u32Id,MS_BOOL bEnable)6619*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CtlSpeedInDispOnly(MS_U32 u32Id, MS_BOOL bEnable)
6620*53ee8cc1Swenshuai.xi {
6621*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6622*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6623*53ee8cc1Swenshuai.xi
6624*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6625*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6626*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6627*53ee8cc1Swenshuai.xi
6628*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_CTRL_SPEED_IN_DISP_ONLY, bEnable);
6629*53ee8cc1Swenshuai.xi
6630*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6631*53ee8cc1Swenshuai.xi }
6632*53ee8cc1Swenshuai.xi
6633*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6634*53ee8cc1Swenshuai.xi /// AVC support reference number over max DPB size when frame buffer is enough.
6635*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
6636*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
6637*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_AVCSupportRefNumOverMaxDBPSize(MS_U32 u32Id,MS_BOOL bEnable)6638*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCSupportRefNumOverMaxDBPSize(MS_U32 u32Id, MS_BOOL bEnable)
6639*53ee8cc1Swenshuai.xi {
6640*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6641*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6642*53ee8cc1Swenshuai.xi
6643*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6644*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6645*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6646*53ee8cc1Swenshuai.xi
6647*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_SUPPORT_REF_NUM_OVER_MAX_DPB_SIZE, bEnable);
6648*53ee8cc1Swenshuai.xi
6649*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6650*53ee8cc1Swenshuai.xi }
6651*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_ReturnInvalidAFD(MS_U32 u32Id,MS_BOOL bEnable)6652*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ReturnInvalidAFD(MS_U32 u32Id, MS_BOOL bEnable)
6653*53ee8cc1Swenshuai.xi {
6654*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6655*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6656*53ee8cc1Swenshuai.xi
6657*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6658*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6659*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6660*53ee8cc1Swenshuai.xi
6661*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RETURN_INVALID_AFD, bEnable);
6662*53ee8cc1Swenshuai.xi
6663*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6664*53ee8cc1Swenshuai.xi }
6665*53ee8cc1Swenshuai.xi
6666*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_AVCForceBrokenByUs(MS_U32 u32Id,MS_BOOL bEnable)6667*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCForceBrokenByUs(MS_U32 u32Id, MS_BOOL bEnable)
6668*53ee8cc1Swenshuai.xi {
6669*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6670*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6671*53ee8cc1Swenshuai.xi
6672*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6673*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6674*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6675*53ee8cc1Swenshuai.xi
6676*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_FORCE_BROKEN_BY_US, bEnable);
6677*53ee8cc1Swenshuai.xi
6678*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6679*53ee8cc1Swenshuai.xi }
6680*53ee8cc1Swenshuai.xi
6681*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6682*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Support_AVC2MVC()
6683*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set Support AVC to MVC
6684*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
6685*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
6686*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Support_AVC2MVC(MS_U32 u32Id,MS_BOOL bEnable)6687*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Support_AVC2MVC(MS_U32 u32Id, MS_BOOL bEnable)
6688*53ee8cc1Swenshuai.xi {
6689*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6690*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6691*53ee8cc1Swenshuai.xi
6692*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6693*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6694*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6695*53ee8cc1Swenshuai.xi
6696*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SUPPORT_AVC_TO_MVC, bEnable);
6697*53ee8cc1Swenshuai.xi
6698*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6699*53ee8cc1Swenshuai.xi }
6700*53ee8cc1Swenshuai.xi
6701*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6702*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_3DLR_View_Exchange()
6703*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: view exchange
6704*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
6705*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
6706*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_3DLR_View_Exchange(MS_U32 u32Id,MS_BOOL bEnable)6707*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_3DLR_View_Exchange(MS_U32 u32Id, MS_BOOL bEnable)
6708*53ee8cc1Swenshuai.xi {
6709*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6710*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6711*53ee8cc1Swenshuai.xi
6712*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6713*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6714*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6715*53ee8cc1Swenshuai.xi
6716*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_3DLR_VIEW_EXCHANGE, bEnable);
6717*53ee8cc1Swenshuai.xi
6718*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6719*53ee8cc1Swenshuai.xi }
6720*53ee8cc1Swenshuai.xi
6721*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6722*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmRateIsSupported()
6723*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get if the framerate is supported
6724*53ee8cc1Swenshuai.xi /// @return -The result of supported or not.
6725*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id)6726*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetFrmRateIsSupported(MS_U32 u32Id)
6727*53ee8cc1Swenshuai.xi {
6728*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6729*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
6730*53ee8cc1Swenshuai.xi MS_BOOL bRet = pCtrl->bFrmRateSupported;
6731*53ee8cc1Swenshuai.xi
6732*53ee8cc1Swenshuai.xi return bRet;
6733*53ee8cc1Swenshuai.xi }
6734*53ee8cc1Swenshuai.xi
6735*53ee8cc1Swenshuai.xi
6736*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6737*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_Enable_New_Slow_Motion()
6738*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: view exchange
6739*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
6740*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
6741*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_Enable_New_Slow_Motion(MS_U32 u32Id,MS_BOOL bEnable)6742*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_Enable_New_Slow_Motion(MS_U32 u32Id, MS_BOOL bEnable)
6743*53ee8cc1Swenshuai.xi {
6744*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6745*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6746*53ee8cc1Swenshuai.xi
6747*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6748*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6749*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6750*53ee8cc1Swenshuai.xi
6751*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_NEW_SLOW_MOTION, bEnable);
6752*53ee8cc1Swenshuai.xi
6753*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6754*53ee8cc1Swenshuai.xi }
6755*53ee8cc1Swenshuai.xi
6756*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6757*53ee8cc1Swenshuai.xi /// Get SEI USER DATA Info
6758*53ee8cc1Swenshuai.xi /// @param pUsrInfo \b OUT : Get CC USER Data info
6759*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6760*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_GetUserDataInfo(MS_U32 u32Id,HVD_EX_UserData_Info * pUsrInfo)6761*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetUserDataInfo(MS_U32 u32Id,HVD_EX_UserData_Info* pUsrInfo)
6762*53ee8cc1Swenshuai.xi {
6763*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
6764*53ee8cc1Swenshuai.xi MS_U32 u32UserDataIdxSize = 0;
6765*53ee8cc1Swenshuai.xi MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
6766*53ee8cc1Swenshuai.xi MS_U32 u32UserDataSize = 0;
6767*53ee8cc1Swenshuai.xi MS_U32 u32UserDataAddr = 0;
6768*53ee8cc1Swenshuai.xi MS_U32 u32CodeVAddr = 0;
6769*53ee8cc1Swenshuai.xi DTV_BUF_type* pHVD_User_Data = NULL;
6770*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6771*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6772*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6773*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6774*53ee8cc1Swenshuai.xi
6775*53ee8cc1Swenshuai.xi u32UserDataIdxSize = (MS_U32)HAL_HVD_EX_GetData(u32Id,E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
6776*53ee8cc1Swenshuai.xi u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
6777*53ee8cc1Swenshuai.xi
6778*53ee8cc1Swenshuai.xi if (u32UsrDataIdxWptr != 0xFFFFFFFF)
6779*53ee8cc1Swenshuai.xi {
6780*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr = u32UsrDataIdxWptr;
6781*53ee8cc1Swenshuai.xi }
6782*53ee8cc1Swenshuai.xi
6783*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd == pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr)
6784*53ee8cc1Swenshuai.xi { // User Data Buffer Empty
6785*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6786*53ee8cc1Swenshuai.xi }
6787*53ee8cc1Swenshuai.xi
6788*53ee8cc1Swenshuai.xi u32CodeVAddr = pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufVAddr;
6789*53ee8cc1Swenshuai.xi if(u32CodeVAddr == 0x0)
6790*53ee8cc1Swenshuai.xi {
6791*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6792*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6793*53ee8cc1Swenshuai.xi }
6794*53ee8cc1Swenshuai.xi
6795*53ee8cc1Swenshuai.xi u32UserDataAddr = MDrv_HVD_EX_GetUserData_Packet(u32Id,pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd, (MS_U32*)&u32UserDataSize );
6796*53ee8cc1Swenshuai.xi if(u32UserDataAddr == 0x0)
6797*53ee8cc1Swenshuai.xi {
6798*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6799*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6800*53ee8cc1Swenshuai.xi }
6801*53ee8cc1Swenshuai.xi u32UserDataAddr += u32CodeVAddr; // change to virtual address
6802*53ee8cc1Swenshuai.xi
6803*53ee8cc1Swenshuai.xi pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
6804*53ee8cc1Swenshuai.xi
6805*53ee8cc1Swenshuai.xi pUsrInfo->u16TmpRef = pHVD_User_Data->u16TempRefCnt;
6806*53ee8cc1Swenshuai.xi pUsrInfo->u8PicStruct = pHVD_User_Data->pic_struct;
6807*53ee8cc1Swenshuai.xi pUsrInfo->u8PicType = pHVD_User_Data->type;
6808*53ee8cc1Swenshuai.xi pUsrInfo->u32Pts = pHVD_User_Data->pts;
6809*53ee8cc1Swenshuai.xi pUsrInfo->u8ByteCnt = pHVD_User_Data->len;
6810*53ee8cc1Swenshuai.xi pUsrInfo->u32DataBuf = (MS_U32)pHVD_User_Data->buf;
6811*53ee8cc1Swenshuai.xi
6812*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd++;
6813*53ee8cc1Swenshuai.xi
6814*53ee8cc1Swenshuai.xi if (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd >= u32UserDataIdxSize)
6815*53ee8cc1Swenshuai.xi {
6816*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd = 0;
6817*53ee8cc1Swenshuai.xi }
6818*53ee8cc1Swenshuai.xi
6819*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
6820*53ee8cc1Swenshuai.xi
6821*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6822*53ee8cc1Swenshuai.xi
6823*53ee8cc1Swenshuai.xi }
6824*53ee8cc1Swenshuai.xi
6825*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6826*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetUsrDataIsAvailable()
6827*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Is there new user data info.
6828*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
6829*53ee8cc1Swenshuai.xi /// @retval -FALSE(0): no new user data info
6830*53ee8cc1Swenshuai.xi /// @retval -TRUE(1): has new user data info
6831*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_GetUsrDataIsAvailable(MS_U32 u32Id)6832*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetUsrDataIsAvailable(MS_U32 u32Id)
6833*53ee8cc1Swenshuai.xi {
6834*53ee8cc1Swenshuai.xi
6835*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6836*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
6837*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6838*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6839*53ee8cc1Swenshuai.xi MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
6840*53ee8cc1Swenshuai.xi u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
6841*53ee8cc1Swenshuai.xi
6842*53ee8cc1Swenshuai.xi if (u32UsrDataIdxWptr != 0xFFFFFFFF)
6843*53ee8cc1Swenshuai.xi {
6844*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr = u32UsrDataIdxWptr;
6845*53ee8cc1Swenshuai.xi }
6846*53ee8cc1Swenshuai.xi
6847*53ee8cc1Swenshuai.xi bRet = (pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataWr == pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u32UsrDataRd)?FALSE:TRUE;
6848*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, bRet);
6849*53ee8cc1Swenshuai.xi }
6850*53ee8cc1Swenshuai.xi
6851*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6852*53ee8cc1Swenshuai.xi /// Set HVD DTV User Data Packet Mode
6853*53ee8cc1Swenshuai.xi /// @param u8UserDataMode \b IN : User Data Packet Mode. 0: DVB normal, 1: ATSC DirectTV. default:0
6854*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6855*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_EX_SetDTVUserDataMode(MS_U32 u32Id,MS_U8 u8UserDataMode)6856*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDTVUserDataMode(MS_U32 u32Id,MS_U8 u8UserDataMode)
6857*53ee8cc1Swenshuai.xi {
6858*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
6859*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6860*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6861*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6862*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6863*53ee8cc1Swenshuai.xi
6864*53ee8cc1Swenshuai.xi
6865*53ee8cc1Swenshuai.xi if (u8UserDataMode == 0)
6866*53ee8cc1Swenshuai.xi {
6867*53ee8cc1Swenshuai.xi // Noraml DVB USER DATA
6868*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 0);
6869*53ee8cc1Swenshuai.xi }
6870*53ee8cc1Swenshuai.xi else if (u8UserDataMode == 1)
6871*53ee8cc1Swenshuai.xi {
6872*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 1);
6873*53ee8cc1Swenshuai.xi }
6874*53ee8cc1Swenshuai.xi else if (u8UserDataMode == 2)
6875*53ee8cc1Swenshuai.xi {
6876*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 2);
6877*53ee8cc1Swenshuai.xi }
6878*53ee8cc1Swenshuai.xi else if (u8UserDataMode == 3)
6879*53ee8cc1Swenshuai.xi {
6880*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 3);
6881*53ee8cc1Swenshuai.xi }
6882*53ee8cc1Swenshuai.xi else if (u8UserDataMode == 7)
6883*53ee8cc1Swenshuai.xi {
6884*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, 7);
6885*53ee8cc1Swenshuai.xi }
6886*53ee8cc1Swenshuai.xi else
6887*53ee8cc1Swenshuai.xi {
6888*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id,E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
6889*53ee8cc1Swenshuai.xi HVD_PRINT("Debug Mode for set user data mode \n");
6890*53ee8cc1Swenshuai.xi }
6891*53ee8cc1Swenshuai.xi
6892*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6893*53ee8cc1Swenshuai.xi }
6894*53ee8cc1Swenshuai.xi
6895*53ee8cc1Swenshuai.xi
6896*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6897*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmPackingArrSEI()
6898*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get if the Frame packing arrangement SEI data
6899*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : The frame packing SEI struct
6900*53ee8cc1Swenshuai.xi /// @return -The result of got the info. or not.
6901*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetFrmPackingArrSEI(MS_U32 u32Id,HVD_EX_FrmPackingSEI * pFrmPacking)6902*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_GetFrmPackingArrSEI(MS_U32 u32Id, HVD_EX_FrmPackingSEI *pFrmPacking)
6903*53ee8cc1Swenshuai.xi {
6904*53ee8cc1Swenshuai.xi
6905*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
6906*53ee8cc1Swenshuai.xi MS_U32 u32FPAFrameAddr = 0 ;
6907*53ee8cc1Swenshuai.xi MS_U32 u32CodeVaddr = 0 ;
6908*53ee8cc1Swenshuai.xi HVD_Frame_packing_SEI *pFrmPackingSrc = NULL;
6909*53ee8cc1Swenshuai.xi MS_BOOL bIn = FALSE;
6910*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6911*53ee8cc1Swenshuai.xi
6912*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
6913*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
6914*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
6915*53ee8cc1Swenshuai.xi
6916*53ee8cc1Swenshuai.xi u32CodeVaddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr));
6917*53ee8cc1Swenshuai.xi if(u32CodeVaddr == 0x0)
6918*53ee8cc1Swenshuai.xi {
6919*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6920*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6921*53ee8cc1Swenshuai.xi }
6922*53ee8cc1Swenshuai.xi
6923*53ee8cc1Swenshuai.xi u32FPAFrameAddr = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FRM_PACKING_SEI_DATA);
6924*53ee8cc1Swenshuai.xi
6925*53ee8cc1Swenshuai.xi //u32FPAFrameAddr = HAL_HVD_EX_GetData(u8DrvId,E_HVD_GDATA_FRM_PACKING_SEI_DATA);
6926*53ee8cc1Swenshuai.xi if(u32FPAFrameAddr == 0x0)
6927*53ee8cc1Swenshuai.xi {
6928*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6929*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6930*53ee8cc1Swenshuai.xi }
6931*53ee8cc1Swenshuai.xi
6932*53ee8cc1Swenshuai.xi u32FPAFrameAddr = MS_PA2KSEG1((MS_U32)(pHVDDrvContext->gHVDCtrl_EX[u8DrvId].MemMap.u32CodeBufAddr+u32FPAFrameAddr)); // change to virtual address
6933*53ee8cc1Swenshuai.xi
6934*53ee8cc1Swenshuai.xi pFrmPackingSrc = (HVD_Frame_packing_SEI *)u32FPAFrameAddr;
6935*53ee8cc1Swenshuai.xi
6936*53ee8cc1Swenshuai.xi if(pFrmPacking != NULL)
6937*53ee8cc1Swenshuai.xi {
6938*53ee8cc1Swenshuai.xi if(pFrmPackingSrc->bvaild == TRUE)
6939*53ee8cc1Swenshuai.xi {
6940*53ee8cc1Swenshuai.xi bIn = TRUE;
6941*53ee8cc1Swenshuai.xi pFrmPacking->bvaild = pFrmPackingSrc->bvaild;
6942*53ee8cc1Swenshuai.xi pFrmPacking->bUsed = pFrmPackingSrc->bUsed;
6943*53ee8cc1Swenshuai.xi pFrmPacking->u8Frm_packing_arr_cnl_flag = pFrmPackingSrc->u8Frm_packing_arr_cnl_flag;
6944*53ee8cc1Swenshuai.xi pFrmPacking->u8Frm_packing_arr_type = pFrmPackingSrc->u8Frm_packing_arr_type;
6945*53ee8cc1Swenshuai.xi pFrmPacking->u8content_interpretation_type = pFrmPackingSrc->u8content_interpretation_type;
6946*53ee8cc1Swenshuai.xi pFrmPacking->u1Quincunx_sampling_flag = pFrmPackingSrc->u1Quincunx_sampling_flag;
6947*53ee8cc1Swenshuai.xi pFrmPacking->u1Spatial_flipping_flag = pFrmPackingSrc->u1Spatial_flipping_flag;
6948*53ee8cc1Swenshuai.xi pFrmPacking->u1Frame0_flipping_flag = pFrmPackingSrc->u1Frame0_flipping_flag;
6949*53ee8cc1Swenshuai.xi pFrmPacking->u1Field_views_flag = pFrmPackingSrc->u1Field_views_flag;
6950*53ee8cc1Swenshuai.xi pFrmPacking->u1Current_frame_is_frame0_flag = pFrmPackingSrc->u1Current_frame_is_frame0_flag;
6951*53ee8cc1Swenshuai.xi pFrmPacking->u1Frame0_self_contained_flag = pFrmPackingSrc->u1Frame0_self_contained_flag;
6952*53ee8cc1Swenshuai.xi pFrmPacking->u1Frame1_self_contained_flag = pFrmPackingSrc->u1Frame1_self_contained_flag;
6953*53ee8cc1Swenshuai.xi pFrmPacking->u4Frame0_grid_position_x = pFrmPackingSrc->u4Frame0_grid_position_x;
6954*53ee8cc1Swenshuai.xi pFrmPacking->u4Frame0_grid_position_y = pFrmPackingSrc->u4Frame0_grid_position_y;
6955*53ee8cc1Swenshuai.xi pFrmPacking->u4Frame1_grid_position_x = pFrmPackingSrc->u4Frame1_grid_position_x;
6956*53ee8cc1Swenshuai.xi pFrmPacking->u4Frame1_grid_position_y = pFrmPackingSrc->u4Frame1_grid_position_y;
6957*53ee8cc1Swenshuai.xi pFrmPacking->u16CropRight = pFrmPackingSrc->u16CropRight;
6958*53ee8cc1Swenshuai.xi pFrmPacking->u16CropLeft = pFrmPackingSrc->u16CropLeft;
6959*53ee8cc1Swenshuai.xi pFrmPacking->u16CropBottom = pFrmPackingSrc->u16CropBottom;
6960*53ee8cc1Swenshuai.xi pFrmPacking->u16CropTop = pFrmPackingSrc->u16CropTop;
6961*53ee8cc1Swenshuai.xi
6962*53ee8cc1Swenshuai.xi if(pFrmPackingSrc->u8payload_len > 32)
6963*53ee8cc1Swenshuai.xi {
6964*53ee8cc1Swenshuai.xi pFrmPacking->u8payload_len = 32;
6965*53ee8cc1Swenshuai.xi }
6966*53ee8cc1Swenshuai.xi else
6967*53ee8cc1Swenshuai.xi {
6968*53ee8cc1Swenshuai.xi pFrmPacking->u8payload_len = pFrmPackingSrc->u8payload_len;
6969*53ee8cc1Swenshuai.xi }
6970*53ee8cc1Swenshuai.xi
6971*53ee8cc1Swenshuai.xi pFrmPacking->u8WaitSPS = pFrmPackingSrc->u8WaitSPS;
6972*53ee8cc1Swenshuai.xi pFrmPacking->u32payload = (MS_U32)pFrmPackingSrc->u8payload;
6973*53ee8cc1Swenshuai.xi
6974*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
6975*53ee8cc1Swenshuai.xi }
6976*53ee8cc1Swenshuai.xi else
6977*53ee8cc1Swenshuai.xi {
6978*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6979*53ee8cc1Swenshuai.xi }
6980*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("SEI status (%d): %d %d %d %d %d %d %d %d\n",bIn,
6981*53ee8cc1Swenshuai.xi pFrmPacking->bvaild,pFrmPacking->bUsed,pFrmPacking->u8Frm_packing_arr_cnl_flag,pFrmPacking->u8Frm_packing_arr_type,
6982*53ee8cc1Swenshuai.xi pFrmPacking->u16CropRight,pFrmPacking->u16CropLeft,pFrmPacking->u16CropBottom,pFrmPacking->u16CropTop);
6983*53ee8cc1Swenshuai.xi }
6984*53ee8cc1Swenshuai.xi else
6985*53ee8cc1Swenshuai.xi {
6986*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
6987*53ee8cc1Swenshuai.xi }
6988*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
6989*53ee8cc1Swenshuai.xi }
6990*53ee8cc1Swenshuai.xi
6991*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
6992*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DynamicScalingResvNBuffer()
6993*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: use N buffers for Dynamic Scaling
6994*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
6995*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable N buffer for DS
6996*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DynamicScalingResvNBuffer(MS_U32 u32Id,MS_BOOL bEnable)6997*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DynamicScalingResvNBuffer(MS_U32 u32Id, MS_BOOL bEnable)
6998*53ee8cc1Swenshuai.xi {
6999*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7000*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7001*53ee8cc1Swenshuai.xi
7002*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7003*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7004*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7005*53ee8cc1Swenshuai.xi
7006*53ee8cc1Swenshuai.xi //HVD_PRINT("MDrv_HVD_EX_DynamicScalingResvNBuffer bEnable = %d\n", bEnable);
7007*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DYNAMIC_SCALE_RESV_N_BUFFER, bEnable);
7008*53ee8cc1Swenshuai.xi
7009*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7010*53ee8cc1Swenshuai.xi }
7011*53ee8cc1Swenshuai.xi
7012*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7013*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetBBUQNum()
7014*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get BBU Q number
7015*53ee8cc1Swenshuai.xi /// @return - BBU Q number
7016*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetBBUQNum(MS_U32 u32Id)7017*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetBBUQNum(MS_U32 u32Id)
7018*53ee8cc1Swenshuai.xi {
7019*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7020*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
7021*53ee8cc1Swenshuai.xi
7022*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_BBU_Q_NUMB);
7023*53ee8cc1Swenshuai.xi }
7024*53ee8cc1Swenshuai.xi
7025*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7026*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetDispFrmNum()
7027*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get Disp frame number
7028*53ee8cc1Swenshuai.xi /// @return - Disp frame number
7029*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetDispFrmNum(MS_U32 u32Id)7030*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetDispFrmNum(MS_U32 u32Id)
7031*53ee8cc1Swenshuai.xi {
7032*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7033*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
7034*53ee8cc1Swenshuai.xi
7035*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetDispFrmNum(u32Id);
7036*53ee8cc1Swenshuai.xi }
7037*53ee8cc1Swenshuai.xi
7038*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7039*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetHVDClock()
7040*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set hvd clock speed
7041*53ee8cc1Swenshuai.xi /// @return - The result of setting hvd clock speed
7042*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetHVDClockSpeed(HVD_EX_ClockSpeed eClockSpeed)7043*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetHVDClockSpeed(HVD_EX_ClockSpeed eClockSpeed)
7044*53ee8cc1Swenshuai.xi {
7045*53ee8cc1Swenshuai.xi #if defined(CHIP_A3)
7046*53ee8cc1Swenshuai.xi HAL_HVD_EX_ClockSpeed eHVDClockSpeed = E_HVD_EX_CLOCK_SPEED_NONE;
7047*53ee8cc1Swenshuai.xi switch (eClockSpeed)
7048*53ee8cc1Swenshuai.xi {
7049*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_HIGHEST:
7050*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_HIGHEST;
7051*53ee8cc1Swenshuai.xi break;
7052*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_HIGH:
7053*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_HIGH;
7054*53ee8cc1Swenshuai.xi break;
7055*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_MEDIUM:
7056*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_MEDIUM;
7057*53ee8cc1Swenshuai.xi break;
7058*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_LOW:
7059*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_LOW;
7060*53ee8cc1Swenshuai.xi break;
7061*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_LOWEST:
7062*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_LOWEST;
7063*53ee8cc1Swenshuai.xi break;
7064*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_DEFAULT:
7065*53ee8cc1Swenshuai.xi eHVDClockSpeed = E_HAL_HVD_EX_CLOCK_SPEED_DEFAULT;
7066*53ee8cc1Swenshuai.xi break;
7067*53ee8cc1Swenshuai.xi default:
7068*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("hvd clock setting is wrong(%d)\n", eClockSpeed);
7069*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7070*53ee8cc1Swenshuai.xi break;
7071*53ee8cc1Swenshuai.xi }
7072*53ee8cc1Swenshuai.xi
7073*53ee8cc1Swenshuai.xi if(E_HVD_RETURN_SUCCESS != HAL_HVD_EX_SetClockSpeed(eHVDClockSpeed))
7074*53ee8cc1Swenshuai.xi {
7075*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7076*53ee8cc1Swenshuai.xi }
7077*53ee8cc1Swenshuai.xi
7078*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
7079*53ee8cc1Swenshuai.xi #else
7080*53ee8cc1Swenshuai.xi UNUSED(eClockSpeed);
7081*53ee8cc1Swenshuai.xi HVD_PRINT("This chip does not support hvd clock presetting~\n");
7082*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_UNSUPPORTED;
7083*53ee8cc1Swenshuai.xi #endif
7084*53ee8cc1Swenshuai.xi }
7085*53ee8cc1Swenshuai.xi
7086*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7087*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVPUClockSpeed()
7088*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set vpu clock speed
7089*53ee8cc1Swenshuai.xi /// @return - The result of setting vpu clock speed
7090*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVPUClockSpeed(HVD_EX_ClockSpeed eClockSpeed)7091*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetVPUClockSpeed(HVD_EX_ClockSpeed eClockSpeed)
7092*53ee8cc1Swenshuai.xi {
7093*53ee8cc1Swenshuai.xi #if defined(CHIP_A3)
7094*53ee8cc1Swenshuai.xi HAL_VPU_EX_ClockSpeedType eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_NONE;
7095*53ee8cc1Swenshuai.xi switch (eClockSpeed)
7096*53ee8cc1Swenshuai.xi {
7097*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_HIGHEST:
7098*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_HIGHEST;
7099*53ee8cc1Swenshuai.xi break;
7100*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_HIGH:
7101*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_HIGH;
7102*53ee8cc1Swenshuai.xi break;
7103*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_MEDIUM:
7104*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_MEDIUM;
7105*53ee8cc1Swenshuai.xi break;
7106*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_LOW:
7107*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_LOW;
7108*53ee8cc1Swenshuai.xi break;
7109*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_LOWEST:
7110*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_LOWEST;
7111*53ee8cc1Swenshuai.xi break;
7112*53ee8cc1Swenshuai.xi case E_HVD_EX_CLOCK_SPEED_DEFAULT:
7113*53ee8cc1Swenshuai.xi eVPUClockSpeed = E_HAL_VPU_EX_CLOCK_SPEED_DEFAULT;
7114*53ee8cc1Swenshuai.xi break;
7115*53ee8cc1Swenshuai.xi default:
7116*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("vpu clock setting is wrong(%d)\n", eVPUClockSpeed);
7117*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7118*53ee8cc1Swenshuai.xi break;
7119*53ee8cc1Swenshuai.xi }
7120*53ee8cc1Swenshuai.xi
7121*53ee8cc1Swenshuai.xi if(FALSE == HAL_VPU_EX_SetClockSpeedType(eVPUClockSpeed))
7122*53ee8cc1Swenshuai.xi {
7123*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7124*53ee8cc1Swenshuai.xi }
7125*53ee8cc1Swenshuai.xi
7126*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
7127*53ee8cc1Swenshuai.xi #else
7128*53ee8cc1Swenshuai.xi UNUSED(eClockSpeed);
7129*53ee8cc1Swenshuai.xi HVD_PRINT("This chip does not support vpu clock presetting~\n");
7130*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_UNSUPPORTED;
7131*53ee8cc1Swenshuai.xi #endif
7132*53ee8cc1Swenshuai.xi }
7133*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id,MS_U8 bEnable)7134*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetHVDColBBUMode(MS_U32 u32Id, MS_U8 bEnable)
7135*53ee8cc1Swenshuai.xi {
7136*53ee8cc1Swenshuai.xi #if (defined(CHIP_EDISON) || defined(CHIP_EINSTEIN) || defined(CHIP_EINSTEIN3)) || defined(CHIP_NAPOLI) || defined(CHIP_MONACO) || defined(CHIP_MUJI) || defined(CHIP_CLIPPERS) || defined(CHIP_MONET)
7137*53ee8cc1Swenshuai.xi if(E_HVD_RETURN_SUCCESS != HAL_HVD_EX_SetHVDColBBUMode(u32Id, bEnable))
7138*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7139*53ee8cc1Swenshuai.xi #endif
7140*53ee8cc1Swenshuai.xi return E_HVD_EX_OK;
7141*53ee8cc1Swenshuai.xi }
7142*53ee8cc1Swenshuai.xi
7143*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7144*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DSReportDispInfoChange()
7145*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Setting report display info change info. when DS enabled.
7146*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7147*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable Report display info change info.
7148*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DSReportDispInfoChange(MS_U32 u32Id,MS_BOOL bEnable)7149*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DSReportDispInfoChange(MS_U32 u32Id, MS_BOOL bEnable)
7150*53ee8cc1Swenshuai.xi {
7151*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7152*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7153*53ee8cc1Swenshuai.xi
7154*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7155*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7156*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7157*53ee8cc1Swenshuai.xi
7158*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DS_RESET_XC_DISP_WIN, bEnable);
7159*53ee8cc1Swenshuai.xi
7160*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7161*53ee8cc1Swenshuai.xi
7162*53ee8cc1Swenshuai.xi }
7163*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetSecureMode(MS_U32 u32Id,MS_U32 u32SecureMode)7164*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetSecureMode(MS_U32 u32Id, MS_U32 u32SecureMode)
7165*53ee8cc1Swenshuai.xi {
7166*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7167*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7168*53ee8cc1Swenshuai.xi
7169*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7170*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7171*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7172*53ee8cc1Swenshuai.xi
7173*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDCtrl_EX[u8DrvId].u8SecureMode = (MS_U8)u32SecureMode;
7174*53ee8cc1Swenshuai.xi
7175*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7176*53ee8cc1Swenshuai.xi }
7177*53ee8cc1Swenshuai.xi
7178*53ee8cc1Swenshuai.xi
7179*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7180*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SupportRefNumOverMaxDpbSize()
7181*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Support h264 FHD ref frame up to 6
7182*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7183*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable support h264 FHD ref frame up to 6
7184*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SupportRefNumOverMaxDpbSize(MS_U32 u32Id,MS_BOOL bEnable)7185*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SupportRefNumOverMaxDpbSize(MS_U32 u32Id, MS_BOOL bEnable)
7186*53ee8cc1Swenshuai.xi {
7187*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7188*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7189*53ee8cc1Swenshuai.xi
7190*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7191*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7192*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7193*53ee8cc1Swenshuai.xi
7194*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_SUPPORT_REF_NUM_OVER_MAX_DPB_SIZE, bEnable);
7195*53ee8cc1Swenshuai.xi
7196*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7197*53ee8cc1Swenshuai.xi }
7198*53ee8cc1Swenshuai.xi
7199*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7200*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_RVU_Setting_Mode()
7201*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: RVU settings
7202*53ee8cc1Swenshuai.xi /// @param -u32Param \u32 IN : 0: diable, 1: Drop B-frame and force IDR.
7203*53ee8cc1Swenshuai.xi /// @return -The result of command setting E_HVD_CMD_RVU_SETTING_MODE
7204*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_RVU_Setting_Mode(MS_U32 u32Id,MS_U32 u32Param)7205*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_RVU_Setting_Mode(MS_U32 u32Id, MS_U32 u32Param)
7206*53ee8cc1Swenshuai.xi {
7207*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7208*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7209*53ee8cc1Swenshuai.xi
7210*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7211*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7212*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7213*53ee8cc1Swenshuai.xi
7214*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_RVU_SETTING_MODE, u32Param);
7215*53ee8cc1Swenshuai.xi
7216*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7217*53ee8cc1Swenshuai.xi }
7218*53ee8cc1Swenshuai.xi
7219*53ee8cc1Swenshuai.xi
7220*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7221*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_FramerateHandling()
7222*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: FramerateHandling
7223*53ee8cc1Swenshuai.xi /// @brief \b A.Case of (timing_info_present_flag == 1)
7224*53ee8cc1Swenshuai.xi /// @brief \b i.Use num_units_in_tick and time_scale
7225*53ee8cc1Swenshuai.xi /// @brief \b ii.framerate = time_scale / num_units_in_tick / 2
7226*53ee8cc1Swenshuai.xi /// @brief \b iii.If calculated framerate from ii.
7227*53ee8cc1Swenshuai.xi /// @brief \b iv.If there is no time_scale or num_units_in_tick, framerate should be 30fps as default vaule.
7228*53ee8cc1Swenshuai.xi /// @brief \b B.Case of timing_info_present_flag == 0
7229*53ee8cc1Swenshuai.xi /// @brief \b i.Use framerate from application
7230*53ee8cc1Swenshuai.xi /// @brief \b C.If there is no VUI information, use framerate from application
7231*53ee8cc1Swenshuai.xi /// @param -bu32FrameRate \b IN : framerate from application
7232*53ee8cc1Swenshuai.xi /// @return -The result of command for handling framerate
7233*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_FramerateHandling(MS_U32 u32Id,MS_U32 u32FrameRate)7234*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_FramerateHandling(MS_U32 u32Id, MS_U32 u32FrameRate)
7235*53ee8cc1Swenshuai.xi {
7236*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7237*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7238*53ee8cc1Swenshuai.xi
7239*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7240*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7241*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7242*53ee8cc1Swenshuai.xi
7243*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_FRAMERATE_HANDLING, u32FrameRate);
7244*53ee8cc1Swenshuai.xi
7245*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7246*53ee8cc1Swenshuai.xi }
7247*53ee8cc1Swenshuai.xi
7248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7249*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_DualNonBlockMode()
7250*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: handle dual non blocking mode
7251*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7252*53ee8cc1Swenshuai.xi /// @return -The result of command setting E_HVD_CMD_DUAL_NON_BLOCK_MODE
7253*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_DualNonBlockMode(MS_U32 u32Id,MS_BOOL bEnable)7254*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_DualNonBlockMode(MS_U32 u32Id, MS_BOOL bEnable)
7255*53ee8cc1Swenshuai.xi {
7256*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7257*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7258*53ee8cc1Swenshuai.xi
7259*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7260*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7261*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7262*53ee8cc1Swenshuai.xi
7263*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_DUAL_NON_BLOCK_MODE, bEnable);
7264*53ee8cc1Swenshuai.xi
7265*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7266*53ee8cc1Swenshuai.xi }
7267*53ee8cc1Swenshuai.xi
7268*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7269*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_IgnorePicStructDisplay()
7270*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Ignore Pic_struct when display progressive frame.
7271*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7272*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable ignore Pic_struct when display progressive frame.
7273*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_IgnorePicStructDisplay(MS_U32 u32Id,MS_U32 param)7274*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IgnorePicStructDisplay(MS_U32 u32Id, MS_U32 param)
7275*53ee8cc1Swenshuai.xi {
7276*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7277*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7278*53ee8cc1Swenshuai.xi
7279*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7280*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7281*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7282*53ee8cc1Swenshuai.xi
7283*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_IGNORE_PIC_STRUCT_DISPLAY, param);
7284*53ee8cc1Swenshuai.xi
7285*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7286*53ee8cc1Swenshuai.xi }
7287*53ee8cc1Swenshuai.xi
7288*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7289*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_InputPtsFreerunMode()
7290*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: video free run when the difference between input PTS and current STC is large than E_HVD_CMD_FREERUN_THRESHOLD + 1s.
7291*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7292*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable video free run when the difference between input PTS and current STC is large than E_HVD_CMD_FREERUN_THRESHOLD + 1s.
7293*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_InputPtsFreerunMode(MS_U32 u32Id,MS_U32 param)7294*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_InputPtsFreerunMode(MS_U32 u32Id, MS_U32 param)
7295*53ee8cc1Swenshuai.xi {
7296*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7297*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7298*53ee8cc1Swenshuai.xi
7299*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7300*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7301*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7302*53ee8cc1Swenshuai.xi
7303*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_INPUT_PTS_FREERUN_MODE, param);
7304*53ee8cc1Swenshuai.xi
7305*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7306*53ee8cc1Swenshuai.xi }
7307*53ee8cc1Swenshuai.xi
7308*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7309*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ErrConcealStartSlice1stMB()
7310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Error concealment from current slice first MB.(Need enable E_HVD_CMD_ERR_CONCEAL)
7311*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : turn on / off.
7312*53ee8cc1Swenshuai.xi /// @return -The result of command to enable/disable Error concealment from current slice first MB.(Need enable E_HVD_CMD_ERR_CONCEAL)
7313*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ErrConcealStartSlice1stMB(MS_U32 u32Id,MS_U32 param)7314*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ErrConcealStartSlice1stMB(MS_U32 u32Id, MS_U32 param)
7315*53ee8cc1Swenshuai.xi {
7316*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7317*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7318*53ee8cc1Swenshuai.xi
7319*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7320*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7321*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7322*53ee8cc1Swenshuai.xi
7323*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ERR_CONCEAL_SLICE_1ST_MB, param);
7324*53ee8cc1Swenshuai.xi
7325*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7326*53ee8cc1Swenshuai.xi }
7327*53ee8cc1Swenshuai.xi
7328*53ee8cc1Swenshuai.xi
7329*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
7330*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetExternalDSBuffer()
7331*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set External DS buffer
7332*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : External DS buffer info.
7333*53ee8cc1Swenshuai.xi /// @return -The result of command to set external DS buffer.
7334*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetExternalDSBuffer(MS_U32 u32Id,HVD_EX_ExternalDSBuf * pExternalBuf)7335*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternalDSBuffer(MS_U32 u32Id, HVD_EX_ExternalDSBuf *pExternalBuf)
7336*53ee8cc1Swenshuai.xi {
7337*53ee8cc1Swenshuai.xi #define SIZE_3K 0xC00
7338*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7339*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7340*53ee8cc1Swenshuai.xi HVD_ShareMem *pShm = (HVD_ShareMem *) HAL_HVD_EX_GetShmAddr(u32Id);
7341*53ee8cc1Swenshuai.xi MS_BOOL bFWInMIU1 = FALSE;
7342*53ee8cc1Swenshuai.xi MS_BOOL bExternalInMIU1 = FALSE;
7343*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7344*53ee8cc1Swenshuai.xi MS_VIRT u32DSBufAddr = pExternalBuf->u32DSBufAddr;
7345*53ee8cc1Swenshuai.xi
7346*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7347*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7348*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7349*53ee8cc1Swenshuai.xi
7350*53ee8cc1Swenshuai.xi if((pShm == NULL) || (pCtrl == NULL) || (pExternalBuf->u32DSBufSize < SIZE_3K)) /// DS buffer size need more than 3K (0xC00)
7351*53ee8cc1Swenshuai.xi {
7352*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
7353*53ee8cc1Swenshuai.xi }
7354*53ee8cc1Swenshuai.xi
7355*53ee8cc1Swenshuai.xi #if defined(CHIP_MONACO)
7356*53ee8cc1Swenshuai.xi if(VPU_FORCE_MIU_MODE == 1)
7357*53ee8cc1Swenshuai.xi {
7358*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("this chip does not support set external DS buffer since VPU_FORCE_MIU_MODE == 1 !!\n");
7359*53ee8cc1Swenshuai.xi return E_HVD_EX_RET_UNSUPPORTED;
7360*53ee8cc1Swenshuai.xi }
7361*53ee8cc1Swenshuai.xi #endif
7362*53ee8cc1Swenshuai.xi
7363*53ee8cc1Swenshuai.xi ///printf("[EDS] 0x%lx, 0x%lx.\n",pCtrl->MemMap.u32CodeBufAddr,pCtrl->MemMap.u32MIU1BaseAddr);
7364*53ee8cc1Swenshuai.xi if((pCtrl->MemMap.u32CodeBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr) && (pCtrl->MemMap.u32MIU1BaseAddr != 0))
7365*53ee8cc1Swenshuai.xi {
7366*53ee8cc1Swenshuai.xi bFWInMIU1 = TRUE;
7367*53ee8cc1Swenshuai.xi }
7368*53ee8cc1Swenshuai.xi
7369*53ee8cc1Swenshuai.xi if((pExternalBuf->u32DSBufAddr >= pCtrl->MemMap.u32MIU1BaseAddr) && (pCtrl->MemMap.u32MIU1BaseAddr != 0) )
7370*53ee8cc1Swenshuai.xi {
7371*53ee8cc1Swenshuai.xi bExternalInMIU1 = TRUE;
7372*53ee8cc1Swenshuai.xi u32DSBufAddr -= pCtrl->MemMap.u32MIU1BaseAddr;
7373*53ee8cc1Swenshuai.xi }
7374*53ee8cc1Swenshuai.xi //printf("[EDS] MIU %d, %d.\n",bFWInMIU1,bExternalInMIU1);
7375*53ee8cc1Swenshuai.xi
7376*53ee8cc1Swenshuai.xi /// If FW and external buf is in the same MIU, the External buffer do nothing.
7377*53ee8cc1Swenshuai.xi if(bFWInMIU1 == bExternalInMIU1)
7378*53ee8cc1Swenshuai.xi {
7379*53ee8cc1Swenshuai.xi pShm->u32DSbufferAddr = u32DSBufAddr;
7380*53ee8cc1Swenshuai.xi }
7381*53ee8cc1Swenshuai.xi else
7382*53ee8cc1Swenshuai.xi {
7383*53ee8cc1Swenshuai.xi /// If FW and external buf is not in the same MIU, the External buffer add the VPU Miu base size
7384*53ee8cc1Swenshuai.xi pShm->u32DSbufferAddr = u32DSBufAddr + HAL_VPU_EX_MIU1BASE();
7385*53ee8cc1Swenshuai.xi }
7386*53ee8cc1Swenshuai.xi pShm->u32DSBuffSize = pExternalBuf->u32DSBufSize;
7387*53ee8cc1Swenshuai.xi
7388*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
7389*53ee8cc1Swenshuai.xi ///printf("[EDS] DS addr = 0x%lx, size = 0x%lx.\n",pShm->u32DSbufferAddr,pShm->u32DSBuffSize);
7390*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_EXTERNAL_DS_BUF, TRUE);
7391*53ee8cc1Swenshuai.xi
7392*53ee8cc1Swenshuai.xi pCtrl->u8SettingMode |= HVD_DRV_MODE_EXTERNAL_DS_BUFFER;
7393*53ee8cc1Swenshuai.xi pCtrl->u32ExternalDSbuf = pExternalBuf->u32DSBufAddr;
7394*53ee8cc1Swenshuai.xi
7395*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7396*53ee8cc1Swenshuai.xi }
7397*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_GetESBufferStatus(MS_U32 u32Id)7398*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_GetESBufferStatus(MS_U32 u32Id)
7399*53ee8cc1Swenshuai.xi {
7400*53ee8cc1Swenshuai.xi MS_U32 u32Ret = 0;
7401*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7402*53ee8cc1Swenshuai.xi
7403*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,FALSE);
7404*53ee8cc1Swenshuai.xi
7405*53ee8cc1Swenshuai.xi u32Ret = HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_FW_ES_BUF_STATUS);
7406*53ee8cc1Swenshuai.xi u32Ret = _HVD_EX_Map2HVDESBufStatus(u32Ret);
7407*53ee8cc1Swenshuai.xi
7408*53ee8cc1Swenshuai.xi return u32Ret;
7409*53ee8cc1Swenshuai.xi }
7410*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Update_UserData_Wptr(MS_U32 u32Id)7411*53ee8cc1Swenshuai.xi static MS_U32 _HVD_EX_CC_Update_UserData_Wptr(MS_U32 u32Id)
7412*53ee8cc1Swenshuai.xi {
7413*53ee8cc1Swenshuai.xi
7414*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7415*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7416*53ee8cc1Swenshuai.xi
7417*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7418*53ee8cc1Swenshuai.xi MS_U32 u32UsrDataIdxWptr = MDrv_HVD_EX_GetUserData_Wptr(u32Id);
7419*53ee8cc1Swenshuai.xi
7420*53ee8cc1Swenshuai.xi if (u32UsrDataIdxWptr != 0xFFFFFFFF)
7421*53ee8cc1Swenshuai.xi pCCInfo->u32FWUsrDataWIdx = u32UsrDataIdxWptr;
7422*53ee8cc1Swenshuai.xi
7423*53ee8cc1Swenshuai.xi return pCCInfo->u32FWUsrDataWIdx;
7424*53ee8cc1Swenshuai.xi }
7425*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Parse_AFD_data(MS_U8 ** pUserDataBuf)7426*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_AFD_data(MS_U8 **pUserDataBuf)
7427*53ee8cc1Swenshuai.xi {
7428*53ee8cc1Swenshuai.xi
7429*53ee8cc1Swenshuai.xi (*pUserDataBuf)++;
7430*53ee8cc1Swenshuai.xi (*pUserDataBuf)++;
7431*53ee8cc1Swenshuai.xi
7432*53ee8cc1Swenshuai.xi }
7433*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Parse_BAR_data(MS_U8 ** pUserDataBuf)7434*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_BAR_data(MS_U8 **pUserDataBuf)
7435*53ee8cc1Swenshuai.xi {
7436*53ee8cc1Swenshuai.xi
7437*53ee8cc1Swenshuai.xi MS_BOOL bTopBarFlag, bBottomBarFlag, bLeftBarFlag, bRightBarlag;
7438*53ee8cc1Swenshuai.xi
7439*53ee8cc1Swenshuai.xi bTopBarFlag = (((**pUserDataBuf) & 0x80) == 0x80); //u_f(1,"top_bar_flag");
7440*53ee8cc1Swenshuai.xi bBottomBarFlag = (((**pUserDataBuf) & 0x40) == 0x40); //u_f(1,"bottom_bar_flag");
7441*53ee8cc1Swenshuai.xi bLeftBarFlag = (((**pUserDataBuf) & 0x20) == 0x20); //u_f(1,"left_bar_flag");
7442*53ee8cc1Swenshuai.xi bRightBarlag = ((*((*pUserDataBuf)++) & 0x10) == 0x10); //u_f(1,"right_bar_flag"); u_f(4,"reserved");
7443*53ee8cc1Swenshuai.xi
7444*53ee8cc1Swenshuai.xi if (bTopBarFlag)
7445*53ee8cc1Swenshuai.xi {
7446*53ee8cc1Swenshuai.xi *pUserDataBuf += 2;
7447*53ee8cc1Swenshuai.xi }
7448*53ee8cc1Swenshuai.xi
7449*53ee8cc1Swenshuai.xi if (bBottomBarFlag)
7450*53ee8cc1Swenshuai.xi {
7451*53ee8cc1Swenshuai.xi *pUserDataBuf += 2;
7452*53ee8cc1Swenshuai.xi }
7453*53ee8cc1Swenshuai.xi
7454*53ee8cc1Swenshuai.xi if (bLeftBarFlag)
7455*53ee8cc1Swenshuai.xi {
7456*53ee8cc1Swenshuai.xi *pUserDataBuf += 2;
7457*53ee8cc1Swenshuai.xi }
7458*53ee8cc1Swenshuai.xi
7459*53ee8cc1Swenshuai.xi if (bRightBarlag)
7460*53ee8cc1Swenshuai.xi {
7461*53ee8cc1Swenshuai.xi *pUserDataBuf += 2;
7462*53ee8cc1Swenshuai.xi }
7463*53ee8cc1Swenshuai.xi
7464*53ee8cc1Swenshuai.xi }
7465*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Parse_CC_data(MS_U32 u32Id,MS_U8 u8CCMode,MS_U8 ** pSrc,MS_U8 * pDst608,MS_U32 * pu32Dst608Len,MS_U8 * pDst708,MS_U32 * pu32Dst708Len,HVD_CC_608EnhanceInfo * pEhInfo608)7466*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Parse_CC_data(MS_U32 u32Id, MS_U8 u8CCMode,MS_U8 **pSrc, MS_U8 *pDst608, MS_U32 *pu32Dst608Len, MS_U8 *pDst708, MS_U32 *pu32Dst708Len, HVD_CC_608EnhanceInfo *pEhInfo608)
7467*53ee8cc1Swenshuai.xi {
7468*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7469*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7470*53ee8cc1Swenshuai.xi
7471*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7472*53ee8cc1Swenshuai.xi
7473*53ee8cc1Swenshuai.xi MS_U32 i,j;
7474*53ee8cc1Swenshuai.xi MS_U32 u32CC_Count;
7475*53ee8cc1Swenshuai.xi MS_U8 u8CC_Code;
7476*53ee8cc1Swenshuai.xi MS_U8 u8CC_Type;
7477*53ee8cc1Swenshuai.xi MS_U8 u8CC_Data1, u8CC_Data2;
7478*53ee8cc1Swenshuai.xi MS_U32 u32Pad;
7479*53ee8cc1Swenshuai.xi
7480*53ee8cc1Swenshuai.xi
7481*53ee8cc1Swenshuai.xi
7482*53ee8cc1Swenshuai.xi u8CC_Code = *((*pSrc)++); //u_f(8,"cc_data_flag cc_count");
7483*53ee8cc1Swenshuai.xi
7484*53ee8cc1Swenshuai.xi u32CC_Count = u8CC_Code & 0x1F; // cc_count
7485*53ee8cc1Swenshuai.xi if (!(u8CC_Code & 0x40)) return; // process_cc_data_flag
7486*53ee8cc1Swenshuai.xi
7487*53ee8cc1Swenshuai.xi
7488*53ee8cc1Swenshuai.xi
7489*53ee8cc1Swenshuai.xi (*pSrc)++; //u_f(8,"reserved 1");
7490*53ee8cc1Swenshuai.xi
7491*53ee8cc1Swenshuai.xi
7492*53ee8cc1Swenshuai.xi
7493*53ee8cc1Swenshuai.xi for (i=0;i<u32CC_Count;i++)
7494*53ee8cc1Swenshuai.xi {
7495*53ee8cc1Swenshuai.xi MS_U8 u8Code;
7496*53ee8cc1Swenshuai.xi
7497*53ee8cc1Swenshuai.xi
7498*53ee8cc1Swenshuai.xi u8Code = *((*pSrc)++); // u_f(8,"cc_valid and cc_type");
7499*53ee8cc1Swenshuai.xi
7500*53ee8cc1Swenshuai.xi
7501*53ee8cc1Swenshuai.xi u8CC_Type = u8Code & 0x03;
7502*53ee8cc1Swenshuai.xi
7503*53ee8cc1Swenshuai.xi u8CC_Data1 = *((*pSrc)++); // u_f(8,"cc_data_1");
7504*53ee8cc1Swenshuai.xi u8CC_Data2 = *((*pSrc)++); // u_f(8,"cc_data_2");
7505*53ee8cc1Swenshuai.xi
7506*53ee8cc1Swenshuai.xi if (!(u8Code & 0x04)) continue; // cc_valid
7507*53ee8cc1Swenshuai.xi
7508*53ee8cc1Swenshuai.xi //NTSC CC 608
7509*53ee8cc1Swenshuai.xi if ((u8CC_Type == 0) || (u8CC_Type == 1))
7510*53ee8cc1Swenshuai.xi {
7511*53ee8cc1Swenshuai.xi //g_DTV_CC.ntsc_cc_data[g_DTV_CC.NTSC_element++] = (cc_type << 16) | (cc_data2 << 8) | (cc_data1);
7512*53ee8cc1Swenshuai.xi
7513*53ee8cc1Swenshuai.xi if(pCCInfo->b608InfoEnhance)
7514*53ee8cc1Swenshuai.xi {
7515*53ee8cc1Swenshuai.xi if( ( (*pu32Dst608Len) + 16) > MAX_608_CC_LEN)
7516*53ee8cc1Swenshuai.xi {
7517*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u32Dst608Len+16: %ld is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+16));
7518*53ee8cc1Swenshuai.xi return;
7519*53ee8cc1Swenshuai.xi }
7520*53ee8cc1Swenshuai.xi }
7521*53ee8cc1Swenshuai.xi else
7522*53ee8cc1Swenshuai.xi {
7523*53ee8cc1Swenshuai.xi if( ( (*pu32Dst608Len) + 4) > MAX_608_CC_LEN)
7524*53ee8cc1Swenshuai.xi {
7525*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u32Dst608Len+4: %ld is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+4));
7526*53ee8cc1Swenshuai.xi return;
7527*53ee8cc1Swenshuai.xi }
7528*53ee8cc1Swenshuai.xi }
7529*53ee8cc1Swenshuai.xi
7530*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = u8CC_Data1;
7531*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = u8CC_Data2;
7532*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = u8CC_Type;
7533*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = 0;
7534*53ee8cc1Swenshuai.xi
7535*53ee8cc1Swenshuai.xi if (pCCInfo->b608InfoEnhance)
7536*53ee8cc1Swenshuai.xi {
7537*53ee8cc1Swenshuai.xi // PTS searched_pts;
7538*53ee8cc1Swenshuai.xi //search_pts(pContext, &searched_pts);
7539*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16TmpRef&0xff);
7540*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16TmpRef>>8)&0xff);
7541*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16PicStruct&0xff);
7542*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16PicStruct>>8)&0xff);
7543*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u32Pts&0xff);
7544*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>8)&0xff);
7545*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>16)&0xff);
7546*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>24)&0xff);
7547*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = pEhInfo608->u8UsrDataCnt;
7548*53ee8cc1Swenshuai.xi
7549*53ee8cc1Swenshuai.xi // for enhance cc-608 data dump, 16bytes/pkt
7550*53ee8cc1Swenshuai.xi u32Pad = (*pu32Dst608Len) & 0xf; //align to 16 byte
7551*53ee8cc1Swenshuai.xi if(u32Pad) u32Pad = 16-u32Pad;
7552*53ee8cc1Swenshuai.xi for(j=0;j<u32Pad;j++)
7553*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = 0xff;
7554*53ee8cc1Swenshuai.xi
7555*53ee8cc1Swenshuai.xi }
7556*53ee8cc1Swenshuai.xi
7557*53ee8cc1Swenshuai.xi
7558*53ee8cc1Swenshuai.xi
7559*53ee8cc1Swenshuai.xi
7560*53ee8cc1Swenshuai.xi }
7561*53ee8cc1Swenshuai.xi else // ATSC_CC 708
7562*53ee8cc1Swenshuai.xi {
7563*53ee8cc1Swenshuai.xi if( ( (*pu32Dst708Len) + 4) > MAX_708_CC_LEN)
7564*53ee8cc1Swenshuai.xi {
7565*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR(" u32Dst708Len+4: %ld is larger than MAX_708_CC_LEN !! \n",((*pu32Dst708Len)+4));
7566*53ee8cc1Swenshuai.xi return;
7567*53ee8cc1Swenshuai.xi }
7568*53ee8cc1Swenshuai.xi pDst708[(*pu32Dst708Len)++] = u8CC_Data1;
7569*53ee8cc1Swenshuai.xi pDst708[(*pu32Dst708Len)++] = u8CC_Data2;
7570*53ee8cc1Swenshuai.xi pDst708[(*pu32Dst708Len)++] = u8CC_Type;
7571*53ee8cc1Swenshuai.xi pDst708[(*pu32Dst708Len)++] = 0;
7572*53ee8cc1Swenshuai.xi
7573*53ee8cc1Swenshuai.xi }
7574*53ee8cc1Swenshuai.xi //new DTV CC header
7575*53ee8cc1Swenshuai.xi
7576*53ee8cc1Swenshuai.xi }
7577*53ee8cc1Swenshuai.xi
7578*53ee8cc1Swenshuai.xi
7579*53ee8cc1Swenshuai.xi
7580*53ee8cc1Swenshuai.xi //padding cc608
7581*53ee8cc1Swenshuai.xi
7582*53ee8cc1Swenshuai.xi
7583*53ee8cc1Swenshuai.xi if(u8CCMode & (CC_NTSC1|CC_NTSC2))
7584*53ee8cc1Swenshuai.xi {
7585*53ee8cc1Swenshuai.xi if (pCCInfo->b608InfoEnhance==0)
7586*53ee8cc1Swenshuai.xi { // for original cc-608 data dump, 16bytes/pkt
7587*53ee8cc1Swenshuai.xi
7588*53ee8cc1Swenshuai.xi
7589*53ee8cc1Swenshuai.xi u32Pad = (*pu32Dst608Len) & 0x7;
7590*53ee8cc1Swenshuai.xi if(u32Pad) u32Pad = 8 - u32Pad;
7591*53ee8cc1Swenshuai.xi
7592*53ee8cc1Swenshuai.xi if((u32Pad + (*pu32Dst608Len)) > MAX_608_CC_LEN)
7593*53ee8cc1Swenshuai.xi {
7594*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u32Dst608Len:%ld + u32Pad: %ld is larger than MAX_608_CC_LEN !! \n",(*pu32Dst608Len), u32Pad);
7595*53ee8cc1Swenshuai.xi return;
7596*53ee8cc1Swenshuai.xi }
7597*53ee8cc1Swenshuai.xi for(i=0;i<u32Pad;i++)
7598*53ee8cc1Swenshuai.xi pDst608[(*pu32Dst608Len)++] = 0xff;
7599*53ee8cc1Swenshuai.xi }
7600*53ee8cc1Swenshuai.xi }
7601*53ee8cc1Swenshuai.xi
7602*53ee8cc1Swenshuai.xi
7603*53ee8cc1Swenshuai.xi }
7604*53ee8cc1Swenshuai.xi
7605*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Extract_CCdata(MS_U32 u32Id,MS_U8 * pDst608Buf,MS_U32 * pu32Dst608Len,MS_U8 * pDst708Buf,MS_U32 * pu32Dst708Len,DTV_BUF_type * pUserData)7606*53ee8cc1Swenshuai.xi static void _HVD_EX_CC_Extract_CCdata(MS_U32 u32Id, MS_U8 *pDst608Buf ,MS_U32 *pu32Dst608Len,MS_U8 *pDst708Buf ,MS_U32 *pu32Dst708Len, DTV_BUF_type* pUserData)
7607*53ee8cc1Swenshuai.xi {
7608*53ee8cc1Swenshuai.xi
7609*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7610*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7611*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7612*53ee8cc1Swenshuai.xi
7613*53ee8cc1Swenshuai.xi
7614*53ee8cc1Swenshuai.xi
7615*53ee8cc1Swenshuai.xi MS_U8 * pUserDataStartBuf = &pUserData->buf[0];//&pSrcBuf[0];
7616*53ee8cc1Swenshuai.xi MS_U8 * pUserDataBuf;
7617*53ee8cc1Swenshuai.xi
7618*53ee8cc1Swenshuai.xi pUserDataBuf = &pUserData->buf[0];
7619*53ee8cc1Swenshuai.xi
7620*53ee8cc1Swenshuai.xi
7621*53ee8cc1Swenshuai.xi HVD_CC_608EnhanceInfo stEhInfo608;
7622*53ee8cc1Swenshuai.xi stEhInfo608.u16TmpRef = pUserData->u16TempRefCnt;
7623*53ee8cc1Swenshuai.xi stEhInfo608.u16PicStruct = (MS_U16)pUserData->pic_struct;
7624*53ee8cc1Swenshuai.xi stEhInfo608.u32Pts = pUserData->pts;
7625*53ee8cc1Swenshuai.xi stEhInfo608.u8UsrDataCnt = 0;
7626*53ee8cc1Swenshuai.xi
7627*53ee8cc1Swenshuai.xi
7628*53ee8cc1Swenshuai.xi {
7629*53ee8cc1Swenshuai.xi MS_U32 dvb_code;
7630*53ee8cc1Swenshuai.xi
7631*53ee8cc1Swenshuai.xi dvb_code = (*pUserDataBuf << 24) | (*(pUserDataBuf+1) << 16) | (*(pUserDataBuf+2) << 8) | *(pUserDataBuf+3); //(u_f(16,"provider_code") << 16) | u_f(16,"provider_code");
7632*53ee8cc1Swenshuai.xi pUserDataBuf += 4;
7633*53ee8cc1Swenshuai.xi
7634*53ee8cc1Swenshuai.xi if (dvb_code == DTV_DTB1_CODE)
7635*53ee8cc1Swenshuai.xi {
7636*53ee8cc1Swenshuai.xi MS_U8 code;
7637*53ee8cc1Swenshuai.xi
7638*53ee8cc1Swenshuai.xi code = *pUserDataBuf++; //u_f(8,"code");
7639*53ee8cc1Swenshuai.xi
7640*53ee8cc1Swenshuai.xi if (code == DTV_CC_CODE)
7641*53ee8cc1Swenshuai.xi {
7642*53ee8cc1Swenshuai.xi _HVD_EX_CC_Parse_CC_data(u32Id, pCCInfo->u8ParsingStatus,&pUserDataBuf, pDst608Buf, pu32Dst608Len, pDst708Buf, pu32Dst708Len, &stEhInfo608);
7643*53ee8cc1Swenshuai.xi }
7644*53ee8cc1Swenshuai.xi else if (code == DTV_BAR_CODE)
7645*53ee8cc1Swenshuai.xi {
7646*53ee8cc1Swenshuai.xi _HVD_EX_CC_Parse_BAR_data(&pUserDataBuf);
7647*53ee8cc1Swenshuai.xi }
7648*53ee8cc1Swenshuai.xi
7649*53ee8cc1Swenshuai.xi }
7650*53ee8cc1Swenshuai.xi else if (dvb_code == DTV_AFD_CODE)
7651*53ee8cc1Swenshuai.xi {
7652*53ee8cc1Swenshuai.xi _HVD_EX_CC_Parse_AFD_data(&pUserDataBuf);
7653*53ee8cc1Swenshuai.xi }
7654*53ee8cc1Swenshuai.xi
7655*53ee8cc1Swenshuai.xi }
7656*53ee8cc1Swenshuai.xi
7657*53ee8cc1Swenshuai.xi
7658*53ee8cc1Swenshuai.xi if((pUserDataBuf - pUserDataStartBuf) > pUserData->len)
7659*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("ERROR!!!! (pUserDataBuf - pUserDataStartBuf) > u32SrcLen\n");
7660*53ee8cc1Swenshuai.xi
7661*53ee8cc1Swenshuai.xi
7662*53ee8cc1Swenshuai.xi }
7663*53ee8cc1Swenshuai.xi
7664*53ee8cc1Swenshuai.xi
_HVD_EX_CC_RB_Have_Avail_Space(MS_U32 u32Id,MS_U8 u8CC608,MS_U32 u32QuerySize)7665*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_RB_Have_Avail_Space(MS_U32 u32Id, MS_U8 u8CC608, MS_U32 u32QuerySize)
7666*53ee8cc1Swenshuai.xi {
7667*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7668*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7669*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7670*53ee8cc1Swenshuai.xi
7671*53ee8cc1Swenshuai.xi MS_U32 u32RingBufVacancy = pCCInfo->u32RingBufVacancy[u8CC608];
7672*53ee8cc1Swenshuai.xi MS_U32 u32AlignCCLen;
7673*53ee8cc1Swenshuai.xi
7674*53ee8cc1Swenshuai.xi if ((u32QuerySize % HVD_CCRB_PACKET_LENGTH) != 0)
7675*53ee8cc1Swenshuai.xi {
7676*53ee8cc1Swenshuai.xi u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32QuerySize / HVD_CCRB_PACKET_LENGTH)+1);
7677*53ee8cc1Swenshuai.xi }
7678*53ee8cc1Swenshuai.xi else
7679*53ee8cc1Swenshuai.xi {
7680*53ee8cc1Swenshuai.xi u32AlignCCLen = u32QuerySize;
7681*53ee8cc1Swenshuai.xi }
7682*53ee8cc1Swenshuai.xi
7683*53ee8cc1Swenshuai.xi
7684*53ee8cc1Swenshuai.xi if(u32RingBufVacancy >= u32AlignCCLen)
7685*53ee8cc1Swenshuai.xi return TRUE;
7686*53ee8cc1Swenshuai.xi else
7687*53ee8cc1Swenshuai.xi return FALSE;
7688*53ee8cc1Swenshuai.xi
7689*53ee8cc1Swenshuai.xi
7690*53ee8cc1Swenshuai.xi }
7691*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Copy_CCdata_To_RB(MS_U32 u32Id,MS_U8 u8CC608,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)7692*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Copy_CCdata_To_RB(MS_U32 u32Id, MS_U8 u8CC608,MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
7693*53ee8cc1Swenshuai.xi {
7694*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7695*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7696*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7697*53ee8cc1Swenshuai.xi
7698*53ee8cc1Swenshuai.xi MS_U32 u32RingBufRPAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
7699*53ee8cc1Swenshuai.xi MS_U32 u32RingBufWPAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
7700*53ee8cc1Swenshuai.xi MS_U32 u32AlignCCLen;
7701*53ee8cc1Swenshuai.xi
7702*53ee8cc1Swenshuai.xi
7703*53ee8cc1Swenshuai.xi
7704*53ee8cc1Swenshuai.xi if(u32SrcLen == 0)
7705*53ee8cc1Swenshuai.xi return FALSE;
7706*53ee8cc1Swenshuai.xi
7707*53ee8cc1Swenshuai.xi
7708*53ee8cc1Swenshuai.xi
7709*53ee8cc1Swenshuai.xi u32AlignCCLen = u32SrcLen;
7710*53ee8cc1Swenshuai.xi
7711*53ee8cc1Swenshuai.xi
7712*53ee8cc1Swenshuai.xi if(pCCInfo->u32RingBufVacancy[u8CC608] < u32AlignCCLen)
7713*53ee8cc1Swenshuai.xi {
7714*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("overflow !!!, u32RingBufVacancy: %ld, u32AlignLen: %ld\n",pCCInfo->u32RingBufVacancy[u8CC608], u32AlignCCLen);
7715*53ee8cc1Swenshuai.xi return TRUE;
7716*53ee8cc1Swenshuai.xi }
7717*53ee8cc1Swenshuai.xi
7718*53ee8cc1Swenshuai.xi
7719*53ee8cc1Swenshuai.xi if(u32RingBufWPAddr >= u32RingBufRPAddr)
7720*53ee8cc1Swenshuai.xi {
7721*53ee8cc1Swenshuai.xi if( (u32RingBufWPAddr + u32AlignCCLen) <= (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
7722*53ee8cc1Swenshuai.xi {
7723*53ee8cc1Swenshuai.xi
7724*53ee8cc1Swenshuai.xi HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
7725*53ee8cc1Swenshuai.xi
7726*53ee8cc1Swenshuai.xi
7727*53ee8cc1Swenshuai.xi if((pCCInfo->u32RingBufWPAddr[u8CC608] + u32AlignCCLen) == (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
7728*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufWPAddr[u8CC608] = pCCInfo->u32RingBufStartPAddr[u8CC608];
7729*53ee8cc1Swenshuai.xi else
7730*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
7731*53ee8cc1Swenshuai.xi
7732*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
7733*53ee8cc1Swenshuai.xi
7734*53ee8cc1Swenshuai.xi }
7735*53ee8cc1Swenshuai.xi else
7736*53ee8cc1Swenshuai.xi {
7737*53ee8cc1Swenshuai.xi MS_U32 part1_len = (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]) - u32RingBufWPAddr;
7738*53ee8cc1Swenshuai.xi MS_U32 part2_len = u32AlignCCLen - part1_len;
7739*53ee8cc1Swenshuai.xi
7740*53ee8cc1Swenshuai.xi
7741*53ee8cc1Swenshuai.xi
7742*53ee8cc1Swenshuai.xi
7743*53ee8cc1Swenshuai.xi {
7744*53ee8cc1Swenshuai.xi
7745*53ee8cc1Swenshuai.xi
7746*53ee8cc1Swenshuai.xi HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)pSrcBuf, part1_len);
7747*53ee8cc1Swenshuai.xi
7748*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608];
7749*53ee8cc1Swenshuai.xi
7750*53ee8cc1Swenshuai.xi HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)(&pSrcBuf[part1_len]), part2_len);
7751*53ee8cc1Swenshuai.xi
7752*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608] + part2_len;
7753*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
7754*53ee8cc1Swenshuai.xi }
7755*53ee8cc1Swenshuai.xi
7756*53ee8cc1Swenshuai.xi }
7757*53ee8cc1Swenshuai.xi
7758*53ee8cc1Swenshuai.xi }
7759*53ee8cc1Swenshuai.xi else
7760*53ee8cc1Swenshuai.xi {
7761*53ee8cc1Swenshuai.xi
7762*53ee8cc1Swenshuai.xi
7763*53ee8cc1Swenshuai.xi {
7764*53ee8cc1Swenshuai.xi
7765*53ee8cc1Swenshuai.xi HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
7766*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
7767*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
7768*53ee8cc1Swenshuai.xi }
7769*53ee8cc1Swenshuai.xi
7770*53ee8cc1Swenshuai.xi
7771*53ee8cc1Swenshuai.xi }
7772*53ee8cc1Swenshuai.xi
7773*53ee8cc1Swenshuai.xi return FALSE;
7774*53ee8cc1Swenshuai.xi }
7775*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Add_PaddingData_To_608(MS_U32 u32Id,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)7776*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Add_PaddingData_To_608(MS_U32 u32Id, MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
7777*53ee8cc1Swenshuai.xi {
7778*53ee8cc1Swenshuai.xi
7779*53ee8cc1Swenshuai.xi MS_U32 u32AlignCCLen;
7780*53ee8cc1Swenshuai.xi MS_U32 i;
7781*53ee8cc1Swenshuai.xi MS_BOOL b608OverFlow;
7782*53ee8cc1Swenshuai.xi
7783*53ee8cc1Swenshuai.xi if ((u32SrcLen % HVD_CCRB_PACKET_LENGTH) != 0)
7784*53ee8cc1Swenshuai.xi {
7785*53ee8cc1Swenshuai.xi u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32SrcLen / HVD_CCRB_PACKET_LENGTH)+1);
7786*53ee8cc1Swenshuai.xi }
7787*53ee8cc1Swenshuai.xi else
7788*53ee8cc1Swenshuai.xi {
7789*53ee8cc1Swenshuai.xi u32AlignCCLen = u32SrcLen;
7790*53ee8cc1Swenshuai.xi }
7791*53ee8cc1Swenshuai.xi
7792*53ee8cc1Swenshuai.xi
7793*53ee8cc1Swenshuai.xi
7794*53ee8cc1Swenshuai.xi if(u32AlignCCLen > MAX_608_CC_LEN)
7795*53ee8cc1Swenshuai.xi {
7796*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("u32AlignCCLen:%ld > MAX_608_CC_LEN", u32AlignCCLen);
7797*53ee8cc1Swenshuai.xi return TRUE;
7798*53ee8cc1Swenshuai.xi }
7799*53ee8cc1Swenshuai.xi
7800*53ee8cc1Swenshuai.xi
7801*53ee8cc1Swenshuai.xi
7802*53ee8cc1Swenshuai.xi for(i =0; i < (u32AlignCCLen-u32SrcLen);i++)
7803*53ee8cc1Swenshuai.xi pSrcBuf[u32SrcLen+i] = 0xff;// add padinng data
7804*53ee8cc1Swenshuai.xi
7805*53ee8cc1Swenshuai.xi b608OverFlow =_HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 1, &(pSrcBuf[0]), u32AlignCCLen);
7806*53ee8cc1Swenshuai.xi return b608OverFlow;
7807*53ee8cc1Swenshuai.xi
7808*53ee8cc1Swenshuai.xi }
7809*53ee8cc1Swenshuai.xi
_HVD_EX_CC_Add_PaddingData_To_708(MS_U32 u32Id,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)7810*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_EX_CC_Add_PaddingData_To_708(MS_U32 u32Id, MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
7811*53ee8cc1Swenshuai.xi {
7812*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7813*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7814*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7815*53ee8cc1Swenshuai.xi
7816*53ee8cc1Swenshuai.xi MS_U32 *u32RingBufWAddr = (MS_U32 *)(HVD_PA2VA(pCCInfo->u32RingBufWPAddr[0]));
7817*53ee8cc1Swenshuai.xi
7818*53ee8cc1Swenshuai.xi MS_U8 u8CC_Type, u8CC_Data1, u8CC_Data2,u8Temp;
7819*53ee8cc1Swenshuai.xi MS_U16 i,j,u16Pad,u16DataCount;
7820*53ee8cc1Swenshuai.xi MS_U8 *pAddr;
7821*53ee8cc1Swenshuai.xi MS_U8 u8CCPading[MAX_708_CC_LEN];
7822*53ee8cc1Swenshuai.xi MS_BOOL b708OverFlow = FALSE;
7823*53ee8cc1Swenshuai.xi u16DataCount = 0;
7824*53ee8cc1Swenshuai.xi
7825*53ee8cc1Swenshuai.xi for(j=0;j<u32SrcLen;j+=4)
7826*53ee8cc1Swenshuai.xi {
7827*53ee8cc1Swenshuai.xi u8CC_Data1 = *pSrcBuf++;
7828*53ee8cc1Swenshuai.xi u8CC_Data2 = *pSrcBuf++;
7829*53ee8cc1Swenshuai.xi u8CC_Type = *pSrcBuf++;
7830*53ee8cc1Swenshuai.xi u8Temp = *pSrcBuf++;
7831*53ee8cc1Swenshuai.xi
7832*53ee8cc1Swenshuai.xi if(u8CC_Type==3) //padd_out();
7833*53ee8cc1Swenshuai.xi {
7834*53ee8cc1Swenshuai.xi if( pCCInfo->u32PktLen708 > 0 )
7835*53ee8cc1Swenshuai.xi {
7836*53ee8cc1Swenshuai.xi u16Pad = pCCInfo->u32PktLen708;
7837*53ee8cc1Swenshuai.xi for (i=0;i<u16Pad;i++)
7838*53ee8cc1Swenshuai.xi u8CCPading[u16DataCount++] = 0xff;
7839*53ee8cc1Swenshuai.xi pCCInfo->u32PktLen708 = 0;
7840*53ee8cc1Swenshuai.xi #if 1
7841*53ee8cc1Swenshuai.xi
7842*53ee8cc1Swenshuai.xi pAddr = (MS_U8 *)pCCInfo->u32PktHdrAddr708;
7843*53ee8cc1Swenshuai.xi if(pAddr)
7844*53ee8cc1Swenshuai.xi {
7845*53ee8cc1Swenshuai.xi u8Temp = *pAddr;
7846*53ee8cc1Swenshuai.xi u16Pad = (u8Temp&0x3f)<<1;
7847*53ee8cc1Swenshuai.xi if((i!=0)&&(u16Pad > i))
7848*53ee8cc1Swenshuai.xi {
7849*53ee8cc1Swenshuai.xi i = i>>1;
7850*53ee8cc1Swenshuai.xi u8Temp = u8Temp - i;
7851*53ee8cc1Swenshuai.xi *pAddr = (u8Temp&0xff);
7852*53ee8cc1Swenshuai.xi }
7853*53ee8cc1Swenshuai.xi }
7854*53ee8cc1Swenshuai.xi #endif
7855*53ee8cc1Swenshuai.xi }
7856*53ee8cc1Swenshuai.xi
7857*53ee8cc1Swenshuai.xi u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
7858*53ee8cc1Swenshuai.xi if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
7859*53ee8cc1Swenshuai.xi for(i=0;i<u16Pad;i++)
7860*53ee8cc1Swenshuai.xi u8CCPading[u16DataCount++] = 0xff;
7861*53ee8cc1Swenshuai.xi
7862*53ee8cc1Swenshuai.xi
7863*53ee8cc1Swenshuai.xi b708OverFlow =_HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 0, u8CCPading, u16DataCount);
7864*53ee8cc1Swenshuai.xi if(b708OverFlow)
7865*53ee8cc1Swenshuai.xi return TRUE;
7866*53ee8cc1Swenshuai.xi pCCInfo->u32PktLen708 = (u8CC_Data1 & 0x3f)*2;
7867*53ee8cc1Swenshuai.xi if(pCCInfo->u32PktLen708 == 0) pCCInfo->u32PktLen708 = 128;
7868*53ee8cc1Swenshuai.xi u16DataCount = 0;
7869*53ee8cc1Swenshuai.xi
7870*53ee8cc1Swenshuai.xi pCCInfo->u32PktHdrAddr708 = (MS_U32)(u32RingBufWAddr);
7871*53ee8cc1Swenshuai.xi }
7872*53ee8cc1Swenshuai.xi
7873*53ee8cc1Swenshuai.xi if(pCCInfo->u32PktLen708 > 0)
7874*53ee8cc1Swenshuai.xi {
7875*53ee8cc1Swenshuai.xi u8CCPading[u16DataCount++] = u8CC_Data1;
7876*53ee8cc1Swenshuai.xi u8CCPading[u16DataCount++] = u8CC_Data2;
7877*53ee8cc1Swenshuai.xi pCCInfo->u32PktLen708 = pCCInfo->u32PktLen708 - 2;
7878*53ee8cc1Swenshuai.xi }
7879*53ee8cc1Swenshuai.xi else
7880*53ee8cc1Swenshuai.xi {
7881*53ee8cc1Swenshuai.xi pCCInfo->u32PktLen708 = 0;
7882*53ee8cc1Swenshuai.xi }
7883*53ee8cc1Swenshuai.xi }
7884*53ee8cc1Swenshuai.xi
7885*53ee8cc1Swenshuai.xi if(u16DataCount > 0)
7886*53ee8cc1Swenshuai.xi {
7887*53ee8cc1Swenshuai.xi if( pCCInfo->u32PktLen708 ==0 )
7888*53ee8cc1Swenshuai.xi {
7889*53ee8cc1Swenshuai.xi u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
7890*53ee8cc1Swenshuai.xi if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
7891*53ee8cc1Swenshuai.xi for(i=0;i<u16Pad;i++)
7892*53ee8cc1Swenshuai.xi u8CCPading[u16DataCount++] = 0xff;
7893*53ee8cc1Swenshuai.xi
7894*53ee8cc1Swenshuai.xi }
7895*53ee8cc1Swenshuai.xi
7896*53ee8cc1Swenshuai.xi b708OverFlow = _HVD_EX_CC_Copy_CCdata_To_RB(u32Id, 0, u8CCPading, u16DataCount);
7897*53ee8cc1Swenshuai.xi if(b708OverFlow)
7898*53ee8cc1Swenshuai.xi return TRUE;
7899*53ee8cc1Swenshuai.xi }
7900*53ee8cc1Swenshuai.xi
7901*53ee8cc1Swenshuai.xi return FALSE;
7902*53ee8cc1Swenshuai.xi
7903*53ee8cc1Swenshuai.xi }
7904*53ee8cc1Swenshuai.xi
7905*53ee8cc1Swenshuai.xi
7906*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
7907*53ee8cc1Swenshuai.xi /// Closed Caption Driver Initialization
7908*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Init(MS_U32 u32Id)7909*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Init(MS_U32 u32Id)
7910*53ee8cc1Swenshuai.xi {
7911*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7912*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7913*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7914*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7915*53ee8cc1Swenshuai.xi
7916*53ee8cc1Swenshuai.xi
7917*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7918*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7919*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7920*53ee8cc1Swenshuai.xi
7921*53ee8cc1Swenshuai.xi pCCInfo->u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW);
7922*53ee8cc1Swenshuai.xi
7923*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, pCCInfo->u8UserDataMode);
7924*53ee8cc1Swenshuai.xi
7925*53ee8cc1Swenshuai.xi if (pCCInfo->u8ParsingStatus == 0xff)
7926*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus = 0x00;
7927*53ee8cc1Swenshuai.xi
7928*53ee8cc1Swenshuai.xi //eRet = E_HVD_OK;
7929*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7930*53ee8cc1Swenshuai.xi }
7931*53ee8cc1Swenshuai.xi
7932*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
7933*53ee8cc1Swenshuai.xi /// Set Closed Caption config
7934*53ee8cc1Swenshuai.xi /// @param u8Operation \b IN Digital Closed Caption Type
7935*53ee8cc1Swenshuai.xi /// @param u16BufferSize \b IN buffer size of the given hardware parser
7936*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
7937*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
7938*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
7939*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_SetCfg(MS_U32 u32Id,MS_U8 u8Operation,MS_U16 u16BufferSize,MS_U8 u8CC608)7940*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_SetCfg(MS_U32 u32Id, MS_U8 u8Operation, MS_U16 u16BufferSize, MS_U8 u8CC608)
7941*53ee8cc1Swenshuai.xi {
7942*53ee8cc1Swenshuai.xi
7943*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7944*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7945*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7946*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7947*53ee8cc1Swenshuai.xi
7948*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7949*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7950*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7951*53ee8cc1Swenshuai.xi
7952*53ee8cc1Swenshuai.xi
7953*53ee8cc1Swenshuai.xi
7954*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufLen[u8CC608] = pCCInfo->u32RingBufVacancy[u8CC608] = u16BufferSize;
7955*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus |= u8Operation;
7956*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus &= 0x07;
7957*53ee8cc1Swenshuai.xi
7958*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u8Operation: %x, u16BufferSize:%x, u8CC608:%d\n",u8Operation, u16BufferSize,u8CC608);
7959*53ee8cc1Swenshuai.xi
7960*53ee8cc1Swenshuai.xi
7961*53ee8cc1Swenshuai.xi if (u8CC608==0x00)
7962*53ee8cc1Swenshuai.xi pCCInfo->b708Enable = TRUE;
7963*53ee8cc1Swenshuai.xi
7964*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
7965*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
7966*53ee8cc1Swenshuai.xi
7967*53ee8cc1Swenshuai.xi }
7968*53ee8cc1Swenshuai.xi
7969*53ee8cc1Swenshuai.xi
7970*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
7971*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Start Address
7972*53ee8cc1Swenshuai.xi /// @param u32StartAddress \b IN Ring Buffer's Address
7973*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
7974*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
7975*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
7976*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Set_RB_StartAddr(MS_U32 u32Id,MS_U32 u32StartPAddress,MS_U8 u8CC608)7977*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Set_RB_StartAddr(MS_U32 u32Id, MS_U32 u32StartPAddress, MS_U8 u8CC608)
7978*53ee8cc1Swenshuai.xi {
7979*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
7980*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
7981*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
7982*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
7983*53ee8cc1Swenshuai.xi
7984*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
7985*53ee8cc1Swenshuai.xi MS_U32 u32StartOffset;
7986*53ee8cc1Swenshuai.xi
7987*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
7988*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
7989*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
7990*53ee8cc1Swenshuai.xi
7991*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel,u32StartOffset,u32StartPAddress);
7992*53ee8cc1Swenshuai.xi
7993*53ee8cc1Swenshuai.xi pCCInfo->u8BufMiuSel[u8CC608] = u8MiuSel;
7994*53ee8cc1Swenshuai.xi /*
7995*53ee8cc1Swenshuai.xi if ( (u32StartPAddress & pCtrl->MemMap.u32MIU1BaseAddr) == pCtrl->MemMap.u32MIU1BaseAddr)
7996*53ee8cc1Swenshuai.xi {
7997*53ee8cc1Swenshuai.xi pCCInfo->bBufMiu1[u8CC608] = TRUE;
7998*53ee8cc1Swenshuai.xi }
7999*53ee8cc1Swenshuai.xi else
8000*53ee8cc1Swenshuai.xi {
8001*53ee8cc1Swenshuai.xi pCCInfo->bBufMiu1[u8CC608] = FALSE;
8002*53ee8cc1Swenshuai.xi }*/
8003*53ee8cc1Swenshuai.xi
8004*53ee8cc1Swenshuai.xi
8005*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u32StartPAddress: 0x%lx ,u8CC608: 0x%x, pCCInfo->u8BufMiuSel[u8CC608]: %d, pCtrl->MemMap.u32MIU1BaseAddr: 0x%lx, pCtrl->MemMap.u32MIU2BaseAddr: 0x%lx\n",
8006*53ee8cc1Swenshuai.xi u32StartPAddress , u8CC608,pCCInfo->u8BufMiuSel[u8CC608], pCtrl->MemMap.u32MIU1BaseAddr, pCtrl->MemMap.u32MIU2BaseAddr);
8007*53ee8cc1Swenshuai.xi
8008*53ee8cc1Swenshuai.xi
8009*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufStartPAddr[u8CC608] = pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608] = u32StartPAddress;
8010*53ee8cc1Swenshuai.xi if(pCCInfo->u32RingBufLen[u8CC608] > 0)
8011*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
8012*53ee8cc1Swenshuai.xi
8013*53ee8cc1Swenshuai.xi
8014*53ee8cc1Swenshuai.xi _HVD_EX_CC_Update_UserData_Wptr(u32Id);
8015*53ee8cc1Swenshuai.xi pCCInfo->u32FWUsrDataRIdx = /*pCCInfo->u32FWUsrDataPrevWIdx =*/ pCCInfo->u32FWUsrDataWIdx;
8016*53ee8cc1Swenshuai.xi
8017*53ee8cc1Swenshuai.xi
8018*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
8019*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8020*53ee8cc1Swenshuai.xi
8021*53ee8cc1Swenshuai.xi }
8022*53ee8cc1Swenshuai.xi
8023*53ee8cc1Swenshuai.xi
8024*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8025*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Read Address as Write Address
8026*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8027*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8028*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8029*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_SyncRB_RdAddr2WrAddr(MS_U32 u32Id,MS_U8 u8CC608)8030*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_SyncRB_RdAddr2WrAddr(MS_U32 u32Id, MS_U8 u8CC608)
8031*53ee8cc1Swenshuai.xi {
8032*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8033*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8034*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8035*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8036*53ee8cc1Swenshuai.xi
8037*53ee8cc1Swenshuai.xi
8038*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608];//u32ReadAddress;
8039*53ee8cc1Swenshuai.xi _HVD_EX_CC_Update_UserData_Wptr(u32Id);
8040*53ee8cc1Swenshuai.xi pCCInfo->u32FWUsrDataRIdx = pCCInfo->u32FWUsrDataWIdx;
8041*53ee8cc1Swenshuai.xi if(pCCInfo->u32RingBufLen[u8CC608] > 0)
8042*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
8043*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
8044*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8045*53ee8cc1Swenshuai.xi
8046*53ee8cc1Swenshuai.xi }
8047*53ee8cc1Swenshuai.xi
8048*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8049*53ee8cc1Swenshuai.xi /// Advance Read Address of HVD CC Ring Buffer by u32EachPacketSize
8050*53ee8cc1Swenshuai.xi /// @param u32EachPacketSize \b IN
8051*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8052*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8053*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8054*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Adv_RB_ReadAddr(MS_U32 u32Id,MS_U32 u32EachPacketSize,MS_U8 u8CC608)8055*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_Adv_RB_ReadAddr(MS_U32 u32Id, MS_U32 u32EachPacketSize, MS_U8 u8CC608)
8056*53ee8cc1Swenshuai.xi {
8057*53ee8cc1Swenshuai.xi
8058*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_FAIL;
8059*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8060*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8061*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8062*53ee8cc1Swenshuai.xi
8063*53ee8cc1Swenshuai.xi MS_U32 u32ParsedDataSize;
8064*53ee8cc1Swenshuai.xi
8065*53ee8cc1Swenshuai.xi // Get the Parsed Data Size
8066*53ee8cc1Swenshuai.xi if ((u32EachPacketSize % HVD_CCRB_PACKET_LENGTH) != 0)
8067*53ee8cc1Swenshuai.xi {
8068*53ee8cc1Swenshuai.xi u32ParsedDataSize = HVD_CCRB_PACKET_LENGTH * ((u32EachPacketSize / HVD_CCRB_PACKET_LENGTH)+1); //HVD_CCRB_PACKET_LENGTH bytes alignment
8069*53ee8cc1Swenshuai.xi }
8070*53ee8cc1Swenshuai.xi else
8071*53ee8cc1Swenshuai.xi {
8072*53ee8cc1Swenshuai.xi u32ParsedDataSize = u32EachPacketSize;
8073*53ee8cc1Swenshuai.xi }
8074*53ee8cc1Swenshuai.xi
8075*53ee8cc1Swenshuai.xi if(u32ParsedDataSize > (pCCInfo->u32RingBufLen[u8CC608] - pCCInfo->u32RingBufVacancy[u8CC608]))
8076*53ee8cc1Swenshuai.xi {
8077*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("MDrv_HVD_CC_Adv_RB_ReadAddr fail!, no enough data!, vacancy: %ld, u32ParsedDataSize: %ld, u32RingBufLen:%ld, u32RingBufRPAddr: 0x%lx, u32RingBufWPAddr: 0x%lx\n",
8078*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608], u32ParsedDataSize, pCCInfo->u32RingBufLen[u8CC608], pCCInfo->u32RingBufRPAddr[u8CC608],pCCInfo->u32RingBufWPAddr[u8CC608]);
8079*53ee8cc1Swenshuai.xi return E_HVD_EX_FAIL;
8080*53ee8cc1Swenshuai.xi }
8081*53ee8cc1Swenshuai.xi
8082*53ee8cc1Swenshuai.xi
8083*53ee8cc1Swenshuai.xi if ((pCCInfo->u32RingBufRPAddr[u8CC608] + u32ParsedDataSize) < (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
8084*53ee8cc1Swenshuai.xi {
8085*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufRPAddr[u8CC608] += u32ParsedDataSize;
8086*53ee8cc1Swenshuai.xi }
8087*53ee8cc1Swenshuai.xi else
8088*53ee8cc1Swenshuai.xi {
8089*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufRPAddr[u8CC608] = (u32ParsedDataSize + pCCInfo->u32RingBufRPAddr[u8CC608] - pCCInfo->u32RingBufLen[u8CC608]);
8090*53ee8cc1Swenshuai.xi }
8091*53ee8cc1Swenshuai.xi
8092*53ee8cc1Swenshuai.xi pCCInfo->u32RingBufVacancy[u8CC608] += u32ParsedDataSize ;
8093*53ee8cc1Swenshuai.xi
8094*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
8095*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8096*53ee8cc1Swenshuai.xi
8097*53ee8cc1Swenshuai.xi }
8098*53ee8cc1Swenshuai.xi
8099*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8100*53ee8cc1Swenshuai.xi /// Stop HVD CC parsing
8101*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8102*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8103*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8104*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_DisableParsing(MS_U32 u32Id,MS_U8 u8CC608)8105*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_DisableParsing(MS_U32 u32Id, MS_U8 u8CC608)
8106*53ee8cc1Swenshuai.xi {
8107*53ee8cc1Swenshuai.xi
8108*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8109*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8110*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8111*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8112*53ee8cc1Swenshuai.xi
8113*53ee8cc1Swenshuai.xi if (u8CC608==0)
8114*53ee8cc1Swenshuai.xi {
8115*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus &= ~0x04;
8116*53ee8cc1Swenshuai.xi pCCInfo->b708Enable = FALSE;
8117*53ee8cc1Swenshuai.xi }
8118*53ee8cc1Swenshuai.xi else
8119*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus &= ~0x03;
8120*53ee8cc1Swenshuai.xi
8121*53ee8cc1Swenshuai.xi pCCInfo->u8ParsingStatus &= 0x07;
8122*53ee8cc1Swenshuai.xi
8123*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
8124*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8125*53ee8cc1Swenshuai.xi }
8126*53ee8cc1Swenshuai.xi
8127*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_CC_GetInfo(MS_U32 u32Id,MS_U32 selector,MS_U8 type,MS_U32 * p1,MS_U32 * p2)8128*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_CC_GetInfo(MS_U32 u32Id, MS_U32 selector, MS_U8 type, MS_U32 *p1, MS_U32 *p2)
8129*53ee8cc1Swenshuai.xi {
8130*53ee8cc1Swenshuai.xi
8131*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8132*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8133*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8134*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8135*53ee8cc1Swenshuai.xi
8136*53ee8cc1Swenshuai.xi // Functionality select
8137*53ee8cc1Swenshuai.xi switch (selector)
8138*53ee8cc1Swenshuai.xi {
8139*53ee8cc1Swenshuai.xi case HVD_EX_CC_SELECTOR_708_SW:
8140*53ee8cc1Swenshuai.xi *p1 = (MS_U32)pCCInfo->b708Enable;
8141*53ee8cc1Swenshuai.xi break;
8142*53ee8cc1Swenshuai.xi
8143*53ee8cc1Swenshuai.xi #if defined( MSOS_TYPE_LINUX )
8144*53ee8cc1Swenshuai.xi case HVD_EX_CC_SELECTOR_RINGBUFFER:
8145*53ee8cc1Swenshuai.xi {
8146*53ee8cc1Swenshuai.xi MS_U32 u32PAddr;
8147*53ee8cc1Swenshuai.xi u32PAddr = pCCInfo->u32RingBufStartPAddr[type];
8148*53ee8cc1Swenshuai.xi *p1 = u32PAddr;
8149*53ee8cc1Swenshuai.xi *p2 = (MS_U32) pCCInfo->u32RingBufLen[type];
8150*53ee8cc1Swenshuai.xi }
8151*53ee8cc1Swenshuai.xi break;
8152*53ee8cc1Swenshuai.xi #endif
8153*53ee8cc1Swenshuai.xi
8154*53ee8cc1Swenshuai.xi default:
8155*53ee8cc1Swenshuai.xi *p1 = *p2 = 0;
8156*53ee8cc1Swenshuai.xi break;
8157*53ee8cc1Swenshuai.xi }
8158*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_OK;
8159*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8160*53ee8cc1Swenshuai.xi }
8161*53ee8cc1Swenshuai.xi
8162*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_CC_IsHvdRstDone(MS_U32 u32Id,MS_U8 type)8163*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_CC_IsHvdRstDone(MS_U32 u32Id, MS_U8 type)
8164*53ee8cc1Swenshuai.xi {
8165*53ee8cc1Swenshuai.xi MS_BOOL bRet = FALSE;
8166*53ee8cc1Swenshuai.xi
8167*53ee8cc1Swenshuai.xi bRet = TRUE;
8168*53ee8cc1Swenshuai.xi
8169*53ee8cc1Swenshuai.xi return bRet;
8170*53ee8cc1Swenshuai.xi }
8171*53ee8cc1Swenshuai.xi
8172*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8173*53ee8cc1Swenshuai.xi /// Get Overflow Status of HVD CC Ring Buffer
8174*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8175*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8176*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8177*53ee8cc1Swenshuai.xi /// Return value:: Overflow Status Flag
8178*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_GetOverflowStatus(MS_U32 u32Id,MS_U8 u8CC608)8179*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_CC_GetOverflowStatus(MS_U32 u32Id, MS_U8 u8CC608)
8180*53ee8cc1Swenshuai.xi {
8181*53ee8cc1Swenshuai.xi
8182*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8183*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8184*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8185*53ee8cc1Swenshuai.xi
8186*53ee8cc1Swenshuai.xi MS_BOOL bOverFlow = pCCInfo->bOverFlow[u8CC608];
8187*53ee8cc1Swenshuai.xi pCCInfo->bOverFlow[u8CC608] = FALSE;
8188*53ee8cc1Swenshuai.xi return (bOverFlow);
8189*53ee8cc1Swenshuai.xi }
8190*53ee8cc1Swenshuai.xi
8191*53ee8cc1Swenshuai.xi
8192*53ee8cc1Swenshuai.xi
8193*53ee8cc1Swenshuai.xi
8194*53ee8cc1Swenshuai.xi
8195*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8196*53ee8cc1Swenshuai.xi /// Get Write Address of HVD CC Ring Buffer
8197*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8198*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8199*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8200*53ee8cc1Swenshuai.xi /// Return value:: Write Address
8201*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Get_RB_WriteAddr(MS_U32 u32Id,MS_U8 u8CC608)8202*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CC_Get_RB_WriteAddr(MS_U32 u32Id, MS_U8 u8CC608)
8203*53ee8cc1Swenshuai.xi {
8204*53ee8cc1Swenshuai.xi
8205*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8206*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8207*53ee8cc1Swenshuai.xi MS_U32 u32UserDataIdxSize = 0;
8208*53ee8cc1Swenshuai.xi MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
8209*53ee8cc1Swenshuai.xi MS_U32 u32UserDataSize = 0;
8210*53ee8cc1Swenshuai.xi MS_U32 u32UserDataAddr = 0;
8211*53ee8cc1Swenshuai.xi DTV_BUF_type* pHVD_User_Data = NULL;
8212*53ee8cc1Swenshuai.xi
8213*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8214*53ee8cc1Swenshuai.xi MS_U32 u32FwParseCnt;
8215*53ee8cc1Swenshuai.xi MS_U32 u32PAddr;
8216*53ee8cc1Swenshuai.xi
8217*53ee8cc1Swenshuai.xi
8218*53ee8cc1Swenshuai.xi if ((pCCInfo->u8ParsingStatus == 0xff) || (pCCInfo->u8ParsingStatus == 0x00))
8219*53ee8cc1Swenshuai.xi {
8220*53ee8cc1Swenshuai.xi
8221*53ee8cc1Swenshuai.xi u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
8222*53ee8cc1Swenshuai.xi /*
8223*53ee8cc1Swenshuai.xi if(!pCCInfo->bBufMiu1[u8CC608])
8224*53ee8cc1Swenshuai.xi u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
8225*53ee8cc1Swenshuai.xi */
8226*53ee8cc1Swenshuai.xi if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
8227*53ee8cc1Swenshuai.xi u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
8228*53ee8cc1Swenshuai.xi
8229*53ee8cc1Swenshuai.xi
8230*53ee8cc1Swenshuai.xi return u32PAddr;
8231*53ee8cc1Swenshuai.xi }
8232*53ee8cc1Swenshuai.xi
8233*53ee8cc1Swenshuai.xi u32UserDataIdxSize = (MS_U32)HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
8234*53ee8cc1Swenshuai.xi
8235*53ee8cc1Swenshuai.xi u32UsrDataIdxWptr =_HVD_EX_CC_Update_UserData_Wptr(u32Id);
8236*53ee8cc1Swenshuai.xi
8237*53ee8cc1Swenshuai.xi
8238*53ee8cc1Swenshuai.xi
8239*53ee8cc1Swenshuai.xi if (pCCInfo->u32FWUsrDataRIdx == u32UsrDataIdxWptr)
8240*53ee8cc1Swenshuai.xi {
8241*53ee8cc1Swenshuai.xi // User Data Buffer Empty
8242*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("RIdx(%ld) == WIdx(%ld) , empty !!!\n", pCCInfo->u32FWUsrDataRIdx,u32UsrDataIdxWptr);
8243*53ee8cc1Swenshuai.xi u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
8244*53ee8cc1Swenshuai.xi
8245*53ee8cc1Swenshuai.xi if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
8246*53ee8cc1Swenshuai.xi u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
8247*53ee8cc1Swenshuai.xi
8248*53ee8cc1Swenshuai.xi return u32PAddr;
8249*53ee8cc1Swenshuai.xi
8250*53ee8cc1Swenshuai.xi }
8251*53ee8cc1Swenshuai.xi else if (u32UsrDataIdxWptr > pCCInfo->u32FWUsrDataRIdx)
8252*53ee8cc1Swenshuai.xi {
8253*53ee8cc1Swenshuai.xi u32FwParseCnt = u32UsrDataIdxWptr - pCCInfo->u32FWUsrDataRIdx;
8254*53ee8cc1Swenshuai.xi }
8255*53ee8cc1Swenshuai.xi else// pCCInfo->u32FWUsrDataWIdx < pCCInfo->u32FWUsrDataRIdx
8256*53ee8cc1Swenshuai.xi {
8257*53ee8cc1Swenshuai.xi u32FwParseCnt = u32UserDataIdxSize - (pCCInfo->u32FWUsrDataRIdx - u32UsrDataIdxWptr);
8258*53ee8cc1Swenshuai.xi }
8259*53ee8cc1Swenshuai.xi
8260*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("u32FwParseCnt(%ld) !!!, pCCInfo->u32RingBufWPAddr[%d]: 0x%lx\n", u32FwParseCnt, u8CC608,pCCInfo->u32RingBufWPAddr[u8CC608] );
8261*53ee8cc1Swenshuai.xi
8262*53ee8cc1Swenshuai.xi MS_BOOL b608OverFlow = FALSE, b708OverFlow = FALSE;
8263*53ee8cc1Swenshuai.xi MS_U8 *pCC608buf = &(pCCInfo->u8CC608buf[0]);
8264*53ee8cc1Swenshuai.xi MS_U8 *pCC708buf = &(pCCInfo->u8CC708buf[0]);
8265*53ee8cc1Swenshuai.xi MS_U32 u32CC608Len = 0;
8266*53ee8cc1Swenshuai.xi MS_U32 u32CC708Len = 0;
8267*53ee8cc1Swenshuai.xi
8268*53ee8cc1Swenshuai.xi
8269*53ee8cc1Swenshuai.xi
8270*53ee8cc1Swenshuai.xi
8271*53ee8cc1Swenshuai.xi while(u32FwParseCnt)
8272*53ee8cc1Swenshuai.xi {
8273*53ee8cc1Swenshuai.xi
8274*53ee8cc1Swenshuai.xi
8275*53ee8cc1Swenshuai.xi
8276*53ee8cc1Swenshuai.xi if( (!_HVD_EX_CC_RB_Have_Avail_Space(u32Id, 1, MAX_608_CC_LEN)) || (!_HVD_EX_CC_RB_Have_Avail_Space(u32Id, 0, MAX_708_CC_LEN)))
8277*53ee8cc1Swenshuai.xi {
8278*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("not have available space!!!\n");
8279*53ee8cc1Swenshuai.xi break;
8280*53ee8cc1Swenshuai.xi }
8281*53ee8cc1Swenshuai.xi u32UserDataAddr = MDrv_HVD_EX_GetUserData_Packet(u32Id, pCCInfo->u32FWUsrDataRIdx, (MS_U32*)&u32UserDataSize);
8282*53ee8cc1Swenshuai.xi u32UserDataAddr += pCtrl->MemMap.u32CodeBufVAddr; // change to virtual address
8283*53ee8cc1Swenshuai.xi
8284*53ee8cc1Swenshuai.xi pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
8285*53ee8cc1Swenshuai.xi
8286*53ee8cc1Swenshuai.xi u32CC608Len = 0;
8287*53ee8cc1Swenshuai.xi u32CC708Len = 0;
8288*53ee8cc1Swenshuai.xi
8289*53ee8cc1Swenshuai.xi
8290*53ee8cc1Swenshuai.xi
8291*53ee8cc1Swenshuai.xi _HVD_EX_CC_Extract_CCdata(u32Id, pCC608buf, &u32CC608Len,pCC708buf, &u32CC708Len, pHVD_User_Data);
8292*53ee8cc1Swenshuai.xi
8293*53ee8cc1Swenshuai.xi if(u32CC608Len > 0)
8294*53ee8cc1Swenshuai.xi b608OverFlow =_HVD_EX_CC_Add_PaddingData_To_608(u32Id, &(pCCInfo->u8CC608buf[0]), u32CC608Len);
8295*53ee8cc1Swenshuai.xi
8296*53ee8cc1Swenshuai.xi
8297*53ee8cc1Swenshuai.xi
8298*53ee8cc1Swenshuai.xi
8299*53ee8cc1Swenshuai.xi if(u32CC708Len > 0)
8300*53ee8cc1Swenshuai.xi b708OverFlow = _HVD_EX_CC_Add_PaddingData_To_708(u32Id, &(pCCInfo->u8CC708buf[0]), u32CC708Len);
8301*53ee8cc1Swenshuai.xi //b708OverFlow =_HVD_CC_Copy_CCdata_To_RB(0, &CC708buf[0], u32CC708Len);
8302*53ee8cc1Swenshuai.xi
8303*53ee8cc1Swenshuai.xi
8304*53ee8cc1Swenshuai.xi
8305*53ee8cc1Swenshuai.xi
8306*53ee8cc1Swenshuai.xi if(b608OverFlow)
8307*53ee8cc1Swenshuai.xi {
8308*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("##### Critical error!!!! b608OverFlow: %d!!!\n",b608OverFlow);
8309*53ee8cc1Swenshuai.xi pCCInfo->bOverFlow[1] = TRUE;
8310*53ee8cc1Swenshuai.xi }
8311*53ee8cc1Swenshuai.xi
8312*53ee8cc1Swenshuai.xi if(b708OverFlow)
8313*53ee8cc1Swenshuai.xi {
8314*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("##### Critical error!!!! b708OverFlow:%d !!!\n",b708OverFlow);
8315*53ee8cc1Swenshuai.xi pCCInfo->bOverFlow[0] = TRUE;
8316*53ee8cc1Swenshuai.xi }
8317*53ee8cc1Swenshuai.xi
8318*53ee8cc1Swenshuai.xi
8319*53ee8cc1Swenshuai.xi
8320*53ee8cc1Swenshuai.xi pCCInfo->u32FWUsrDataRIdx++;
8321*53ee8cc1Swenshuai.xi
8322*53ee8cc1Swenshuai.xi if (pCCInfo->u32FWUsrDataRIdx >= u32UserDataIdxSize)
8323*53ee8cc1Swenshuai.xi {
8324*53ee8cc1Swenshuai.xi pCCInfo->u32FWUsrDataRIdx = 0;
8325*53ee8cc1Swenshuai.xi }
8326*53ee8cc1Swenshuai.xi
8327*53ee8cc1Swenshuai.xi
8328*53ee8cc1Swenshuai.xi u32FwParseCnt--;
8329*53ee8cc1Swenshuai.xi }
8330*53ee8cc1Swenshuai.xi
8331*53ee8cc1Swenshuai.xi
8332*53ee8cc1Swenshuai.xi u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
8333*53ee8cc1Swenshuai.xi if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
8334*53ee8cc1Swenshuai.xi u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
8335*53ee8cc1Swenshuai.xi
8336*53ee8cc1Swenshuai.xi return u32PAddr;
8337*53ee8cc1Swenshuai.xi
8338*53ee8cc1Swenshuai.xi
8339*53ee8cc1Swenshuai.xi
8340*53ee8cc1Swenshuai.xi }
8341*53ee8cc1Swenshuai.xi
8342*53ee8cc1Swenshuai.xi
8343*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8344*53ee8cc1Swenshuai.xi /// Get Read Address of HVD CC Ring Buffer
8345*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
8346*53ee8cc1Swenshuai.xi /// - # TRUE for CC608 parser
8347*53ee8cc1Swenshuai.xi /// - # FALSE for CC708 parser
8348*53ee8cc1Swenshuai.xi /// Return value:: Read Address
8349*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_Get_RB_ReadAddr(MS_U32 u32Id,MS_U8 u8CC608)8350*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_EX_CC_Get_RB_ReadAddr(MS_U32 u32Id, MS_U8 u8CC608)
8351*53ee8cc1Swenshuai.xi {
8352*53ee8cc1Swenshuai.xi
8353*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8354*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8355*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8356*53ee8cc1Swenshuai.xi
8357*53ee8cc1Swenshuai.xi MS_U32 u32PAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
8358*53ee8cc1Swenshuai.xi if(pCCInfo->u8BufMiuSel[u8CC608] == E_CHIP_MIU_0)
8359*53ee8cc1Swenshuai.xi u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
8360*53ee8cc1Swenshuai.xi
8361*53ee8cc1Swenshuai.xi return u32PAddr;
8362*53ee8cc1Swenshuai.xi
8363*53ee8cc1Swenshuai.xi }
8364*53ee8cc1Swenshuai.xi
8365*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
8366*53ee8cc1Swenshuai.xi /// Enhance CC info mode, only support cc608
8367*53ee8cc1Swenshuai.xi /// @param bEnable \b IN
8368*53ee8cc1Swenshuai.xi /// - # TRUE for enhance to dump the pts/tmp_ref info
8369*53ee8cc1Swenshuai.xi /// - # FALSE for original
8370*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_EX_CC_InfoEnhanceMode(MS_U32 u32Id,MS_BOOL bEnable)8371*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_CC_InfoEnhanceMode(MS_U32 u32Id, MS_BOOL bEnable)
8372*53ee8cc1Swenshuai.xi {
8373*53ee8cc1Swenshuai.xi
8374*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8375*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8376*53ee8cc1Swenshuai.xi HVD_CC_Info *pCCInfo = &(pCtrl->CloseCaptionInfo);
8377*53ee8cc1Swenshuai.xi
8378*53ee8cc1Swenshuai.xi pCCInfo->b608InfoEnhance = bEnable;
8379*53ee8cc1Swenshuai.xi
8380*53ee8cc1Swenshuai.xi return TRUE;
8381*53ee8cc1Swenshuai.xi }
8382*53ee8cc1Swenshuai.xi
8383*53ee8cc1Swenshuai.xi
8384*53ee8cc1Swenshuai.xi
8385*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetExternal_CC608_Buffer(MS_U32 u32Id,MS_U32 u32Addr,MS_U32 u32Len)8386*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternal_CC608_Buffer(MS_U32 u32Id, MS_U32 u32Addr, MS_U32 u32Len)
8387*53ee8cc1Swenshuai.xi {
8388*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8389*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8390*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8391*53ee8cc1Swenshuai.xi MS_U8 u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW|USER_DATA_MODE_EXTERNAL_CC_BUFFER);
8392*53ee8cc1Swenshuai.xi MS_U32 u32CCinfo;
8393*53ee8cc1Swenshuai.xi
8394*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8395*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8396*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8397*53ee8cc1Swenshuai.xi
8398*53ee8cc1Swenshuai.xi u32Addr <<= 10;// 1kbytes unit
8399*53ee8cc1Swenshuai.xi u32Len <<= 10; // 1kbytes unit
8400*53ee8cc1Swenshuai.xi
8401*53ee8cc1Swenshuai.xi // Read Ptr (4 bytes), Write Ptr (4 bytes), Latch Bit (2 bytes), overflow (2 bytes), Miu Base Address (4 bytes)
8402*53ee8cc1Swenshuai.xi MS_U32 *u32ReadPtr = (MS_U32 *)(HVD_PA2VA(u32Addr));
8403*53ee8cc1Swenshuai.xi MS_U32 *u32WritePtr = (MS_U32 *)(HVD_PA2VA(u32Addr+4));
8404*53ee8cc1Swenshuai.xi MS_U32 *u32LatchOverflow = (MS_U32 *)(HVD_PA2VA(u32Addr+8));
8405*53ee8cc1Swenshuai.xi MS_U32 *u32FWBinaryAddr = (MS_U32 *)(HVD_PA2VA(u32Addr+12));
8406*53ee8cc1Swenshuai.xi
8407*53ee8cc1Swenshuai.xi *u32ReadPtr = *u32WritePtr = u32Addr+EXT_608_CC_DATA_ALIGN;
8408*53ee8cc1Swenshuai.xi *u32LatchOverflow = 0;
8409*53ee8cc1Swenshuai.xi
8410*53ee8cc1Swenshuai.xi
8411*53ee8cc1Swenshuai.xi u32Addr -= pCtrl->MemMap.u32FWBinaryAddr;
8412*53ee8cc1Swenshuai.xi *u32FWBinaryAddr = pCtrl->MemMap.u32FWBinaryAddr;
8413*53ee8cc1Swenshuai.xi
8414*53ee8cc1Swenshuai.xi u32CCinfo = ((u32Addr >> 10) << 8) & 0xffffff00; //arg[31:8] * 1kbytes
8415*53ee8cc1Swenshuai.xi u32CCinfo |= ((u32Len >> 10) & 0xff); //arg[7:0] *1kbytes
8416*53ee8cc1Swenshuai.xi
8417*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
8418*53ee8cc1Swenshuai.xi
8419*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_EXTERNAL_CC_608_BUF, u32CCinfo);
8420*53ee8cc1Swenshuai.xi
8421*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8422*53ee8cc1Swenshuai.xi
8423*53ee8cc1Swenshuai.xi
8424*53ee8cc1Swenshuai.xi }
8425*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetExternal_CC708_Buffer(MS_U32 u32Id,MS_U32 u32Addr,MS_U32 u32Len)8426*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetExternal_CC708_Buffer(MS_U32 u32Id, MS_U32 u32Addr, MS_U32 u32Len)
8427*53ee8cc1Swenshuai.xi {
8428*53ee8cc1Swenshuai.xi
8429*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8430*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8431*53ee8cc1Swenshuai.xi HVD_EX_Drv_Ctrl *pCtrl = &(pHVDDrvContext->gHVDCtrl_EX[u8DrvId]);
8432*53ee8cc1Swenshuai.xi MS_U8 u8UserDataMode = (USER_DATA_MODE_DIRECTTV_CC|USER_DATA_MODE_ATSC_CC_RAW|USER_DATA_MODE_EXTERNAL_CC_BUFFER);
8433*53ee8cc1Swenshuai.xi MS_U32 u32CCinfo;
8434*53ee8cc1Swenshuai.xi
8435*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8436*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8437*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8438*53ee8cc1Swenshuai.xi
8439*53ee8cc1Swenshuai.xi u32Addr <<= 10;// 1kbytes unit
8440*53ee8cc1Swenshuai.xi u32Len <<= 10; // 1kbytes unit
8441*53ee8cc1Swenshuai.xi
8442*53ee8cc1Swenshuai.xi // Read Ptr (4 bytes), Write Ptr (4 bytes), Latch Bit (2 bytes), overflow (2 bytes), Miu Base Address (4 bytes)
8443*53ee8cc1Swenshuai.xi MS_U32 *u32ReadPtr = (MS_U32 *)(HVD_PA2VA(u32Addr));
8444*53ee8cc1Swenshuai.xi MS_U32 *u32WritePtr = (MS_U32 *)(HVD_PA2VA(u32Addr+4));
8445*53ee8cc1Swenshuai.xi MS_U32 *u32LatchOverflow = (MS_U32 *)(HVD_PA2VA(u32Addr+8));
8446*53ee8cc1Swenshuai.xi MS_U32 *u32FWBinaryAddr = (MS_U32 *)(HVD_PA2VA(u32Addr+12));
8447*53ee8cc1Swenshuai.xi
8448*53ee8cc1Swenshuai.xi
8449*53ee8cc1Swenshuai.xi MS_U32 i;
8450*53ee8cc1Swenshuai.xi MS_U8 *u8ResvAddr = (MS_U8 *)((HVD_PA2VA(u32Addr))+EXT_CC_INFO_LENGTH);
8451*53ee8cc1Swenshuai.xi for(i=0;i< (EXT_708_CC_DATA_ALIGN- EXT_CC_INFO_LENGTH) ;i++)
8452*53ee8cc1Swenshuai.xi {
8453*53ee8cc1Swenshuai.xi u8ResvAddr[i] = 0xff;
8454*53ee8cc1Swenshuai.xi }
8455*53ee8cc1Swenshuai.xi
8456*53ee8cc1Swenshuai.xi
8457*53ee8cc1Swenshuai.xi
8458*53ee8cc1Swenshuai.xi *u32ReadPtr = *u32WritePtr = u32Addr+EXT_708_CC_DATA_ALIGN;
8459*53ee8cc1Swenshuai.xi *u32LatchOverflow = 0;
8460*53ee8cc1Swenshuai.xi
8461*53ee8cc1Swenshuai.xi u32Addr -= pCtrl->MemMap.u32FWBinaryAddr;
8462*53ee8cc1Swenshuai.xi *u32FWBinaryAddr = pCtrl->MemMap.u32FWBinaryAddr;
8463*53ee8cc1Swenshuai.xi
8464*53ee8cc1Swenshuai.xi
8465*53ee8cc1Swenshuai.xi u32CCinfo = ((u32Addr >> 10) << 8) & 0xffffff00; //arg[31:8] * 1kbytes
8466*53ee8cc1Swenshuai.xi u32CCinfo |= ((u32Len >> 10) & 0xff); //arg[7:0] *1kbytes
8467*53ee8cc1Swenshuai.xi
8468*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result)HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_USERDATA_MODE, u8UserDataMode);
8469*53ee8cc1Swenshuai.xi
8470*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_ENABLE_EXTERNAL_CC_708_BUF, u32CCinfo);
8471*53ee8cc1Swenshuai.xi
8472*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8473*53ee8cc1Swenshuai.xi }
8474*53ee8cc1Swenshuai.xi
8475*53ee8cc1Swenshuai.xi
8476*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8477*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_ShowFirstFrameDirect()
8478*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Push First Frame to Display Queue Directly
8479*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
8480*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
8481*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_ShowFirstFrameDirect(MS_U32 u32Id,MS_BOOL bEnable)8482*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_ShowFirstFrameDirect(MS_U32 u32Id, MS_BOOL bEnable)
8483*53ee8cc1Swenshuai.xi {
8484*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8485*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8486*53ee8cc1Swenshuai.xi
8487*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8488*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8489*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8490*53ee8cc1Swenshuai.xi
8491*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SHOW_FIRST_FRAME_DIRECT, bEnable);
8492*53ee8cc1Swenshuai.xi
8493*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8494*53ee8cc1Swenshuai.xi }
8495*53ee8cc1Swenshuai.xi
8496*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8497*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_AVCResizeDosDispPendBuf()
8498*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Resize disp pending buffer size for display outside mode(dos),
8499*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN : size of display pending buffer
8500*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
8501*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_AVCResizeDosDispPendBuf(MS_U32 u32Id,MS_U32 u32Size)8502*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_AVCResizeDosDispPendBuf(MS_U32 u32Id, MS_U32 u32Size)
8503*53ee8cc1Swenshuai.xi {
8504*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8505*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8506*53ee8cc1Swenshuai.xi
8507*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8508*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8509*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8510*53ee8cc1Swenshuai.xi
8511*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_AVC_RESIZE_DOS_DISP_PEND_BUF, u32Size);
8512*53ee8cc1Swenshuai.xi
8513*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8514*53ee8cc1Swenshuai.xi }
8515*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8516*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDmxFrameRate()
8517*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set the demuxer prefered frame rate.
8518*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
8519*53ee8cc1Swenshuai.xi /// @return -The result is successful or not
8520*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDmxFrameRate(MS_U32 u32Id,MS_U32 u32Value)8521*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDmxFrameRate(MS_U32 u32Id, MS_U32 u32Value)
8522*53ee8cc1Swenshuai.xi {
8523*53ee8cc1Swenshuai.xi return (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DMX_FRAMERATE, u32Value);
8524*53ee8cc1Swenshuai.xi }
8525*53ee8cc1Swenshuai.xi
8526*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8527*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetDmxFrameRateBase()
8528*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: set the demuxer prefered frame rate.
8529*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
8530*53ee8cc1Swenshuai.xi /// @return -The result is successful or not
8531*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetDmxFrameRateBase(MS_U32 u32Id,MS_U32 u32Value)8532*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetDmxFrameRateBase(MS_U32 u32Id, MS_U32 u32Value)
8533*53ee8cc1Swenshuai.xi {
8534*53ee8cc1Swenshuai.xi return (HVD_EX_Result) HAL_HVD_EX_SetData(u32Id, E_HVD_SDATA_DMX_FRAMERATEBASE, u32Value);
8535*53ee8cc1Swenshuai.xi }
8536*53ee8cc1Swenshuai.xi
8537*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8538*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_GetSupport2ndMVOPInterface()
8539*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get if support 2nd MVOP interface.
8540*53ee8cc1Swenshuai.xi /// @param : none
8541*53ee8cc1Swenshuai.xi /// @return -The result is true or false
8542*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_GetSupport2ndMVOPInterface(void)8543*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_GetSupport2ndMVOPInterface(void)
8544*53ee8cc1Swenshuai.xi {
8545*53ee8cc1Swenshuai.xi return HAL_HVD_EX_GetSupport2ndMVOPInterface();
8546*53ee8cc1Swenshuai.xi }
8547*53ee8cc1Swenshuai.xi
8548*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8549*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetVPUSecureMode()
8550*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set secure mode for HVD Drv.
8551*53ee8cc1Swenshuai.xi /// @param : none
8552*53ee8cc1Swenshuai.xi /// @return -The result is true or false
8553*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetVPUSecureMode(MS_BOOL bEnable)8554*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetVPUSecureMode(MS_BOOL bEnable)
8555*53ee8cc1Swenshuai.xi {
8556*53ee8cc1Swenshuai.xi pHVDDrvContext->bVPUIsSecureMode = bEnable;
8557*53ee8cc1Swenshuai.xi return TRUE;
8558*53ee8cc1Swenshuai.xi }
8559*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_OnePendingBufferMode(MS_U32 u32Id,MS_BOOL bEnable)8560*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_OnePendingBufferMode(MS_U32 u32Id,MS_BOOL bEnable)
8561*53ee8cc1Swenshuai.xi {
8562*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
8563*53ee8cc1Swenshuai.xi
8564*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8565*53ee8cc1Swenshuai.xi
8566*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDPreCtrl[u8DrvId].bOnePendingBuffer = bEnable;
8567*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8568*53ee8cc1Swenshuai.xi }
8569*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_TsInBbuMode(MS_U32 u32Id,MS_BOOL bDisable)8570*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_TsInBbuMode(MS_U32 u32Id,MS_BOOL bDisable)
8571*53ee8cc1Swenshuai.xi {
8572*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
8573*53ee8cc1Swenshuai.xi
8574*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8575*53ee8cc1Swenshuai.xi
8576*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDPreCtrl[u8DrvId].bDisableTspInBbuMode = bDisable;
8577*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8578*53ee8cc1Swenshuai.xi }
MDrv_HVD_EX_IapGnBufShareBWMode(MS_U32 u32Id,MS_BOOL bEnable,MS_U32 u32IapGnBufAddr,MS_U32 u32IapGnBufSize)8579*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_IapGnBufShareBWMode(MS_U32 u32Id,MS_BOOL bEnable, MS_U32 u32IapGnBufAddr, MS_U32 u32IapGnBufSize)
8580*53ee8cc1Swenshuai.xi {
8581*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
8582*53ee8cc1Swenshuai.xi
8583*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8584*53ee8cc1Swenshuai.xi
8585*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.bEnable = bEnable;
8586*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.u32IapGnBufAddr = u32IapGnBufAddr;
8587*53ee8cc1Swenshuai.xi pHVDDrvContext->gHVDPreCtrl[u8DrvId].stIapGnShBWMode.u32IapGnBufSize = u32IapGnBufSize;
8588*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8589*53ee8cc1Swenshuai.xi }
8590*53ee8cc1Swenshuai.xi
8591*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8592*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_SetPTSUsecMode()
8593*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: enable/disable PTS output by micro second level,
8594*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :enable/disable
8595*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
8596*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_SetPTSUsecMode(MS_U32 u32Id,MS_BOOL bEnable)8597*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_SetPTSUsecMode(MS_U32 u32Id, MS_BOOL bEnable)
8598*53ee8cc1Swenshuai.xi {
8599*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_OK;
8600*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8601*53ee8cc1Swenshuai.xi
8602*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8603*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8604*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8605*53ee8cc1Swenshuai.xi
8606*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_SET_PTS_US_MODE, bEnable);
8607*53ee8cc1Swenshuai.xi
8608*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8609*53ee8cc1Swenshuai.xi }
8610*53ee8cc1Swenshuai.xi
8611*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
8612*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_EX_PVRTimeShiftSeamlessMode()
8613*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:
8614*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :
8615*53ee8cc1Swenshuai.xi /// @return -E_HVD_EX_OK for success; E_HVD_EX_FAIL for failure.
8616*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_EX_PVRTimeShiftSeamlessMode(MS_U32 u32Id,MS_U8 u8Arg)8617*53ee8cc1Swenshuai.xi HVD_EX_Result MDrv_HVD_EX_PVRTimeShiftSeamlessMode(MS_U32 u32Id, MS_U8 u8Arg)
8618*53ee8cc1Swenshuai.xi {
8619*53ee8cc1Swenshuai.xi HVD_EX_Result eRet = E_HVD_EX_RET_ILLEGAL_ACCESS;
8620*53ee8cc1Swenshuai.xi MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
8621*53ee8cc1Swenshuai.xi
8622*53ee8cc1Swenshuai.xi HVD_EX_MSG_TRACE();
8623*53ee8cc1Swenshuai.xi _DRV_HVD_Inited(u8DrvId,eRet);
8624*53ee8cc1Swenshuai.xi _DRV_HVD_EX_Entry(u8DrvId);
8625*53ee8cc1Swenshuai.xi
8626*53ee8cc1Swenshuai.xi eRet = (HVD_EX_Result) HAL_HVD_EX_SetCmd(u32Id, E_HVD_CMD_PVR_SEAMLESS_TIMESHIFT, u8Arg);
8627*53ee8cc1Swenshuai.xi
8628*53ee8cc1Swenshuai.xi if ((u8Arg == 1) || (u8Arg == 2)) //u8Arg=1 needs about 50ms, u8Arg=2 needs about 30ms
8629*53ee8cc1Swenshuai.xi {
8630*53ee8cc1Swenshuai.xi MS_U32 u32Status = (u8Arg==1)?(E_HVD_SEAMLESS_PAUSE_DECODE):(E_HVD_SEAMLESS_RESET_HW_DONE);
8631*53ee8cc1Swenshuai.xi MS_U32 u32Times = 0;
8632*53ee8cc1Swenshuai.xi
8633*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("TS Seamless. Arg=%d, polling status start at %ld \n", u8Arg, HVD_GetSysTime_ms());
8634*53ee8cc1Swenshuai.xi
8635*53ee8cc1Swenshuai.xi while (1)
8636*53ee8cc1Swenshuai.xi {
8637*53ee8cc1Swenshuai.xi if (HAL_HVD_EX_GetData(u32Id, E_HVD_GDATA_TS_SEAMLESS_STATUS) & u32Status)
8638*53ee8cc1Swenshuai.xi {
8639*53ee8cc1Swenshuai.xi HVD_EX_MSG_DBG("TS Seamless status change done. Arg=%d. Status=0x%lx at %ld \n", u8Arg, u32Status, HVD_GetSysTime_ms());
8640*53ee8cc1Swenshuai.xi break;
8641*53ee8cc1Swenshuai.xi }
8642*53ee8cc1Swenshuai.xi
8643*53ee8cc1Swenshuai.xi u32Times++;
8644*53ee8cc1Swenshuai.xi HVD_Delay_ms(1);
8645*53ee8cc1Swenshuai.xi
8646*53ee8cc1Swenshuai.xi if (u32Times > 500)
8647*53ee8cc1Swenshuai.xi {
8648*53ee8cc1Swenshuai.xi HVD_EX_MSG_ERR("Timeout!!! TS Seamless status change is not finished. Arg=%d. Status=0x%lx at %ld \n", u8Arg, u32Status, HVD_GetSysTime_ms());
8649*53ee8cc1Swenshuai.xi eRet = E_HVD_EX_FAIL;
8650*53ee8cc1Swenshuai.xi break;
8651*53ee8cc1Swenshuai.xi }
8652*53ee8cc1Swenshuai.xi }
8653*53ee8cc1Swenshuai.xi }
8654*53ee8cc1Swenshuai.xi
8655*53ee8cc1Swenshuai.xi _DRV_HVD_EX_RET(u8DrvId, eRet);
8656*53ee8cc1Swenshuai.xi }
MDrv_HVD_EX_BBU_Proc(MS_U32 u32Id)8657*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_BBU_Proc(MS_U32 u32Id)
8658*53ee8cc1Swenshuai.xi {
8659*53ee8cc1Swenshuai.xi HAL_HVD_EX_BBU_Proc(u32Id);
8660*53ee8cc1Swenshuai.xi }
MDrv_HVD_EX_BBU_StopProc(MS_U32 u32Id)8661*53ee8cc1Swenshuai.xi void MDrv_HVD_EX_BBU_StopProc(MS_U32 u32Id)
8662*53ee8cc1Swenshuai.xi {
8663*53ee8cc1Swenshuai.xi HAL_HVD_EX_BBU_StopProc(u32Id);
8664*53ee8cc1Swenshuai.xi }
8665*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_CHIP_Capability(void * pHWCap)8666*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_EX_CHIP_Capability(void* pHWCap)
8667*53ee8cc1Swenshuai.xi {
8668*53ee8cc1Swenshuai.xi return HAL_VPU_EX_CHIP_Capability(pHWCap);
8669*53ee8cc1Swenshuai.xi }
8670*53ee8cc1Swenshuai.xi
8671*53ee8cc1Swenshuai.xi #else
MDrv_HVD_EX_LoadCodeInSecure(MS_U32 addr)8672*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_LoadCodeInSecure(MS_U32 addr)
8673*53ee8cc1Swenshuai.xi {
8674*53ee8cc1Swenshuai.xi return HAL_VPU_EX_LoadCodeInSecure(addr);
8675*53ee8cc1Swenshuai.xi }
8676*53ee8cc1Swenshuai.xi
MDrv_HVD_EX_SetLockDownRegister(void * param)8677*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_EX_SetLockDownRegister(void* param)
8678*53ee8cc1Swenshuai.xi {
8679*53ee8cc1Swenshuai.xi if(param == NULL)
8680*53ee8cc1Swenshuai.xi {
8681*53ee8cc1Swenshuai.xi return FALSE;
8682*53ee8cc1Swenshuai.xi }
8683*53ee8cc1Swenshuai.xi return HAL_VPU_EX_SetLockDownRegister(param);
8684*53ee8cc1Swenshuai.xi }
8685*53ee8cc1Swenshuai.xi
8686*53ee8cc1Swenshuai.xi #endif
8687*53ee8cc1Swenshuai.xi
8688*53ee8cc1Swenshuai.xi
8689*53ee8cc1Swenshuai.xi
8690*53ee8cc1Swenshuai.xi
8691