xref: /utopia/UTPA2-700.0.x/modules/vdec_v1/drv/hvd/drvHVD_sub.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi //    Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi //    No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi //    modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi //    supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi //    Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi //    Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi //    obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi //    such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi //    MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi //    confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi //    third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi //    without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi //    intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi //    and in conformity with any international standard.  You agree to waive any
38*53ee8cc1Swenshuai.xi //    claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi //    incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi //    In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi //    consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi //    revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi //    You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi //    even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi //    request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi //    parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi //    services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi //    MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi //    ("Services").
52*53ee8cc1Swenshuai.xi //    You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi //    writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi //    disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi //    or otherwise:
58*53ee8cc1Swenshuai.xi //    (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi //        mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi //    (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi //        including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi //        of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi //    (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi //    of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi //    Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi //    settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi //    Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi //    with the said Rules.
72*53ee8cc1Swenshuai.xi //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi //    be English.
74*53ee8cc1Swenshuai.xi //    The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi ///
97*53ee8cc1Swenshuai.xi /// file    drvHVD_sub.c
98*53ee8cc1Swenshuai.xi /// @brief  SubHVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi #if defined(SUPPORT_HVD_SUB)
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi //  Include Files
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi // Common Definition
106*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
107*53ee8cc1Swenshuai.xi #include "drvHVD.h"
108*53ee8cc1Swenshuai.xi #include "drvHVD_def.h"
109*53ee8cc1Swenshuai.xi #include "drvHVD_sub.h"
110*53ee8cc1Swenshuai.xi #include "drvHVD_sub_def.h"
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi #if defined(CHIP_T2)
113*53ee8cc1Swenshuai.xi #include "halSVD.h"
114*53ee8cc1Swenshuai.xi #include "regSVD.h"
115*53ee8cc1Swenshuai.xi #include "fwSVD_if.h"
116*53ee8cc1Swenshuai.xi #else
117*53ee8cc1Swenshuai.xi     #include "halHVD.h"
118*53ee8cc1Swenshuai.xi     #include "halHVD_sub.h"
119*53ee8cc1Swenshuai.xi     #include "fwHVD_if.h"
120*53ee8cc1Swenshuai.xi     #include "halVPU.h"
121*53ee8cc1Swenshuai.xi #endif
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
124*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
125*53ee8cc1Swenshuai.xi #endif
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
128*53ee8cc1Swenshuai.xi //  Driver Compiler Options
129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
133*53ee8cc1Swenshuai.xi //  Local Defines
134*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
135*53ee8cc1Swenshuai.xi // Drv memory usage
136*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
137*53ee8cc1Swenshuai.xi     #define HVD_DTV_VIDEO_DELAY         0 // ms
138*53ee8cc1Swenshuai.xi #else
139*53ee8cc1Swenshuai.xi     #define HVD_DTV_VIDEO_DELAY         0 // ms
140*53ee8cc1Swenshuai.xi #endif
141*53ee8cc1Swenshuai.xi #define HVD_FW_CMD_TIMEOUT_DEFAULT      100 // ms
142*53ee8cc1Swenshuai.xi #define HVD_FW_EXIT_ACTION_TIMEOUT      3500 // ms
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi #define HVD_CTRL_INIT_FINISHED          BIT(0)    // deflaut: 0
145*53ee8cc1Swenshuai.xi #define HVD_CTRL_PROCESSING             BIT(1)    // deflaut: 0
146*53ee8cc1Swenshuai.xi #define HVD_CTRL_DATA_END               BIT(2)    // deflaut: 0
147*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISPLAY_CTRL           BIT(3)    // deflaut: 0
148*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_INFO_RDY          BIT(4)    // deflaut: 0
149*53ee8cc1Swenshuai.xi #define HVD_CTRL_CODE_MIU_1             BIT(5)    // deflaut: 0
150*53ee8cc1Swenshuai.xi #define HVD_CTRL_ES_MIU_1               BIT(6)    // deflaut: 0
151*53ee8cc1Swenshuai.xi #define HVD_CTRL_FRM_MIU_1              BIT(7)    // deflaut: 0
152*53ee8cc1Swenshuai.xi #define HVD_CTRL_DRVPROCC_MIU_1         BIT(8)    // deflaut: 0
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi typedef enum
155*53ee8cc1Swenshuai.xi {
156*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_NONE = 0, //decode -> decode_finish
157*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_INIT,
158*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_TRIGGER_DISP,
159*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_SEEK2PTS,
160*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_MAX,
161*53ee8cc1Swenshuai.xi } HVD_Check_Cmd;
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_HVD     BIT(0)
164*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_MVD     BIT(1)
165*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_VPU     BIT(2)
166*53ee8cc1Swenshuai.xi 
167*53ee8cc1Swenshuai.xi #define _DRV_HVD_Entry()        {gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_PROCESSING;}
168*53ee8cc1Swenshuai.xi #define _DRV_HVD_Return(_ret)   {gSubHVDCtrl.u32CtrlMode &= (~HVD_CTRL_PROCESSING); return (_ret);}
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi #define _DRV_HVD_Initedn()      {if( !bHVDIsInited ){ return ; }}
171*53ee8cc1Swenshuai.xi #define _DRV_HVD_Inited(_ret)   {if( !bHVDIsInited ){ return (_ret); }}
172*53ee8cc1Swenshuai.xi #define _DRV_HVD_Rsting(_ret)   {if( bHVDIsIniting ){ return (_ret); }}
173*53ee8cc1Swenshuai.xi #define _DRV_HVD_Ctrl(x)        ( gSubHVDCtrl.u32CtrlMode & (x) )
174*53ee8cc1Swenshuai.xi #define _DRV_HVD_SetCtrl(x)     { gSubHVDCtrl.u32CtrlMode |= (x); }
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
177*53ee8cc1Swenshuai.xi //  Local Structurs
178*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
181*53ee8cc1Swenshuai.xi //  Global Variables
182*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
183*53ee8cc1Swenshuai.xi HVD_Drv_Ctrl    gSubHVDCtrl;
184*53ee8cc1Swenshuai.xi MS_U32 u32SubUartCtrl=(E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_MUST);
185*53ee8cc1Swenshuai.xi MS_U32 u32SubInitSysTimeBase=0;
186*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
187*53ee8cc1Swenshuai.xi //  Local Variables
188*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
189*53ee8cc1Swenshuai.xi static HVD_DrvInfo DrvInfo;
190*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsInited=FALSE;
191*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsIniting=FALSE;
192*53ee8cc1Swenshuai.xi static HVD_ISR_Ctrl gHVDISRCtrl={ FALSE, FALSE, 0  , NULL };
193*53ee8cc1Swenshuai.xi static HVD_BBU_Info gHVDPacket={0,0,0,0,0,0, FALSE};
194*53ee8cc1Swenshuai.xi static unsigned char u8_4Lines[64];
195*53ee8cc1Swenshuai.xi //MS_U8 pu8HVD_DMAcpy_pool[20];
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitVariables(HVD_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams);
198*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_Check_Cmd(HVD_Check_Cmd etype);
199*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitFW_AVC(void);
200*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_Check_FW_Version(void);
201*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitFW(void);
202*53ee8cc1Swenshuai.xi 
203*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
204*53ee8cc1Swenshuai.xi //  Debug Functions
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi 
208*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
209*53ee8cc1Swenshuai.xi //  Local Functions
210*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_HVD_Sub_Chip_Flush_Memory(void)211*53ee8cc1Swenshuai.xi void _HVD_Sub_Chip_Flush_Memory(void)
212*53ee8cc1Swenshuai.xi {
213*53ee8cc1Swenshuai.xi     unsigned char *pu8;
214*53ee8cc1Swenshuai.xi     volatile unsigned char tmp;
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     // Transfer the memory to noncache memory
217*53ee8cc1Swenshuai.xi     // Flush the data from pipe and buffer in MIU
218*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.u32DummyWriteBuf != 0 )
219*53ee8cc1Swenshuai.xi     {
220*53ee8cc1Swenshuai.xi         pu8 = ((unsigned char *)(((unsigned int)gSubHVDCtrl.u32DummyWriteBuf   )  ));
221*53ee8cc1Swenshuai.xi #if 1
222*53ee8cc1Swenshuai.xi         pu8[0] = pu8[16] = pu8[32] = pu8[48] = 1;
223*53ee8cc1Swenshuai.xi #else
224*53ee8cc1Swenshuai.xi         // TODO: this patch is necessary for T3_nos_mips & simpleplayer.
225*53ee8cc1Swenshuai.xi         {
226*53ee8cc1Swenshuai.xi             MS_U32 cnt=0;
227*53ee8cc1Swenshuai.xi             for (cnt = 0; cnt < 128; cnt++)
228*53ee8cc1Swenshuai.xi             {
229*53ee8cc1Swenshuai.xi                 *pu8 = 1;
230*53ee8cc1Swenshuai.xi                 pu8++;
231*53ee8cc1Swenshuai.xi             }
232*53ee8cc1Swenshuai.xi         }
233*53ee8cc1Swenshuai.xi #endif
234*53ee8cc1Swenshuai.xi     }
235*53ee8cc1Swenshuai.xi     else
236*53ee8cc1Swenshuai.xi     {
237*53ee8cc1Swenshuai.xi         pu8 = ((unsigned char *)(((unsigned int)u8_4Lines)  ));
238*53ee8cc1Swenshuai.xi         pu8[0] = pu8[16] = pu8[32] = pu8[48] = 1;
239*53ee8cc1Swenshuai.xi     }
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi     // Flush the data in the EC bridge buffer
242*53ee8cc1Swenshuai.xi     //mb();
243*53ee8cc1Swenshuai.xi     HAL_MEMORY_BARRIER();
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi     // final read
246*53ee8cc1Swenshuai.xi     tmp = pu8[0] ;
247*53ee8cc1Swenshuai.xi     tmp = pu8[16] ;
248*53ee8cc1Swenshuai.xi     tmp = pu8[32] ;
249*53ee8cc1Swenshuai.xi     tmp = pu8[48] ;
250*53ee8cc1Swenshuai.xi }
251*53ee8cc1Swenshuai.xi 
_HVD_Sub_Chip_Read_Memory(void)252*53ee8cc1Swenshuai.xi void _HVD_Sub_Chip_Read_Memory(void)
253*53ee8cc1Swenshuai.xi {
254*53ee8cc1Swenshuai.xi     volatile unsigned char *pu8;
255*53ee8cc1Swenshuai.xi     volatile unsigned int t;
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi     // Transfer the memory to noncache memory
258*53ee8cc1Swenshuai.xi     pu8 = (volatile unsigned char *)(((unsigned int)gSubHVDCtrl.MemMap.u32CodeBufVAddr));
259*53ee8cc1Swenshuai.xi 
260*53ee8cc1Swenshuai.xi     t = pu8[0];
261*53ee8cc1Swenshuai.xi     t = pu8[64];
262*53ee8cc1Swenshuai.xi }
263*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitVariables(HVD_MemCfg * pStMemCfg,HVD_Init_Params * pStInitParams)264*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitVariables(HVD_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams)
265*53ee8cc1Swenshuai.xi {
266*53ee8cc1Swenshuai.xi     HVD_memset((void *) &gSubHVDCtrl, 0, sizeof(HVD_Drv_Ctrl));
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi     if (sizeof(HVD_Init_Params) == sizeof(HVD_Init_Settings))
269*53ee8cc1Swenshuai.xi     {
270*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) &gSubHVDCtrl.InitParams,
271*53ee8cc1Swenshuai.xi                    pStInitParams,
272*53ee8cc1Swenshuai.xi                    sizeof(HVD_Init_Params));
273*53ee8cc1Swenshuai.xi     }
274*53ee8cc1Swenshuai.xi     else
275*53ee8cc1Swenshuai.xi     {
276*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR("HVD Err: HVD struct define is diff: HVD_Init_Params(%lu) vs HVD_Init_Settings(%lu)\n",
277*53ee8cc1Swenshuai.xi                     (MS_U32)sizeof(HVD_Init_Params),
278*53ee8cc1Swenshuai.xi                     (MS_U32)sizeof(HVD_Init_Settings));
279*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
280*53ee8cc1Swenshuai.xi     }
281*53ee8cc1Swenshuai.xi 
282*53ee8cc1Swenshuai.xi     // fill memory
283*53ee8cc1Swenshuai.xi #if 0
284*53ee8cc1Swenshuai.xi     HVD_memcpy( (void*)&gSubHVDCtrl.MemMap ,  pStMemCfg  , sizeof(HVD_Mem_Map)  );
285*53ee8cc1Swenshuai.xi #else
286*53ee8cc1Swenshuai.xi     if (pStMemCfg->u32MIU1BaseAddr == 0)
287*53ee8cc1Swenshuai.xi     {
288*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MSOS_MIU1_BASE
289*53ee8cc1Swenshuai.xi         gSubHVDCtrl.MemMap.u32MIU1BaseAddr=  HAL_MIU1_BASE;
290*53ee8cc1Swenshuai.xi #else
291*53ee8cc1Swenshuai.xi         gSubHVDCtrl.MemMap.u32MIU1BaseAddr=  HVD_MIU1_BASE_ADDRESS;
292*53ee8cc1Swenshuai.xi #endif
293*53ee8cc1Swenshuai.xi     }
294*53ee8cc1Swenshuai.xi     else
295*53ee8cc1Swenshuai.xi     {
296*53ee8cc1Swenshuai.xi         gSubHVDCtrl.MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr;
297*53ee8cc1Swenshuai.xi     }
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.eFWSourceType       = (HVD_FWInputSourceType) pStMemCfg->eFWSourceType;
300*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FWBinaryVAddr    = pStMemCfg->u32FWBinaryVAddr;
301*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FWBinaryAddr     = (MS_U32) pStMemCfg->u32FWBinaryAddr;
302*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FWBinarySize     = pStMemCfg->u32FWBinarySize;
303*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32VLCBinaryVAddr   = pStMemCfg->u32VLCBinaryVAddr;
304*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32VLCBinaryAddr    = (MS_U32) pStMemCfg->u32VLCBinaryAddr;
305*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32VLCBinarySize    = pStMemCfg->u32VLCBinarySize;
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32CodeBufVAddr     = pStMemCfg->u32CodeBufVAddr;
308*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32CodeBufAddr      = (MS_U32) pStMemCfg->u32CodeBufAddr;
309*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32CodeBufSize      = pStMemCfg->u32CodeBufSize;
310*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FrameBufVAddr    = pStMemCfg->u32FrameBufVAddr;
311*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FrameBufAddr     = (MS_U32) pStMemCfg->u32FrameBufAddr;
312*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FrameBufSize     = pStMemCfg->u32FrameBufSize;
313*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32BitstreamBufVAddr= pStMemCfg->u32BitstreamBufVAddr;
314*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr ;
315*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize ;
316*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
317*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32DrvProcessBufAddr = (MS_U32)pStMemCfg->u32DrvProcessBufAddr;
318*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32DrvProcessBufSize = pStMemCfg->u32DrvProcessBufSize;
319*53ee8cc1Swenshuai.xi #endif
320*53ee8cc1Swenshuai.xi     // get non-cache address
321*53ee8cc1Swenshuai.xi #if 0
322*53ee8cc1Swenshuai.xi     if( pStMemCfg->u32CPUNonCacheMask == 0 )
323*53ee8cc1Swenshuai.xi     {
324*53ee8cc1Swenshuai.xi         #if defined (__aeon__)
325*53ee8cc1Swenshuai.xi             #if defined (CHIP_T2)
326*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32CPUNonCacheMask=0x80000000;
327*53ee8cc1Swenshuai.xi             #else
328*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32CPUNonCacheMask=0xC0000000;
329*53ee8cc1Swenshuai.xi             #endif
330*53ee8cc1Swenshuai.xi         #else   // MIPS
331*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CPUNonCacheMask=0xA0000000;
332*53ee8cc1Swenshuai.xi         #endif
333*53ee8cc1Swenshuai.xi     }
334*53ee8cc1Swenshuai.xi     else
335*53ee8cc1Swenshuai.xi     {
336*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CPUNonCacheMask = pStMemCfg->u32CPUNonCacheMask;
337*53ee8cc1Swenshuai.xi     }
338*53ee8cc1Swenshuai.xi     #if defined( MSOS_TYPE_LINUX) || defined(REDLION_LINUX_KERNEL_ENVI)
339*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32CPUNonCacheMask=0;
340*53ee8cc1Swenshuai.xi     #endif
341*53ee8cc1Swenshuai.xi     // Virtual address to physical
342*53ee8cc1Swenshuai.xi #if 0
343*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32CodeBufAddr=   HVD_VA2PA( pStMemCfg->u32CodeBufVAddr  ) ;
344*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FrameBufAddr=   HVD_VA2PA( pStMemCfg->u32FrameBufVAddr  ) ;
345*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32BitstreamBufAddr=   HVD_VA2PA( pStMemCfg->u32BitstreamBufVAddr  ) ;
346*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32DrvProcessBufAddr = HVD_VA2PA( pStMemCfg->u32DrvProcessBufVAddr  ) ;
347*53ee8cc1Swenshuai.xi #endif
348*53ee8cc1Swenshuai.xi     // remove non-cache
349*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32BitstreamBufAddr &= (~gSubHVDCtrl.u32CPUNonCacheMask);
350*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32CodeBufAddr &= (~gSubHVDCtrl.u32CPUNonCacheMask);
351*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32FrameBufAddr &= (~gSubHVDCtrl.u32CPUNonCacheMask);
352*53ee8cc1Swenshuai.xi     gSubHVDCtrl.MemMap.u32DrvProcessBufAddr &= (~gSubHVDCtrl.u32CPUNonCacheMask);
353*53ee8cc1Swenshuai.xi #endif
354*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_INFO("HVD mmap: MIU1base:%lx FW(%d %lx %lx %lx)vlc(%lx %lx %lx) (Va,Pa,Siz)Co(%lx %lx %lx)Fr(%lx %lx %lx)Bit(%lx %lx %lx) Drv(%lx %lx %lx)\n",
355*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32MIU1BaseAddr,
356*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.eFWSourceType,
357*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32FWBinaryVAddr,
358*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32FWBinaryAddr,
359*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32FWBinarySize,
360*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32VLCBinaryVAddr,
361*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32VLCBinaryAddr,
362*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32VLCBinarySize,
363*53ee8cc1Swenshuai.xi                  pStMemCfg->u32CodeBufVAddr,
364*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32CodeBufAddr,
365*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32CodeBufSize,
366*53ee8cc1Swenshuai.xi                  pStMemCfg->u32FrameBufVAddr,
367*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32FrameBufAddr,
368*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32FrameBufSize,
369*53ee8cc1Swenshuai.xi                  pStMemCfg->u32BitstreamBufVAddr,
370*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32BitstreamBufAddr,
371*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32BitstreamBufSize,
372*53ee8cc1Swenshuai.xi                  pStMemCfg->u32DrvProcessBufVAddr,
373*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32DrvProcessBufAddr,
374*53ee8cc1Swenshuai.xi                  gSubHVDCtrl.MemMap.u32DrvProcessBufSize);
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi     gSubHVDCtrl.InitParams.u16DecoderClock = HAL_HVD_Sub_GetCorretClock(pStInitParams->u16DecoderClock);
377*53ee8cc1Swenshuai.xi     {
378*53ee8cc1Swenshuai.xi         MS_U32 offset = HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_DUMMY_WRITE_ADDR);
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi         if (offset != 0)
381*53ee8cc1Swenshuai.xi         {
382*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32DummyWriteBuf = gSubHVDCtrl.MemMap.u32CodeBufVAddr + offset;
383*53ee8cc1Swenshuai.xi         }
384*53ee8cc1Swenshuai.xi     }
385*53ee8cc1Swenshuai.xi 
386*53ee8cc1Swenshuai.xi #if HVD_ENABLE_STOP_ACCESS_OVER_256
387*53ee8cc1Swenshuai.xi     gSubHVDCtrl.bCannotAccessMIU256 = TRUE;
388*53ee8cc1Swenshuai.xi #endif
389*53ee8cc1Swenshuai.xi 
390*53ee8cc1Swenshuai.xi     gSubHVDCtrl.bAutoRmLastZeroByte = TRUE;
391*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32CmdTimeout = HVD_FW_CMD_TIMEOUT_DEFAULT;
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi     if (pStInitParams->u8TurboInit & E_HVD_TURBOINIT_FW_RELOAD)
394*53ee8cc1Swenshuai.xi     {
395*53ee8cc1Swenshuai.xi         gSubHVDCtrl.bTurboFWMode = TRUE;
396*53ee8cc1Swenshuai.xi     }
397*53ee8cc1Swenshuai.xi 
398*53ee8cc1Swenshuai.xi #if !(defined(CHIP_T2) || defined(CHIP_T7))
399*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u32MiuBurstLevel = (MS_U32)E_HVD_BURST_CNT_DISABLE;
400*53ee8cc1Swenshuai.xi #endif
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     return E_HVD_OK;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_Check_Cmd(HVD_Check_Cmd eCmd)405*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_Check_Cmd(HVD_Check_Cmd eCmd)
406*53ee8cc1Swenshuai.xi {
407*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp0 = 0;
408*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp1 = 0;
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi     switch (eCmd)
411*53ee8cc1Swenshuai.xi     {
412*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_INIT:
413*53ee8cc1Swenshuai.xi         {
414*53ee8cc1Swenshuai.xi             if (!(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK))
415*53ee8cc1Swenshuai.xi             {
416*53ee8cc1Swenshuai.xi                 // Check mode
417*53ee8cc1Swenshuai.xi                 u32Tmp0 = gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK;
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi                 if (!MDrv_HVD_Sub_GetCaps((HVD_Codec) u32Tmp0))
420*53ee8cc1Swenshuai.xi                 {
421*53ee8cc1Swenshuai.xi                     HVD_SUB_MSG_ERR("Check Cmd Err: Init: HW not support type:%d\n", eCmd);
422*53ee8cc1Swenshuai.xi                     return E_HVD_RET_UNSUPPORTED;
423*53ee8cc1Swenshuai.xi                 }
424*53ee8cc1Swenshuai.xi 
425*53ee8cc1Swenshuai.xi                 u32Tmp0 = gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
426*53ee8cc1Swenshuai.xi 
427*53ee8cc1Swenshuai.xi                 if (u32Tmp0 == HVD_INIT_MAIN_LIVE_STREAM)
428*53ee8cc1Swenshuai.xi                 {
429*53ee8cc1Swenshuai.xi                     if ((gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_DRV)
430*53ee8cc1Swenshuai.xi                     {
431*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR("Check Cmd Err: Init: Live stream mode can not use Drv input\n");
432*53ee8cc1Swenshuai.xi                         return E_HVD_RET_INVALID_PARAMETER;
433*53ee8cc1Swenshuai.xi                     }
434*53ee8cc1Swenshuai.xi                     if(!(gSubHVDCtrl.InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI|HVD_INIT_DBG_FW)))
435*53ee8cc1Swenshuai.xi                     {
436*53ee8cc1Swenshuai.xi                         // need not to check this under debug mode
437*53ee8cc1Swenshuai.xi                         if ((gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK) == HVD_INIT_START_CODE_REMOVED)
438*53ee8cc1Swenshuai.xi                         {
439*53ee8cc1Swenshuai.xi                             HVD_SUB_MSG_ERR("Check Cmd Err: Init: Live stream mode must have start code\n");
440*53ee8cc1Swenshuai.xi                             return E_HVD_RET_INVALID_PARAMETER;
441*53ee8cc1Swenshuai.xi                         }
442*53ee8cc1Swenshuai.xi                         if (gSubHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON)
443*53ee8cc1Swenshuai.xi                         {
444*53ee8cc1Swenshuai.xi                             HVD_SUB_MSG_ERR("Check Cmd Err: Init: Live stream mode can not use none ATS sync mode\n");
445*53ee8cc1Swenshuai.xi                             return E_HVD_RET_INVALID_PARAMETER;
446*53ee8cc1Swenshuai.xi                         }
447*53ee8cc1Swenshuai.xi                     }
448*53ee8cc1Swenshuai.xi                 }
449*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 == HVD_INIT_MAIN_FILE_RAW)
450*53ee8cc1Swenshuai.xi                       || (u32Tmp0 == HVD_INIT_MAIN_FILE_TS))
451*53ee8cc1Swenshuai.xi                 {
452*53ee8cc1Swenshuai.xi                     if (!(gSubHVDCtrl.InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
453*53ee8cc1Swenshuai.xi                     {
454*53ee8cc1Swenshuai.xi                         if((gSubHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_DTS)
455*53ee8cc1Swenshuai.xi                         && (gSubHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_PTS)
456*53ee8cc1Swenshuai.xi                         && (gSubHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON))
457*53ee8cc1Swenshuai.xi                         {
458*53ee8cc1Swenshuai.xi                             HVD_SUB_MSG_ERR("Check Cmd Err: Init: sync mode is not set. use default value:%d\n",
459*53ee8cc1Swenshuai.xi                                         (MS_U16)E_HVD_SYNC_TBL_TYPE_PTS);
460*53ee8cc1Swenshuai.xi                             gSubHVDCtrl.InitParams.u8SyncType = E_HVD_SYNC_TBL_TYPE_PTS;
461*53ee8cc1Swenshuai.xi                         }
462*53ee8cc1Swenshuai.xi                     }
463*53ee8cc1Swenshuai.xi                 }
464*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 != HVD_INIT_MAIN_FILE_RAW)
465*53ee8cc1Swenshuai.xi                       && (u32Tmp0 != HVD_INIT_MAIN_FILE_TS))
466*53ee8cc1Swenshuai.xi                 {
467*53ee8cc1Swenshuai.xi                     HVD_SUB_MSG_ERR("Check Cmd Err: Init: main type can not be recognized:%ld\n", u32Tmp0);
468*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
469*53ee8cc1Swenshuai.xi                 }
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi                 // check memory map
472*53ee8cc1Swenshuai.xi                 if (gSubHVDCtrl.MemMap.u32MIU1BaseAddr == 0)
473*53ee8cc1Swenshuai.xi                 {
474*53ee8cc1Swenshuai.xi                     HVD_SUB_MSG_ERR("Check Cmd Err: Init: MIU 1 Base addr should not be zero\n");
475*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
476*53ee8cc1Swenshuai.xi                 }
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi                 if ((gSubHVDCtrl.MemMap.u32CodeBufAddr& 0x7FF) != 0)
479*53ee8cc1Swenshuai.xi                 {
480*53ee8cc1Swenshuai.xi                     HVD_SUB_MSG_ERR("Check Cmd Err: Init: Error HVD code address(0x%lx) must 2048 byte alignment\n",
481*53ee8cc1Swenshuai.xi                                 gSubHVDCtrl.MemMap.u32CodeBufAddr);
482*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
483*53ee8cc1Swenshuai.xi                 }
484*53ee8cc1Swenshuai.xi             }
485*53ee8cc1Swenshuai.xi 
486*53ee8cc1Swenshuai.xi             u32Tmp0 = gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
487*53ee8cc1Swenshuai.xi             u32Tmp1 = gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK;
488*53ee8cc1Swenshuai.xi 
489*53ee8cc1Swenshuai.xi             if (u32Tmp0 != HVD_INIT_MAIN_LIVE_STREAM)
490*53ee8cc1Swenshuai.xi             {
491*53ee8cc1Swenshuai.xi                 if (u32Tmp1 == HVD_INIT_INPUT_DRV)
492*53ee8cc1Swenshuai.xi                 {
493*53ee8cc1Swenshuai.xi                     // check if driver process buffer is in bitstream buffer.
494*53ee8cc1Swenshuai.xi                     MS_U32 tmpAddr = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr;
495*53ee8cc1Swenshuai.xi                     if (gSubHVDCtrl.MemMap.u32DrvProcessBufAddr == 0)
496*53ee8cc1Swenshuai.xi                     {
497*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR("Check Cmd Err: Init: Drv process buffer address should not be zero\n");
498*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.bNoDrvProccBuf = TRUE;
499*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
500*53ee8cc1Swenshuai.xi                     }
501*53ee8cc1Swenshuai.xi                     if ((gSubHVDCtrl.MemMap.u32BitstreamBufAddr > tmpAddr)
502*53ee8cc1Swenshuai.xi                     || (tmpAddr > (gSubHVDCtrl.MemMap.u32BitstreamBufAddr+gSubHVDCtrl.MemMap.u32BitstreamBufSize)))
503*53ee8cc1Swenshuai.xi                     {
504*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR("Check Cmd Warn: Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or MP4) and Drv input.\n");
505*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.bNoDrvProccBuf = TRUE;
506*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
507*53ee8cc1Swenshuai.xi                     }
508*53ee8cc1Swenshuai.xi                     if (gSubHVDCtrl.MemMap.u32DrvProcessBufSize
509*53ee8cc1Swenshuai.xi                     < (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<3) + 8))
510*53ee8cc1Swenshuai.xi                     {
511*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR("Check Cmd Warn: Init: File mode(TS or MP4) and Drv input must set the process buffer size and must be larger than %lu Bytes:%ld\n",
512*53ee8cc1Swenshuai.xi                                     gSubHVDCtrl.MemMap.u32DrvProcessBufSize,
513*53ee8cc1Swenshuai.xi                                     (MS_U32)(HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<3) + 8) );
514*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.bNoDrvProccBuf = TRUE;
515*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_OUTOF_MEMORY;
516*53ee8cc1Swenshuai.xi                     }
517*53ee8cc1Swenshuai.xi                     if (gSubHVDCtrl.MemMap.u32DrvProcessBufSize > 1)
518*53ee8cc1Swenshuai.xi                     {
519*53ee8cc1Swenshuai.xi                         tmpAddr = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr + gSubHVDCtrl.MemMap.u32DrvProcessBufSize -1;
520*53ee8cc1Swenshuai.xi                     }
521*53ee8cc1Swenshuai.xi                     else
522*53ee8cc1Swenshuai.xi                     {
523*53ee8cc1Swenshuai.xi                         tmpAddr = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr;
524*53ee8cc1Swenshuai.xi                     }
525*53ee8cc1Swenshuai.xi                     if ((gSubHVDCtrl.MemMap.u32BitstreamBufAddr > tmpAddr)
526*53ee8cc1Swenshuai.xi                     || (tmpAddr > (gSubHVDCtrl.MemMap.u32BitstreamBufAddr + gSubHVDCtrl.MemMap.u32BitstreamBufSize)))
527*53ee8cc1Swenshuai.xi                     {
528*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR("Check Cmd Warn: Init: The driver process buffer shall be located in the bitstream buffer under file mode(TS or PS) and Drv input.\n");
529*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.bNoDrvProccBuf = TRUE;
530*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
531*53ee8cc1Swenshuai.xi                     }
532*53ee8cc1Swenshuai.xi                 }
533*53ee8cc1Swenshuai.xi                 else
534*53ee8cc1Swenshuai.xi                 {
535*53ee8cc1Swenshuai.xi                     ;// TODO: check if the TSP MIU sel is the same with the MIU lacation of process buffer.
536*53ee8cc1Swenshuai.xi                 }
537*53ee8cc1Swenshuai.xi             }
538*53ee8cc1Swenshuai.xi             break;
539*53ee8cc1Swenshuai.xi         }
540*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_SEEK2PTS:
541*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_TRIGGER_DISP:
542*53ee8cc1Swenshuai.xi #if 0
543*53ee8cc1Swenshuai.xi if( MDrv_HVD_GetPlayMode( E_HVD_GMODE_IS_SYNC_ON )  )
544*53ee8cc1Swenshuai.xi {
545*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_ERR("Check Cmd Err: Cmd type:%d Sync Active: %lx\n", (MS_U16)eCmd ,  (MS_S32)MDrv_HVD_GetPlayMode( E_HVD_GMODE_IS_SYNC_ON ) );
546*53ee8cc1Swenshuai.xi     return E_HVD_RET_ILLEGAL_ACCESS;
547*53ee8cc1Swenshuai.xi }
548*53ee8cc1Swenshuai.xi #endif
549*53ee8cc1Swenshuai.xi             break;
550*53ee8cc1Swenshuai.xi         default:
551*53ee8cc1Swenshuai.xi             return E_HVD_OK;
552*53ee8cc1Swenshuai.xi     }
553*53ee8cc1Swenshuai.xi     return E_HVD_OK;
554*53ee8cc1Swenshuai.xi }
555*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitShareMem(void)556*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_InitShareMem(void)
557*53ee8cc1Swenshuai.xi {
558*53ee8cc1Swenshuai.xi     return (HVD_Result)HAL_HVD_Sub_InitShareMem();
559*53ee8cc1Swenshuai.xi }
560*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitRegCPU(void)561*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_InitRegCPU(void)
562*53ee8cc1Swenshuai.xi {
563*53ee8cc1Swenshuai.xi     // check MIU select
564*53ee8cc1Swenshuai.xi     if( !(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK) )
565*53ee8cc1Swenshuai.xi     {
566*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_CheckMIUSel( gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_UTOPIA_ENVI );
567*53ee8cc1Swenshuai.xi     }
568*53ee8cc1Swenshuai.xi     return (HVD_Result)HAL_HVD_Sub_InitRegCPU();
569*53ee8cc1Swenshuai.xi }
570*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_RstVariables(void)571*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_RstVariables(void)
572*53ee8cc1Swenshuai.xi {
573*53ee8cc1Swenshuai.xi     MS_BOOL bBitMIU1 = FALSE;
574*53ee8cc1Swenshuai.xi     MS_BOOL bCodeMIU1 = FALSE;
575*53ee8cc1Swenshuai.xi     // Init control flg
576*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32CtrlMode=0;
577*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.MemMap.u32CodeBufAddr >= gSubHVDCtrl.MemMap.u32MIU1BaseAddr )
578*53ee8cc1Swenshuai.xi     {
579*53ee8cc1Swenshuai.xi         //gSubHVDCtrl.MemMap.u32CodeBufAddr-=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
580*53ee8cc1Swenshuai.xi         //gSubHVDCtrl.MemMap.u32FrameBufAddr-=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
581*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_CODE_MIU_1;
582*53ee8cc1Swenshuai.xi         bCodeMIU1=TRUE;
583*53ee8cc1Swenshuai.xi     }
584*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.MemMap.u32BitstreamBufAddr >= gSubHVDCtrl.MemMap.u32MIU1BaseAddr  )
585*53ee8cc1Swenshuai.xi     {
586*53ee8cc1Swenshuai.xi         //gSubHVDCtrl.MemMap.u32BitstreamBufAddr-=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
587*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_ES_MIU_1;
588*53ee8cc1Swenshuai.xi         bBitMIU1=TRUE;
589*53ee8cc1Swenshuai.xi     }
590*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.MemMap.u32FrameBufAddr>= gSubHVDCtrl.MemMap.u32MIU1BaseAddr  )
591*53ee8cc1Swenshuai.xi     {
592*53ee8cc1Swenshuai.xi         //gSubHVDCtrl.MemMap.u32BitstreamBufAddr-=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
593*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_FRM_MIU_1;
594*53ee8cc1Swenshuai.xi     }
595*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.MemMap.u32DrvProcessBufAddr>= gSubHVDCtrl.MemMap.u32MIU1BaseAddr )
596*53ee8cc1Swenshuai.xi     {
597*53ee8cc1Swenshuai.xi         //gSubHVDCtrl.MemMap.u32BitstreamBufAddr-=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
598*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_DRVPROCC_MIU_1;
599*53ee8cc1Swenshuai.xi     }
600*53ee8cc1Swenshuai.xi 
601*53ee8cc1Swenshuai.xi     if(!gSubHVDCtrl.bNoDrvProccBuf)
602*53ee8cc1Swenshuai.xi     {
603*53ee8cc1Swenshuai.xi         // init nal table buffer start address.
604*53ee8cc1Swenshuai.xi         if( ( gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
605*53ee8cc1Swenshuai.xi         {
606*53ee8cc1Swenshuai.xi             if( bBitMIU1 != bCodeMIU1 )
607*53ee8cc1Swenshuai.xi             {
608*53ee8cc1Swenshuai.xi                 if( gSubHVDCtrl.MemMap.u32DrvProcessBufSize>
609*53ee8cc1Swenshuai.xi                     ( HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) <<3) + 8))
610*53ee8cc1Swenshuai.xi                 {
611*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
612*53ee8cc1Swenshuai.xi                     if( (( gSubHVDCtrl.u32BBUTblInBitstreamBufAddr + gSubHVDCtrl.MemMap.u32DrvProcessBufAddr) % 8) != 0)
613*53ee8cc1Swenshuai.xi                     {
614*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.u32BBUTblInBitstreamBufAddr = gSubHVDCtrl.u32BBUTblInBitstreamBufAddr + gSubHVDCtrl.MemMap.u32DrvProcessBufAddr + 7;
615*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.u32BBUTblInBitstreamBufAddr -= (gSubHVDCtrl.u32BBUTblInBitstreamBufAddr ) % 8;
616*53ee8cc1Swenshuai.xi                         gSubHVDCtrl.u32BBUTblInBitstreamBufAddr -= gSubHVDCtrl.MemMap.u32DrvProcessBufAddr;
617*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR( "HVD Err: Nal table in bitstream buffer start address is not aligned. old:%lx new:%lx" ,  (MS_U32)HVD_BBU_ST_ADDR_IN_BITSTREAMBUF  , gSubHVDCtrl.u32BBUTblInBitstreamBufAddr  );
618*53ee8cc1Swenshuai.xi                     }
619*53ee8cc1Swenshuai.xi                 }
620*53ee8cc1Swenshuai.xi                 else
621*53ee8cc1Swenshuai.xi                 {
622*53ee8cc1Swenshuai.xi                     HVD_SUB_MSG_ERR( "HVD Err: Driver process buffer size is not enough for driver input path. input:%lx required:%lx" ,  (MS_U32)gSubHVDCtrl.MemMap.u32DrvProcessBufSize  , ( HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) <<3) + 8)  );
623*53ee8cc1Swenshuai.xi                     return E_HVD_RET_OUTOF_MEMORY;
624*53ee8cc1Swenshuai.xi                 }
625*53ee8cc1Swenshuai.xi             }
626*53ee8cc1Swenshuai.xi         }
627*53ee8cc1Swenshuai.xi 
628*53ee8cc1Swenshuai.xi         // init AVI NULL packet pattern && RM flush pattern
629*53ee8cc1Swenshuai.xi         if( ( gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
630*53ee8cc1Swenshuai.xi         {
631*53ee8cc1Swenshuai.xi             MS_U8 *pNULLPattern=NULL;
632*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32NULLPacketAddr = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr;
633*53ee8cc1Swenshuai.xi             //pNULLPattern=(MS_U8 *)(((MS_U32)pu8HVD_DMAcpy_pool)  );
634*53ee8cc1Swenshuai.xi             //HVD_memset( (void*)pNULLPattern, 0 , sizeof( pu8HVD_DMAcpy_pool ) );
635*53ee8cc1Swenshuai.xi             // TODO: use other non-cachable VA addr
636*53ee8cc1Swenshuai.xi             pNULLPattern=(MS_U8 *)(((MS_U32)gSubHVDCtrl.MemMap.u32CodeBufVAddr)  );
637*53ee8cc1Swenshuai.xi             HVD_memset( (void*)pNULLPattern, 0 , 12 );
638*53ee8cc1Swenshuai.xi             switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
639*53ee8cc1Swenshuai.xi             {
640*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
641*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
642*53ee8cc1Swenshuai.xi                 if(  gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK )
643*53ee8cc1Swenshuai.xi                 {   // start code removed
644*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32NULLPacketSize = 8;
645*53ee8cc1Swenshuai.xi                     if( gSubHVDCtrl.MemMap.u32DrvProcessBufSize < gSubHVDCtrl.u32NULLPacketSize )
646*53ee8cc1Swenshuai.xi                     {
647*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
648*53ee8cc1Swenshuai.xi                     }
649*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xAA , gSubHVDCtrl.u32NULLPacketSize);
650*53ee8cc1Swenshuai.xi                     pNULLPattern[4] = 0X55;
651*53ee8cc1Swenshuai.xi                 }
652*53ee8cc1Swenshuai.xi                 else // start code remained
653*53ee8cc1Swenshuai.xi                 {
654*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32NULLPacketSize = 12;
655*53ee8cc1Swenshuai.xi                     if( gSubHVDCtrl.MemMap.u32DrvProcessBufSize < gSubHVDCtrl.u32NULLPacketSize )
656*53ee8cc1Swenshuai.xi                     {
657*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
658*53ee8cc1Swenshuai.xi                     }
659*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xAA , gSubHVDCtrl.u32NULLPacketSize);
660*53ee8cc1Swenshuai.xi                     pNULLPattern[0] = 0;
661*53ee8cc1Swenshuai.xi                     pNULLPattern[1] = 0;
662*53ee8cc1Swenshuai.xi                     pNULLPattern[2] = 1;
663*53ee8cc1Swenshuai.xi                     pNULLPattern[3] = 0xFF;
664*53ee8cc1Swenshuai.xi                     pNULLPattern[8] = 0X55;
665*53ee8cc1Swenshuai.xi                     //pNULLPattern[gSubHVDCtrl.u32NULLPacketSize-1] = 0x80;
666*53ee8cc1Swenshuai.xi                 }
667*53ee8cc1Swenshuai.xi 
668*53ee8cc1Swenshuai.xi                 if( bBitMIU1 != bCodeMIU1 )
669*53ee8cc1Swenshuai.xi                 {
670*53ee8cc1Swenshuai.xi                     #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
671*53ee8cc1Swenshuai.xi                     _HVD_Sub_Chip_Flush_Memory();
672*53ee8cc1Swenshuai.xi                     HVD_dmacpy(gSubHVDCtrl.MemMap.u32DrvProcessBufAddr, gSubHVDCtrl.MemMap.u32CodeBufAddr, gSubHVDCtrl.u32NULLPacketSize);
673*53ee8cc1Swenshuai.xi                     #else
674*53ee8cc1Swenshuai.xi                     HVD_memcpy((void*)(gSubHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gSubHVDCtrl.u32NULLPacketSize);
675*53ee8cc1Swenshuai.xi                     _HVD_Sub_Chip_Flush_Memory();
676*53ee8cc1Swenshuai.xi                     #endif
677*53ee8cc1Swenshuai.xi                 }
678*53ee8cc1Swenshuai.xi                 else
679*53ee8cc1Swenshuai.xi                 {
680*53ee8cc1Swenshuai.xi                     HVD_memcpy((void*)(gSubHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gSubHVDCtrl.u32NULLPacketSize);
681*53ee8cc1Swenshuai.xi                     _HVD_Sub_Chip_Flush_Memory();
682*53ee8cc1Swenshuai.xi                 }
683*53ee8cc1Swenshuai.xi 
684*53ee8cc1Swenshuai.xi                 break;
685*53ee8cc1Swenshuai.xi 
686*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
687*53ee8cc1Swenshuai.xi                 // RM has no NULL packet
688*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.u32NULLPacketSize = 0;
689*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.u32NULLPacketAddr =0;
690*53ee8cc1Swenshuai.xi                 #if HVD_ENABLE_RV_FEATURE
691*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32RV_FlushPacketAddr = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr;
692*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32RV_FlushPacketSize = 8;
693*53ee8cc1Swenshuai.xi                     if( gSubHVDCtrl.MemMap.u32DrvProcessBufSize < gSubHVDCtrl.u32RV_FlushPacketSize )
694*53ee8cc1Swenshuai.xi                     {
695*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
696*53ee8cc1Swenshuai.xi                     }
697*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xFF , gSubHVDCtrl.u32RV_FlushPacketSize);
698*53ee8cc1Swenshuai.xi                     {
699*53ee8cc1Swenshuai.xi                     #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
700*53ee8cc1Swenshuai.xi                         _HVD_Sub_Chip_Flush_Memory();
701*53ee8cc1Swenshuai.xi                         HVD_dmacpy(  gSubHVDCtrl.MemMap.u32DrvProcessBufAddr ,  gSubHVDCtrl.MemMap.u32CodeBufAddr ,  gSubHVDCtrl.u32RV_FlushPacketSize);
702*53ee8cc1Swenshuai.xi                     #else
703*53ee8cc1Swenshuai.xi                         HVD_memcpy((void*)(gSubHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gSubHVDCtrl.u32RV_FlushPacketSize);
704*53ee8cc1Swenshuai.xi                         _HVD_Sub_Chip_Flush_Memory();
705*53ee8cc1Swenshuai.xi                     #endif
706*53ee8cc1Swenshuai.xi                     }
707*53ee8cc1Swenshuai.xi                 #endif
708*53ee8cc1Swenshuai.xi                 break;
709*53ee8cc1Swenshuai.xi 
710*53ee8cc1Swenshuai.xi 
711*53ee8cc1Swenshuai.xi             default:
712*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.u32NULLPacketSize = 0;
713*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.u32NULLPacketAddr =0;
714*53ee8cc1Swenshuai.xi                 break;
715*53ee8cc1Swenshuai.xi             }
716*53ee8cc1Swenshuai.xi         }
717*53ee8cc1Swenshuai.xi         else
718*53ee8cc1Swenshuai.xi         {
719*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32NULLPacketSize = 0;
720*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32NULLPacketAddr =0;
721*53ee8cc1Swenshuai.xi         }
722*53ee8cc1Swenshuai.xi     }
723*53ee8cc1Swenshuai.xi 
724*53ee8cc1Swenshuai.xi     // reset other driver control variables
725*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32StepDecodeCnt=0;
726*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32LastESRptr=0;
727*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32BBUPacketCnt=0;
728*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32BBUWptr_Fired=0;
729*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32LastErrCode=0;
730*53ee8cc1Swenshuai.xi     gSubHVDCtrl.bIsDispInfoChg=0;
731*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&(gSubHVDCtrl.LastNal) ,  0   , sizeof(HVD_Nal_Entry)   );
732*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&(gSubHVDCtrl.LivingStatus) ,  0   , sizeof(HVD_Alive_Status)   );
733*53ee8cc1Swenshuai.xi 
734*53ee8cc1Swenshuai.xi     // Init HAL variables
735*53ee8cc1Swenshuai.xi     return (HVD_Result) HAL_HVD_Sub_InitVariables((MS_U32)(&gSubHVDCtrl));
736*53ee8cc1Swenshuai.xi }
737*53ee8cc1Swenshuai.xi 
738*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
739*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: _DRV_HVD_Sub_SetSyncMode()
740*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to sync video time stamp and STC.
741*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : sync type
742*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : only work under ( eMode == E_HVD_SYNC_ATS) , video delay toward Audio time stamp. It's minimun value is 0, and maximun value is 4500 ( unit:ms)
743*53ee8cc1Swenshuai.xi /// @return -The result of command set sync type
744*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
_DRV_HVD_Sub_SetSyncMode(HVD_Sync_Tbl_Type eMode)745*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_SetSyncMode( HVD_Sync_Tbl_Type eMode)
746*53ee8cc1Swenshuai.xi {
747*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_OK;
748*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
749*53ee8cc1Swenshuai.xi     eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_TYPE, eMode);
750*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
751*53ee8cc1Swenshuai.xi }
752*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitFW_AVC(void)753*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitFW_AVC(void)
754*53ee8cc1Swenshuai.xi {
755*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = gSubHVDCtrl.InitParams.u32ModeFlag;
756*53ee8cc1Swenshuai.xi 
757*53ee8cc1Swenshuai.xi     // common settings
758*53ee8cc1Swenshuai.xi     if (!(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
759*53ee8cc1Swenshuai.xi     {
760*53ee8cc1Swenshuai.xi         _DRV_HVD_Sub_SetSyncMode((HVD_Sync_Tbl_Type)gSubHVDCtrl.InitParams.u8SyncType);
761*53ee8cc1Swenshuai.xi 
762*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.u8MinFrmGap)
763*53ee8cc1Swenshuai.xi         {
764*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_MIN_FRAME_GAP,
765*53ee8cc1Swenshuai.xi                            gSubHVDCtrl.InitParams.u8MinFrmGap);
766*53ee8cc1Swenshuai.xi         }
767*53ee8cc1Swenshuai.xi 
768*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.u32MaxDecTick)
769*53ee8cc1Swenshuai.xi         {
770*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_MAX_DEC_TICK,
771*53ee8cc1Swenshuai.xi                            gSubHVDCtrl.InitParams.u32MaxDecTick);
772*53ee8cc1Swenshuai.xi         }
773*53ee8cc1Swenshuai.xi 
774*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.u16Pitch)
775*53ee8cc1Swenshuai.xi         {
776*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_PITCH, gSubHVDCtrl.InitParams.u16Pitch);
777*53ee8cc1Swenshuai.xi         }
778*53ee8cc1Swenshuai.xi 
779*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.bSyncEachFrm)
780*53ee8cc1Swenshuai.xi         {
781*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_EACH_FRM, TRUE);
782*53ee8cc1Swenshuai.xi         }
783*53ee8cc1Swenshuai.xi 
784*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.bFastDisplay)
785*53ee8cc1Swenshuai.xi         {
786*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_FAST_DISP, TRUE);
787*53ee8cc1Swenshuai.xi         }
788*53ee8cc1Swenshuai.xi 
789*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.bDynamicScaling)
790*53ee8cc1Swenshuai.xi         {
791*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DYNAMIC_SCALE, TRUE);
792*53ee8cc1Swenshuai.xi         }
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi         if (gSubHVDCtrl.InitParams.bUserData)
795*53ee8cc1Swenshuai.xi         {
796*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DPO_CC, TRUE);
797*53ee8cc1Swenshuai.xi         }
798*53ee8cc1Swenshuai.xi     }
799*53ee8cc1Swenshuai.xi 
800*53ee8cc1Swenshuai.xi     if (gSubHVDCtrl.InitParams.u8TimeUnit)
801*53ee8cc1Swenshuai.xi     {
802*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_SetCmd(E_HVD_CMD_TIME_UNIT_TYPE,
803*53ee8cc1Swenshuai.xi                        gSubHVDCtrl.InitParams.u8TimeUnit);
804*53ee8cc1Swenshuai.xi     }
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi     // specific settings
807*53ee8cc1Swenshuai.xi     switch (u32InitMode & HVD_INIT_MAIN_MASK)
808*53ee8cc1Swenshuai.xi     {
809*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_RAW:
810*53ee8cc1Swenshuai.xi         {
811*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DIS_VDEAD, TRUE);
812*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, TRUE);
813*53ee8cc1Swenshuai.xi 
814*53ee8cc1Swenshuai.xi             if (!(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
815*53ee8cc1Swenshuai.xi             {
816*53ee8cc1Swenshuai.xi                 HAL_HVD_Sub_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
817*53ee8cc1Swenshuai.xi             }
818*53ee8cc1Swenshuai.xi 
819*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_PARSER_BYPASS, TRUE);
820*53ee8cc1Swenshuai.xi 
821*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_PITCH , 1952 );
822*53ee8cc1Swenshuai.xi             // svd only
823*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_ES_FULL_STOP, TRUE);
824*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_BBU_RESIZE, 95);
825*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_PLAY , 0);
826*53ee8cc1Swenshuai.xi             break;
827*53ee8cc1Swenshuai.xi         }
828*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_TS:
829*53ee8cc1Swenshuai.xi         {
830*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DIS_VDEAD, TRUE);
831*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, TRUE);
832*53ee8cc1Swenshuai.xi 
833*53ee8cc1Swenshuai.xi             if (!(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
834*53ee8cc1Swenshuai.xi             {
835*53ee8cc1Swenshuai.xi                 HAL_HVD_Sub_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
836*53ee8cc1Swenshuai.xi             }
837*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_PITCH , 1952 );
838*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_SYNC_EACH_FRM ,  TRUE );
839*53ee8cc1Swenshuai.xi             // svd ONLY
840*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_ES_FULL_STOP, TRUE);
841*53ee8cc1Swenshuai.xi 
842*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_PLAY , 0);
843*53ee8cc1Swenshuai.xi             break;
844*53ee8cc1Swenshuai.xi         }
845*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_LIVE_STREAM:
846*53ee8cc1Swenshuai.xi         {
847*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_FORCE_RESET_HW, TRUE);
848*53ee8cc1Swenshuai.xi 
849*53ee8cc1Swenshuai.xi             if (gSubHVDCtrl.InitParams.u8TimeUnit)
850*53ee8cc1Swenshuai.xi             {
851*53ee8cc1Swenshuai.xi                 HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY,
852*53ee8cc1Swenshuai.xi                                (MS_U32) HVD_DTV_VIDEO_DELAY);
853*53ee8cc1Swenshuai.xi             }
854*53ee8cc1Swenshuai.xi             else
855*53ee8cc1Swenshuai.xi             {
856*53ee8cc1Swenshuai.xi                 HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY,
857*53ee8cc1Swenshuai.xi                                (MS_U32) HVD_DTV_VIDEO_DELAY*90);
858*53ee8cc1Swenshuai.xi             }
859*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_PITCH , 1984 );
860*53ee8cc1Swenshuai.xi             //HAL_HVD_Sub_SetCmd( E_HVD_CMD_MAX_DEC_TICK ,  6400000); //for GP only
861*53ee8cc1Swenshuai.xi             break;
862*53ee8cc1Swenshuai.xi         }
863*53ee8cc1Swenshuai.xi         default:
864*53ee8cc1Swenshuai.xi             break;
865*53ee8cc1Swenshuai.xi     }
866*53ee8cc1Swenshuai.xi 
867*53ee8cc1Swenshuai.xi     // svd only
868*53ee8cc1Swenshuai.xi     //HAL_HVD_Sub_SetCmd( E_HVD_CMD_FRAME_BUF_RESIZE , (gSubHVDCtrl.MemMap.u32BitstreamBufSize+gSubHVDCtrl.MemMap.u32CodeBufSize+gSubHVDCtrl.MemMap.u32FrameBufSize) >>20);
869*53ee8cc1Swenshuai.xi     return E_HVD_OK;
870*53ee8cc1Swenshuai.xi }
871*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitFW_RM(void)872*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_InitFW_RM(void)
873*53ee8cc1Swenshuai.xi {
874*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = gSubHVDCtrl.InitParams.u32ModeFlag;
875*53ee8cc1Swenshuai.xi 
876*53ee8cc1Swenshuai.xi     // common settings
877*53ee8cc1Swenshuai.xi     if( !(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY)  )
878*53ee8cc1Swenshuai.xi     {
879*53ee8cc1Swenshuai.xi         _DRV_HVD_Sub_SetSyncMode( (HVD_Sync_Tbl_Type)gSubHVDCtrl.InitParams.u8SyncType);
880*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.InitParams.u16Pitch)
881*53ee8cc1Swenshuai.xi         {
882*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd( E_HVD_CMD_PITCH ,  gSubHVDCtrl.InitParams.u16Pitch);
883*53ee8cc1Swenshuai.xi         }
884*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.InitParams.bSyncEachFrm)
885*53ee8cc1Swenshuai.xi         {
886*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd( E_HVD_CMD_SYNC_EACH_FRM ,  TRUE);
887*53ee8cc1Swenshuai.xi         }
888*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.InitParams.bFastDisplay)
889*53ee8cc1Swenshuai.xi         {
890*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd( E_HVD_CMD_FAST_DISP ,  TRUE);
891*53ee8cc1Swenshuai.xi         }
892*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.InitParams.bDynamicScaling)
893*53ee8cc1Swenshuai.xi         {
894*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd( E_HVD_CMD_DYNAMIC_SCALE ,  TRUE);
895*53ee8cc1Swenshuai.xi         }
896*53ee8cc1Swenshuai.xi     }
897*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.InitParams.u8TimeUnit)
898*53ee8cc1Swenshuai.xi     {
899*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_SetCmd( E_HVD_CMD_TIME_UNIT_TYPE ,  gSubHVDCtrl.InitParams.u8TimeUnit);
900*53ee8cc1Swenshuai.xi     }
901*53ee8cc1Swenshuai.xi     // specific settings
902*53ee8cc1Swenshuai.xi     switch( u32InitMode & HVD_INIT_MAIN_MASK )
903*53ee8cc1Swenshuai.xi     {
904*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_RAW:
905*53ee8cc1Swenshuai.xi         break;
906*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_TS:
907*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_LIVE_STREAM:
908*53ee8cc1Swenshuai.xi     default:
909*53ee8cc1Swenshuai.xi         break;
910*53ee8cc1Swenshuai.xi     }
911*53ee8cc1Swenshuai.xi 
912*53ee8cc1Swenshuai.xi     // svd only
913*53ee8cc1Swenshuai.xi     //HAL_HVD_Sub_SetCmd( E_HVD_CMD_FRAME_BUF_RESIZE , (gSubHVDCtrl.MemMap.u32BitstreamBufSize+gSubHVDCtrl.MemMap.u32CodeBufSize+gSubHVDCtrl.MemMap.u32FrameBufSize) >>20);
914*53ee8cc1Swenshuai.xi 
915*53ee8cc1Swenshuai.xi     // fix FFx4 display error
916*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetCmd( E_HVD_CMD_FORCE_RESET_HW , TRUE );
917*53ee8cc1Swenshuai.xi 
918*53ee8cc1Swenshuai.xi     return E_HVD_OK;
919*53ee8cc1Swenshuai.xi }
920*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_Check_FW_Version(void)921*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_Check_FW_Version(void)
922*53ee8cc1Swenshuai.xi {
923*53ee8cc1Swenshuai.xi     // check FW version ID
924*53ee8cc1Swenshuai.xi     if (!(gSubHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK))
925*53ee8cc1Swenshuai.xi     {
926*53ee8cc1Swenshuai.xi #if (HVD_HW_VERSION == HVD_HW_SVD)
927*53ee8cc1Swenshuai.xi         if (HVD_FW_VERSION != HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID))
928*53ee8cc1Swenshuai.xi         {
929*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD: fw interface and binary is not the same. fw ID: interface:%lx binary:%lx\n",
930*53ee8cc1Swenshuai.xi                         (MS_U32)HVD_FW_VERSION,
931*53ee8cc1Swenshuai.xi                         HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID));
932*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
933*53ee8cc1Swenshuai.xi         }
934*53ee8cc1Swenshuai.xi         // check if release required
935*53ee8cc1Swenshuai.xi         if (!(gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_DBG_FW))
936*53ee8cc1Swenshuai.xi         {
937*53ee8cc1Swenshuai.xi             // check debug version
938*53ee8cc1Swenshuai.xi             if ((HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_RELEASE_VERSION_MASK) < HVD_FW_VER_RELEASE_VERSION)
939*53ee8cc1Swenshuai.xi             {
940*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_MUST("HVD: FW is not release verion: binary:%lx\n",
941*53ee8cc1Swenshuai.xi                              HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID));
942*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
943*53ee8cc1Swenshuai.xi             }
944*53ee8cc1Swenshuai.xi         }
945*53ee8cc1Swenshuai.xi #else
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi         if( (HVD_FW_IF_VERSION>>16) != (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_IF_VERSION_ID)>>16) )
948*53ee8cc1Swenshuai.xi         {
949*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD: fw interface and binary is not the same. fw ID: interface:%lx binary:%lx\n",
950*53ee8cc1Swenshuai.xi                         (MS_U32)HVD_FW_IF_VERSION,
951*53ee8cc1Swenshuai.xi                         HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_IF_VERSION_ID));
952*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
953*53ee8cc1Swenshuai.xi         }
954*53ee8cc1Swenshuai.xi 
955*53ee8cc1Swenshuai.xi         // check if release required
956*53ee8cc1Swenshuai.xi         if (!(gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_DBG_FW))
957*53ee8cc1Swenshuai.xi         {
958*53ee8cc1Swenshuai.xi             // check debug version
959*53ee8cc1Swenshuai.xi             if (!(HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_RELEASE_VERSION))
960*53ee8cc1Swenshuai.xi             {
961*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_MUST("HVD: FW is not release verion: binary:%lx\n",
962*53ee8cc1Swenshuai.xi                              HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID));
963*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
964*53ee8cc1Swenshuai.xi             }
965*53ee8cc1Swenshuai.xi 
966*53ee8cc1Swenshuai.xi             if (HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_DUMP_DEBUG_MSG)
967*53ee8cc1Swenshuai.xi             {
968*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_MUST("HVD: FW release verion, but it has debug message. binary:%lx\n",
969*53ee8cc1Swenshuai.xi                              HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_VERSION_ID));
970*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
971*53ee8cc1Swenshuai.xi             }
972*53ee8cc1Swenshuai.xi         }
973*53ee8cc1Swenshuai.xi #endif
974*53ee8cc1Swenshuai.xi     }
975*53ee8cc1Swenshuai.xi     return E_HVD_OK;
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_InitFW(void)978*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_InitFW(void)
979*53ee8cc1Swenshuai.xi {
980*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_OK;
981*53ee8cc1Swenshuai.xi 
982*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_Sub_Check_FW_Version();
983*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_OK)
984*53ee8cc1Swenshuai.xi     {
985*53ee8cc1Swenshuai.xi         return eRet;
986*53ee8cc1Swenshuai.xi     }
987*53ee8cc1Swenshuai.xi 
988*53ee8cc1Swenshuai.xi     switch (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK)
989*53ee8cc1Swenshuai.xi     {
990*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
991*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_Sub_InitFW_AVC();
992*53ee8cc1Swenshuai.xi             break;
993*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
994*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_Sub_InitFW_AVC();
995*53ee8cc1Swenshuai.xi             break;
996*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
997*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_Sub_InitFW_RM();
998*53ee8cc1Swenshuai.xi             break;
999*53ee8cc1Swenshuai.xi         default:
1000*53ee8cc1Swenshuai.xi             break;
1001*53ee8cc1Swenshuai.xi     }
1002*53ee8cc1Swenshuai.xi     return eRet;
1003*53ee8cc1Swenshuai.xi }
1004*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_IsAllBufferEmpty(void)1005*53ee8cc1Swenshuai.xi MS_BOOL _DRV_HVD_Sub_IsAllBufferEmpty( void )
1006*53ee8cc1Swenshuai.xi {
1007*53ee8cc1Swenshuai.xi     MS_U32 playbacktype = gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK ;
1008*53ee8cc1Swenshuai.xi     if( playbacktype == HVD_INIT_MAIN_FILE_RAW)
1009*53ee8cc1Swenshuai.xi     {
1010*53ee8cc1Swenshuai.xi         if(HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_Q_NUMB) != 0)
1011*53ee8cc1Swenshuai.xi         {
1012*53ee8cc1Swenshuai.xi             return FALSE;
1013*53ee8cc1Swenshuai.xi         }
1014*53ee8cc1Swenshuai.xi     }
1015*53ee8cc1Swenshuai.xi     else //if( playbacktype == HVD_INIT_MAIN_FILE_TS ) TSP input
1016*53ee8cc1Swenshuai.xi     {
1017*53ee8cc1Swenshuai.xi         #if 0
1018*53ee8cc1Swenshuai.xi         if( HAL_HVD_Sub_GetData( E_HVD_GDATA_ES_READ_PTR) != HAL_HVD_Sub_GetData( E_HVD_GDATA_ES_WRITE_PTR) )
1019*53ee8cc1Swenshuai.xi         {
1020*53ee8cc1Swenshuai.xi             return FALSE;
1021*53ee8cc1Swenshuai.xi         }
1022*53ee8cc1Swenshuai.xi         #endif
1023*53ee8cc1Swenshuai.xi     }
1024*53ee8cc1Swenshuai.xi     {   // other Queues
1025*53ee8cc1Swenshuai.xi         if( ( (HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_Q_NUMB) == 0) &&
1026*53ee8cc1Swenshuai.xi                (HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_Q_NUMB) == 0) )
1027*53ee8cc1Swenshuai.xi                &&  (HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD)   )
1028*53ee8cc1Swenshuai.xi         {
1029*53ee8cc1Swenshuai.xi             return TRUE;
1030*53ee8cc1Swenshuai.xi         }
1031*53ee8cc1Swenshuai.xi         else
1032*53ee8cc1Swenshuai.xi         {
1033*53ee8cc1Swenshuai.xi             return FALSE;
1034*53ee8cc1Swenshuai.xi         }
1035*53ee8cc1Swenshuai.xi     }
1036*53ee8cc1Swenshuai.xi }
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
_DRV_HVD_Sub_ISRHandler(void)1039*53ee8cc1Swenshuai.xi MS_S32 _DRV_HVD_Sub_ISRHandler(void)
1040*53ee8cc1Swenshuai.xi #else
1041*53ee8cc1Swenshuai.xi void _DRV_HVD_Sub_ISRHandler(void)
1042*53ee8cc1Swenshuai.xi #endif
1043*53ee8cc1Swenshuai.xi {
1044*53ee8cc1Swenshuai.xi     if( gHVDISRCtrl.pfnISRCallBack != NULL )
1045*53ee8cc1Swenshuai.xi     {
1046*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bInISR = TRUE;
1047*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo = HAL_HVD_Sub_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
1048*53ee8cc1Swenshuai.xi         if( gHVDISRCtrl.u32ISRInfo )
1049*53ee8cc1Swenshuai.xi         {
1050*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_Enable_ISR(FALSE);
1051*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack();
1052*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_Enable_ISR(TRUE);
1053*53ee8cc1Swenshuai.xi         }
1054*53ee8cc1Swenshuai.xi     }
1055*53ee8cc1Swenshuai.xi     else
1056*53ee8cc1Swenshuai.xi     {
1057*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR( "DRV HVD Err: ISR callback is NULL.\n"  );
1058*53ee8cc1Swenshuai.xi     }
1059*53ee8cc1Swenshuai.xi     gHVDISRCtrl.bInISR = FALSE;
1060*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetClearISR();
1061*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Enable();
1062*53ee8cc1Swenshuai.xi     #if defined(REDLION_LINUX_KERNEL_ENVI)
1063*53ee8cc1Swenshuai.xi     return 1;
1064*53ee8cc1Swenshuai.xi     #endif
1065*53ee8cc1Swenshuai.xi }
1066*53ee8cc1Swenshuai.xi 
1067*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_RecoverySettings(void)1068*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_Sub_RecoverySettings(void)
1069*53ee8cc1Swenshuai.xi {
1070*53ee8cc1Swenshuai.xi // TODO: complete this function. and consider more cases. step decoder, display?
1071*53ee8cc1Swenshuai.xi     HVD_Result eRst=E_HVD_OK;
1072*53ee8cc1Swenshuai.xi 
1073*53ee8cc1Swenshuai.xi     switch( gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK )
1074*53ee8cc1Swenshuai.xi     {
1075*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_LIVE_STREAM:
1076*53ee8cc1Swenshuai.xi // temp solution
1077*53ee8cc1Swenshuai.xi     // must before play().
1078*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.Settings.DispInfoTH.u32FrmrateLowBound != 0 )||
1079*53ee8cc1Swenshuai.xi             (gSubHVDCtrl.Settings.DispInfoTH.u32FrmrateUpBound   != 0)  ||
1080*53ee8cc1Swenshuai.xi             (gSubHVDCtrl.Settings.DispInfoTH.u32MvopLowBound     != 0)  ||
1081*53ee8cc1Swenshuai.xi             (gSubHVDCtrl.Settings.DispInfoTH.u32MvopUpBound       != 0)   )
1082*53ee8cc1Swenshuai.xi         {
1083*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetData(  E_HVD_SDATA_DISP_INFO_TH ,  (MS_U32)(&gSubHVDCtrl.Settings.DispInfoTH) );
1084*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
1085*53ee8cc1Swenshuai.xi         }
1086*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.Settings.u32IsrEvent )
1087*53ee8cc1Swenshuai.xi         {
1088*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_ISR_TYPE, gSubHVDCtrl.Settings.u32IsrEvent);
1089*53ee8cc1Swenshuai.xi         }
1090*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_Enable_ISR(gSubHVDCtrl.Settings.bEnISR);
1091*53ee8cc1Swenshuai.xi   // play()
1092*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAY, 0);
1093*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u8SkipMode )
1094*53ee8cc1Swenshuai.xi         {
1095*53ee8cc1Swenshuai.xi             if(E_HVD_OK != (eRst = MDrv_HVD_Sub_SetSkipDecMode((HVD_Skip_Decode)(gSubHVDCtrl.Settings.u8SkipMode))))
1096*53ee8cc1Swenshuai.xi             {
1097*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR( "_DRV_HVD_Sub_RecoverySettings : Set Skip Mode fail!!.\n"  );
1098*53ee8cc1Swenshuai.xi                 return eRst;
1099*53ee8cc1Swenshuai.xi             }
1100*53ee8cc1Swenshuai.xi         }
1101*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bIsShowErrFrm )
1102*53ee8cc1Swenshuai.xi         {
1103*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_ERR_FRM, TRUE);
1104*53ee8cc1Swenshuai.xi         }
1105*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u8FrcMode )
1106*53ee8cc1Swenshuai.xi         {
1107*53ee8cc1Swenshuai.xi             if(E_HVD_OK != (eRst = MDrv_HVD_Sub_SetFrcMode((HVD_FrmRateConv_Mode)(gSubHVDCtrl.Settings.u8FrcMode))))
1108*53ee8cc1Swenshuai.xi             {
1109*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR( "_DRV_HVD_Sub_RecoverySettings : Set Frc Mode fail!!.\n"  );
1110*53ee8cc1Swenshuai.xi                 return eRst;
1111*53ee8cc1Swenshuai.xi             }
1112*53ee8cc1Swenshuai.xi         }
1113*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bIsErrConceal )
1114*53ee8cc1Swenshuai.xi         {
1115*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_ERR_CONCEAL, TRUE);
1116*53ee8cc1Swenshuai.xi         }
1117*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bAutoFreeES )
1118*53ee8cc1Swenshuai.xi         {
1119*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_AUTO_FREE_ES, TRUE);
1120*53ee8cc1Swenshuai.xi         }
1121*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bDisDeblocking )
1122*53ee8cc1Swenshuai.xi         {
1123*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DIS_DBF, TRUE);
1124*53ee8cc1Swenshuai.xi         }
1125*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bDisQuarterPixel )
1126*53ee8cc1Swenshuai.xi         {
1127*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
1128*53ee8cc1Swenshuai.xi         }
1129*53ee8cc1Swenshuai.xi 
1130*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.bIsSyncOn )
1131*53ee8cc1Swenshuai.xi         {
1132*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_ACTIVE, TRUE);
1133*53ee8cc1Swenshuai.xi         }
1134*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u32SyncTolerance )
1135*53ee8cc1Swenshuai.xi         {
1136*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_TOLERANCE, gSubHVDCtrl.Settings.u32SyncTolerance);
1137*53ee8cc1Swenshuai.xi         }
1138*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u32SyncRepeatTH )
1139*53ee8cc1Swenshuai.xi         {
1140*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_THRESHOLD, gSubHVDCtrl.Settings.u32SyncRepeatTH);
1141*53ee8cc1Swenshuai.xi         }
1142*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u32SyncVideoDelay )
1143*53ee8cc1Swenshuai.xi         {
1144*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, gSubHVDCtrl.Settings.u32SyncVideoDelay);
1145*53ee8cc1Swenshuai.xi         }
1146*53ee8cc1Swenshuai.xi         if(  gSubHVDCtrl.Settings.u32SyncFreeRunTH )
1147*53ee8cc1Swenshuai.xi         {
1148*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_FREERUN_THRESHOLD, gSubHVDCtrl.Settings.u32SyncFreeRunTH);
1149*53ee8cc1Swenshuai.xi         }
1150*53ee8cc1Swenshuai.xi #if !(defined(CHIP_T2) || defined(CHIP_T7))
1151*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.Settings.u32MiuBurstLevel != 0xFFFFFFFF )
1152*53ee8cc1Swenshuai.xi         {
1153*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_SetCmd(E_HVD_CMD_MIU_BURST_CNT, gSubHVDCtrl.Settings.u32MiuBurstLevel);
1154*53ee8cc1Swenshuai.xi         }
1155*53ee8cc1Swenshuai.xi #endif
1156*53ee8cc1Swenshuai.xi         //HAL_HVD_Sub_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
1157*53ee8cc1Swenshuai.xi         gSubHVDCtrl.bStepDecoding=0;
1158*53ee8cc1Swenshuai.xi         break;
1159*53ee8cc1Swenshuai.xi 
1160*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_RAW:
1161*53ee8cc1Swenshuai.xi     default:
1162*53ee8cc1Swenshuai.xi         gSubHVDCtrl.bStepDecoding=0;
1163*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAY, 0);
1164*53ee8cc1Swenshuai.xi         break;
1165*53ee8cc1Swenshuai.xi     }
1166*53ee8cc1Swenshuai.xi     return eRst;
1167*53ee8cc1Swenshuai.xi }
1168*53ee8cc1Swenshuai.xi 
_DRV_HVD_Sub_Rst(MS_BOOL bErrHandle)1169*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Sub_Rst(MS_BOOL bErrHandle)
1170*53ee8cc1Swenshuai.xi {
1171*53ee8cc1Swenshuai.xi     HVD_Result eRst = E_HVD_RET_ILLEGAL_ACCESS;
1172*53ee8cc1Swenshuai.xi 
1173*53ee8cc1Swenshuai.xi     if (bErrHandle == TRUE)
1174*53ee8cc1Swenshuai.xi     {
1175*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
1176*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1177*53ee8cc1Swenshuai.xi     }
1178*53ee8cc1Swenshuai.xi 
1179*53ee8cc1Swenshuai.xi     bHVDIsIniting = TRUE;
1180*53ee8cc1Swenshuai.xi 
1181*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(FALSE);
1182*53ee8cc1Swenshuai.xi 
1183*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1184*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1185*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1186*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1187*53ee8cc1Swenshuai.xi                  __LINE__);
1188*53ee8cc1Swenshuai.xi #endif
1189*53ee8cc1Swenshuai.xi 
1190*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_RstVariables();
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1193*53ee8cc1Swenshuai.xi     {
1194*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1195*53ee8cc1Swenshuai.xi     }
1196*53ee8cc1Swenshuai.xi 
1197*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1198*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1199*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1200*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1201*53ee8cc1Swenshuai.xi                  __LINE__);
1202*53ee8cc1Swenshuai.xi #endif
1203*53ee8cc1Swenshuai.xi 
1204*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_InitShareMem();
1205*53ee8cc1Swenshuai.xi 
1206*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1207*53ee8cc1Swenshuai.xi     {
1208*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1209*53ee8cc1Swenshuai.xi     }
1210*53ee8cc1Swenshuai.xi 
1211*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1212*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1213*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1214*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1215*53ee8cc1Swenshuai.xi                  __LINE__);
1216*53ee8cc1Swenshuai.xi #endif
1217*53ee8cc1Swenshuai.xi 
1218*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_InitRegCPU();
1219*53ee8cc1Swenshuai.xi 
1220*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1221*53ee8cc1Swenshuai.xi     {
1222*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1223*53ee8cc1Swenshuai.xi     }
1224*53ee8cc1Swenshuai.xi 
1225*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1226*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1227*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1228*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1229*53ee8cc1Swenshuai.xi                  __LINE__);
1230*53ee8cc1Swenshuai.xi #endif
1231*53ee8cc1Swenshuai.xi 
1232*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_InitFW();
1233*53ee8cc1Swenshuai.xi 
1234*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1235*53ee8cc1Swenshuai.xi     {
1236*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1237*53ee8cc1Swenshuai.xi     }
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi     eRst = E_HVD_OK;
1240*53ee8cc1Swenshuai.xi 
1241*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(gSubHVDCtrl.Settings.bEnISR);
1242*53ee8cc1Swenshuai.xi 
1243*53ee8cc1Swenshuai.xi     bHVDIsIniting = FALSE;
1244*53ee8cc1Swenshuai.xi     return eRst;
1245*53ee8cc1Swenshuai.xi 
1246*53ee8cc1Swenshuai.xi     DRV_HVD_Rst_Failed :
1247*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(gSubHVDCtrl.Settings.bEnISR);
1248*53ee8cc1Swenshuai.xi     bHVDIsIniting = FALSE;
1249*53ee8cc1Swenshuai.xi 
1250*53ee8cc1Swenshuai.xi     return eRst;
1251*53ee8cc1Swenshuai.xi }
1252*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1253*53ee8cc1Swenshuai.xi //  Global Functions
1254*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1255*53ee8cc1Swenshuai.xi 
1256*53ee8cc1Swenshuai.xi // System
1257*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1258*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_PowerCtrl()
1259*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/Disable HVD HW clock
1260*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/Disable HVD HW clock
1261*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable
1262*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable
1263*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_PowerCtrl(MS_BOOL bEnable)1264*53ee8cc1Swenshuai.xi void MDrv_HVD_Sub_PowerCtrl( MS_BOOL bEnable )
1265*53ee8cc1Swenshuai.xi {
1266*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1267*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_MVD_PowerCtrl( bEnable);
1268*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_PowerCtrl(bEnable);
1269*53ee8cc1Swenshuai.xi     HAL_VPU_PowerCtrl(bEnable);
1270*53ee8cc1Swenshuai.xi }
1271*53ee8cc1Swenshuai.xi 
1272*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1273*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetOSRegBase()
1274*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set system register base
1275*53ee8cc1Swenshuai.xi /// @param -u32RegBaseAddr \b IN :  system register base
1276*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetOSRegBase(MS_U32 u32RegBaseAddr)1277*53ee8cc1Swenshuai.xi void MDrv_HVD_Sub_SetOSRegBase( MS_U32 u32RegBaseAddr )
1278*53ee8cc1Swenshuai.xi {
1279*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_InitRegBase( u32RegBaseAddr );
1280*53ee8cc1Swenshuai.xi }
1281*53ee8cc1Swenshuai.xi 
1282*53ee8cc1Swenshuai.xi // Action
1283*53ee8cc1Swenshuai.xi 
1284*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1285*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Init()
1286*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  HVD driver initialization
1287*53ee8cc1Swenshuai.xi /// @param -pStMemCfg \b IN :  pointer to the memory config of HVD driver
1288*53ee8cc1Swenshuai.xi /// @param -pStInitSettings \b IN :  Initialization of HVD driver
1289*53ee8cc1Swenshuai.xi /// @return -The result of initialization process
1290*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Init(HVD_MemCfg * pStMemCfg,HVD_Init_Settings * pStInitSettings)1291*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Init(HVD_MemCfg *pStMemCfg, HVD_Init_Settings *pStInitSettings)
1292*53ee8cc1Swenshuai.xi {
1293*53ee8cc1Swenshuai.xi     HVD_Result eRst = E_HVD_FAIL;
1294*53ee8cc1Swenshuai.xi 
1295*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1298*53ee8cc1Swenshuai.xi     u32SubInitSysTimeBase = HVD_GetSysTime_ms();
1299*53ee8cc1Swenshuai.xi #endif
1300*53ee8cc1Swenshuai.xi 
1301*53ee8cc1Swenshuai.xi     if ((pStMemCfg == NULL) || (pStInitSettings == NULL))
1302*53ee8cc1Swenshuai.xi     {
1303*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR("HVD Err: Init params are invalid\n");
1304*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1305*53ee8cc1Swenshuai.xi     }
1306*53ee8cc1Swenshuai.xi 
1307*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
1308*53ee8cc1Swenshuai.xi     {
1309*53ee8cc1Swenshuai.xi         MS_U32 u32NonPMBankSize = 0, u32RiuBaseAdd = 0;
1310*53ee8cc1Swenshuai.xi 
1311*53ee8cc1Swenshuai.xi         if (!MDrv_MMIO_GetBASE(&u32RiuBaseAdd, &u32NonPMBankSize, MS_MODULE_HW))
1312*53ee8cc1Swenshuai.xi         {
1313*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD Err: MMIO_GetBASE failure\n");
1314*53ee8cc1Swenshuai.xi             return eRst;
1315*53ee8cc1Swenshuai.xi         }
1316*53ee8cc1Swenshuai.xi         else
1317*53ee8cc1Swenshuai.xi         {
1318*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO("HVD:1 u32RiuBaseAdd = %lx\n", u32RiuBaseAdd);
1319*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_InitRegBase(u32RiuBaseAdd);
1320*53ee8cc1Swenshuai.xi         }
1321*53ee8cc1Swenshuai.xi     }
1322*53ee8cc1Swenshuai.xi #endif
1323*53ee8cc1Swenshuai.xi 
1324*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_INFO("HVD: system call type: Mutex:%d clock:%d delay:%d asm_sync:%d\n",
1325*53ee8cc1Swenshuai.xi                  HVD_ENABLE_MUTEX_PROTECT,
1326*53ee8cc1Swenshuai.xi                  HVD_SYSTEM_CLOCK_TYPE,
1327*53ee8cc1Swenshuai.xi                  HVD_SYSTEM_DELAY_MS_TYPE,
1328*53ee8cc1Swenshuai.xi                  HVD_MEMORY_BARRIER_TYPE);
1329*53ee8cc1Swenshuai.xi 
1330*53ee8cc1Swenshuai.xi     if (u32SubUartCtrl & E_HVD_UART_CTRL_INFO)
1331*53ee8cc1Swenshuai.xi     {
1332*53ee8cc1Swenshuai.xi         MS_U32 u32delaytime = 5;
1333*53ee8cc1Swenshuai.xi         MS_U32 u32FirstTime = HVD_GetSysTime_ms();
1334*53ee8cc1Swenshuai.xi         MS_U32 u32SecondTime= 0;
1335*53ee8cc1Swenshuai.xi 
1336*53ee8cc1Swenshuai.xi         HVD_Delay_ms(u32delaytime);
1337*53ee8cc1Swenshuai.xi         u32SecondTime = HVD_GetSysTime_ms();
1338*53ee8cc1Swenshuai.xi 
1339*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD: MSOS API check: 1st:%lu 2nd:%lu delay:%lu dif:%lu\n",
1340*53ee8cc1Swenshuai.xi                      u32FirstTime,
1341*53ee8cc1Swenshuai.xi                      u32SecondTime,
1342*53ee8cc1Swenshuai.xi                      u32delaytime,
1343*53ee8cc1Swenshuai.xi                      u32SecondTime - u32FirstTime);
1344*53ee8cc1Swenshuai.xi     }
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1347*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1348*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1349*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1350*53ee8cc1Swenshuai.xi                  __LINE__);
1351*53ee8cc1Swenshuai.xi #endif
1352*53ee8cc1Swenshuai.xi 
1353*53ee8cc1Swenshuai.xi     if (bHVDIsInited == TRUE)
1354*53ee8cc1Swenshuai.xi     {
1355*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR("HVD Warn: re-init HVD Driver\n");
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi #if HVD_ENABLE_REINIT_FAILED
1358*53ee8cc1Swenshuai.xi         eRst = E_HVD_RET_RE_INIT;
1359*53ee8cc1Swenshuai.xi         return eRst;
1360*53ee8cc1Swenshuai.xi #endif
1361*53ee8cc1Swenshuai.xi     }
1362*53ee8cc1Swenshuai.xi 
1363*53ee8cc1Swenshuai.xi     // disable ISR first
1364*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(FALSE);
1365*53ee8cc1Swenshuai.xi 
1366*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_InitVariables(pStMemCfg,
1367*53ee8cc1Swenshuai.xi               (HVD_Init_Params *) pStInitSettings);
1368*53ee8cc1Swenshuai.xi 
1369*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1370*53ee8cc1Swenshuai.xi     {
1371*53ee8cc1Swenshuai.xi         return eRst;
1372*53ee8cc1Swenshuai.xi     }
1373*53ee8cc1Swenshuai.xi 
1374*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1375*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1376*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1377*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1378*53ee8cc1Swenshuai.xi                  __LINE__);
1379*53ee8cc1Swenshuai.xi #endif
1380*53ee8cc1Swenshuai.xi 
1381*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1382*53ee8cc1Swenshuai.xi 
1383*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_Check_Cmd(E_HVD_CHECK_CMD_INIT);
1384*53ee8cc1Swenshuai.xi 
1385*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1386*53ee8cc1Swenshuai.xi     {
1387*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRst);
1388*53ee8cc1Swenshuai.xi     }
1389*53ee8cc1Swenshuai.xi 
1390*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1391*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1392*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1393*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1394*53ee8cc1Swenshuai.xi                  __LINE__);
1395*53ee8cc1Swenshuai.xi #endif
1396*53ee8cc1Swenshuai.xi 
1397*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Sub_Rst(FALSE);
1398*53ee8cc1Swenshuai.xi 
1399*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1400*53ee8cc1Swenshuai.xi     {
1401*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRst);
1402*53ee8cc1Swenshuai.xi     }
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1405*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1406*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32SubInitSysTimeBase,
1407*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1408*53ee8cc1Swenshuai.xi                  __LINE__);
1409*53ee8cc1Swenshuai.xi #endif
1410*53ee8cc1Swenshuai.xi 
1411*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
1412*53ee8cc1Swenshuai.xi     bHVDIsInited = TRUE;
1413*53ee8cc1Swenshuai.xi     eRst = E_HVD_OK;
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_INFO("HVD driver Init successfully.\n");
1416*53ee8cc1Swenshuai.xi 
1417*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRst);
1418*53ee8cc1Swenshuai.xi }
1419*53ee8cc1Swenshuai.xi 
1420*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1421*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Rst()
1422*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD driver
1423*53ee8cc1Swenshuai.xi /// @param -bErrHandle \b IN :  reset option HVD driver
1424*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Reset HVD to clear mode.( do not recovery SPS)
1425*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Reset HVD to clear mode, and recovery SPS.
1426*53ee8cc1Swenshuai.xi /// @return -The result of reset process
1427*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Rst(MS_BOOL bErrHandle)1428*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Rst(MS_BOOL bErrHandle)
1429*53ee8cc1Swenshuai.xi {
1430*53ee8cc1Swenshuai.xi     HVD_Result eRet=E_HVD_RET_ILLEGAL_ACCESS;
1431*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1432*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1433*53ee8cc1Swenshuai.xi     if( bErrHandle == TRUE )
1434*53ee8cc1Swenshuai.xi     {
1435*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR( "HVD Not supported reset(TRUE) yet\n");
1436*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1437*53ee8cc1Swenshuai.xi     }
1438*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) != HVD_INIT_MAIN_LIVE_STREAM)
1439*53ee8cc1Swenshuai.xi     {
1440*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR( "HVD rst() only support live stream mode\n");
1441*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1442*53ee8cc1Swenshuai.xi     }
1443*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_Sub_Rst(bErrHandle);
1444*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1445*53ee8cc1Swenshuai.xi     {
1446*53ee8cc1Swenshuai.xi         return (eRet);
1447*53ee8cc1Swenshuai.xi     }
1448*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_Sub_RecoverySettings();
1449*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1450*53ee8cc1Swenshuai.xi     {
1451*53ee8cc1Swenshuai.xi         return ( eRet);
1452*53ee8cc1Swenshuai.xi     }
1453*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
1454*53ee8cc1Swenshuai.xi     bHVDIsInited=TRUE;
1455*53ee8cc1Swenshuai.xi     return (eRet);
1456*53ee8cc1Swenshuai.xi }
1457*53ee8cc1Swenshuai.xi 
1458*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1459*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Play()
1460*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Play HVD
1461*53ee8cc1Swenshuai.xi /// @return -The result of command play
1462*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Play(void)1463*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Play(void)
1464*53ee8cc1Swenshuai.xi {
1465*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1466*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1467*53ee8cc1Swenshuai.xi 
1468*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1469*53ee8cc1Swenshuai.xi 
1470*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1471*53ee8cc1Swenshuai.xi 
1472*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
1473*53ee8cc1Swenshuai.xi     if( MDrv_HVD_Sub_GetPlayState() != E_HVD_GSTATE_PLAY || gSubHVDCtrl.bStepDecoding )
1474*53ee8cc1Swenshuai.xi #endif
1475*53ee8cc1Swenshuai.xi     {
1476*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAY, 0);
1477*53ee8cc1Swenshuai.xi         if( eRet != E_HVD_OK )
1478*53ee8cc1Swenshuai.xi         {
1479*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1480*53ee8cc1Swenshuai.xi         }
1481*53ee8cc1Swenshuai.xi     }
1482*53ee8cc1Swenshuai.xi     // step display off
1483*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1484*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK  )
1485*53ee8cc1Swenshuai.xi     {
1486*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
1487*53ee8cc1Swenshuai.xi     }
1488*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1489*53ee8cc1Swenshuai.xi }
1490*53ee8cc1Swenshuai.xi 
1491*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1492*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Exit()
1493*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Stop HVD and release resource.
1494*53ee8cc1Swenshuai.xi /// @return -The result of command stop
1495*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Exit(void)1496*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Exit(void)
1497*53ee8cc1Swenshuai.xi {
1498*53ee8cc1Swenshuai.xi     MS_U32 u32Timer=0;
1499*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1500*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1501*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1502*53ee8cc1Swenshuai.xi     _DRV_HVD_Rsting(eRet);
1503*53ee8cc1Swenshuai.xi     bHVDIsInited=FALSE;
1504*53ee8cc1Swenshuai.xi     do
1505*53ee8cc1Swenshuai.xi     {
1506*53ee8cc1Swenshuai.xi         u32Timer++;
1507*53ee8cc1Swenshuai.xi         if(u32Timer>=HVD_FW_EXIT_ACTION_TIMEOUT)
1508*53ee8cc1Swenshuai.xi         {
1509*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_TIMEOUT;
1510*53ee8cc1Swenshuai.xi             return eRet;
1511*53ee8cc1Swenshuai.xi         }
1512*53ee8cc1Swenshuai.xi         else
1513*53ee8cc1Swenshuai.xi         {
1514*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1515*53ee8cc1Swenshuai.xi         }
1516*53ee8cc1Swenshuai.xi     }while(_DRV_HVD_Ctrl(HVD_CTRL_PROCESSING));
1517*53ee8cc1Swenshuai.xi     // release ISR callback
1518*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(FALSE);
1519*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Disable();
1520*53ee8cc1Swenshuai.xi     if( gHVDISRCtrl.bRegISR )
1521*53ee8cc1Swenshuai.xi     {
1522*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Detach();
1523*53ee8cc1Swenshuai.xi     }
1524*53ee8cc1Swenshuai.xi     // close HVD FW
1525*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_DeInit();
1526*53ee8cc1Swenshuai.xi     // reset internal control variables
1527*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&gSubHVDCtrl  , 0 , sizeof(HVD_Drv_Ctrl) );
1528*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&gHVDISRCtrl  , 0 , sizeof(HVD_ISR_Ctrl) );
1529*53ee8cc1Swenshuai.xi     // TODO: check it is really stop
1530*53ee8cc1Swenshuai.xi     //_DRV_HVD_Return(eRet );
1531*53ee8cc1Swenshuai.xi     return eRet;
1532*53ee8cc1Swenshuai.xi }
1533*53ee8cc1Swenshuai.xi 
1534*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1535*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Pause()
1536*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Pause HVD
1537*53ee8cc1Swenshuai.xi /// @return -The result of command pause
1538*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Pause(void)1539*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Pause(void)
1540*53ee8cc1Swenshuai.xi {
1541*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1542*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1543*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1544*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1545*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PAUSE, 0);
1546*53ee8cc1Swenshuai.xi     if( eRet !=  E_HVD_OK)
1547*53ee8cc1Swenshuai.xi     {
1548*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1549*53ee8cc1Swenshuai.xi     }
1550*53ee8cc1Swenshuai.xi     // step display off
1551*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1552*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK  )
1553*53ee8cc1Swenshuai.xi     {
1554*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode &=~HVD_CTRL_DISPLAY_CTRL;
1555*53ee8cc1Swenshuai.xi     }
1556*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
1557*53ee8cc1Swenshuai.xi }
1558*53ee8cc1Swenshuai.xi 
1559*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1560*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Flush()
1561*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Flush queue and buffer
1562*53ee8cc1Swenshuai.xi /// @param -bShowLast \b IN :  TRUE / FALSE
1563*53ee8cc1Swenshuai.xi ///                 -FALSE(0): show current displayed frame
1564*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show last decoded frame
1565*53ee8cc1Swenshuai.xi /// @return -The result of command flush
1566*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Flush(MS_BOOL bShowLast)1567*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_Flush(MS_BOOL bShowLast)
1568*53ee8cc1Swenshuai.xi {
1569*53ee8cc1Swenshuai.xi     MS_U32 u32Times = 0;
1570*53ee8cc1Swenshuai.xi     MS_BOOL bPlayback=FALSE;
1571*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1572*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1573*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1574*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1575*53ee8cc1Swenshuai.xi 
1576*53ee8cc1Swenshuai.xi     // pause first
1577*53ee8cc1Swenshuai.xi     if(  MDrv_HVD_Sub_GetPlayState() != E_HVD_GSTATE_PAUSE )
1578*53ee8cc1Swenshuai.xi     {
1579*53ee8cc1Swenshuai.xi         bPlayback = TRUE;
1580*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PAUSE, 0);
1581*53ee8cc1Swenshuai.xi         if( eRet !=  E_HVD_OK)
1582*53ee8cc1Swenshuai.xi         {
1583*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1584*53ee8cc1Swenshuai.xi         }
1585*53ee8cc1Swenshuai.xi         // check flush done
1586*53ee8cc1Swenshuai.xi         while( 1 )
1587*53ee8cc1Swenshuai.xi         {
1588*53ee8cc1Swenshuai.xi             if(  MDrv_HVD_Sub_GetPlayState() == E_HVD_GSTATE_PAUSE )
1589*53ee8cc1Swenshuai.xi             {
1590*53ee8cc1Swenshuai.xi                 break;
1591*53ee8cc1Swenshuai.xi             }
1592*53ee8cc1Swenshuai.xi             u32Times++;
1593*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1594*53ee8cc1Swenshuai.xi             if( u32Times > 100 )
1595*53ee8cc1Swenshuai.xi             {
1596*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_INFO("HVD info: pause in flush() not finished.\n");
1597*53ee8cc1Swenshuai.xi                 break;
1598*53ee8cc1Swenshuai.xi             }
1599*53ee8cc1Swenshuai.xi         }
1600*53ee8cc1Swenshuai.xi     }
1601*53ee8cc1Swenshuai.xi     // step display off
1602*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1603*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK  )
1604*53ee8cc1Swenshuai.xi     {
1605*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode &=~HVD_CTRL_DISPLAY_CTRL;
1606*53ee8cc1Swenshuai.xi     }
1607*53ee8cc1Swenshuai.xi 
1608*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
1609*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM )
1610*53ee8cc1Swenshuai.xi     {
1611*53ee8cc1Swenshuai.xi         if ( gSubHVDCtrl.LastNal.bRVBrokenPacket )
1612*53ee8cc1Swenshuai.xi         {
1613*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO("HVD Info: push dummy packet for broken by us packet\n");
1614*53ee8cc1Swenshuai.xi             gHVDPacket.u32Length=gSubHVDCtrl.u32RV_FlushPacketSize;
1615*53ee8cc1Swenshuai.xi             gHVDPacket.u32Staddr=gSubHVDCtrl.u32RV_FlushPacketAddr-gSubHVDCtrl.MemMap.u32BitstreamBufAddr;
1616*53ee8cc1Swenshuai.xi             gHVDPacket.u32OriPktAddr=gHVDPacket.u32Staddr;
1617*53ee8cc1Swenshuai.xi             gHVDPacket.bRVBrokenPacket = FALSE;
1618*53ee8cc1Swenshuai.xi             eRet=( HVD_Result )HAL_HVD_Sub_PushPacket( (HVD_BBU_Info*)&gHVDPacket );
1619*53ee8cc1Swenshuai.xi         }
1620*53ee8cc1Swenshuai.xi     }
1621*53ee8cc1Swenshuai.xi #endif
1622*53ee8cc1Swenshuai.xi 
1623*53ee8cc1Swenshuai.xi     // fire all packet to FW
1624*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData( E_HVD_GDATA_BBU_WRITE_PTR_FIRED ) != HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_WRITE_PTR) )
1625*53ee8cc1Swenshuai.xi     {
1626*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_UpdateESWptr_Fire();
1627*53ee8cc1Swenshuai.xi     }
1628*53ee8cc1Swenshuai.xi     // send command
1629*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_FLUSH, (MS_U32)bShowLast);
1630*53ee8cc1Swenshuai.xi     if( eRet !=  E_HVD_OK)
1631*53ee8cc1Swenshuai.xi     {
1632*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1633*53ee8cc1Swenshuai.xi     }
1634*53ee8cc1Swenshuai.xi     // check flush done only for raw file mode
1635*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
1636*53ee8cc1Swenshuai.xi     {
1637*53ee8cc1Swenshuai.xi         while( 1 )
1638*53ee8cc1Swenshuai.xi         {
1639*53ee8cc1Swenshuai.xi             //_DRV_HVD_PushDummy();
1640*53ee8cc1Swenshuai.xi             if( _DRV_HVD_Sub_IsAllBufferEmpty() )
1641*53ee8cc1Swenshuai.xi             {
1642*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
1643*53ee8cc1Swenshuai.xi                 break;
1644*53ee8cc1Swenshuai.xi             }
1645*53ee8cc1Swenshuai.xi             u32Times++;
1646*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1647*53ee8cc1Swenshuai.xi             if ( u32Times > 200 )
1648*53ee8cc1Swenshuai.xi             {
1649*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR("HVD Err: Flush() timeout failed: BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx\n" ,
1650*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_Q_NUMB),
1651*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_Q_NUMB),
1652*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_Q_NUMB),
1653*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
1654*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_READ_PTR),
1655*53ee8cc1Swenshuai.xi                     HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_WRITE_PTR) );
1656*53ee8cc1Swenshuai.xi                 eRet = E_HVD_FAIL;
1657*53ee8cc1Swenshuai.xi                 break;
1658*53ee8cc1Swenshuai.xi             }
1659*53ee8cc1Swenshuai.xi         }
1660*53ee8cc1Swenshuai.xi         // reset byte_cnt
1661*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_RstPTSCtrlVariable();
1662*53ee8cc1Swenshuai.xi     }
1663*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_FlushRstShareMem();
1664*53ee8cc1Swenshuai.xi 
1665*53ee8cc1Swenshuai.xi     // MediaCodec need this to let scan mode to be normal.
1666*53ee8cc1Swenshuai.xi     if( 0)//bPlayback )
1667*53ee8cc1Swenshuai.xi     {
1668*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAY, 0);
1669*53ee8cc1Swenshuai.xi         if( eRet != E_HVD_OK )
1670*53ee8cc1Swenshuai.xi         {
1671*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1672*53ee8cc1Swenshuai.xi         }
1673*53ee8cc1Swenshuai.xi     }
1674*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1675*53ee8cc1Swenshuai.xi }
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1678*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_StepDisp()
1679*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Trigger HVD to show one frame
1680*53ee8cc1Swenshuai.xi /// @return -The result of command trigger display
1681*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_StepDisp(void)1682*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_StepDisp(void)
1683*53ee8cc1Swenshuai.xi {
1684*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1685*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1686*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1687*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1688*53ee8cc1Swenshuai.xi     // check command
1689*53ee8cc1Swenshuai.xi     eRet=_DRV_HVD_Sub_Check_Cmd( E_HVD_CHECK_CMD_TRIGGER_DISP );
1690*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1691*53ee8cc1Swenshuai.xi     {
1692*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1693*53ee8cc1Swenshuai.xi     }
1694*53ee8cc1Swenshuai.xi 
1695*53ee8cc1Swenshuai.xi     // step display on
1696*53ee8cc1Swenshuai.xi     if( _DRV_HVD_Ctrl(HVD_CTRL_DISPLAY_CTRL) )
1697*53ee8cc1Swenshuai.xi     {
1698*53ee8cc1Swenshuai.xi         if( MDrv_HVD_Sub_IsFrameShowed() )
1699*53ee8cc1Swenshuai.xi         {
1700*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_Sub_SetData(E_HVD_SDATA_TRIGGER_DISP, 1);
1701*53ee8cc1Swenshuai.xi         }
1702*53ee8cc1Swenshuai.xi         else
1703*53ee8cc1Swenshuai.xi         {
1704*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO("HVD Warn: Previous Step Display command is not finished\n");
1705*53ee8cc1Swenshuai.xi             eRet =E_HVD_OK;
1706*53ee8cc1Swenshuai.xi         }
1707*53ee8cc1Swenshuai.xi     }
1708*53ee8cc1Swenshuai.xi     else
1709*53ee8cc1Swenshuai.xi     {
1710*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetData(E_HVD_SDATA_TRIGGER_DISP, 1);
1711*53ee8cc1Swenshuai.xi         if( eRet == E_HVD_OK  )
1712*53ee8cc1Swenshuai.xi         {
1713*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(HVD_CTRL_DISPLAY_CTRL);
1714*53ee8cc1Swenshuai.xi         }
1715*53ee8cc1Swenshuai.xi     }
1716*53ee8cc1Swenshuai.xi     // enter play mode
1717*53ee8cc1Swenshuai.xi     if( 1)//HAL_HVD_GetData(E_HVD_GDATA_FW_STATE) == E_HVD_FW_PAUSE )
1718*53ee8cc1Swenshuai.xi     {
1719*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAY, 0);
1720*53ee8cc1Swenshuai.xi         if( eRet !=  E_HVD_OK)
1721*53ee8cc1Swenshuai.xi         {
1722*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1723*53ee8cc1Swenshuai.xi         }
1724*53ee8cc1Swenshuai.xi     }
1725*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1726*53ee8cc1Swenshuai.xi }
1727*53ee8cc1Swenshuai.xi 
1728*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1729*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_StepDecode()
1730*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step decode one frame
1731*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_StepDecode(void)1732*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_StepDecode(void)
1733*53ee8cc1Swenshuai.xi {
1734*53ee8cc1Swenshuai.xi     MS_U32 u32Times=0;
1735*53ee8cc1Swenshuai.xi     MS_U32 FWState=0;
1736*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1737*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1738*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1739*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1740*53ee8cc1Swenshuai.xi     // check if step decoding
1741*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.bStepDecoding)
1742*53ee8cc1Swenshuai.xi     {
1743*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.u32StepDecodeCnt == HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT) )
1744*53ee8cc1Swenshuai.xi         {
1745*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_NOTREADY;
1746*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1747*53ee8cc1Swenshuai.xi         }
1748*53ee8cc1Swenshuai.xi     }
1749*53ee8cc1Swenshuai.xi     // Pause first
1750*53ee8cc1Swenshuai.xi     FWState = HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_STATE);
1751*53ee8cc1Swenshuai.xi     if( FWState != (MS_U32)E_HVD_FW_PAUSE )
1752*53ee8cc1Swenshuai.xi     {
1753*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PAUSE, 0);
1754*53ee8cc1Swenshuai.xi         if( eRet !=  E_HVD_OK)
1755*53ee8cc1Swenshuai.xi         {
1756*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1757*53ee8cc1Swenshuai.xi         }
1758*53ee8cc1Swenshuai.xi         while( FWState != ((MS_U32)E_HVD_FW_PAUSE)
1759*53ee8cc1Swenshuai.xi             && u32Times <= 10000)
1760*53ee8cc1Swenshuai.xi         {
1761*53ee8cc1Swenshuai.xi             FWState = HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_STATE);
1762*53ee8cc1Swenshuai.xi             u32Times++;
1763*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1764*53ee8cc1Swenshuai.xi         }
1765*53ee8cc1Swenshuai.xi         if( HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_STATE) != E_HVD_FW_PAUSE )
1766*53ee8cc1Swenshuai.xi         {
1767*53ee8cc1Swenshuai.xi             eRet = E_HVD_FAIL;
1768*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1769*53ee8cc1Swenshuai.xi         }
1770*53ee8cc1Swenshuai.xi     }
1771*53ee8cc1Swenshuai.xi     gSubHVDCtrl.bStepDecoding=TRUE;
1772*53ee8cc1Swenshuai.xi     // get decode cnt
1773*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32StepDecodeCnt = HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT);
1774*53ee8cc1Swenshuai.xi     // step decode
1775*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_STEP_DECODE, 0);
1776*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1777*53ee8cc1Swenshuai.xi }
1778*53ee8cc1Swenshuai.xi 
1779*53ee8cc1Swenshuai.xi // set command, action, status, input
1780*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1781*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_PushQueue()
1782*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  push one entry into the decoding table(BBU table).
1783*53ee8cc1Swenshuai.xi /// @param -pInfo \b IN :  Pointer to the information of input packet.
1784*53ee8cc1Swenshuai.xi /// @return -The result of command push queue
1785*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_PushQueue(HVD_Packet_Info * pInfo)1786*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_PushQueue(HVD_Packet_Info* pInfo)
1787*53ee8cc1Swenshuai.xi {
1788*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1789*53ee8cc1Swenshuai.xi     MS_BOOL bNULLPacket=FALSE;
1790*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1791*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1792*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1793*53ee8cc1Swenshuai.xi 
1794*53ee8cc1Swenshuai.xi     if( pInfo ==NULL  )
1795*53ee8cc1Swenshuai.xi     {
1796*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1797*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1798*53ee8cc1Swenshuai.xi     }
1799*53ee8cc1Swenshuai.xi     else if( pInfo->u32Length >= 0x200000) // HW bbu tag limitation
1800*53ee8cc1Swenshuai.xi     {
1801*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR(  "HVD Err: input packet size(0x%lx) larger than max packet size(0x%lx)\n " , pInfo->u32Length  , 0x200000UL  );
1802*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1803*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1804*53ee8cc1Swenshuai.xi     }
1805*53ee8cc1Swenshuai.xi     else if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_TSP )
1806*53ee8cc1Swenshuai.xi     {
1807*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR(  "HVD Err: Init mode is TSP input and PushQueue() is not supported in TSP input."  );
1808*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_ILLEGAL_ACCESS;
1809*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1810*53ee8cc1Swenshuai.xi     }
1811*53ee8cc1Swenshuai.xi     else if( ((gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
1812*53ee8cc1Swenshuai.xi        (pInfo->u32Staddr >= gSubHVDCtrl.MemMap.u32BitstreamBufSize) )
1813*53ee8cc1Swenshuai.xi     {
1814*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1815*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1816*53ee8cc1Swenshuai.xi     }
1817*53ee8cc1Swenshuai.xi 
1818*53ee8cc1Swenshuai.xi     //HVD_memcpy((void*)(&gHVDPacket), (void*)pInfo, sizeof(HVD_Packet_Info));
1819*53ee8cc1Swenshuai.xi     gHVDPacket.u32ID_H=pInfo->u32ID_H;
1820*53ee8cc1Swenshuai.xi     gHVDPacket.u32ID_L=pInfo->u32ID_L;
1821*53ee8cc1Swenshuai.xi     gHVDPacket.u32Length=pInfo->u32Length;
1822*53ee8cc1Swenshuai.xi     gHVDPacket.u32TimeStamp=pInfo->u32TimeStamp;
1823*53ee8cc1Swenshuai.xi     if( pInfo->u32Staddr & HVD_RV_BROKEN_BY_US_MASK )
1824*53ee8cc1Swenshuai.xi     {
1825*53ee8cc1Swenshuai.xi         gHVDPacket.bRVBrokenPacket= TRUE;
1826*53ee8cc1Swenshuai.xi         gHVDPacket.u32OriPktAddr=pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
1827*53ee8cc1Swenshuai.xi         gHVDPacket.u32Staddr=pInfo->u32Staddr& (~HVD_RV_BROKEN_BY_US_MASK);
1828*53ee8cc1Swenshuai.xi     }
1829*53ee8cc1Swenshuai.xi     else
1830*53ee8cc1Swenshuai.xi     {
1831*53ee8cc1Swenshuai.xi         gHVDPacket.bRVBrokenPacket= FALSE;
1832*53ee8cc1Swenshuai.xi         gHVDPacket.u32OriPktAddr=pInfo->u32Staddr;
1833*53ee8cc1Swenshuai.xi         gHVDPacket.u32Staddr=pInfo->u32Staddr;
1834*53ee8cc1Swenshuai.xi     }
1835*53ee8cc1Swenshuai.xi 
1836*53ee8cc1Swenshuai.xi     // invalid packet
1837*53ee8cc1Swenshuai.xi     if(  (gHVDPacket.u32TimeStamp != HVD_U32_MAX) && (gHVDPacket.u32Length==0))
1838*53ee8cc1Swenshuai.xi     {
1839*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO(  "HVD Err: Invalid Packet(size:0x%lx PTS:0x%lx)\n " , gHVDPacket.u32Length  , gHVDPacket.u32TimeStamp );
1840*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1841*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1842*53ee8cc1Swenshuai.xi     }
1843*53ee8cc1Swenshuai.xi     // AVI NULL packet
1844*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_AVI_NULL_PACKET
1845*53ee8cc1Swenshuai.xi     else if((gHVDPacket.u32TimeStamp == HVD_U32_MAX) && (gHVDPacket.u32Length==0))
1846*53ee8cc1Swenshuai.xi     {
1847*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.bNoDrvProccBuf)
1848*53ee8cc1Swenshuai.xi         {
1849*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO(  "HVD Err: AVI Null Packet(size:0x%lx PTS:0x%lx), but do not have enough driver process buffer(0x%lx)\n " , pInfo->u32Length  , gHVDPacket.u32TimeStamp , gSubHVDCtrl.MemMap.u32DrvProcessBufSize);
1850*53ee8cc1Swenshuai.xi             eRet=E_HVD_RET_ILLEGAL_ACCESS;
1851*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1852*53ee8cc1Swenshuai.xi         }
1853*53ee8cc1Swenshuai.xi         else
1854*53ee8cc1Swenshuai.xi         {
1855*53ee8cc1Swenshuai.xi             bNULLPacket=TRUE;
1856*53ee8cc1Swenshuai.xi             gHVDPacket.u32Length = gSubHVDCtrl.u32NULLPacketSize;
1857*53ee8cc1Swenshuai.xi             gHVDPacket.u32Staddr= gSubHVDCtrl.u32NULLPacketAddr - gSubHVDCtrl.MemMap.u32BitstreamBufAddr;
1858*53ee8cc1Swenshuai.xi         }
1859*53ee8cc1Swenshuai.xi     }
1860*53ee8cc1Swenshuai.xi #endif
1861*53ee8cc1Swenshuai.xi     // the else are all normal cases.
1862*53ee8cc1Swenshuai.xi     if( MDrv_HVD_Sub_GetBBUVacancy() != 0)
1863*53ee8cc1Swenshuai.xi     {
1864*53ee8cc1Swenshuai.xi         {
1865*53ee8cc1Swenshuai.xi             MS_U32 u32ESRptr=HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_READ_PTR );
1866*53ee8cc1Swenshuai.xi             MS_U32 u32ESWptr=HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_WRITE_PTR);
1867*53ee8cc1Swenshuai.xi             if( ( u32ESWptr >= u32ESRptr ) &&
1868*53ee8cc1Swenshuai.xi                  ( gHVDPacket.u32Staddr + gHVDPacket.u32Length >= gSubHVDCtrl.MemMap.u32BitstreamBufSize )  )
1869*53ee8cc1Swenshuai.xi             {
1870*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR(  "HVD Warn: input packet (%lx %lx %lx) may cause bitstream buffer overflow(%lx %lx) %lx\n " , gHVDPacket.u32Staddr , gHVDPacket.u32Length  ,  gHVDPacket.u32Staddr+gHVDPacket.u32Length  , u32ESRptr ,u32ESWptr , gSubHVDCtrl.MemMap.u32BitstreamBufSize );
1871*53ee8cc1Swenshuai.xi             }
1872*53ee8cc1Swenshuai.xi             if( ( u32ESWptr < u32ESRptr ) &&
1873*53ee8cc1Swenshuai.xi                  ( gHVDPacket.u32Staddr + gHVDPacket.u32Length >= u32ESRptr )  )
1874*53ee8cc1Swenshuai.xi             {
1875*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR(  "HVD Warn: input packet (%lx %lx %lx) may overwrite undecoded data(%lx %lx)\n " , gHVDPacket.u32Staddr , gHVDPacket.u32Length  ,  gHVDPacket.u32Staddr+gHVDPacket.u32Length  , u32ESRptr ,u32ESWptr );
1876*53ee8cc1Swenshuai.xi             }
1877*53ee8cc1Swenshuai.xi             if( HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_Q_NUMB) && (!bNULLPacket) &&
1878*53ee8cc1Swenshuai.xi                  (gSubHVDCtrl.MemMap.u32DrvProcessBufSize != 0) &&
1879*53ee8cc1Swenshuai.xi                  ( gSubHVDCtrl.MemMap.u32BitstreamBufAddr<= gSubHVDCtrl.MemMap.u32DrvProcessBufAddr  ) &&
1880*53ee8cc1Swenshuai.xi                  ( gSubHVDCtrl.MemMap.u32DrvProcessBufAddr < (gSubHVDCtrl.MemMap.u32BitstreamBufAddr + gSubHVDCtrl.MemMap.u32BitstreamBufSize)) )
1881*53ee8cc1Swenshuai.xi             {
1882*53ee8cc1Swenshuai.xi                     MS_U32 u32Lower = gSubHVDCtrl.MemMap.u32DrvProcessBufAddr - gSubHVDCtrl.MemMap.u32BitstreamBufAddr;
1883*53ee8cc1Swenshuai.xi                     MS_U32 u32Upper = u32Lower+gSubHVDCtrl.MemMap.u32DrvProcessBufSize;
1884*53ee8cc1Swenshuai.xi                     if( ( (u32Lower <= gHVDPacket.u32Staddr) && (gHVDPacket.u32Staddr < u32Upper)) ||
1885*53ee8cc1Swenshuai.xi                          ( (u32Lower <= (gHVDPacket.u32Staddr + gHVDPacket.u32Length) ) && ( (gHVDPacket.u32Staddr+gHVDPacket.u32Length) < u32Upper)) ||
1886*53ee8cc1Swenshuai.xi                          ( (gHVDPacket.u32Staddr < u32Lower) && (u32Upper<=(gHVDPacket.u32Staddr+gHVDPacket.u32Length)) )   )
1887*53ee8cc1Swenshuai.xi                     {
1888*53ee8cc1Swenshuai.xi                         HVD_SUB_MSG_ERR(  "HVD Warn: input packet (%lx %lx %lx) is located in HVD driver process buffer(%lx %lx)\n " , gHVDPacket.u32Staddr , gHVDPacket.u32Length  ,  gHVDPacket.u32Staddr+gHVDPacket.u32Length  , u32Lower ,u32Upper );
1889*53ee8cc1Swenshuai.xi                     }
1890*53ee8cc1Swenshuai.xi             }
1891*53ee8cc1Swenshuai.xi          //for debug
1892*53ee8cc1Swenshuai.xi             if( 0)
1893*53ee8cc1Swenshuai.xi             {
1894*53ee8cc1Swenshuai.xi                  HVD_SUB_MSG_INFO(  "HVD : %lu (%lu %lu) ID:%lx input packet (%lx %lx %lx) (%lx %lx %lx) (%lu %lu %lu)\n " ,
1895*53ee8cc1Swenshuai.xi                     gSubHVDCtrl.u32BBUPacketCnt , MDrv_HVD_Sub_GetDataErrCnt() , MDrv_HVD_Sub_GetDecErrCnt(),
1896*53ee8cc1Swenshuai.xi                     gHVDPacket.u32ID_L , gHVDPacket.u32Staddr+gHVDPacket.u32Length , gHVDPacket.u32Length, gHVDPacket.u32Staddr,
1897*53ee8cc1Swenshuai.xi                     u32ESRptr, gSubHVDCtrl.MemMap.u32BitstreamBufSize  ,u32ESWptr ,
1898*53ee8cc1Swenshuai.xi                     MDrv_HVD_Sub_GetBBUVacancy() ,HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_READ_PTR) ,HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_WRITE_PTR) );
1899*53ee8cc1Swenshuai.xi             }
1900*53ee8cc1Swenshuai.xi         }
1901*53ee8cc1Swenshuai.xi         #if !(defined(UDMA_FPGA_ENVI))
1902*53ee8cc1Swenshuai.xi         if( ((gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM)
1903*53ee8cc1Swenshuai.xi         && (gSubHVDCtrl.bAutoRmLastZeroByte == TRUE)
1904*53ee8cc1Swenshuai.xi         && ( (!gSubHVDCtrl.bCannotAccessMIU256) ||
1905*53ee8cc1Swenshuai.xi              (( gSubHVDCtrl.bCannotAccessMIU256 )  && ( gSubHVDCtrl.MemMap.u32BitstreamBufAddr < gSubHVDCtrl.MemMap.u32MIU1BaseAddr))) )
1906*53ee8cc1Swenshuai.xi         {
1907*53ee8cc1Swenshuai.xi             MS_U32 ModifyCnt=0;
1908*53ee8cc1Swenshuai.xi             while(1)//for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
1909*53ee8cc1Swenshuai.xi             {
1910*53ee8cc1Swenshuai.xi                 if( gHVDPacket.u32Length )
1911*53ee8cc1Swenshuai.xi                 {
1912*53ee8cc1Swenshuai.xi                     MS_U8 *pByte=NULL;
1913*53ee8cc1Swenshuai.xi                     MS_U32 u32tmp=0;
1914*53ee8cc1Swenshuai.xi                     u32tmp = ( gHVDPacket.u32Staddr + gHVDPacket.u32Length-1);
1915*53ee8cc1Swenshuai.xi                     if( u32tmp >= gSubHVDCtrl.MemMap.u32BitstreamBufSize )
1916*53ee8cc1Swenshuai.xi                     {
1917*53ee8cc1Swenshuai.xi                         u32tmp-=gSubHVDCtrl.MemMap.u32BitstreamBufSize;
1918*53ee8cc1Swenshuai.xi                     }
1919*53ee8cc1Swenshuai.xi                     u32tmp+=gSubHVDCtrl.MemMap.u32BitstreamBufVAddr;
1920*53ee8cc1Swenshuai.xi                     pByte = (MS_U8 *)u32tmp;
1921*53ee8cc1Swenshuai.xi                     if( *pByte == 0 )
1922*53ee8cc1Swenshuai.xi                     {
1923*53ee8cc1Swenshuai.xi                         /*
1924*53ee8cc1Swenshuai.xi                        if( ModifyCnt == 2 )
1925*53ee8cc1Swenshuai.xi                        {
1926*53ee8cc1Swenshuai.xi                             gHVDPacket.u32Length+=ModifyCnt;
1927*53ee8cc1Swenshuai.xi                        }
1928*53ee8cc1Swenshuai.xi                        else
1929*53ee8cc1Swenshuai.xi                        */
1930*53ee8cc1Swenshuai.xi                        {
1931*53ee8cc1Swenshuai.xi                         ModifyCnt++;
1932*53ee8cc1Swenshuai.xi                             gHVDPacket.u32Length--;
1933*53ee8cc1Swenshuai.xi                        }
1934*53ee8cc1Swenshuai.xi                     }
1935*53ee8cc1Swenshuai.xi                     else
1936*53ee8cc1Swenshuai.xi                     {
1937*53ee8cc1Swenshuai.xi                         break;
1938*53ee8cc1Swenshuai.xi                     }
1939*53ee8cc1Swenshuai.xi                 }
1940*53ee8cc1Swenshuai.xi             }
1941*53ee8cc1Swenshuai.xi             if( ModifyCnt != 0)
1942*53ee8cc1Swenshuai.xi             {
1943*53ee8cc1Swenshuai.xi                 //HVD_SUB_MSG_INFO("HVD remove last zero byte:%lu\n" , ModifyCnt);
1944*53ee8cc1Swenshuai.xi             }
1945*53ee8cc1Swenshuai.xi             if( gHVDPacket.u32Length == 0 )
1946*53ee8cc1Swenshuai.xi             {
1947*53ee8cc1Swenshuai.xi                 HVD_SUB_MSG_ERR(  "HVD Warn: Packet with all zero bytes(staddr:0x%lx remove zero bytes:%lu)\n " ,  gHVDPacket.u32Staddr , ModifyCnt);
1948*53ee8cc1Swenshuai.xi                 eRet=E_HVD_OK;
1949*53ee8cc1Swenshuai.xi                 _DRV_HVD_Return(eRet );
1950*53ee8cc1Swenshuai.xi             }
1951*53ee8cc1Swenshuai.xi         }
1952*53ee8cc1Swenshuai.xi         #endif
1953*53ee8cc1Swenshuai.xi         /*
1954*53ee8cc1Swenshuai.xi         {
1955*53ee8cc1Swenshuai.xi             MS_U8 *pByte=NULL;
1956*53ee8cc1Swenshuai.xi             pByte = (MS_U8 *)((gSubHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
1957*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
1958*53ee8cc1Swenshuai.xi                 *pByte  , *(pByte+1) , *(pByte+2) , *(pByte+3) );
1959*53ee8cc1Swenshuai.xi         }
1960*53ee8cc1Swenshuai.xi         */
1961*53ee8cc1Swenshuai.xi         eRet=( HVD_Result )HAL_HVD_Sub_PushPacket( (HVD_BBU_Info*)&gHVDPacket );
1962*53ee8cc1Swenshuai.xi 
1963*53ee8cc1Swenshuai.xi     }
1964*53ee8cc1Swenshuai.xi     else
1965*53ee8cc1Swenshuai.xi     {
1966*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("Push queue full\n");
1967*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_QUEUE_FULL;
1968*53ee8cc1Swenshuai.xi     }
1969*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1970*53ee8cc1Swenshuai.xi }
1971*53ee8cc1Swenshuai.xi 
1972*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1973*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_PushQueue_Fire()
1974*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  fire all waiting entry into the decoding table(BBU table).
1975*53ee8cc1Swenshuai.xi /// @return -The result of command push queue fire
1976*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_PushQueue_Fire(void)1977*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_PushQueue_Fire(void)
1978*53ee8cc1Swenshuai.xi {
1979*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1980*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
1981*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1982*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1983*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_UpdateESWptr_Fire();
1984*53ee8cc1Swenshuai.xi     eRet= E_HVD_OK;
1985*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
1986*53ee8cc1Swenshuai.xi }
1987*53ee8cc1Swenshuai.xi 
1988*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1989*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_DecodeIFrame()
1990*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Decode I frame only under driver input path.
1991*53ee8cc1Swenshuai.xi /// @param -u32SrcSt \b IN :  The physical address if user has input packet.
1992*53ee8cc1Swenshuai.xi /// @param -u32SrcSize \b IN :  The packet size if user has input packet.
1993*53ee8cc1Swenshuai.xi /// @return -The result of command decode I frame.
1994*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_DecodeIFrame(MS_PHYADDR u32SrcSt,MS_U32 u32SrcSize)1995*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_DecodeIFrame(MS_PHYADDR u32SrcSt , MS_U32 u32SrcSize)
1996*53ee8cc1Swenshuai.xi {
1997*53ee8cc1Swenshuai.xi     MS_U32 timer = 300;
1998*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1999*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2000*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2001*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2002*53ee8cc1Swenshuai.xi 
2003*53ee8cc1Swenshuai.xi     eRet= MDrv_HVD_Sub_Pause();
2004*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK)
2005*53ee8cc1Swenshuai.xi     {
2006*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2007*53ee8cc1Swenshuai.xi     }
2008*53ee8cc1Swenshuai.xi     // skip decode I
2009*53ee8cc1Swenshuai.xi     eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SKIP_DEC, E_HVD_SKIP_DECODE_I);
2010*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2011*53ee8cc1Swenshuai.xi     {
2012*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2013*53ee8cc1Swenshuai.xi     }
2014*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_I_DIRECT, TRUE);
2015*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2016*53ee8cc1Swenshuai.xi     {
2017*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2018*53ee8cc1Swenshuai.xi     }
2019*53ee8cc1Swenshuai.xi     eRet = MDrv_HVD_Sub_StepDecode();
2020*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK)
2021*53ee8cc1Swenshuai.xi     {
2022*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2023*53ee8cc1Swenshuai.xi     }
2024*53ee8cc1Swenshuai.xi     if( E_HVD_INIT_INPUT_DRV == (gSubHVDCtrl.InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) )
2025*53ee8cc1Swenshuai.xi     {
2026*53ee8cc1Swenshuai.xi         HVD_Packet_Info packet;
2027*53ee8cc1Swenshuai.xi         if( u32SrcSize ==0 )
2028*53ee8cc1Swenshuai.xi         {
2029*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2030*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR( "HVD err: decode I frame input packet size is zero\n" );
2031*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2032*53ee8cc1Swenshuai.xi         }
2033*53ee8cc1Swenshuai.xi         packet.u32Staddr = u32SrcSt - gSubHVDCtrl.MemMap.u32BitstreamBufAddr ;
2034*53ee8cc1Swenshuai.xi         packet.u32Length = u32SrcSize;
2035*53ee8cc1Swenshuai.xi         if( ( packet.u32Staddr + packet.u32Length )  >  gSubHVDCtrl.MemMap.u32BitstreamBufSize )
2036*53ee8cc1Swenshuai.xi         {
2037*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2038*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR( "HVD err: decode I frame memory overflow, the packet end address is over ES buffer end address\n" );
2039*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2040*53ee8cc1Swenshuai.xi         }
2041*53ee8cc1Swenshuai.xi         packet.u32TimeStamp = 0xFFFFFFFF;
2042*53ee8cc1Swenshuai.xi         packet.u32ID_L=0;
2043*53ee8cc1Swenshuai.xi         packet.u32ID_H=0;
2044*53ee8cc1Swenshuai.xi         MDrv_HVD_Sub_PushQueue( &packet );
2045*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_UpdateESWptr_Fire();
2046*53ee8cc1Swenshuai.xi     }
2047*53ee8cc1Swenshuai.xi     while( timer )
2048*53ee8cc1Swenshuai.xi     {
2049*53ee8cc1Swenshuai.xi         HVD_Delay_ms(1);
2050*53ee8cc1Swenshuai.xi         if( MDrv_HVD_Sub_IsStepDecodeDone() )
2051*53ee8cc1Swenshuai.xi         {
2052*53ee8cc1Swenshuai.xi             break;
2053*53ee8cc1Swenshuai.xi         }
2054*53ee8cc1Swenshuai.xi         timer--;
2055*53ee8cc1Swenshuai.xi     }
2056*53ee8cc1Swenshuai.xi     if( timer ==0)
2057*53ee8cc1Swenshuai.xi     {
2058*53ee8cc1Swenshuai.xi         eRet= E_HVD_FAIL;
2059*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR( "HVD err: decode I frame time out, not enough data\n" );
2060*53ee8cc1Swenshuai.xi         _DRV_HVD_Return( eRet);
2061*53ee8cc1Swenshuai.xi     }
2062*53ee8cc1Swenshuai.xi     eRet= E_HVD_OK;
2063*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
2064*53ee8cc1Swenshuai.xi }
2065*53ee8cc1Swenshuai.xi 
2066*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2067*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDataEnd()
2068*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Upper layer set this to inform driver that there are no more data will be pushed.
2069*53ee8cc1Swenshuai.xi /// @param -bEnd \b IN :  Enable/ Disable
2070*53ee8cc1Swenshuai.xi ///                 -FALSE(0): normal status( default )
2071*53ee8cc1Swenshuai.xi ///                 -TRUE(1): ending status
2072*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDataEnd(MS_BOOL bEnd)2073*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDataEnd( MS_BOOL bEnd )
2074*53ee8cc1Swenshuai.xi {
2075*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2076*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2077*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2078*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2079*53ee8cc1Swenshuai.xi     if( bEnd )
2080*53ee8cc1Swenshuai.xi     {
2081*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode|= HVD_CTRL_DATA_END;
2082*53ee8cc1Swenshuai.xi     }
2083*53ee8cc1Swenshuai.xi     else
2084*53ee8cc1Swenshuai.xi     {
2085*53ee8cc1Swenshuai.xi         gSubHVDCtrl.u32CtrlMode&=~ HVD_CTRL_DATA_END;
2086*53ee8cc1Swenshuai.xi     }
2087*53ee8cc1Swenshuai.xi     //_DRV_HVD_PushDummy_Rst();
2088*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_PLAYBACK_FINISH, bEnd);
2089*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
2090*53ee8cc1Swenshuai.xi }
2091*53ee8cc1Swenshuai.xi 
2092*53ee8cc1Swenshuai.xi 
2093*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2094*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDispErrFrm()
2095*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to decode and show error(broken) frames
2096*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
2097*53ee8cc1Swenshuai.xi ///                 -FALSE(0): hide error frames
2098*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show error frames
2099*53ee8cc1Swenshuai.xi /// @return -The result of command set display error frames
2100*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDispErrFrm(MS_BOOL bEnable)2101*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDispErrFrm(MS_BOOL bEnable)
2102*53ee8cc1Swenshuai.xi {
2103*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2104*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2105*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2106*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2107*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_ERR_FRM, bEnable);
2108*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.bIsShowErrFrm=bEnable;
2109*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2110*53ee8cc1Swenshuai.xi }
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2113*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDispRepeatField()
2114*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to show last field when FW needs to show repeated field
2115*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
2116*53ee8cc1Swenshuai.xi ///                 -FALSE(0): disable this mode
2117*53ee8cc1Swenshuai.xi ///                 -TRUE(1): enable this mode
2118*53ee8cc1Swenshuai.xi /// @return -The result of command set display repeated field
2119*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDispRepeatField(MS_BOOL bEnable)2120*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDispRepeatField(MS_BOOL bEnable)
2121*53ee8cc1Swenshuai.xi {
2122*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2123*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2124*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2125*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2126*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, bEnable);
2127*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2128*53ee8cc1Swenshuai.xi }
2129*53ee8cc1Swenshuai.xi 
2130*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2131*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSkipDecMode()
2132*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the decoding frame type.
2133*53ee8cc1Swenshuai.xi /// @param -eDecType \b IN : decoding frame type
2134*53ee8cc1Swenshuai.xi /// @return -The result of command set skip decode mode
2135*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSkipDecMode(HVD_Skip_Decode eDecType)2136*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSkipDecMode(HVD_Skip_Decode eDecType)
2137*53ee8cc1Swenshuai.xi {
2138*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2139*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2140*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2141*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2142*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2143*53ee8cc1Swenshuai.xi     if( (HVD_Skip_Decode)HAL_HVD_Sub_GetData( E_HVD_GDATA_SKIP_MODE ) != eDecType )
2144*53ee8cc1Swenshuai.xi #endif
2145*53ee8cc1Swenshuai.xi     {
2146*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SKIP_DEC, eDecType);
2147*53ee8cc1Swenshuai.xi         if( eRet != E_HVD_OK )
2148*53ee8cc1Swenshuai.xi         {
2149*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2150*53ee8cc1Swenshuai.xi         }
2151*53ee8cc1Swenshuai.xi         if( eDecType == E_HVD_SKIP_DECODE_I  )
2152*53ee8cc1Swenshuai.xi         {
2153*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_I_DIRECT, TRUE);
2154*53ee8cc1Swenshuai.xi         }
2155*53ee8cc1Swenshuai.xi         else
2156*53ee8cc1Swenshuai.xi         {
2157*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_I_DIRECT, FALSE);
2158*53ee8cc1Swenshuai.xi         }
2159*53ee8cc1Swenshuai.xi     }
2160*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u8SkipMode=(MS_U8)eDecType;
2161*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2162*53ee8cc1Swenshuai.xi }
2163*53ee8cc1Swenshuai.xi 
2164*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2165*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDispSpeed()
2166*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the display speed type.
2167*53ee8cc1Swenshuai.xi /// @param -eSpeed \b IN : display speed type
2168*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
2169*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDispSpeed(HVD_Drv_Disp_Speed eSpeed)2170*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDispSpeed(HVD_Drv_Disp_Speed eSpeed)
2171*53ee8cc1Swenshuai.xi {
2172*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2173*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2174*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2175*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2176*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_DEG(" MDrv_HVD_SetDispSpeed:%d\n " , (MS_S16)eSpeed);
2177*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2178*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData( E_HVD_GDATA_DISPLAY_DURATION ) != eSpeed )
2179*53ee8cc1Swenshuai.xi #endif
2180*53ee8cc1Swenshuai.xi     {
2181*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_SPEED, eSpeed);
2182*53ee8cc1Swenshuai.xi     }
2183*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
2184*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK )
2185*53ee8cc1Swenshuai.xi     {
2186*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
2187*53ee8cc1Swenshuai.xi         while( timer )
2188*53ee8cc1Swenshuai.xi         {
2189*53ee8cc1Swenshuai.xi             if( HAL_HVD_Sub_GetData( E_HVD_GDATA_DISPLAY_DURATION ) == eSpeed )
2190*53ee8cc1Swenshuai.xi             {
2191*53ee8cc1Swenshuai.xi                 break;
2192*53ee8cc1Swenshuai.xi             }
2193*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2194*53ee8cc1Swenshuai.xi             timer--;
2195*53ee8cc1Swenshuai.xi         }
2196*53ee8cc1Swenshuai.xi     }
2197*53ee8cc1Swenshuai.xi #endif
2198*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2199*53ee8cc1Swenshuai.xi }
2200*53ee8cc1Swenshuai.xi 
2201*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2202*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSyncActive()
2203*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/disable the sync of video time stamp and STC.
2204*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
2205*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable sync mode
2206*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable sync mode
2207*53ee8cc1Swenshuai.xi /// @return -The result of command set sync active
2208*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSyncActive(MS_BOOL bEnable)2209*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSyncActive( MS_BOOL bEnable)
2210*53ee8cc1Swenshuai.xi {
2211*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2212*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2213*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2214*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2215*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2216*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData( E_HVD_GDATA_IS_SYNC_ON ) != bEnable )
2217*53ee8cc1Swenshuai.xi #endif
2218*53ee8cc1Swenshuai.xi     {
2219*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_ACTIVE, bEnable);
2220*53ee8cc1Swenshuai.xi     }
2221*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
2222*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK )
2223*53ee8cc1Swenshuai.xi     {
2224*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
2225*53ee8cc1Swenshuai.xi         while( timer )
2226*53ee8cc1Swenshuai.xi         {
2227*53ee8cc1Swenshuai.xi             if( HAL_HVD_Sub_GetData( E_HVD_GDATA_IS_SYNC_ON ) == bEnable )
2228*53ee8cc1Swenshuai.xi             {
2229*53ee8cc1Swenshuai.xi                 break;
2230*53ee8cc1Swenshuai.xi             }
2231*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2232*53ee8cc1Swenshuai.xi             timer--;
2233*53ee8cc1Swenshuai.xi         }
2234*53ee8cc1Swenshuai.xi     }
2235*53ee8cc1Swenshuai.xi #endif
2236*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.bIsSyncOn=bEnable;
2237*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2238*53ee8cc1Swenshuai.xi }
2239*53ee8cc1Swenshuai.xi 
2240*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2241*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDropMode()
2242*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to drop decoded frames.
2243*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Drop display type.
2244*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The argument of eMode
2245*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_DROP_DISPLAY_AUTO)  , Enable: (u32Arg = TRUE); Disable: (u32Arg = FALSE)
2246*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_DROP_DISPLAY_ONCE)  , u32Arg = not zero
2247*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
2248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDropMode(HVD_Drop_Disp eMode,MS_U32 u32Arg)2249*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDropMode( HVD_Drop_Disp eMode , MS_U32 u32Arg)
2250*53ee8cc1Swenshuai.xi {
2251*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2252*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2253*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2254*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2255*53ee8cc1Swenshuai.xi 
2256*53ee8cc1Swenshuai.xi     if( eMode  == E_HVD_DROP_DISPLAY_AUTO )
2257*53ee8cc1Swenshuai.xi     {
2258*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DROP_DISP_AUTO, u32Arg);
2259*53ee8cc1Swenshuai.xi     }
2260*53ee8cc1Swenshuai.xi     else if( eMode  == E_HVD_DROP_DISPLAY_ONCE )
2261*53ee8cc1Swenshuai.xi     {
2262*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DROP_DISP_ONCE, u32Arg);
2263*53ee8cc1Swenshuai.xi     }
2264*53ee8cc1Swenshuai.xi     else
2265*53ee8cc1Swenshuai.xi     {
2266*53ee8cc1Swenshuai.xi         eRet= E_HVD_RET_INVALID_PARAMETER;
2267*53ee8cc1Swenshuai.xi     }
2268*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2269*53ee8cc1Swenshuai.xi }
2270*53ee8cc1Swenshuai.xi 
2271*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2272*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_RstPTS()
2273*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD sync table
2274*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : PTS base
2275*53ee8cc1Swenshuai.xi /// @return -The result of command reset PTS
2276*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_RstPTS(MS_U32 u32PTS)2277*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_RstPTS(MS_U32 u32PTS)
2278*53ee8cc1Swenshuai.xi {
2279*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2280*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2281*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2282*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2283*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_RESET_PTS, u32PTS);
2284*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2285*53ee8cc1Swenshuai.xi }
2286*53ee8cc1Swenshuai.xi 
2287*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2288*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetFrcMode()
2289*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the frame rate convert mode.
2290*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
2291*53ee8cc1Swenshuai.xi /// @return -The result of command set frame rate convert mode
2292*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetFrcMode(HVD_FrmRateConv_Mode eMode)2293*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetFrcMode(HVD_FrmRateConv_Mode eMode )
2294*53ee8cc1Swenshuai.xi {
2295*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2296*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2297*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2298*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2299*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_FRC_MODE, eMode);
2300*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u8FrcMode=(MS_U8)eMode;
2301*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2302*53ee8cc1Swenshuai.xi }
2303*53ee8cc1Swenshuai.xi 
2304*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2305*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSyncTolerance()
2306*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
2307*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : tolerance.
2308*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2309*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSyncTolerance(MS_U32 u32Arg)2310*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSyncTolerance(MS_U32 u32Arg )
2311*53ee8cc1Swenshuai.xi {
2312*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2313*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2314*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2315*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2316*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_TOLERANCE, u32Arg);
2317*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u32SyncTolerance=u32Arg;
2318*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2319*53ee8cc1Swenshuai.xi }
2320*53ee8cc1Swenshuai.xi 
2321*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2322*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSyncVideoDelay()
2323*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the video delay from STC when sync mode active.
2324*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The video delay. unit:ms
2325*53ee8cc1Swenshuai.xi /// @return -The result of command set sync video delay
2326*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSyncVideoDelay(MS_U32 u32Arg)2327*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSyncVideoDelay( MS_U32 u32Arg)
2328*53ee8cc1Swenshuai.xi {
2329*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2330*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2331*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2332*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2333*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) ==
2334*53ee8cc1Swenshuai.xi          HVD_INIT_MAIN_LIVE_STREAM   )
2335*53ee8cc1Swenshuai.xi     {
2336*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.InitParams.u8TimeUnit )
2337*53ee8cc1Swenshuai.xi         {
2338*53ee8cc1Swenshuai.xi             eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32)(u32Arg+HVD_DTV_VIDEO_DELAY)  );
2339*53ee8cc1Swenshuai.xi         }
2340*53ee8cc1Swenshuai.xi         else
2341*53ee8cc1Swenshuai.xi         {
2342*53ee8cc1Swenshuai.xi             eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg+((MS_U32)HVD_DTV_VIDEO_DELAY*90)  );
2343*53ee8cc1Swenshuai.xi         }
2344*53ee8cc1Swenshuai.xi     }
2345*53ee8cc1Swenshuai.xi     else
2346*53ee8cc1Swenshuai.xi     {
2347*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg);
2348*53ee8cc1Swenshuai.xi     }
2349*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u32SyncVideoDelay=u32Arg;
2350*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2351*53ee8cc1Swenshuai.xi }
2352*53ee8cc1Swenshuai.xi 
2353*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2354*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSyncFreeRunTH()
2355*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
2356*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : theashold.
2357*53ee8cc1Swenshuai.xi ///                     - 0 : use FW default value
2358*53ee8cc1Swenshuai.xi ///                     - 0xFFFFFFFF : never free run, FW always do sync action.
2359*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2360*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSyncFreeRunTH(MS_U32 u32Arg)2361*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSyncFreeRunTH(MS_U32 u32Arg )
2362*53ee8cc1Swenshuai.xi {
2363*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2364*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2365*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2366*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2367*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_FREERUN_THRESHOLD, u32Arg);
2368*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u32SyncFreeRunTH=u32Arg;
2369*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2370*53ee8cc1Swenshuai.xi }
2371*53ee8cc1Swenshuai.xi 
2372*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2373*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSyncRepeatTH()
2374*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the repeat threashold under sync mode.
2375*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : repeat times. 0x01 ~ 0xFF
2376*53ee8cc1Swenshuai.xi ///                 0xff - repeat current frame until STC catch up PTS.
2377*53ee8cc1Swenshuai.xi /// @return -The result of command set sync repeat threashold
2378*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSyncRepeatTH(MS_U32 u32Arg)2379*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSyncRepeatTH( MS_U32 u32Arg)
2380*53ee8cc1Swenshuai.xi {
2381*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2382*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2383*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2384*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2385*53ee8cc1Swenshuai.xi     eRet= (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SYNC_THRESHOLD, u32Arg);
2386*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.u32SyncRepeatTH=u32Arg;
2387*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2388*53ee8cc1Swenshuai.xi }
2389*53ee8cc1Swenshuai.xi 
2390*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2391*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetErrConceal()
2392*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/Disable error concealment.
2393*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2394*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable error concealment.
2395*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable error concealment.
2396*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2397*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetErrConceal(MS_BOOL bEnable)2398*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetErrConceal(MS_BOOL bEnable )
2399*53ee8cc1Swenshuai.xi {
2400*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2401*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2402*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2403*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2404*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_ERR_CONCEAL, bEnable);
2405*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.bIsErrConceal=bEnable;
2406*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2407*53ee8cc1Swenshuai.xi }
2408*53ee8cc1Swenshuai.xi 
2409*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2410*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDbgLevel()
2411*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set debug level
2412*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
2413*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDbgLevel(HVD_Uart_Level elevel)2414*53ee8cc1Swenshuai.xi void MDrv_HVD_Sub_SetDbgLevel( HVD_Uart_Level elevel )
2415*53ee8cc1Swenshuai.xi {
2416*53ee8cc1Swenshuai.xi     if( elevel == E_HVD_UART_LEVEL_FW )
2417*53ee8cc1Swenshuai.xi     {
2418*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_UartSwitch2FW(TRUE);
2419*53ee8cc1Swenshuai.xi     }
2420*53ee8cc1Swenshuai.xi     #if 0
2421*53ee8cc1Swenshuai.xi     else
2422*53ee8cc1Swenshuai.xi     {
2423*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_UartSwitch2FW(FALSE);
2424*53ee8cc1Swenshuai.xi     }
2425*53ee8cc1Swenshuai.xi     #endif
2426*53ee8cc1Swenshuai.xi     switch( elevel )
2427*53ee8cc1Swenshuai.xi     {
2428*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_ERR:
2429*53ee8cc1Swenshuai.xi         u32SubUartCtrl =E_HVD_UART_CTRL_ERR;
2430*53ee8cc1Swenshuai.xi         break;
2431*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_INFO:
2432*53ee8cc1Swenshuai.xi         u32SubUartCtrl =E_HVD_UART_CTRL_INFO|E_HVD_UART_CTRL_ERR;
2433*53ee8cc1Swenshuai.xi         break;
2434*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_DBG:
2435*53ee8cc1Swenshuai.xi         u32SubUartCtrl =E_HVD_UART_CTRL_DBG|E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_INFO;
2436*53ee8cc1Swenshuai.xi         break;
2437*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_TRACE:
2438*53ee8cc1Swenshuai.xi         u32SubUartCtrl =E_HVD_UART_CTRL_TRACE|E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_INFO|E_HVD_UART_CTRL_DBG;
2439*53ee8cc1Swenshuai.xi         break;
2440*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_FW:
2441*53ee8cc1Swenshuai.xi         //u32SubUartCtrl =E_HVD_UART_CTRL_FW|E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_INFO|E_HVD_UART_CTRL_DBG|E_HVD_UART_CTRL_TRACE;
2442*53ee8cc1Swenshuai.xi         //break;
2443*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_NONE:
2444*53ee8cc1Swenshuai.xi     default:
2445*53ee8cc1Swenshuai.xi         u32SubUartCtrl=E_HVD_UART_CTRL_DISABLE;
2446*53ee8cc1Swenshuai.xi         break;
2447*53ee8cc1Swenshuai.xi     }
2448*53ee8cc1Swenshuai.xi }
2449*53ee8cc1Swenshuai.xi 
2450*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2451*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SeekToPTS()
2452*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_SetSyncActive(TRUE).
2453*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
2454*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
2455*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
2456*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
2457*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SeekToPTS(MS_U32 u32PTS)2458*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SeekToPTS(MS_U32 u32PTS )
2459*53ee8cc1Swenshuai.xi {
2460*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2461*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2462*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2463*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2464*53ee8cc1Swenshuai.xi     eRet=_DRV_HVD_Sub_Check_Cmd( E_HVD_CHECK_CMD_SEEK2PTS );
2465*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2466*53ee8cc1Swenshuai.xi     {
2467*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2468*53ee8cc1Swenshuai.xi     }
2469*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_JUMP_TO_PTS, u32PTS);
2470*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2471*53ee8cc1Swenshuai.xi }
2472*53ee8cc1Swenshuai.xi 
2473*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2474*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SkipToPTS()
2475*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.
2476*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
2477*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
2478*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
2479*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
2480*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SkipToPTS(MS_U32 u32PTS)2481*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SkipToPTS(MS_U32 u32PTS )
2482*53ee8cc1Swenshuai.xi {
2483*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2484*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2485*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2486*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2487*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SKIP_TO_PTS, u32PTS);
2488*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2489*53ee8cc1Swenshuai.xi }
2490*53ee8cc1Swenshuai.xi 
2491*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2492*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetFreezeImg()
2493*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync, but decoding process is still going.
2494*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2495*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable freeze image.
2496*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable freeze image.
2497*53ee8cc1Swenshuai.xi /// @return -The result of command freeze image.
2498*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetFreezeImg(MS_BOOL bEnable)2499*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetFreezeImg(MS_BOOL bEnable )
2500*53ee8cc1Swenshuai.xi {
2501*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2502*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2503*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2504*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2505*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_FREEZE_IMG, bEnable);
2506*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2507*53ee8cc1Swenshuai.xi }
2508*53ee8cc1Swenshuai.xi 
2509*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2510*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetBlueScreen()
2511*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync and keep blue screen , but decoding process is still going.
2512*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2513*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable blue screen.
2514*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable blue screen.
2515*53ee8cc1Swenshuai.xi /// @return -The result of command set blue screen.
2516*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetBlueScreen(MS_BOOL bEnable)2517*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetBlueScreen(MS_BOOL bEnable )
2518*53ee8cc1Swenshuai.xi {
2519*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2520*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2521*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2522*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2523*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_BLUE_SCREEN, bEnable);
2524*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2525*53ee8cc1Swenshuai.xi }
2526*53ee8cc1Swenshuai.xi 
2527*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2528*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDispOneField()
2529*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW only show one field(top field only).
2530*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2531*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable display one field.
2532*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable display one field.
2533*53ee8cc1Swenshuai.xi /// @return -The result of command display one field.
2534*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDispOneField(MS_BOOL bEnable)2535*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDispOneField(MS_BOOL bEnable )
2536*53ee8cc1Swenshuai.xi {
2537*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2538*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2539*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2540*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2541*53ee8cc1Swenshuai.xi     if( bEnable )
2542*53ee8cc1Swenshuai.xi     {   // force to show top field only.
2543*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_TOP);
2544*53ee8cc1Swenshuai.xi     }
2545*53ee8cc1Swenshuai.xi     else
2546*53ee8cc1Swenshuai.xi     {
2547*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_OFF);
2548*53ee8cc1Swenshuai.xi     }
2549*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2550*53ee8cc1Swenshuai.xi }
2551*53ee8cc1Swenshuai.xi 
2552*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2553*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetISREvent()
2554*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by HVD fw.
2555*53ee8cc1Swenshuai.xi /// @param -u32Event \b IN : event types
2556*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
2557*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
2558*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetISREvent(MS_U32 u32Event,HVD_InterruptCb fnISRHandler)2559*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetISREvent(MS_U32 u32Event, HVD_InterruptCb fnISRHandler)
2560*53ee8cc1Swenshuai.xi {
2561*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2562*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2563*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2564*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2565*53ee8cc1Swenshuai.xi     if( u32Event == E_HVD_ISR_NONE )
2566*53ee8cc1Swenshuai.xi     {
2567*53ee8cc1Swenshuai.xi         gSubHVDCtrl.Settings.bEnISR = FALSE;
2568*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_Enable_ISR(FALSE);
2569*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Disable();
2570*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Detach();
2571*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bRegISR = FALSE;
2572*53ee8cc1Swenshuai.xi         gHVDISRCtrl.pfnISRCallBack = NULL;
2573*53ee8cc1Swenshuai.xi         gSubHVDCtrl.Settings.u32IsrEvent = (MS_U32)E_HVD_ISR_NONE;
2574*53ee8cc1Swenshuai.xi         eRet = E_HVD_OK;
2575*53ee8cc1Swenshuai.xi     }
2576*53ee8cc1Swenshuai.xi     else
2577*53ee8cc1Swenshuai.xi     {
2578*53ee8cc1Swenshuai.xi         if(fnISRHandler != NULL)
2579*53ee8cc1Swenshuai.xi         {
2580*53ee8cc1Swenshuai.xi #if 1 //If ISR handler has been registerred, we only need to reset event flag.
2581*53ee8cc1Swenshuai.xi             if( gHVDISRCtrl.bRegISR )
2582*53ee8cc1Swenshuai.xi             {
2583*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2584*53ee8cc1Swenshuai.xi                 eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2585*53ee8cc1Swenshuai.xi                 if( eRet != E_HVD_OK)
2586*53ee8cc1Swenshuai.xi                 {
2587*53ee8cc1Swenshuai.xi                     _DRV_HVD_Return(eRet);
2588*53ee8cc1Swenshuai.xi                 }
2589*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.Settings.u32IsrEvent = u32Event;
2590*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
2591*53ee8cc1Swenshuai.xi             }
2592*53ee8cc1Swenshuai.xi             else
2593*53ee8cc1Swenshuai.xi             {
2594*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2595*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Attach( (void*)_DRV_HVD_Sub_ISRHandler );
2596*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Enable();
2597*53ee8cc1Swenshuai.xi                 HVD_MSG_INFO("attach ISR number:%d\n" , HVD_ISR_VECTOR);
2598*53ee8cc1Swenshuai.xi                 eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2599*53ee8cc1Swenshuai.xi                 if(eRet != E_HVD_OK)
2600*53ee8cc1Swenshuai.xi                 {
2601*53ee8cc1Swenshuai.xi                     _DRV_HVD_Return(eRet );
2602*53ee8cc1Swenshuai.xi                 }
2603*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.Settings.u32IsrEvent = u32Event;
2604*53ee8cc1Swenshuai.xi                 gSubHVDCtrl.Settings.bEnISR = TRUE;
2605*53ee8cc1Swenshuai.xi                 HAL_HVD_Sub_Enable_ISR(TRUE);
2606*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.bRegISR=TRUE;
2607*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
2608*53ee8cc1Swenshuai.xi             }
2609*53ee8cc1Swenshuai.xi #else
2610*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_Enable_ISR(FALSE);
2611*53ee8cc1Swenshuai.xi             if( gHVDISRCtrl.bRegISR )
2612*53ee8cc1Swenshuai.xi             {
2613*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Detach();
2614*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.bRegISR=FALSE;
2615*53ee8cc1Swenshuai.xi             }
2616*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2617*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Attach( (void*)_DRV_HVD_Sub_ISRHandler );
2618*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Enable();
2619*53ee8cc1Swenshuai.xi /*
2620*53ee8cc1Swenshuai.xi             {
2621*53ee8cc1Swenshuai.xi                 MS_U32 i=0;
2622*53ee8cc1Swenshuai.xi                 for( i=0;i<68;i++ )
2623*53ee8cc1Swenshuai.xi                 {
2624*53ee8cc1Swenshuai.xi                     MsOS_AttachInterrupt( i , (void*)_DRV_HVD_Sub_ISRHandler );//(InterruptCb)fnISRHandler  );
2625*53ee8cc1Swenshuai.xi                     MsOS_EnableInterrupt(i);
2626*53ee8cc1Swenshuai.xi                 }
2627*53ee8cc1Swenshuai.xi             }
2628*53ee8cc1Swenshuai.xi */
2629*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_INFO("attach ISR number:%d\n" , HVD_ISR_VECTOR);
2630*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2631*53ee8cc1Swenshuai.xi             gSubHVDCtrl.Settings.u32IsrEvent = u32Event;
2632*53ee8cc1Swenshuai.xi             if( eRet != E_HVD_OK)
2633*53ee8cc1Swenshuai.xi             {
2634*53ee8cc1Swenshuai.xi                 _DRV_HVD_Return(eRet );
2635*53ee8cc1Swenshuai.xi             }
2636*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_Enable_ISR(TRUE);
2637*53ee8cc1Swenshuai.xi             gHVDISRCtrl.bRegISR=TRUE;
2638*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
2639*53ee8cc1Swenshuai.xi #endif
2640*53ee8cc1Swenshuai.xi         }
2641*53ee8cc1Swenshuai.xi         else
2642*53ee8cc1Swenshuai.xi         {
2643*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR( "HVD DrvErr: SetISREvent with NULL pointer. ISR type:%lu\n", u32Event);
2644*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2645*53ee8cc1Swenshuai.xi         }
2646*53ee8cc1Swenshuai.xi     }
2647*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
2648*53ee8cc1Swenshuai.xi }
2649*53ee8cc1Swenshuai.xi 
2650*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2651*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetEnableISR()
2652*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable HVD interrupt.
2653*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2654*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable interrupt.
2655*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable interrupt.
2656*53ee8cc1Swenshuai.xi /// @return -The result of command set enable ISR.
2657*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetEnableISR(MS_BOOL bEnable)2658*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_SetEnableISR(MS_BOOL bEnable)
2659*53ee8cc1Swenshuai.xi {
2660*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2661*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2662*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_Enable_ISR(bEnable);
2663*53ee8cc1Swenshuai.xi     gSubHVDCtrl.Settings.bEnISR=bEnable;
2664*53ee8cc1Swenshuai.xi     return TRUE;
2665*53ee8cc1Swenshuai.xi }
2666*53ee8cc1Swenshuai.xi 
2667*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2668*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetForceISR()
2669*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: test the HVD interrupt function. Force FW send one interrupt.
2670*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2671*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Clear force interrupt status from HK.
2672*53ee8cc1Swenshuai.xi ///                 -TRUE(1): force one interrupt from HK.
2673*53ee8cc1Swenshuai.xi /// @return -The result of command set force ISR.
2674*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetForceISR(MS_BOOL bEnable)2675*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_SetForceISR(MS_BOOL bEnable)
2676*53ee8cc1Swenshuai.xi {
2677*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2678*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2679*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetForceISR( bEnable);
2680*53ee8cc1Swenshuai.xi     return TRUE;
2681*53ee8cc1Swenshuai.xi }
2682*53ee8cc1Swenshuai.xi 
2683*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2684*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetMVOPDone()
2685*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: tell FW MVOP is ready for futher decode.
2686*53ee8cc1Swenshuai.xi /// @return -The result of command.
2687*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetMVOPDone(void)2688*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_SetMVOPDone(void)
2689*53ee8cc1Swenshuai.xi {
2690*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2691*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2692*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2693*53ee8cc1Swenshuai.xi     //_DRV_HVD_Entry();
2694*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
2695*53ee8cc1Swenshuai.xi     return TRUE;
2696*53ee8cc1Swenshuai.xi }
2697*53ee8cc1Swenshuai.xi 
2698*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2699*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetVirtualBox()
2700*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set DS width and Height to F/W
2701*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN :  frame width
2702*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN :  frame height
2703*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetVirtualBox(MS_U16 u16Width,MS_U16 u16Height)2704*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetVirtualBox(MS_U16 u16Width, MS_U16 u16Height)
2705*53ee8cc1Swenshuai.xi {
2706*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2707*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2708*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2709*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2710*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData(E_HVD_SDATA_VIRTUAL_BOX_WIDTH, u16Width);
2711*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData(E_HVD_SDATA_VIRTUAL_BOX_HEIGHT, u16Height);
2712*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
2713*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2714*53ee8cc1Swenshuai.xi }
2715*53ee8cc1Swenshuai.xi 
2716*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2717*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDynScalingParam()
2718*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Pass scalar parameters to decoder
2719*53ee8cc1Swenshuai.xi /// @return -The result of command.
2720*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDynScalingParam(void * pStAddr,MS_U32 u32Size)2721*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDynScalingParam(  void *pStAddr , MS_U32 u32Size )
2722*53ee8cc1Swenshuai.xi {
2723*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2724*53ee8cc1Swenshuai.xi     MS_U32 addr = 0;
2725*53ee8cc1Swenshuai.xi 
2726*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2727*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2728*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2729*53ee8cc1Swenshuai.xi     if( (pStAddr == NULL ) || (u32Size==0)  )
2730*53ee8cc1Swenshuai.xi     {
2731*53ee8cc1Swenshuai.xi         eRet = E_HVD_RET_INVALID_PARAMETER;
2732*53ee8cc1Swenshuai.xi         _DRV_HVD_Inited(eRet);
2733*53ee8cc1Swenshuai.xi     }
2734*53ee8cc1Swenshuai.xi     else
2735*53ee8cc1Swenshuai.xi     {
2736*53ee8cc1Swenshuai.xi         // 1. copy data input data array
2737*53ee8cc1Swenshuai.xi         addr = MDrv_HVD_Sub_GetDynamicScalingInfo(E_HVD_DS_INFO_ADDR);
2738*53ee8cc1Swenshuai.xi         HVD_memcpy(addr, pStAddr, u32Size);
2739*53ee8cc1Swenshuai.xi 
2740*53ee8cc1Swenshuai.xi         // 2. while till FW finish it.
2741*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_SCALER_INFO_NOTIFY, 0);
2742*53ee8cc1Swenshuai.xi     }
2743*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2744*53ee8cc1Swenshuai.xi }
2745*53ee8cc1Swenshuai.xi 
2746*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2747*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetDispInfoTH()
2748*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the upper and lower limitation of a valid SPS.
2749*53ee8cc1Swenshuai.xi /// @param -DispInfoTH \b IN : tolerance.
2750*53ee8cc1Swenshuai.xi /// @return -The result of command set display inforation threshold
2751*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetDispInfoTH(HVD_Disp_Info_Threshold * DispInfoTH)2752*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetDispInfoTH(HVD_Disp_Info_Threshold* DispInfoTH )
2753*53ee8cc1Swenshuai.xi {
2754*53ee8cc1Swenshuai.xi     HVD_Disp_Info_TH DispInfoTHTmp;
2755*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2756*53ee8cc1Swenshuai.xi 
2757*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2758*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2759*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2760*53ee8cc1Swenshuai.xi     if( DispInfoTH ==NULL)
2761*53ee8cc1Swenshuai.xi     {
2762*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
2763*53ee8cc1Swenshuai.xi     }
2764*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateLowBound=DispInfoTH->u32FrmrateLowBound;
2765*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateUpBound=DispInfoTH->u32FrmrateUpBound;
2766*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopLowBound=DispInfoTH->u32MvopLowBound;
2767*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopUpBound=DispInfoTH->u32MvopUpBound;
2768*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData(  E_HVD_SDATA_DISP_INFO_TH ,  (MS_U32)(&DispInfoTHTmp) );
2769*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
2770*53ee8cc1Swenshuai.xi     HVD_memcpy((void*)&(gSubHVDCtrl.Settings.DispInfoTH), (void*)(DispInfoTH), sizeof(HVD_Disp_Info_Threshold) );
2771*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2772*53ee8cc1Swenshuai.xi }
2773*53ee8cc1Swenshuai.xi 
2774*53ee8cc1Swenshuai.xi // check status
2775*53ee8cc1Swenshuai.xi 
2776*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2777*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsISROccured()
2778*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check if the ISR is occured or not.
2779*53ee8cc1Swenshuai.xi /// @return - Is occured or not
2780*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): interrupt is not occured.
2781*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): interrupt has been occured.
2782*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsISROccured(void)2783*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsISROccured(void)
2784*53ee8cc1Swenshuai.xi {
2785*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2786*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2787*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_IsISROccured();
2788*53ee8cc1Swenshuai.xi }
2789*53ee8cc1Swenshuai.xi 
2790*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2791*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsDispFinish()
2792*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check this file mode display is finish or not. only work after MDrv_HVD_SetDataEnd(TRUE)
2793*53ee8cc1Swenshuai.xi /// @return - Is finish or not
2794*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not finish or Not in file mode playback
2795*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Display Finished.
2796*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsDispFinish(void)2797*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsDispFinish(void)
2798*53ee8cc1Swenshuai.xi {
2799*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2800*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2801*53ee8cc1Swenshuai.xi 
2802*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
2803*53ee8cc1Swenshuai.xi     {
2804*53ee8cc1Swenshuai.xi         return FALSE;
2805*53ee8cc1Swenshuai.xi     }
2806*53ee8cc1Swenshuai.xi 
2807*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.u32CtrlMode & HVD_CTRL_DATA_END)
2808*53ee8cc1Swenshuai.xi     {
2809*53ee8cc1Swenshuai.xi         if( _DRV_HVD_Sub_IsAllBufferEmpty() )
2810*53ee8cc1Swenshuai.xi         {
2811*53ee8cc1Swenshuai.xi             return TRUE;
2812*53ee8cc1Swenshuai.xi         }
2813*53ee8cc1Swenshuai.xi         else
2814*53ee8cc1Swenshuai.xi         {
2815*53ee8cc1Swenshuai.xi             //_DRV_HVD_PushDummy();
2816*53ee8cc1Swenshuai.xi             return FALSE;
2817*53ee8cc1Swenshuai.xi         }
2818*53ee8cc1Swenshuai.xi     }
2819*53ee8cc1Swenshuai.xi     else
2820*53ee8cc1Swenshuai.xi     {
2821*53ee8cc1Swenshuai.xi         return FALSE;
2822*53ee8cc1Swenshuai.xi     }
2823*53ee8cc1Swenshuai.xi }
2824*53ee8cc1Swenshuai.xi 
2825*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2826*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsFrameShowed()
2827*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD Frame showed after TriggerDisp(TRUE) or first frame showed
2828*53ee8cc1Swenshuai.xi /// @return - Is frame showed or not
2829*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): New Framed showed
2830*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Not showed
2831*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsFrameShowed(void)2832*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsFrameShowed(void)
2833*53ee8cc1Swenshuai.xi {
2834*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2835*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2836*53ee8cc1Swenshuai.xi 
2837*53ee8cc1Swenshuai.xi     if( !HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_1ST_FRM_RDY)  )
2838*53ee8cc1Swenshuai.xi     {// 1st frame not ready or AV sync not ready
2839*53ee8cc1Swenshuai.xi         return FALSE;
2840*53ee8cc1Swenshuai.xi     }
2841*53ee8cc1Swenshuai.xi     else
2842*53ee8cc1Swenshuai.xi     {// 1st frame showed or AV sync ready
2843*53ee8cc1Swenshuai.xi         if( _DRV_HVD_Ctrl( HVD_CTRL_DISPLAY_CTRL))
2844*53ee8cc1Swenshuai.xi         {   // control display
2845*53ee8cc1Swenshuai.xi             return (MS_BOOL)HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_FRAME_SHOWED);
2846*53ee8cc1Swenshuai.xi         }
2847*53ee8cc1Swenshuai.xi         else
2848*53ee8cc1Swenshuai.xi         { // cotrol decode
2849*53ee8cc1Swenshuai.xi             return TRUE;
2850*53ee8cc1Swenshuai.xi         }
2851*53ee8cc1Swenshuai.xi     }
2852*53ee8cc1Swenshuai.xi }
2853*53ee8cc1Swenshuai.xi 
2854*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2855*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsStepDecodeDone()
2856*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD step decode done after step decode command.
2857*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
2858*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoding, or user did not send corresponding step decode command.
2859*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decode done
2860*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsStepDecodeDone(void)2861*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsStepDecodeDone(void)
2862*53ee8cc1Swenshuai.xi {
2863*53ee8cc1Swenshuai.xi     MS_BOOL bRet=FALSE;
2864*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2865*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2866*53ee8cc1Swenshuai.xi 
2867*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.bStepDecoding)
2868*53ee8cc1Swenshuai.xi     {
2869*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.u32StepDecodeCnt != HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT) )
2870*53ee8cc1Swenshuai.xi         {
2871*53ee8cc1Swenshuai.xi             gSubHVDCtrl.u32StepDecodeCnt = 0;
2872*53ee8cc1Swenshuai.xi             bRet= TRUE;
2873*53ee8cc1Swenshuai.xi             gSubHVDCtrl.bStepDecoding=FALSE;
2874*53ee8cc1Swenshuai.xi         }
2875*53ee8cc1Swenshuai.xi     }
2876*53ee8cc1Swenshuai.xi     return bRet;
2877*53ee8cc1Swenshuai.xi }
2878*53ee8cc1Swenshuai.xi 
2879*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2880*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_CheckDispInfoRdy()
2881*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info ready and correct or not
2882*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
2883*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_CheckDispInfoRdy(void)2884*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_CheckDispInfoRdy(void)
2885*53ee8cc1Swenshuai.xi {
2886*53ee8cc1Swenshuai.xi     MS_U32 u32ErrCode=0;
2887*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2888*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2889*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2890*53ee8cc1Swenshuai.xi 
2891*53ee8cc1Swenshuai.xi     if( !( gSubHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY) )
2892*53ee8cc1Swenshuai.xi     {
2893*53ee8cc1Swenshuai.xi         if( !HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_DISP_INFO_CHANGE) )
2894*53ee8cc1Swenshuai.xi         {
2895*53ee8cc1Swenshuai.xi             return E_HVD_RET_NOTREADY;
2896*53ee8cc1Swenshuai.xi         }
2897*53ee8cc1Swenshuai.xi         else
2898*53ee8cc1Swenshuai.xi         {
2899*53ee8cc1Swenshuai.xi             gSubHVDCtrl.bIsDispInfoChg=TRUE;
2900*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(HVD_CTRL_DISP_INFO_RDY);
2901*53ee8cc1Swenshuai.xi         }
2902*53ee8cc1Swenshuai.xi     }
2903*53ee8cc1Swenshuai.xi     // check if FW report error
2904*53ee8cc1Swenshuai.xi     u32ErrCode = HAL_HVD_Sub_GetData(E_HVD_GDATA_ERROR_CODE);
2905*53ee8cc1Swenshuai.xi     if( u32ErrCode != 0 )
2906*53ee8cc1Swenshuai.xi     {
2907*53ee8cc1Swenshuai.xi         if( u32ErrCode == E_HVD_ERR_OUT_OF_MEMORY)
2908*53ee8cc1Swenshuai.xi         {
2909*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD Err: FW error that Out of Memory:%lx. Allocated frame buffer size is smaller than required.\n" , u32ErrCode );
2910*53ee8cc1Swenshuai.xi             gSubHVDCtrl.bIsDispInfoChg=FALSE;
2911*53ee8cc1Swenshuai.xi             return E_HVD_RET_OUTOF_MEMORY;
2912*53ee8cc1Swenshuai.xi         }
2913*53ee8cc1Swenshuai.xi     }
2914*53ee8cc1Swenshuai.xi     //>> move to FW
2915*53ee8cc1Swenshuai.xi     #if 0
2916*53ee8cc1Swenshuai.xi     if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_AVC )
2917*53ee8cc1Swenshuai.xi     {
2918*53ee8cc1Swenshuai.xi         MS_U32 u32MaxFS = 0, u32FS = 0;
2919*53ee8cc1Swenshuai.xi         MS_U8 u8LevelIdc = HAL_HVD_GetData(E_HVD_GDATA_AVC_LEVEL_IDC);
2920*53ee8cc1Swenshuai.xi         MS_U32 u32Width, u32Height;
2921*53ee8cc1Swenshuai.xi         HVD_Display_Info *pDispInfo  = (HVD_Display_Info *)HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_INFO_ADDR);
2922*53ee8cc1Swenshuai.xi         u32Height = pDispInfo->u16VerSize;
2923*53ee8cc1Swenshuai.xi         u32Width = pDispInfo->u16VerSize;
2924*53ee8cc1Swenshuai.xi         u32FS = (u32Width / 16) * (u32Height / 16);
2925*53ee8cc1Swenshuai.xi 
2926*53ee8cc1Swenshuai.xi         switch(u8LevelIdc)
2927*53ee8cc1Swenshuai.xi         {
2928*53ee8cc1Swenshuai.xi             case 10:
2929*53ee8cc1Swenshuai.xi                 u32MaxFS = 99;
2930*53ee8cc1Swenshuai.xi                 break;
2931*53ee8cc1Swenshuai.xi             case 11:
2932*53ee8cc1Swenshuai.xi             case 12:
2933*53ee8cc1Swenshuai.xi             case 13:
2934*53ee8cc1Swenshuai.xi             case 20:
2935*53ee8cc1Swenshuai.xi                 u32MaxFS = 396;
2936*53ee8cc1Swenshuai.xi                 break;
2937*53ee8cc1Swenshuai.xi             case 21:
2938*53ee8cc1Swenshuai.xi                 u32MaxFS = 792;
2939*53ee8cc1Swenshuai.xi                 break;
2940*53ee8cc1Swenshuai.xi             case 22:
2941*53ee8cc1Swenshuai.xi             case 30:
2942*53ee8cc1Swenshuai.xi                 u32MaxFS = 1620;
2943*53ee8cc1Swenshuai.xi                 break;
2944*53ee8cc1Swenshuai.xi             case 31:
2945*53ee8cc1Swenshuai.xi                 u32MaxFS = 3600;
2946*53ee8cc1Swenshuai.xi                 break;
2947*53ee8cc1Swenshuai.xi             case 32:
2948*53ee8cc1Swenshuai.xi                 u32MaxFS = 5120;
2949*53ee8cc1Swenshuai.xi                 break;
2950*53ee8cc1Swenshuai.xi             case 40:
2951*53ee8cc1Swenshuai.xi             case 41:
2952*53ee8cc1Swenshuai.xi                 u32MaxFS = 8192;
2953*53ee8cc1Swenshuai.xi                 break;
2954*53ee8cc1Swenshuai.xi             case 42:
2955*53ee8cc1Swenshuai.xi                 u32MaxFS = 8704;
2956*53ee8cc1Swenshuai.xi                 break;
2957*53ee8cc1Swenshuai.xi             case 50:
2958*53ee8cc1Swenshuai.xi                 u32MaxFS = 22080;
2959*53ee8cc1Swenshuai.xi                 break;
2960*53ee8cc1Swenshuai.xi             case 51:
2961*53ee8cc1Swenshuai.xi                 u32MaxFS = 36864;
2962*53ee8cc1Swenshuai.xi                 break;
2963*53ee8cc1Swenshuai.xi             default:
2964*53ee8cc1Swenshuai.xi                 u32MaxFS = 0xFFFFFFFF;
2965*53ee8cc1Swenshuai.xi                 break;
2966*53ee8cc1Swenshuai.xi         }
2967*53ee8cc1Swenshuai.xi 
2968*53ee8cc1Swenshuai.xi         if(u32FS > u32MaxFS)
2969*53ee8cc1Swenshuai.xi         {
2970*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_DEG("HVD Err : SPS over spec,level = %d u32FS = %lu u32MaxFS = %lu\n", u8LevelIdc ,  u32FS, u32MaxFS);
2971*53ee8cc1Swenshuai.xi             gSubHVDCtrl.bIsDispInfoChg=FALSE;
2972*53ee8cc1Swenshuai.xi             return E_HVD_RET_UNSUPPORTED;
2973*53ee8cc1Swenshuai.xi         }
2974*53ee8cc1Swenshuai.xi     }
2975*53ee8cc1Swenshuai.xi     #endif
2976*53ee8cc1Swenshuai.xi     return E_HVD_OK;
2977*53ee8cc1Swenshuai.xi }
2978*53ee8cc1Swenshuai.xi 
2979*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2980*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsDispInfoChg()
2981*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info is changed or not
2982*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
2983*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not changed
2984*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): changed
2985*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsDispInfoChg(void)2986*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsDispInfoChg(void)
2987*53ee8cc1Swenshuai.xi {
2988*53ee8cc1Swenshuai.xi     MS_BOOL bRet=FALSE;
2989*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
2990*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2991*53ee8cc1Swenshuai.xi 
2992*53ee8cc1Swenshuai.xi     bRet = (MS_BOOL)HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_DISP_INFO_CHANGE);
2993*53ee8cc1Swenshuai.xi     if( bRet )
2994*53ee8cc1Swenshuai.xi     {
2995*53ee8cc1Swenshuai.xi         gSubHVDCtrl.bIsDispInfoChg = TRUE;
2996*53ee8cc1Swenshuai.xi         _DRV_HVD_SetCtrl(HVD_CTRL_DISP_INFO_RDY);
2997*53ee8cc1Swenshuai.xi     }
2998*53ee8cc1Swenshuai.xi     #if 0 // debug use
2999*53ee8cc1Swenshuai.xi     {
3000*53ee8cc1Swenshuai.xi         static MS_U32 u32DecodeCnt=0;
3001*53ee8cc1Swenshuai.xi         static MS_U32 u32IdleCnt=0;
3002*53ee8cc1Swenshuai.xi         MS_U32 tmp =0 ;
3003*53ee8cc1Swenshuai.xi         tmp = MDrv_HVD_Sub_GetDecodeCnt();
3004*53ee8cc1Swenshuai.xi         if( u32DecodeCnt != tmp )
3005*53ee8cc1Swenshuai.xi         {
3006*53ee8cc1Swenshuai.xi             printf( "%lu decode cnt:%lx PTS:%lx\n" , (MS_U32)bRet ,tmp ,  MDrv_HVD_GetPTS() );
3007*53ee8cc1Swenshuai.xi             u32DecodeCnt =tmp;
3008*53ee8cc1Swenshuai.xi         }
3009*53ee8cc1Swenshuai.xi         else
3010*53ee8cc1Swenshuai.xi         {
3011*53ee8cc1Swenshuai.xi             u32IdleCnt++;
3012*53ee8cc1Swenshuai.xi         }
3013*53ee8cc1Swenshuai.xi         if( u32IdleCnt > 1000)
3014*53ee8cc1Swenshuai.xi         {
3015*53ee8cc1Swenshuai.xi             printf( "HVD: seems IDLE: %lu decode cnt:%lx PTS:%lx\n" , (MS_U32)bRet  ,tmp ,  MDrv_HVD_Sub_GetPTS() );
3016*53ee8cc1Swenshuai.xi             u32IdleCnt=0;
3017*53ee8cc1Swenshuai.xi         }
3018*53ee8cc1Swenshuai.xi     }
3019*53ee8cc1Swenshuai.xi     #endif
3020*53ee8cc1Swenshuai.xi     return bRet;
3021*53ee8cc1Swenshuai.xi }
3022*53ee8cc1Swenshuai.xi 
3023*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3024*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsIdle()
3025*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder is idle or not
3026*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3027*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not idle
3028*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is idle
3029*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsIdle(void)3030*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsIdle(void)
3031*53ee8cc1Swenshuai.xi {
3032*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3033*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3034*53ee8cc1Swenshuai.xi 
3035*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD )
3036*53ee8cc1Swenshuai.xi     {
3037*53ee8cc1Swenshuai.xi         return TRUE;
3038*53ee8cc1Swenshuai.xi     }
3039*53ee8cc1Swenshuai.xi     else
3040*53ee8cc1Swenshuai.xi     {
3041*53ee8cc1Swenshuai.xi         return FALSE;
3042*53ee8cc1Swenshuai.xi     }
3043*53ee8cc1Swenshuai.xi }
3044*53ee8cc1Swenshuai.xi 
3045*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3046*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsSyncStart()
3047*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder starts to do sync action(drop or repeat) or not.
3048*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3049*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not doing sync action
3050*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is doing sync action
3051*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsSyncStart(void)3052*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsSyncStart(void)
3053*53ee8cc1Swenshuai.xi {
3054*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3055*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3056*53ee8cc1Swenshuai.xi 
3057*53ee8cc1Swenshuai.xi     if( (MS_BOOL)MDrv_HVD_Sub_GetPlayMode(E_HVD_GMODE_IS_SYNC_ON) == FALSE)
3058*53ee8cc1Swenshuai.xi     {
3059*53ee8cc1Swenshuai.xi         return FALSE;
3060*53ee8cc1Swenshuai.xi     }
3061*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_SYNC_START)  )
3062*53ee8cc1Swenshuai.xi     {
3063*53ee8cc1Swenshuai.xi         return TRUE;
3064*53ee8cc1Swenshuai.xi     }
3065*53ee8cc1Swenshuai.xi     else
3066*53ee8cc1Swenshuai.xi     {
3067*53ee8cc1Swenshuai.xi         return FALSE;
3068*53ee8cc1Swenshuai.xi     }
3069*53ee8cc1Swenshuai.xi }
3070*53ee8cc1Swenshuai.xi 
3071*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3072*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsSyncReach()
3073*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: The distance of Video time stamp and STC is closed enough.
3074*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3075*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): The distance is not shorter than sync tolerance.
3076*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): The distance is shorter than sync tolerance.
3077*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsSyncReach(void)3078*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsSyncReach(void)
3079*53ee8cc1Swenshuai.xi {
3080*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3081*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3082*53ee8cc1Swenshuai.xi 
3083*53ee8cc1Swenshuai.xi     if( (MS_BOOL)MDrv_HVD_Sub_GetPlayMode(E_HVD_GMODE_IS_SYNC_ON) == FALSE)
3084*53ee8cc1Swenshuai.xi     {
3085*53ee8cc1Swenshuai.xi         return FALSE;
3086*53ee8cc1Swenshuai.xi     }
3087*53ee8cc1Swenshuai.xi 
3088*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_SYNC_REACH)  )
3089*53ee8cc1Swenshuai.xi     {
3090*53ee8cc1Swenshuai.xi         return TRUE;
3091*53ee8cc1Swenshuai.xi     }
3092*53ee8cc1Swenshuai.xi     else
3093*53ee8cc1Swenshuai.xi     {
3094*53ee8cc1Swenshuai.xi         return FALSE;
3095*53ee8cc1Swenshuai.xi     }
3096*53ee8cc1Swenshuai.xi }
3097*53ee8cc1Swenshuai.xi 
3098*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3099*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsLowDelay()
3100*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if current stream has low delay flag in SPS.
3101*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3102*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
3103*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
3104*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsLowDelay(void)3105*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsLowDelay(void)
3106*53ee8cc1Swenshuai.xi {
3107*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3108*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3109*53ee8cc1Swenshuai.xi 
3110*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_AVC_LOW_DELAY)  )
3111*53ee8cc1Swenshuai.xi     {
3112*53ee8cc1Swenshuai.xi         return TRUE;
3113*53ee8cc1Swenshuai.xi     }
3114*53ee8cc1Swenshuai.xi     else
3115*53ee8cc1Swenshuai.xi     {
3116*53ee8cc1Swenshuai.xi         return FALSE;
3117*53ee8cc1Swenshuai.xi     }
3118*53ee8cc1Swenshuai.xi }
3119*53ee8cc1Swenshuai.xi 
3120*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3121*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsIFrmFound()
3122*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if I frame found after Init() or flush().
3123*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3124*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): I frame is not found.
3125*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): I frame has been found.
3126*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsIFrmFound(void)3127*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsIFrmFound(void)
3128*53ee8cc1Swenshuai.xi {
3129*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3130*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3131*53ee8cc1Swenshuai.xi 
3132*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_I_FRM_FOUND)  )
3133*53ee8cc1Swenshuai.xi     {
3134*53ee8cc1Swenshuai.xi         return TRUE;
3135*53ee8cc1Swenshuai.xi     }
3136*53ee8cc1Swenshuai.xi     else
3137*53ee8cc1Swenshuai.xi     {
3138*53ee8cc1Swenshuai.xi         return FALSE;
3139*53ee8cc1Swenshuai.xi     }
3140*53ee8cc1Swenshuai.xi }
3141*53ee8cc1Swenshuai.xi 
3142*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3143*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_Is1stFrmRdy()
3144*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if first frame showed on screen after Init() or flush().
3145*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3146*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): First frame is not showed.
3147*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): First frame is showed.
3148*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_Is1stFrmRdy(void)3149*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_Is1stFrmRdy(void)
3150*53ee8cc1Swenshuai.xi {
3151*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3152*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3153*53ee8cc1Swenshuai.xi 
3154*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_1ST_FRM_RDY)  )
3155*53ee8cc1Swenshuai.xi     {
3156*53ee8cc1Swenshuai.xi         return TRUE;
3157*53ee8cc1Swenshuai.xi     }
3158*53ee8cc1Swenshuai.xi     else
3159*53ee8cc1Swenshuai.xi     {
3160*53ee8cc1Swenshuai.xi         return FALSE;
3161*53ee8cc1Swenshuai.xi     }
3162*53ee8cc1Swenshuai.xi }
3163*53ee8cc1Swenshuai.xi 
3164*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3165*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsAllBufferEmpty()
3166*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if all of the buffers(display, decoded, BBU, bitstream) are empty.
3167*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3168*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not Empty.
3169*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Empty.
3170*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsAllBufferEmpty(void)3171*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_IsAllBufferEmpty(void)
3172*53ee8cc1Swenshuai.xi {
3173*53ee8cc1Swenshuai.xi     //HVD_SUB_MSG_TRACE();
3174*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3175*53ee8cc1Swenshuai.xi 
3176*53ee8cc1Swenshuai.xi     if( _DRV_HVD_Sub_IsAllBufferEmpty() )
3177*53ee8cc1Swenshuai.xi     {
3178*53ee8cc1Swenshuai.xi         return TRUE;
3179*53ee8cc1Swenshuai.xi     }
3180*53ee8cc1Swenshuai.xi     else
3181*53ee8cc1Swenshuai.xi     {
3182*53ee8cc1Swenshuai.xi         return FALSE;
3183*53ee8cc1Swenshuai.xi     }
3184*53ee8cc1Swenshuai.xi     #if 0
3185*53ee8cc1Swenshuai.xi     if( u32Times > 200 )
3186*53ee8cc1Swenshuai.xi     {
3187*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD Info: Flush() timeout failed:BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx  \n" ,
3188*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_Q_NUMB) ,
3189*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_Q_NUMB),
3190*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_Q_NUMB),
3191*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
3192*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData( E_HVD_GDATA_ES_READ_PTR),
3193*53ee8cc1Swenshuai.xi             HAL_HVD_Sub_GetData( E_HVD_GDATA_ES_WRITE_PTR) );
3194*53ee8cc1Swenshuai.xi         eRet = E_HVD_FAIL;
3195*53ee8cc1Swenshuai.xi         break;
3196*53ee8cc1Swenshuai.xi     }
3197*53ee8cc1Swenshuai.xi     return TRUE;
3198*53ee8cc1Swenshuai.xi     #endif
3199*53ee8cc1Swenshuai.xi }
3200*53ee8cc1Swenshuai.xi 
3201*53ee8cc1Swenshuai.xi // get infomation
3202*53ee8cc1Swenshuai.xi 
3203*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3204*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetBBUVacancy()
3205*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the vacancy of BBU queue.
3206*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3207*53ee8cc1Swenshuai.xi /// @retval     -0: queue is full.
3208*53ee8cc1Swenshuai.xi /// @retval     -not zero: queue is not full.
3209*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetBBUVacancy(void)3210*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetBBUVacancy(void)
3211*53ee8cc1Swenshuai.xi {
3212*53ee8cc1Swenshuai.xi     MS_U32 u32BBUQnumb=0;
3213*53ee8cc1Swenshuai.xi     MS_U32 u32BBUTotal=0;
3214*53ee8cc1Swenshuai.xi     MS_U32 u32PTSQnumb=0;
3215*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3216*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3217*53ee8cc1Swenshuai.xi     u32BBUTotal = HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY);
3218*53ee8cc1Swenshuai.xi     u32BBUQnumb = HAL_HVD_Sub_GetData(E_HVD_GDATA_BBU_Q_NUMB);
3219*53ee8cc1Swenshuai.xi     if( u32BBUTotal <= u32BBUQnumb )
3220*53ee8cc1Swenshuai.xi     {
3221*53ee8cc1Swenshuai.xi         //HVD_SUB_MSG_ERR("HVD err: GetBBUVacancy has error that total number(%lx) is smaller than current number(%lx)\n" , u32BBUTotal, u32BBUQnumb);
3222*53ee8cc1Swenshuai.xi         u32BBUQnumb=0;
3223*53ee8cc1Swenshuai.xi     }
3224*53ee8cc1Swenshuai.xi     else
3225*53ee8cc1Swenshuai.xi     {
3226*53ee8cc1Swenshuai.xi         u32BBUQnumb = u32BBUTotal - u32BBUQnumb;
3227*53ee8cc1Swenshuai.xi     }
3228*53ee8cc1Swenshuai.xi     if( u32BBUQnumb )
3229*53ee8cc1Swenshuai.xi     {
3230*53ee8cc1Swenshuai.xi         u32BBUTotal=HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB) - 1; // add -1 for full case
3231*53ee8cc1Swenshuai.xi         u32PTSQnumb=HAL_HVD_Sub_GetData(E_HVD_GDATA_PTS_Q_NUMB);
3232*53ee8cc1Swenshuai.xi         if( u32BBUTotal <= u32PTSQnumb  )
3233*53ee8cc1Swenshuai.xi         {
3234*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_DEG("HVD Warn: GetBBUVacancy has error that total PTS Q number(%lx) is smaller than current PTS Q number(%lx)\n" , u32BBUTotal, u32PTSQnumb);
3235*53ee8cc1Swenshuai.xi             u32BBUQnumb=0;
3236*53ee8cc1Swenshuai.xi         }
3237*53ee8cc1Swenshuai.xi     }
3238*53ee8cc1Swenshuai.xi     return u32BBUQnumb;
3239*53ee8cc1Swenshuai.xi }
3240*53ee8cc1Swenshuai.xi 
3241*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3242*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetDispInfo()
3243*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get video display information
3244*53ee8cc1Swenshuai.xi /// @param -pinfo \b OUT : pointer to video display information.
3245*53ee8cc1Swenshuai.xi /// @return -The result of command get display information
3246*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetDispInfo(HVD_Disp_Info * pinfo)3247*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_GetDispInfo( HVD_Disp_Info *pinfo )
3248*53ee8cc1Swenshuai.xi {
3249*53ee8cc1Swenshuai.xi     MS_U32 u32Seqtimes=10;
3250*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
3251*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3252*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3253*53ee8cc1Swenshuai.xi 
3254*53ee8cc1Swenshuai.xi     if( !(gSubHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
3255*53ee8cc1Swenshuai.xi     {
3256*53ee8cc1Swenshuai.xi         if( MDrv_HVD_Sub_CheckDispInfoRdy() == E_HVD_RET_NOTREADY )
3257*53ee8cc1Swenshuai.xi         {
3258*53ee8cc1Swenshuai.xi             return E_HVD_RET_NOTREADY;
3259*53ee8cc1Swenshuai.xi         }
3260*53ee8cc1Swenshuai.xi     }
3261*53ee8cc1Swenshuai.xi     if( pinfo == NULL )
3262*53ee8cc1Swenshuai.xi     {
3263*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
3264*53ee8cc1Swenshuai.xi     }
3265*53ee8cc1Swenshuai.xi 
3266*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
3267*53ee8cc1Swenshuai.xi 
3268*53ee8cc1Swenshuai.xi     HVD_GETDISPINFO_START:
3269*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData(E_HVD_SDATA_GET_DISP_INFO_START, 0);
3270*53ee8cc1Swenshuai.xi     HVD_memcpy((void*)pinfo, (void*)HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_INFO_ADDR)  ,  sizeof(HVD_Display_Info));
3271*53ee8cc1Swenshuai.xi     if( HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_DISP_INFO_UNCOPYED) )
3272*53ee8cc1Swenshuai.xi     {
3273*53ee8cc1Swenshuai.xi         u32Seqtimes--;
3274*53ee8cc1Swenshuai.xi         if( u32Seqtimes > 0)
3275*53ee8cc1Swenshuai.xi         {
3276*53ee8cc1Swenshuai.xi             goto HVD_GETDISPINFO_START;
3277*53ee8cc1Swenshuai.xi         }
3278*53ee8cc1Swenshuai.xi         else
3279*53ee8cc1Swenshuai.xi         {
3280*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD Err: GetDispInfo Timeout:%d\n" , (MS_S16)HAL_HVD_Sub_GetData(E_HVD_GDATA_IS_DISP_INFO_UNCOPYED) );
3281*53ee8cc1Swenshuai.xi             _DRV_HVD_Return( E_HVD_RET_TIMEOUT);
3282*53ee8cc1Swenshuai.xi         }
3283*53ee8cc1Swenshuai.xi     }
3284*53ee8cc1Swenshuai.xi 
3285*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
3286*53ee8cc1Swenshuai.xi     if(HVD_INIT_HW_RM == (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
3287*53ee8cc1Swenshuai.xi     {//RM is always displayed by 60 frames per sec.
3288*53ee8cc1Swenshuai.xi         pinfo->u32FrameRate = 60000;
3289*53ee8cc1Swenshuai.xi     }
3290*53ee8cc1Swenshuai.xi #endif
3291*53ee8cc1Swenshuai.xi 
3292*53ee8cc1Swenshuai.xi     if( gSubHVDCtrl.bIsDispInfoChg )
3293*53ee8cc1Swenshuai.xi     {
3294*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u32FrameRate = %lu\n", pinfo->u32FrameRate);
3295*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u8Interlace = %x \n", (MS_S16)pinfo->u8Interlace);
3296*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16HorSize = %u \n", pinfo->u16HorSize);
3297*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16VerSize = %u \n", pinfo->u16VerSize);
3298*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16Crop R/L = %u, %u \n", pinfo->u16CropRight, pinfo->u16CropLeft);
3299*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16Crop B/T = %u, %u \n", pinfo->u16CropBottom, pinfo->u16CropTop);
3300*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u8AspectRate = %u \n", (MS_S16)pinfo->u8AspectRate);
3301*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16SarWidth = %u \n", pinfo->u16SarWidth);
3302*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16SarHeight = %u \n", pinfo->u16SarHeight);
3303*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u16Pitch = %u \n", pinfo->u16Pitch);
3304*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_DEG("pinfo->u8ColourPrimaries = %u \n", pinfo->u8ColourPrimaries);
3305*53ee8cc1Swenshuai.xi         gSubHVDCtrl.bIsDispInfoChg=FALSE;
3306*53ee8cc1Swenshuai.xi     }
3307*53ee8cc1Swenshuai.xi 
3308*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( E_HVD_OK);
3309*53ee8cc1Swenshuai.xi }
3310*53ee8cc1Swenshuai.xi 
3311*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3312*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetPTS()
3313*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of current displayed video frame. unit: ms
3314*53ee8cc1Swenshuai.xi /// @return - PTS
3315*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetPTS(void)3316*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetPTS(void)
3317*53ee8cc1Swenshuai.xi {
3318*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
3319*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3320*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_Sub_GetData(E_HVD_GDATA_PTS);
3321*53ee8cc1Swenshuai.xi     return u32PTS;
3322*53ee8cc1Swenshuai.xi }
3323*53ee8cc1Swenshuai.xi 
3324*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3325*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetNextPTS()
3326*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of next displayed video frame. unit: ms
3327*53ee8cc1Swenshuai.xi /// @return - PTS
3328*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetNextPTS(void)3329*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetNextPTS(void)
3330*53ee8cc1Swenshuai.xi {
3331*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
3332*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3333*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_Sub_GetData(E_HVD_GDATA_NEXT_PTS);
3334*53ee8cc1Swenshuai.xi     return u32PTS;
3335*53ee8cc1Swenshuai.xi }
3336*53ee8cc1Swenshuai.xi 
3337*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3338*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetDataErrCnt()
3339*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated data Error Count
3340*53ee8cc1Swenshuai.xi /// @return -data error count
3341*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetDataErrCnt(void)3342*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetDataErrCnt(void)
3343*53ee8cc1Swenshuai.xi {
3344*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3345*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_GetData(E_HVD_GDATA_DATA_ERROR_CNT);
3346*53ee8cc1Swenshuai.xi }
3347*53ee8cc1Swenshuai.xi 
3348*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3349*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetDecErrCnt()
3350*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decode Error Count
3351*53ee8cc1Swenshuai.xi /// @return -decode error count
3352*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetDecErrCnt(void)3353*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetDecErrCnt(void)
3354*53ee8cc1Swenshuai.xi {
3355*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3356*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_ERROR_CNT);
3357*53ee8cc1Swenshuai.xi }
3358*53ee8cc1Swenshuai.xi 
3359*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3360*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetESWritePtr()
3361*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer write point
3362*53ee8cc1Swenshuai.xi /// @return - ES buffer write point offset from bitstream buffer base
3363*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetESWritePtr(void)3364*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetESWritePtr(void)
3365*53ee8cc1Swenshuai.xi {
3366*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3367*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_WRITE_PTR);
3368*53ee8cc1Swenshuai.xi }
3369*53ee8cc1Swenshuai.xi 
3370*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3371*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetESReadPtr()
3372*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer read point
3373*53ee8cc1Swenshuai.xi /// @return - ES buffer read point offset from bitstream buffer base
3374*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetESReadPtr(void)3375*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetESReadPtr(void)
3376*53ee8cc1Swenshuai.xi {
3377*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3378*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_GetData(E_HVD_GDATA_ES_READ_PTR);
3379*53ee8cc1Swenshuai.xi }
3380*53ee8cc1Swenshuai.xi 
3381*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3382*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetErrCode()
3383*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get error code
3384*53ee8cc1Swenshuai.xi /// @return - error code number
3385*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetErrCode(void)3386*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetErrCode(void)
3387*53ee8cc1Swenshuai.xi {
3388*53ee8cc1Swenshuai.xi // TODO: define driver error code  for upper layer
3389*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3390*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3391*53ee8cc1Swenshuai.xi     u32Ret = HAL_HVD_Sub_GetData(E_HVD_GDATA_ERROR_CODE);
3392*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData(E_HVD_SDATA_ERROR_CODE , 0);
3393*53ee8cc1Swenshuai.xi     gSubHVDCtrl.u32LastErrCode = u32Ret;
3394*53ee8cc1Swenshuai.xi     return u32Ret;
3395*53ee8cc1Swenshuai.xi }
3396*53ee8cc1Swenshuai.xi 
3397*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3398*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetPlayMode()
3399*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current play mode status.
3400*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Mode type.
3401*53ee8cc1Swenshuai.xi /// @return - mode status
3402*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetPlayMode(HVD_Get_Mode_Status eMode)3403*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetPlayMode(HVD_Get_Mode_Status eMode)
3404*53ee8cc1Swenshuai.xi {
3405*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3406*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3407*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3408*53ee8cc1Swenshuai.xi     switch( eMode )
3409*53ee8cc1Swenshuai.xi     {
3410*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_SHOW_ERR_FRM:
3411*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_REPEAT_LAST_FIELD:
3412*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_ERR_CONCEAL:
3413*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_SYNC_ON:
3414*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_PLAYBACK_FINISH:
3415*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_SYNC_MODE:
3416*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_SKIP_MODE:
3417*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_DROP_MODE:
3418*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_DISPLAY_SPEED:
3419*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_FRC_MODE:
3420*53ee8cc1Swenshuai.xi         // TODO: add isr type here
3421*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_ISR_TYPE:
3422*53ee8cc1Swenshuai.xi         u32Ret=HAL_HVD_Sub_GetData( (HVD_GetData)((MS_U32)eMode+ (MS_U32)E_HVD_GDATA_IS_SHOW_ERR_FRM));
3423*53ee8cc1Swenshuai.xi         break;
3424*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_STEP_DISPLAY:
3425*53ee8cc1Swenshuai.xi         u32Ret = _DRV_HVD_Ctrl(HVD_CTRL_DISPLAY_CTRL);
3426*53ee8cc1Swenshuai.xi         break;
3427*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_STREAM_TYPE:
3428*53ee8cc1Swenshuai.xi         u32Ret = gSubHVDCtrl.InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK;
3429*53ee8cc1Swenshuai.xi         break;
3430*53ee8cc1Swenshuai.xi     default:
3431*53ee8cc1Swenshuai.xi         break;
3432*53ee8cc1Swenshuai.xi     }
3433*53ee8cc1Swenshuai.xi     return u32Ret;
3434*53ee8cc1Swenshuai.xi }
3435*53ee8cc1Swenshuai.xi 
3436*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3437*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetPlayState()
3438*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get current play state
3439*53ee8cc1Swenshuai.xi /// @return - play state
3440*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetPlayState(void)3441*53ee8cc1Swenshuai.xi HVD_Get_Play_State MDrv_HVD_Sub_GetPlayState(void)
3442*53ee8cc1Swenshuai.xi {
3443*53ee8cc1Swenshuai.xi     MS_U32 u32FWstate=0;
3444*53ee8cc1Swenshuai.xi     HVD_Get_Play_State eRet=E_HVD_GSTATE_INIT;
3445*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3446*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3447*53ee8cc1Swenshuai.xi     u32FWstate=HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_STATE);
3448*53ee8cc1Swenshuai.xi     u32FWstate &= E_HVD_FW_STATE_MASK;
3449*53ee8cc1Swenshuai.xi     switch( u32FWstate )
3450*53ee8cc1Swenshuai.xi     {
3451*53ee8cc1Swenshuai.xi     case E_HVD_FW_INIT:
3452*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_INIT;
3453*53ee8cc1Swenshuai.xi         break;
3454*53ee8cc1Swenshuai.xi     case E_HVD_FW_PLAY:
3455*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_PLAY;
3456*53ee8cc1Swenshuai.xi         break;
3457*53ee8cc1Swenshuai.xi     case E_HVD_FW_PAUSE:
3458*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_PAUSE;
3459*53ee8cc1Swenshuai.xi         break;
3460*53ee8cc1Swenshuai.xi     case E_HVD_FW_STOP:
3461*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_STOP;
3462*53ee8cc1Swenshuai.xi         break;
3463*53ee8cc1Swenshuai.xi     }
3464*53ee8cc1Swenshuai.xi     return eRet;
3465*53ee8cc1Swenshuai.xi }
3466*53ee8cc1Swenshuai.xi 
3467*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3468*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetDecodeCnt()
3469*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decoded frame Count
3470*53ee8cc1Swenshuai.xi /// @return - decoded frame Count
3471*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetDecodeCnt(void)3472*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetDecodeCnt(void)
3473*53ee8cc1Swenshuai.xi {
3474*53ee8cc1Swenshuai.xi     //HVD_SUB_MSG_TRACE();
3475*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3476*53ee8cc1Swenshuai.xi     return HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT);
3477*53ee8cc1Swenshuai.xi }
3478*53ee8cc1Swenshuai.xi 
3479*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3480*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetActiveFormat()
3481*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current AFD ID
3482*53ee8cc1Swenshuai.xi /// @return - AFD ID, 0xFF:invalid value
3483*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetActiveFormat(void)3484*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_Sub_GetActiveFormat(void)
3485*53ee8cc1Swenshuai.xi {
3486*53ee8cc1Swenshuai.xi     HVD_Display_Info *pDispInfo = NULL;
3487*53ee8cc1Swenshuai.xi 
3488*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3489*53ee8cc1Swenshuai.xi 
3490*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(~0);
3491*53ee8cc1Swenshuai.xi 
3492*53ee8cc1Swenshuai.xi     if (!(gSubHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
3493*53ee8cc1Swenshuai.xi     {
3494*53ee8cc1Swenshuai.xi         return 0;
3495*53ee8cc1Swenshuai.xi     }
3496*53ee8cc1Swenshuai.xi 
3497*53ee8cc1Swenshuai.xi     pDispInfo = (HVD_Display_Info *) HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_INFO_ADDR);
3498*53ee8cc1Swenshuai.xi 
3499*53ee8cc1Swenshuai.xi     if (pDispInfo != NULL)
3500*53ee8cc1Swenshuai.xi     {
3501*53ee8cc1Swenshuai.xi         return pDispInfo->u8AFD;
3502*53ee8cc1Swenshuai.xi     }
3503*53ee8cc1Swenshuai.xi     else
3504*53ee8cc1Swenshuai.xi     {
3505*53ee8cc1Swenshuai.xi         return ~0;
3506*53ee8cc1Swenshuai.xi     }
3507*53ee8cc1Swenshuai.xi }
3508*53ee8cc1Swenshuai.xi 
3509*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3510*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetInfo()
3511*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver.
3512*53ee8cc1Swenshuai.xi /// @return - driver information
3513*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetInfo(void)3514*53ee8cc1Swenshuai.xi const HVD_DrvInfo* MDrv_HVD_Sub_GetInfo( void )
3515*53ee8cc1Swenshuai.xi {
3516*53ee8cc1Swenshuai.xi     DrvInfo.bAVC=MDrv_HVD_Sub_GetCaps( E_HVD_AVC);
3517*53ee8cc1Swenshuai.xi     DrvInfo.bAVS=MDrv_HVD_Sub_GetCaps( E_HVD_AVS);
3518*53ee8cc1Swenshuai.xi     DrvInfo.bRM=MDrv_HVD_Sub_GetCaps( E_HVD_RM);
3519*53ee8cc1Swenshuai.xi     DrvInfo.FWversion=HVD_FW_VERSION;
3520*53ee8cc1Swenshuai.xi     return (&DrvInfo);
3521*53ee8cc1Swenshuai.xi }
3522*53ee8cc1Swenshuai.xi 
3523*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3524*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetStatus()
3525*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get status of HVD driver
3526*53ee8cc1Swenshuai.xi /// @param -pstatus \b OUT : driver status
3527*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3528*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
3529*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
3530*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetStatus(HVD_DrvStatus * pstatus)3531*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_GetStatus( HVD_DrvStatus *pstatus)
3532*53ee8cc1Swenshuai.xi {
3533*53ee8cc1Swenshuai.xi     if( pstatus ==  NULL )
3534*53ee8cc1Swenshuai.xi     {
3535*53ee8cc1Swenshuai.xi         return FALSE;
3536*53ee8cc1Swenshuai.xi     }
3537*53ee8cc1Swenshuai.xi     pstatus->bInit = gSubHVDCtrl.u32CtrlMode&HVD_CTRL_INIT_FINISHED;
3538*53ee8cc1Swenshuai.xi     pstatus->bBusy = gSubHVDCtrl.u32CtrlMode&HVD_CTRL_PROCESSING;
3539*53ee8cc1Swenshuai.xi     return TRUE;
3540*53ee8cc1Swenshuai.xi }
3541*53ee8cc1Swenshuai.xi 
3542*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3543*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetFrmInfo()
3544*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current displayed or decoded frame information of HVD driver
3545*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
3546*53ee8cc1Swenshuai.xi /// @param -pInfo \b OUT : frame information
3547*53ee8cc1Swenshuai.xi /// @return -The result of command get frame information
3548*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetFrmInfo(HVD_Get_Frm_Info_Type eType,HVD_Frame_Info * pInfo)3549*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_GetFrmInfo( HVD_Get_Frm_Info_Type eType  ,  HVD_Frame_Info *pInfo)
3550*53ee8cc1Swenshuai.xi {
3551*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo =NULL;
3552*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3553*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(E_HVD_FAIL);
3554*53ee8cc1Swenshuai.xi     if( pInfo ==  NULL )
3555*53ee8cc1Swenshuai.xi     {
3556*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
3557*53ee8cc1Swenshuai.xi     }
3558*53ee8cc1Swenshuai.xi     if( eType == E_HVD_GFRMINFO_DISPLAY )
3559*53ee8cc1Swenshuai.xi     {
3560*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_FRM_INFO);
3561*53ee8cc1Swenshuai.xi     }
3562*53ee8cc1Swenshuai.xi     else if(  eType == E_HVD_GFRMINFO_DECODE )
3563*53ee8cc1Swenshuai.xi     {
3564*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_FRM_INFO);
3565*53ee8cc1Swenshuai.xi     }
3566*53ee8cc1Swenshuai.xi 
3567*53ee8cc1Swenshuai.xi     if(  pFrmInfo != NULL  )
3568*53ee8cc1Swenshuai.xi     {
3569*53ee8cc1Swenshuai.xi         pInfo->u32LumaAddr = (MS_PHYADDR)(pFrmInfo->u32LumaAddr);
3570*53ee8cc1Swenshuai.xi         pInfo->u32ChromaAddr = (MS_PHYADDR)(pFrmInfo->u32ChromaAddr);
3571*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.u32CtrlMode & HVD_CTRL_FRM_MIU_1 )
3572*53ee8cc1Swenshuai.xi         {
3573*53ee8cc1Swenshuai.xi             pInfo->u32LumaAddr+=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
3574*53ee8cc1Swenshuai.xi             pInfo->u32ChromaAddr+=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
3575*53ee8cc1Swenshuai.xi         }
3576*53ee8cc1Swenshuai.xi         pInfo->u32TimeStamp= pFrmInfo->u32TimeStamp;
3577*53ee8cc1Swenshuai.xi         pInfo->u32ID_L= pFrmInfo->u32ID_L;
3578*53ee8cc1Swenshuai.xi         pInfo->u32ID_H= pFrmInfo->u32ID_H;
3579*53ee8cc1Swenshuai.xi         pInfo->u16Pitch = pFrmInfo->u16Pitch;
3580*53ee8cc1Swenshuai.xi         pInfo->u16Height = pFrmInfo->u16Height;
3581*53ee8cc1Swenshuai.xi         pInfo->u16Width = pFrmInfo->u16Width;
3582*53ee8cc1Swenshuai.xi         pInfo->eFrmType= (HVD_Frm_Type)(pFrmInfo->u8FrmType);
3583*53ee8cc1Swenshuai.xi         pInfo->eFieldType=(HVD_FieldType)(pFrmInfo->u8FieldType);
3584*53ee8cc1Swenshuai.xi         if( (pInfo->u16Pitch ==0) && (pInfo->u16Width == 0) && (pInfo->u16Height ==0) )
3585*53ee8cc1Swenshuai.xi         {
3586*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
3587*53ee8cc1Swenshuai.xi         }
3588*53ee8cc1Swenshuai.xi     }
3589*53ee8cc1Swenshuai.xi     else
3590*53ee8cc1Swenshuai.xi     {
3591*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
3592*53ee8cc1Swenshuai.xi     }
3593*53ee8cc1Swenshuai.xi     return E_HVD_OK;
3594*53ee8cc1Swenshuai.xi }
3595*53ee8cc1Swenshuai.xi 
3596*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3597*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetISRInfo()
3598*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver interrupt
3599*53ee8cc1Swenshuai.xi /// @param -eType \b OUT : ISR information
3600*53ee8cc1Swenshuai.xi /// @return -the result of get ISR information
3601*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetISRInfo(MS_U32 * eType)3602*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_GetISRInfo(MS_U32* eType)
3603*53ee8cc1Swenshuai.xi {
3604*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3605*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3606*53ee8cc1Swenshuai.xi 
3607*53ee8cc1Swenshuai.xi     if(TRUE == gHVDISRCtrl.bInISR)
3608*53ee8cc1Swenshuai.xi     {
3609*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo |= HAL_HVD_Sub_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
3610*53ee8cc1Swenshuai.xi         *eType = gHVDISRCtrl.u32ISRInfo;
3611*53ee8cc1Swenshuai.xi     }
3612*53ee8cc1Swenshuai.xi     else
3613*53ee8cc1Swenshuai.xi     {
3614*53ee8cc1Swenshuai.xi         *eType = HAL_HVD_Sub_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
3615*53ee8cc1Swenshuai.xi     }
3616*53ee8cc1Swenshuai.xi     return TRUE;
3617*53ee8cc1Swenshuai.xi }
3618*53ee8cc1Swenshuai.xi 
3619*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3620*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_CalLumaSum()
3621*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get the sum of luma data in a frame.
3622*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
3623*53ee8cc1Swenshuai.xi /// @return -the sum
3624*53ee8cc1Swenshuai.xi /// @retval     -0xFFFFFFFF: error occer.
3625*53ee8cc1Swenshuai.xi /// @retval     -not zero: the sum.
3626*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_CalLumaSum(HVD_Get_Frm_Info_Type eType)3627*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_CalLumaSum(  HVD_Get_Frm_Info_Type eType  )
3628*53ee8cc1Swenshuai.xi {
3629*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo =NULL;
3630*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=HVD_U32_MAX;
3631*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3632*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u32Ret);
3633*53ee8cc1Swenshuai.xi     if( eType == E_HVD_GFRMINFO_DISPLAY )
3634*53ee8cc1Swenshuai.xi     {
3635*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_Sub_GetData(E_HVD_GDATA_DISP_FRM_INFO);
3636*53ee8cc1Swenshuai.xi     }
3637*53ee8cc1Swenshuai.xi     else if(  eType == E_HVD_GFRMINFO_DECODE )
3638*53ee8cc1Swenshuai.xi     {
3639*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_Sub_GetData(E_HVD_GDATA_DEC_FRM_INFO);
3640*53ee8cc1Swenshuai.xi     }
3641*53ee8cc1Swenshuai.xi 
3642*53ee8cc1Swenshuai.xi     if(  pFrmInfo != NULL  )
3643*53ee8cc1Swenshuai.xi     {
3644*53ee8cc1Swenshuai.xi         MS_U32 u32tmp=0;
3645*53ee8cc1Swenshuai.xi         MS_U32 u32PitchCnt=0;
3646*53ee8cc1Swenshuai.xi         MS_U32 u32HeightCnt=0;
3647*53ee8cc1Swenshuai.xi         volatile MS_U8* pLumaData=NULL;
3648*53ee8cc1Swenshuai.xi         // PA2VA
3649*53ee8cc1Swenshuai.xi         u32tmp = gSubHVDCtrl.MemMap.u32FrameBufAddr;
3650*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.u32CtrlMode & HVD_CTRL_FRM_MIU_1 )
3651*53ee8cc1Swenshuai.xi         {
3652*53ee8cc1Swenshuai.xi             u32tmp -=gSubHVDCtrl.MemMap.u32MIU1BaseAddr;
3653*53ee8cc1Swenshuai.xi         }
3654*53ee8cc1Swenshuai.xi         pLumaData = (volatile MS_U8*)(gSubHVDCtrl.MemMap.u32FrameBufVAddr+(pFrmInfo->u32LumaAddr -u32tmp)  );
3655*53ee8cc1Swenshuai.xi         for( u32HeightCnt=0 ; u32HeightCnt < pFrmInfo->u16Height ; u32HeightCnt++  )
3656*53ee8cc1Swenshuai.xi         {
3657*53ee8cc1Swenshuai.xi             for( u32PitchCnt =0   ; u32PitchCnt < pFrmInfo->u16Pitch  ;u32PitchCnt++ )
3658*53ee8cc1Swenshuai.xi             {
3659*53ee8cc1Swenshuai.xi                 if( u32PitchCnt < pFrmInfo->u16Pitch )
3660*53ee8cc1Swenshuai.xi                 {
3661*53ee8cc1Swenshuai.xi                     u32Ret+=(MS_U32)(*pLumaData);
3662*53ee8cc1Swenshuai.xi                 }
3663*53ee8cc1Swenshuai.xi                 pLumaData++;
3664*53ee8cc1Swenshuai.xi             }
3665*53ee8cc1Swenshuai.xi         }
3666*53ee8cc1Swenshuai.xi     }
3667*53ee8cc1Swenshuai.xi     return u32Ret;
3668*53ee8cc1Swenshuai.xi }
3669*53ee8cc1Swenshuai.xi 
3670*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3671*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetUserData_Wptr()
3672*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get write pointer of user data.
3673*53ee8cc1Swenshuai.xi /// @return -the information of write pointer of user data.
3674*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetUserData_Wptr(void)3675*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetUserData_Wptr( void )
3676*53ee8cc1Swenshuai.xi {
3677*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3678*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3679*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3680*53ee8cc1Swenshuai.xi     u32Ret = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_WPTR);
3681*53ee8cc1Swenshuai.xi     return u32Ret;
3682*53ee8cc1Swenshuai.xi }
3683*53ee8cc1Swenshuai.xi 
3684*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3685*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetUserData_Packet()
3686*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of user data packet.
3687*53ee8cc1Swenshuai.xi /// @param -u32Idx \b IN : the pointer of required user data packet( valid range is 0 ~ 11 )
3688*53ee8cc1Swenshuai.xi /// @param -u32Size \b OUT : the size of required user data packet
3689*53ee8cc1Swenshuai.xi /// @return -the offset of user data packet form code buffer start address
3690*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetUserData_Packet(MS_U32 u32Idx,MS_U32 * u32Size)3691*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetUserData_Packet( MS_U32 u32Idx , MS_U32* u32Size )
3692*53ee8cc1Swenshuai.xi {
3693*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3694*53ee8cc1Swenshuai.xi     MS_U32 tmp=0;
3695*53ee8cc1Swenshuai.xi     MS_U8* pIdx=NULL;
3696*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3697*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3698*53ee8cc1Swenshuai.xi     *u32Size=0;
3699*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
3700*53ee8cc1Swenshuai.xi     if(  u32Idx >= tmp )
3701*53ee8cc1Swenshuai.xi     {
3702*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_ERR("HVD ERR: input user data index(%lu) is larger than max index(%lu)\n"  , u32Idx   , tmp  );
3703*53ee8cc1Swenshuai.xi         return 0;
3704*53ee8cc1Swenshuai.xi     }
3705*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_ADDR);
3706*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3707*53ee8cc1Swenshuai.xi     {
3708*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD FW ERR: user data packet idx tbl base addr(%lx) is zero\n"   , tmp  );
3709*53ee8cc1Swenshuai.xi         return 0;
3710*53ee8cc1Swenshuai.xi     }
3711*53ee8cc1Swenshuai.xi     pIdx = (MS_U8*)(tmp + u32Idx);
3712*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE);
3713*53ee8cc1Swenshuai.xi     if( (*pIdx) >= tmp )
3714*53ee8cc1Swenshuai.xi     {
3715*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD FW ERR: user data packet tbl ptr(%lu) is larger than max size(%lu)\n"  , (MS_U32)(*pIdx)   , tmp  );
3716*53ee8cc1Swenshuai.xi         return 0;
3717*53ee8cc1Swenshuai.xi     }
3718*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR);
3719*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3720*53ee8cc1Swenshuai.xi     {
3721*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD FW ERR: user data packet packet tbl base offset(%lx) is zero\n"   , tmp  );
3722*53ee8cc1Swenshuai.xi         return 0;
3723*53ee8cc1Swenshuai.xi     }
3724*53ee8cc1Swenshuai.xi     u32Ret= tmp ;//+ gSubHVDCtrl.MemMap.u32CodeBufAddr;
3725*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_PACKET_SIZE);
3726*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3727*53ee8cc1Swenshuai.xi     {
3728*53ee8cc1Swenshuai.xi         HVD_SUB_MSG_INFO("HVD FW ERR: user data packet packet size(%lu) is zero\n"   , tmp  );
3729*53ee8cc1Swenshuai.xi         return 0;
3730*53ee8cc1Swenshuai.xi     }
3731*53ee8cc1Swenshuai.xi     *u32Size=tmp;
3732*53ee8cc1Swenshuai.xi     u32Ret +=  (MS_U32)(*pIdx) * tmp;
3733*53ee8cc1Swenshuai.xi     return u32Ret;
3734*53ee8cc1Swenshuai.xi }
3735*53ee8cc1Swenshuai.xi 
3736*53ee8cc1Swenshuai.xi // VDEC Interal control
3737*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3738*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GenPattern()
3739*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Generate spcific pattern to support some special function.
3740*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the virtual address of spcific pattern
3741*53ee8cc1Swenshuai.xi /// @param -u32VAddr \b IN : the virtual address of spcific pattern
3742*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN, OUT :
3743*53ee8cc1Swenshuai.xi ///                             IN: the input array size.
3744*53ee8cc1Swenshuai.xi ///                             OUT: the used array size.
3745*53ee8cc1Swenshuai.xi /// @return -The result of command generate spcific pattern
3746*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GenPattern(HVD_PatternType eType,MS_U32 u32VAddr,MS_U32 * u32Size)3747*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_GenPattern( HVD_PatternType eType ,  MS_U32 u32VAddr  ,  MS_U32* u32Size  )
3748*53ee8cc1Swenshuai.xi {
3749*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
3750*53ee8cc1Swenshuai.xi     MS_U8* pDummyData = NULL;
3751*53ee8cc1Swenshuai.xi     MS_U32 u32MinPatternSize=0;
3752*53ee8cc1Swenshuai.xi 
3753*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3754*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3755*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
3756*53ee8cc1Swenshuai.xi 
3757*53ee8cc1Swenshuai.xi #if defined(CHIP_T2)
3758*53ee8cc1Swenshuai.xi 
3759*53ee8cc1Swenshuai.xi     {// dummy pattern
3760*53ee8cc1Swenshuai.xi         // Driver input need not to push dummy pattern
3761*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
3762*53ee8cc1Swenshuai.xi         {
3763*53ee8cc1Swenshuai.xi             *u32Size = 0;
3764*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
3765*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3766*53ee8cc1Swenshuai.xi         }
3767*53ee8cc1Swenshuai.xi 
3768*53ee8cc1Swenshuai.xi         // TSP input process
3769*53ee8cc1Swenshuai.xi         if( u32VAddr == 0)
3770*53ee8cc1Swenshuai.xi         {
3771*53ee8cc1Swenshuai.xi             *u32Size = 6;
3772*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Dummy Pattern address shall not be zero\n" );
3773*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
3774*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3775*53ee8cc1Swenshuai.xi         }
3776*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3777*53ee8cc1Swenshuai.xi         {
3778*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3779*53ee8cc1Swenshuai.xi             u32MinPatternSize =6;
3780*53ee8cc1Swenshuai.xi             break;
3781*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3782*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3783*53ee8cc1Swenshuai.xi         default:
3784*53ee8cc1Swenshuai.xi             u32MinPatternSize = 0;
3785*53ee8cc1Swenshuai.xi             break;
3786*53ee8cc1Swenshuai.xi         }
3787*53ee8cc1Swenshuai.xi         if( *u32Size < u32MinPatternSize )
3788*53ee8cc1Swenshuai.xi         {
3789*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Dummy Pattern must have at least %lu bytes, input:%lu\n" , u32MinPatternSize , (MS_U32)(*u32Size)  );
3790*53ee8cc1Swenshuai.xi             *u32Size = u32MinPatternSize;
3791*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_OUTOF_MEMORY;
3792*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3793*53ee8cc1Swenshuai.xi         }
3794*53ee8cc1Swenshuai.xi 
3795*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8*)(u32VAddr);
3796*53ee8cc1Swenshuai.xi         HVD_memset( (void*)pDummyData, 0xff , *u32Size);
3797*53ee8cc1Swenshuai.xi 
3798*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3799*53ee8cc1Swenshuai.xi         {
3800*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3801*53ee8cc1Swenshuai.xi             pDummyData[0] = 0;
3802*53ee8cc1Swenshuai.xi             pDummyData[1] = 0;
3803*53ee8cc1Swenshuai.xi             pDummyData[2] = 1;
3804*53ee8cc1Swenshuai.xi             pDummyData[3] = 0xFF;
3805*53ee8cc1Swenshuai.xi             pDummyData[*u32Size-1] = 0x80;
3806*53ee8cc1Swenshuai.xi             break;
3807*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3808*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3809*53ee8cc1Swenshuai.xi         default:
3810*53ee8cc1Swenshuai.xi             *u32Size = u32MinPatternSize;
3811*53ee8cc1Swenshuai.xi             break;
3812*53ee8cc1Swenshuai.xi         }
3813*53ee8cc1Swenshuai.xi     }
3814*53ee8cc1Swenshuai.xi 
3815*53ee8cc1Swenshuai.xi #else // HVD chip set
3816*53ee8cc1Swenshuai.xi     if( eType == E_HVD_PATTERN_FLUSH )
3817*53ee8cc1Swenshuai.xi     {// flush pattern
3818*53ee8cc1Swenshuai.xi         // Driver input need not to push flush pattern
3819*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
3820*53ee8cc1Swenshuai.xi         {
3821*53ee8cc1Swenshuai.xi             *u32Size = 0;
3822*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
3823*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3824*53ee8cc1Swenshuai.xi         }
3825*53ee8cc1Swenshuai.xi 
3826*53ee8cc1Swenshuai.xi         // TSP input process
3827*53ee8cc1Swenshuai.xi         if( u32VAddr == 0)
3828*53ee8cc1Swenshuai.xi         {
3829*53ee8cc1Swenshuai.xi             *u32Size = 8+144;
3830*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Flush Pattern address shall not be zero\n" );
3831*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
3832*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3833*53ee8cc1Swenshuai.xi         }
3834*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3835*53ee8cc1Swenshuai.xi         {
3836*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3837*53ee8cc1Swenshuai.xi             u32MinPatternSize =8+144;
3838*53ee8cc1Swenshuai.xi             break;
3839*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3840*53ee8cc1Swenshuai.xi             u32MinPatternSize=8+144;
3841*53ee8cc1Swenshuai.xi             break;
3842*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3843*53ee8cc1Swenshuai.xi         default:
3844*53ee8cc1Swenshuai.xi             u32MinPatternSize = 0;
3845*53ee8cc1Swenshuai.xi             break;
3846*53ee8cc1Swenshuai.xi         }
3847*53ee8cc1Swenshuai.xi         if( *u32Size < u32MinPatternSize )
3848*53ee8cc1Swenshuai.xi         {
3849*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Flush Pattern must have at least %lu bytes, input:%lu\n" , u32MinPatternSize , (MS_U32)(*u32Size)  );
3850*53ee8cc1Swenshuai.xi             *u32Size = u32MinPatternSize;
3851*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_OUTOF_MEMORY;
3852*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3853*53ee8cc1Swenshuai.xi         }
3854*53ee8cc1Swenshuai.xi         *u32Size = u32MinPatternSize;
3855*53ee8cc1Swenshuai.xi 
3856*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8*)(u32VAddr);
3857*53ee8cc1Swenshuai.xi         HVD_memset( (void*)pDummyData, 0x0 , *u32Size);
3858*53ee8cc1Swenshuai.xi 
3859*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3860*53ee8cc1Swenshuai.xi         {
3861*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3862*53ee8cc1Swenshuai.xi             pDummyData[0] = 0;
3863*53ee8cc1Swenshuai.xi             pDummyData[1] = 0;
3864*53ee8cc1Swenshuai.xi             pDummyData[2] = 1;
3865*53ee8cc1Swenshuai.xi             pDummyData[3] = 0xFF;
3866*53ee8cc1Swenshuai.xi             pDummyData[4] = 0xAA;
3867*53ee8cc1Swenshuai.xi             pDummyData[5] = 0x55;
3868*53ee8cc1Swenshuai.xi             pDummyData[6] = 0xAA;
3869*53ee8cc1Swenshuai.xi             pDummyData[7] = 0x55;
3870*53ee8cc1Swenshuai.xi             break;
3871*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3872*53ee8cc1Swenshuai.xi             pDummyData[0] = 0;
3873*53ee8cc1Swenshuai.xi             pDummyData[1] = 0;
3874*53ee8cc1Swenshuai.xi             pDummyData[2] = 1;
3875*53ee8cc1Swenshuai.xi             pDummyData[3] = 0xB4;
3876*53ee8cc1Swenshuai.xi             pDummyData[4] = 0xAA;
3877*53ee8cc1Swenshuai.xi             pDummyData[5] = 0x55;
3878*53ee8cc1Swenshuai.xi             pDummyData[6] = 0xAA;
3879*53ee8cc1Swenshuai.xi             pDummyData[7] = 0x55;
3880*53ee8cc1Swenshuai.xi             break;
3881*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3882*53ee8cc1Swenshuai.xi         default:
3883*53ee8cc1Swenshuai.xi             break;
3884*53ee8cc1Swenshuai.xi         }
3885*53ee8cc1Swenshuai.xi 
3886*53ee8cc1Swenshuai.xi     }
3887*53ee8cc1Swenshuai.xi     else if( eType == E_HVD_PATTERN_FILEEND )
3888*53ee8cc1Swenshuai.xi     {// dummy pattern
3889*53ee8cc1Swenshuai.xi         // Driver input need not to push dummy pattern
3890*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
3891*53ee8cc1Swenshuai.xi         {
3892*53ee8cc1Swenshuai.xi             *u32Size = 0;
3893*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
3894*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3895*53ee8cc1Swenshuai.xi         }
3896*53ee8cc1Swenshuai.xi 
3897*53ee8cc1Swenshuai.xi         // TSP input process
3898*53ee8cc1Swenshuai.xi         if( u32VAddr == 0)
3899*53ee8cc1Swenshuai.xi         {
3900*53ee8cc1Swenshuai.xi             *u32Size = 8+144;
3901*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Dummy Pattern address shall not be zero\n" );
3902*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
3903*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3904*53ee8cc1Swenshuai.xi         }
3905*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3906*53ee8cc1Swenshuai.xi         {
3907*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3908*53ee8cc1Swenshuai.xi             u32MinPatternSize =8+144;
3909*53ee8cc1Swenshuai.xi             break;
3910*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3911*53ee8cc1Swenshuai.xi             u32MinPatternSize=8+144;
3912*53ee8cc1Swenshuai.xi             break;
3913*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3914*53ee8cc1Swenshuai.xi         default:
3915*53ee8cc1Swenshuai.xi             u32MinPatternSize = 0;
3916*53ee8cc1Swenshuai.xi             break;
3917*53ee8cc1Swenshuai.xi         }
3918*53ee8cc1Swenshuai.xi         if( *u32Size < u32MinPatternSize )
3919*53ee8cc1Swenshuai.xi         {
3920*53ee8cc1Swenshuai.xi             HVD_SUB_MSG_ERR("HVD ERR: Dummy Pattern must have at least %lu bytes, input:%lu\n" , u32MinPatternSize , (MS_U32)(*u32Size)  );
3921*53ee8cc1Swenshuai.xi             *u32Size = u32MinPatternSize;
3922*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_OUTOF_MEMORY;
3923*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
3924*53ee8cc1Swenshuai.xi         }
3925*53ee8cc1Swenshuai.xi 
3926*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8*)(u32VAddr);
3927*53ee8cc1Swenshuai.xi 
3928*53ee8cc1Swenshuai.xi         HVD_memset( (void*)pDummyData, 0x0 , *u32Size);
3929*53ee8cc1Swenshuai.xi 
3930*53ee8cc1Swenshuai.xi         switch( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
3931*53ee8cc1Swenshuai.xi         {
3932*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
3933*53ee8cc1Swenshuai.xi             pDummyData[0] = 0;
3934*53ee8cc1Swenshuai.xi             pDummyData[1] = 0;
3935*53ee8cc1Swenshuai.xi             pDummyData[2] = 1;
3936*53ee8cc1Swenshuai.xi             pDummyData[3] = 0xFF;
3937*53ee8cc1Swenshuai.xi             pDummyData[4] = 0xFF;
3938*53ee8cc1Swenshuai.xi             pDummyData[5] = 0xFF;
3939*53ee8cc1Swenshuai.xi             pDummyData[6] = 0xFF;
3940*53ee8cc1Swenshuai.xi             pDummyData[7] = 0xFF;
3941*53ee8cc1Swenshuai.xi             break;
3942*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
3943*53ee8cc1Swenshuai.xi             pDummyData[0] = 0;
3944*53ee8cc1Swenshuai.xi             pDummyData[1] = 0;
3945*53ee8cc1Swenshuai.xi             pDummyData[2] = 1;
3946*53ee8cc1Swenshuai.xi             pDummyData[3] = 0xB4;
3947*53ee8cc1Swenshuai.xi             pDummyData[4] = 0xAA;
3948*53ee8cc1Swenshuai.xi             pDummyData[5] = 0x66;
3949*53ee8cc1Swenshuai.xi             pDummyData[6] = 0xAA;
3950*53ee8cc1Swenshuai.xi             pDummyData[7] = 0x66;
3951*53ee8cc1Swenshuai.xi             break;
3952*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
3953*53ee8cc1Swenshuai.xi         default:
3954*53ee8cc1Swenshuai.xi             *u32Size = u32MinPatternSize;
3955*53ee8cc1Swenshuai.xi             break;
3956*53ee8cc1Swenshuai.xi         }
3957*53ee8cc1Swenshuai.xi     }
3958*53ee8cc1Swenshuai.xi #endif
3959*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
3960*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
3961*53ee8cc1Swenshuai.xi }
3962*53ee8cc1Swenshuai.xi 
3963*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3964*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetPatternInfo()
3965*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get driver specific data information
3966*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific data information
3967*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
3968*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetPatternInfo(HVD_Pattern_Info eType)3969*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetPatternInfo(   HVD_Pattern_Info eType )
3970*53ee8cc1Swenshuai.xi {
3971*53ee8cc1Swenshuai.xi     MS_U32 eRet=0;
3972*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
3973*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3974*53ee8cc1Swenshuai.xi     switch( eType )
3975*53ee8cc1Swenshuai.xi     {
3976*53ee8cc1Swenshuai.xi     case E_HVD_FLUSH_PATTERN_SIZE:
3977*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
3978*53ee8cc1Swenshuai.xi         {
3979*53ee8cc1Swenshuai.xi             eRet =0;
3980*53ee8cc1Swenshuai.xi         }
3981*53ee8cc1Swenshuai.xi         else if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
3982*53ee8cc1Swenshuai.xi         {
3983*53ee8cc1Swenshuai.xi #if defined(CHIP_T2)
3984*53ee8cc1Swenshuai.xi             eRet =(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_MAX_DUMMY_FIFO);
3985*53ee8cc1Swenshuai.xi #else
3986*53ee8cc1Swenshuai.xi             eRet =8+144;
3987*53ee8cc1Swenshuai.xi #endif
3988*53ee8cc1Swenshuai.xi         }
3989*53ee8cc1Swenshuai.xi         break;
3990*53ee8cc1Swenshuai.xi 
3991*53ee8cc1Swenshuai.xi     case E_HVD_DUMMY_HW_FIFO:
3992*53ee8cc1Swenshuai.xi         if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
3993*53ee8cc1Swenshuai.xi         {
3994*53ee8cc1Swenshuai.xi             eRet =0;
3995*53ee8cc1Swenshuai.xi         }
3996*53ee8cc1Swenshuai.xi         else if( (gSubHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
3997*53ee8cc1Swenshuai.xi         {
3998*53ee8cc1Swenshuai.xi             eRet =(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_MAX_DUMMY_FIFO);
3999*53ee8cc1Swenshuai.xi         }
4000*53ee8cc1Swenshuai.xi         break;
4001*53ee8cc1Swenshuai.xi     }
4002*53ee8cc1Swenshuai.xi     return eRet;
4003*53ee8cc1Swenshuai.xi }
4004*53ee8cc1Swenshuai.xi 
4005*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4006*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetDynamicScalingInfo()
4007*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of Dynamic Scaling
4008*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific information
4009*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
4010*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetDynamicScalingInfo(HVD_DynamicScaling_Info eType)4011*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetDynamicScalingInfo(   HVD_DynamicScaling_Info eType )
4012*53ee8cc1Swenshuai.xi {
4013*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4014*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4015*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4016*53ee8cc1Swenshuai.xi     switch( eType )
4017*53ee8cc1Swenshuai.xi     {
4018*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_MIUSEL:
4019*53ee8cc1Swenshuai.xi         if( gSubHVDCtrl.MemMap.u32CodeBufAddr >= gSubHVDCtrl.MemMap.u32MIU1BaseAddr )
4020*53ee8cc1Swenshuai.xi         {
4021*53ee8cc1Swenshuai.xi             u32Ret=TRUE;
4022*53ee8cc1Swenshuai.xi         }
4023*53ee8cc1Swenshuai.xi         else
4024*53ee8cc1Swenshuai.xi         {
4025*53ee8cc1Swenshuai.xi             u32Ret=FALSE;
4026*53ee8cc1Swenshuai.xi         }
4027*53ee8cc1Swenshuai.xi         break;
4028*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_ADDR:
4029*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_DS_BUF_ADDR);
4030*53ee8cc1Swenshuai.xi         u32Ret+=gSubHVDCtrl.MemMap.u32CodeBufAddr;
4031*53ee8cc1Swenshuai.xi         break;
4032*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_SIZE:
4033*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_DS_BUF_SIZE);
4034*53ee8cc1Swenshuai.xi         break;
4035*53ee8cc1Swenshuai.xi     case E_HVD_DS_VECTOR_DEPTH:
4036*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_DS_VECTOR_DEPTH);
4037*53ee8cc1Swenshuai.xi         break;
4038*53ee8cc1Swenshuai.xi     case E_HVD_DS_INFO_ADDR:
4039*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_Sub_GetData(E_HVD_GDATA_FW_DS_INFO_ADDR);
4040*53ee8cc1Swenshuai.xi         u32Ret+=gSubHVDCtrl.MemMap.u32CodeBufAddr;
4041*53ee8cc1Swenshuai.xi         break;
4042*53ee8cc1Swenshuai.xi     }
4043*53ee8cc1Swenshuai.xi     return u32Ret;
4044*53ee8cc1Swenshuai.xi }
4045*53ee8cc1Swenshuai.xi 
4046*53ee8cc1Swenshuai.xi #if 0
4047*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4048*53ee8cc1Swenshuai.xi /// @brief \b Enum \b Name: HVD_DynamicScaling_Info
4049*53ee8cc1Swenshuai.xi /// @brief \b Enum \b Description:  The information type of dynamic scaling.
4050*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4051*53ee8cc1Swenshuai.xi typedef enum
4052*53ee8cc1Swenshuai.xi {
4053*53ee8cc1Swenshuai.xi     E_HVD_DS_CAPABILITY,         ///< the capability of dynamic sacling. Ret: TRUE /FALSE
4054*53ee8cc1Swenshuai.xi     E_HVD_DS_BUF_ADDR,         ///< the buffer start physcial address.
4055*53ee8cc1Swenshuai.xi     E_HVD_DS_BUF_SIZE,            ///< the buffer size.
4056*53ee8cc1Swenshuai.xi     E_HVD_DS_VECTOR_DEPTH,            ///< the depth of scaling vector.
4057*53ee8cc1Swenshuai.xi } HVD_DynamicScaling_Info;
4058*53ee8cc1Swenshuai.xi 
4059*53ee8cc1Swenshuai.xi 
4060*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4061*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDynamicScalingInfo()
4062*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get driver information of dynamic scaling
4063*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific dynamic scaling information
4064*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
4065*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4066*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDynamicScalingInfo(   HVD_DynamicScaling_Info eType )
4067*53ee8cc1Swenshuai.xi {
4068*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4069*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4070*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4071*53ee8cc1Swenshuai.xi 
4072*53ee8cc1Swenshuai.xi     switch( eType )
4073*53ee8cc1Swenshuai.xi     {
4074*53ee8cc1Swenshuai.xi     case E_HVD_DS_CAPABILITY:
4075*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_GetData(  E_HVD_GDATA_DS_CAPABILITY );
4076*53ee8cc1Swenshuai.xi         break;
4077*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_ADDR:
4078*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_GetData(  E_HVD_GDATA_DS_BUF_ADDR );
4079*53ee8cc1Swenshuai.xi         break;
4080*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_SIZE:
4081*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_GetData(  E_HVD_GDATA_DS_BUF_SIZE );
4082*53ee8cc1Swenshuai.xi         break;
4083*53ee8cc1Swenshuai.xi     case E_HVD_DS_VECTOR_DEPTH:
4084*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_GetData(  E_HVD_GDATA_DS_VECTOR_DEPTH );
4085*53ee8cc1Swenshuai.xi         break;
4086*53ee8cc1Swenshuai.xi     default:
4087*53ee8cc1Swenshuai.xi         break;
4088*53ee8cc1Swenshuai.xi     }
4089*53ee8cc1Swenshuai.xi     return u32Ret;
4090*53ee8cc1Swenshuai.xi }
4091*53ee8cc1Swenshuai.xi #endif
4092*53ee8cc1Swenshuai.xi // debug
4093*53ee8cc1Swenshuai.xi 
4094*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4095*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetData()
4096*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get target data from HVD driver
4097*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of the target data
4098*53ee8cc1Swenshuai.xi /// @return -the value of the target data
4099*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetData(HVD_GData_Type eType)4100*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetData(HVD_GData_Type eType)
4101*53ee8cc1Swenshuai.xi {
4102*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4103*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4104*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4105*53ee8cc1Swenshuai.xi     switch( eType )
4106*53ee8cc1Swenshuai.xi     {
4107*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_CNT:
4108*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_DISP_CNT );
4109*53ee8cc1Swenshuai.xi         break;
4110*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_SKIP_CNT:
4111*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_SKIP_CNT );
4112*53ee8cc1Swenshuai.xi         break;
4113*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DROP_CNT:
4114*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_DROP_CNT );
4115*53ee8cc1Swenshuai.xi         break;
4116*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_IDLE_CNT:
4117*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_VPU_IDLE_CNT );
4118*53ee8cc1Swenshuai.xi         break;
4119*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_VSYNC_CNT:
4120*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_VSYNC_CNT );
4121*53ee8cc1Swenshuai.xi         break;
4122*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_MAIN_LOOP_CNT:
4123*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_MAIN_LOOP_CNT );
4124*53ee8cc1Swenshuai.xi         break;
4125*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_AVC_LEVEL_IDC:
4126*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_AVC_LEVEL_IDC );
4127*53ee8cc1Swenshuai.xi         break;
4128*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_Q_SIZE:
4129*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_DISP_Q_NUMB );
4130*53ee8cc1Swenshuai.xi         break;
4131*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_ES_LEVEL:
4132*53ee8cc1Swenshuai.xi         u32Ret = (MS_U32)(HVD_ES_Level)HAL_HVD_Sub_GetData(  E_HVD_GDATA_ES_LEVEL );
4133*53ee8cc1Swenshuai.xi         break;
4134*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_AVC_VUI_DISP_INFO:
4135*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_AVC_VUI_DISP_INFO );
4136*53ee8cc1Swenshuai.xi         break;
4137*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_STC:
4138*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_DISP_STC );
4139*53ee8cc1Swenshuai.xi         break;
4140*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_USERDATA_IDX_TBL_SIZE:
4141*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
4142*53ee8cc1Swenshuai.xi         break;
4143*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_USERDATA_PACKET_SIZE:
4144*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(E_HVD_GDATA_USERDATA_PACKET_SIZE);
4145*53ee8cc1Swenshuai.xi         break;
4146*53ee8cc1Swenshuai.xi 
4147*53ee8cc1Swenshuai.xi     default:
4148*53ee8cc1Swenshuai.xi         break;
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi     }
4151*53ee8cc1Swenshuai.xi     return u32Ret;
4152*53ee8cc1Swenshuai.xi }
4153*53ee8cc1Swenshuai.xi 
4154*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4155*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetMem_Dbg()
4156*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get any data from any memory address
4157*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target data
4158*53ee8cc1Swenshuai.xi /// @return -the value of the memory
4159*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetMem_Dbg(MS_U32 u32Addr)4160*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_Sub_GetMem_Dbg(MS_U32 u32Addr)
4161*53ee8cc1Swenshuai.xi {
4162*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4163*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4164*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u32Ret);
4165*53ee8cc1Swenshuai.xi     switch(u32Addr)
4166*53ee8cc1Swenshuai.xi     {
4167*53ee8cc1Swenshuai.xi     case 1:
4168*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_BBU_READ_PTR );
4169*53ee8cc1Swenshuai.xi         break;
4170*53ee8cc1Swenshuai.xi     case 2:
4171*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_VPU_PC_CNT );
4172*53ee8cc1Swenshuai.xi         break;
4173*53ee8cc1Swenshuai.xi     case 3:
4174*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_Sub_GetData(  E_HVD_GDATA_BBU_WRITE_PTR );
4175*53ee8cc1Swenshuai.xi         break;
4176*53ee8cc1Swenshuai.xi     }
4177*53ee8cc1Swenshuai.xi     return u32Ret;
4178*53ee8cc1Swenshuai.xi //        break;
4179*53ee8cc1Swenshuai.xi //    return HAL_HVD_GetData_Dbg(u32Addr);
4180*53ee8cc1Swenshuai.xi }
4181*53ee8cc1Swenshuai.xi 
4182*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4183*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_DbgDumpStatus()
4184*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Dump specific information to standard output.
4185*53ee8cc1Swenshuai.xi /// @param -eFlag \b IN : the type of information.
4186*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_DbgDumpStatus(HVD_DumpStatus eFlag)4187*53ee8cc1Swenshuai.xi void MDrv_HVD_Sub_DbgDumpStatus(HVD_DumpStatus eFlag)
4188*53ee8cc1Swenshuai.xi {
4189*53ee8cc1Swenshuai.xi     _DRV_HVD_Initedn();
4190*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_DRV )
4191*53ee8cc1Swenshuai.xi     {
4192*53ee8cc1Swenshuai.xi         ;
4193*53ee8cc1Swenshuai.xi     }
4194*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_FW )
4195*53ee8cc1Swenshuai.xi     {
4196*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_Dump_FW_Status();
4197*53ee8cc1Swenshuai.xi     }
4198*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_HW )
4199*53ee8cc1Swenshuai.xi     {
4200*53ee8cc1Swenshuai.xi         HAL_HVD_Sub_Dump_HW_Status(HVD_U32_MAX);
4201*53ee8cc1Swenshuai.xi     }
4202*53ee8cc1Swenshuai.xi }
4203*53ee8cc1Swenshuai.xi 
4204*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4205*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetMem_Dbg()
4206*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any data into any memory address
4207*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target destination
4208*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : the value of input content
4209*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetMem_Dbg(MS_U32 u32Addr,MS_U32 u32Arg)4210*53ee8cc1Swenshuai.xi void MDrv_HVD_Sub_SetMem_Dbg(MS_U32 u32Addr , MS_U32 u32Arg)
4211*53ee8cc1Swenshuai.xi {
4212*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4213*53ee8cc1Swenshuai.xi     HAL_HVD_Sub_SetData_Dbg(u32Addr ,u32Arg );
4214*53ee8cc1Swenshuai.xi }
4215*53ee8cc1Swenshuai.xi 
4216*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4217*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetCmd_Dbg()
4218*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
4219*53ee8cc1Swenshuai.xi /// @param -u32Cmd \b IN : specify the FW command ID.
4220*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of FW command.
4221*53ee8cc1Swenshuai.xi /// @return -the result of debug command
4222*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetCmd_Dbg(MS_U32 u32Cmd,MS_U32 u32Arg)4223*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetCmd_Dbg( MS_U32 u32Cmd , MS_U32 u32Arg)
4224*53ee8cc1Swenshuai.xi {
4225*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4226*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4227*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4228*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4229*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_Sub_SetCmd((HVD_User_Cmd)u32Cmd , u32Arg);
4230*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
4231*53ee8cc1Swenshuai.xi }
4232*53ee8cc1Swenshuai.xi 
4233*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4234*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetSettings_Pro()
4235*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
4236*53ee8cc1Swenshuai.xi /// @param -eType \b IN : specify the type of setting.
4237*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of the setting.
4238*53ee8cc1Swenshuai.xi /// @return -the result of set professional settings.
4239*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetSettings_Pro(HVD_SSettings_Type eType,MS_U32 u32Arg)4240*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetSettings_Pro( HVD_SSettings_Type eType , MS_U32 u32Arg)
4241*53ee8cc1Swenshuai.xi {
4242*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4243*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
4244*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4245*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4246*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4247*53ee8cc1Swenshuai.xi     switch( eType )
4248*53ee8cc1Swenshuai.xi     {
4249*53ee8cc1Swenshuai.xi         case E_HVD_SSET_TIME_UNIT:
4250*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_TIME_UNIT_TYPE;
4251*53ee8cc1Swenshuai.xi             break;
4252*53ee8cc1Swenshuai.xi         case E_HVD_SSET_PITCH:
4253*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_PITCH;
4254*53ee8cc1Swenshuai.xi             break;
4255*53ee8cc1Swenshuai.xi         case E_HVD_SSET_SYNC_EACH_FRM:
4256*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_SYNC_EACH_FRM;
4257*53ee8cc1Swenshuai.xi             break;
4258*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MAX_DEC_TICK:
4259*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MAX_DEC_TICK;
4260*53ee8cc1Swenshuai.xi             break;
4261*53ee8cc1Swenshuai.xi         case E_HVD_SSET_AUTO_FREE_ES:
4262*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_AUTO_FREE_ES;
4263*53ee8cc1Swenshuai.xi             gSubHVDCtrl.Settings.bAutoFreeES=u32Arg;
4264*53ee8cc1Swenshuai.xi             break;
4265*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MIN_FRAME_GAP:
4266*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MIN_FRAME_GAP;
4267*53ee8cc1Swenshuai.xi             break;
4268*53ee8cc1Swenshuai.xi         case E_HVD_SSET_DISABLE_DEBLOCKING:
4269*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_DBF;
4270*53ee8cc1Swenshuai.xi             if( u32Arg > 2 )
4271*53ee8cc1Swenshuai.xi             {
4272*53ee8cc1Swenshuai.xi                 u32Arg =1;
4273*53ee8cc1Swenshuai.xi             }
4274*53ee8cc1Swenshuai.xi             gSubHVDCtrl.Settings.bDisDeblocking=u32Arg;
4275*53ee8cc1Swenshuai.xi             break;
4276*53ee8cc1Swenshuai.xi         case E_HVD_SSET_DISABLE_QUARTER_PIXEL:
4277*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_QUART_PIXEL;
4278*53ee8cc1Swenshuai.xi             if( u32Arg > 2 )
4279*53ee8cc1Swenshuai.xi             {
4280*53ee8cc1Swenshuai.xi                 u32Arg =1;
4281*53ee8cc1Swenshuai.xi             }
4282*53ee8cc1Swenshuai.xi             gSubHVDCtrl.Settings.bDisQuarterPixel=u32Arg;
4283*53ee8cc1Swenshuai.xi             break;
4284*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MIU_BURST_CNT_LEVEL:
4285*53ee8cc1Swenshuai.xi #if !(defined(CHIP_T2) || defined(CHIP_T7))
4286*53ee8cc1Swenshuai.xi             gSubHVDCtrl.Settings.u32MiuBurstLevel=u32Arg;
4287*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MIU_BURST_CNT;
4288*53ee8cc1Swenshuai.xi #else
4289*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_INVALID_CMD;
4290*53ee8cc1Swenshuai.xi #endif
4291*53ee8cc1Swenshuai.xi             break;
4292*53ee8cc1Swenshuai.xi         default:
4293*53ee8cc1Swenshuai.xi             break;
4294*53ee8cc1Swenshuai.xi     }
4295*53ee8cc1Swenshuai.xi     if( eCmd != E_HVD_CMD_INVALID_CMD)
4296*53ee8cc1Swenshuai.xi     {
4297*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_Sub_SetCmd(eCmd , u32Arg);
4298*53ee8cc1Swenshuai.xi     }
4299*53ee8cc1Swenshuai.xi     else
4300*53ee8cc1Swenshuai.xi     {
4301*53ee8cc1Swenshuai.xi         eRet = E_HVD_RET_INVALID_PARAMETER;
4302*53ee8cc1Swenshuai.xi     }
4303*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
4304*53ee8cc1Swenshuai.xi }
4305*53ee8cc1Swenshuai.xi 
4306*53ee8cc1Swenshuai.xi #if 1
4307*53ee8cc1Swenshuai.xi 
4308*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4309*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_GetCaps()
4310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if HW support this format
4311*53ee8cc1Swenshuai.xi /// @param -u32Type \b IN : specify the format type
4312*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
4313*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not supported by HW
4314*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): supported by HW
4315*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_GetCaps(HVD_Codec u32Type)4316*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Sub_GetCaps( HVD_Codec u32Type)
4317*53ee8cc1Swenshuai.xi {
4318*53ee8cc1Swenshuai.xi     MS_U32 verID=HAL_HVD_Sub_Get_HWVersionID();
4319*53ee8cc1Swenshuai.xi     verID = verID;
4320*53ee8cc1Swenshuai.xi     u32Type = u32Type;
4321*53ee8cc1Swenshuai.xi     //AVCH264DBG(printf("HVD rev id: 0x%x \n\n", verID );
4322*53ee8cc1Swenshuai.xi     #if ( HVD_HW_VERSION == HVD_HW_HVD)
4323*53ee8cc1Swenshuai.xi     verID=verID >> 12;
4324*53ee8cc1Swenshuai.xi     switch( u32Type )
4325*53ee8cc1Swenshuai.xi     {
4326*53ee8cc1Swenshuai.xi     case E_HVD_AVC:
4327*53ee8cc1Swenshuai.xi     case E_HVD_AVS:
4328*53ee8cc1Swenshuai.xi     case E_HVD_RM:
4329*53ee8cc1Swenshuai.xi         if( (verID & BIT(u32Type)) == 0 )
4330*53ee8cc1Swenshuai.xi         {
4331*53ee8cc1Swenshuai.xi             return FALSE;
4332*53ee8cc1Swenshuai.xi         }
4333*53ee8cc1Swenshuai.xi         break;
4334*53ee8cc1Swenshuai.xi     default:
4335*53ee8cc1Swenshuai.xi         return FALSE;
4336*53ee8cc1Swenshuai.xi     }
4337*53ee8cc1Swenshuai.xi     #else
4338*53ee8cc1Swenshuai.xi     if( u32Type != E_HVD_AVC )
4339*53ee8cc1Swenshuai.xi     {
4340*53ee8cc1Swenshuai.xi         return FALSE;
4341*53ee8cc1Swenshuai.xi     }
4342*53ee8cc1Swenshuai.xi     #endif
4343*53ee8cc1Swenshuai.xi     return TRUE;
4344*53ee8cc1Swenshuai.xi }
4345*53ee8cc1Swenshuai.xi #endif
4346*53ee8cc1Swenshuai.xi 
4347*53ee8cc1Swenshuai.xi #if 0 //need check for hvd sub
4348*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_LinkWeakSymbolPatch(void)
4349*53ee8cc1Swenshuai.xi {
4350*53ee8cc1Swenshuai.xi     return TRUE;
4351*53ee8cc1Swenshuai.xi }
4352*53ee8cc1Swenshuai.xi #endif
4353*53ee8cc1Swenshuai.xi 
4354*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4355*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetAutoRmLstZeroByte
4356*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on/off auto remove last zero byte
4357*53ee8cc1Swenshuai.xi /// @param -bOn \b IN : Turn on/off auto remove last zero byte
4358*53ee8cc1Swenshuai.xi /// @return -the result of turn on/off auto remove last zero byte
4359*53ee8cc1Swenshuai.xi ///\b NOTE: The default mode after initialization is On.
4360*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetAutoRmLstZeroByte(MS_BOOL bOn)4361*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetAutoRmLstZeroByte(MS_BOOL bOn)
4362*53ee8cc1Swenshuai.xi {
4363*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4364*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4365*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4366*53ee8cc1Swenshuai.xi     gSubHVDCtrl.bAutoRmLastZeroByte = bOn;
4367*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4368*53ee8cc1Swenshuai.xi }
4369*53ee8cc1Swenshuai.xi 
4370*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4371*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_IsAlive
4372*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:Check Whether HVD is alive or not(check cnt)
4373*53ee8cc1Swenshuai.xi /// @return -the result of HVD alive status(E_HVD_OK/E_HVD_RET_NOT_RUNNING)
4374*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_IsAlive(void)4375*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_IsAlive(void)
4376*53ee8cc1Swenshuai.xi {
4377*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(E_HVD_FAIL);
4378*53ee8cc1Swenshuai.xi #if defined(CHIP_T2)
4379*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4380*53ee8cc1Swenshuai.xi #else
4381*53ee8cc1Swenshuai.xi     if((gSubHVDCtrl.LivingStatus.u32DecCnt == HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT))
4382*53ee8cc1Swenshuai.xi     && (gSubHVDCtrl.LivingStatus.u32SkipCnt == HAL_HVD_Sub_GetData(E_HVD_GDATA_SKIP_CNT))
4383*53ee8cc1Swenshuai.xi     && (gSubHVDCtrl.LivingStatus.u32IdleCnt == HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT))
4384*53ee8cc1Swenshuai.xi     && (gSubHVDCtrl.LivingStatus.u32MainLoopCnt == HAL_HVD_Sub_GetData(E_HVD_GDATA_MAIN_LOOP_CNT)))
4385*53ee8cc1Swenshuai.xi     {
4386*53ee8cc1Swenshuai.xi         return E_HVD_RET_NOT_RUNNING;
4387*53ee8cc1Swenshuai.xi     }
4388*53ee8cc1Swenshuai.xi     else
4389*53ee8cc1Swenshuai.xi     {
4390*53ee8cc1Swenshuai.xi         gSubHVDCtrl.LivingStatus.u32DecCnt = HAL_HVD_Sub_GetData(E_HVD_GDATA_DECODE_CNT);
4391*53ee8cc1Swenshuai.xi         gSubHVDCtrl.LivingStatus.u32SkipCnt = HAL_HVD_Sub_GetData(E_HVD_GDATA_SKIP_CNT);
4392*53ee8cc1Swenshuai.xi         gSubHVDCtrl.LivingStatus.u32IdleCnt = HAL_HVD_Sub_GetData(E_HVD_GDATA_VPU_IDLE_CNT);
4393*53ee8cc1Swenshuai.xi         gSubHVDCtrl.LivingStatus.u32MainLoopCnt = HAL_HVD_Sub_GetData(E_HVD_GDATA_MAIN_LOOP_CNT);
4394*53ee8cc1Swenshuai.xi     }
4395*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4396*53ee8cc1Swenshuai.xi #endif
4397*53ee8cc1Swenshuai.xi }
4398*53ee8cc1Swenshuai.xi 
4399*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4400*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Sub_SetBalanceBW
4401*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: bandwidth adjustment
4402*53ee8cc1Swenshuai.xi /// @param -qp_cnt \b IN : QP threshold for overtime counter
4403*53ee8cc1Swenshuai.xi /// @param -db_cnt \b IN : Deblocking threshod for overtime counter
4404*53ee8cc1Swenshuai.xi /// @param -upper \b IN : upper bound for overtime counter
4405*53ee8cc1Swenshuai.xi /// @return -the result of command E_HVD_CMD_BALANCE_BW
4406*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Sub_SetBalanceBW(MS_U8 qp_cnt,MS_U8 db_cnt,MS_U8 upper)4407*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Sub_SetBalanceBW(MS_U8 qp_cnt, MS_U8 db_cnt, MS_U8 upper)
4408*53ee8cc1Swenshuai.xi {
4409*53ee8cc1Swenshuai.xi     HVD_Result eRst=E_HVD_FAIL;
4410*53ee8cc1Swenshuai.xi     HVD_SUB_MSG_TRACE();
4411*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRst);
4412*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4413*53ee8cc1Swenshuai.xi     eRst = (HVD_Result)HAL_HVD_Sub_SetCmd(E_HVD_CMD_BALANCE_BW, qp_cnt | (db_cnt << 8) | (upper << 16));
4414*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRst);
4415*53ee8cc1Swenshuai.xi }
4416*53ee8cc1Swenshuai.xi #endif //defined(SUPPORT_HVD_SUB)
4417*53ee8cc1Swenshuai.xi 
4418