xref: /utopia/UTPA2-700.0.x/modules/vdec_v1/drv/hvd/drvHVD.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.c
98*53ee8cc1Swenshuai.xi /// @brief  HVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
104*53ee8cc1Swenshuai.xi //  Include Files
105*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
106*53ee8cc1Swenshuai.xi // Common Definition
107*53ee8cc1Swenshuai.xi #include "drvHVD_Common.h"
108*53ee8cc1Swenshuai.xi #include "drvHVD.h"
109*53ee8cc1Swenshuai.xi #include "drvHVD_def.h"
110*53ee8cc1Swenshuai.xi 
111*53ee8cc1Swenshuai.xi #include "fwHVD_if.h"
112*53ee8cc1Swenshuai.xi #include "halHVD.h"
113*53ee8cc1Swenshuai.xi #include "halVPU.h"
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
116*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
117*53ee8cc1Swenshuai.xi #endif
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
120*53ee8cc1Swenshuai.xi //  Driver Compiler Options
121*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
124*53ee8cc1Swenshuai.xi //  Local Defines
125*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
126*53ee8cc1Swenshuai.xi // Drv memory usage
127*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
128*53ee8cc1Swenshuai.xi     #define HVD_DTV_VIDEO_DELAY         0 // ms
129*53ee8cc1Swenshuai.xi #else
130*53ee8cc1Swenshuai.xi     #define HVD_DTV_VIDEO_DELAY         0 // ms
131*53ee8cc1Swenshuai.xi #endif
132*53ee8cc1Swenshuai.xi #define HVD_FW_CMD_TIMEOUT_DEFAULT      100 // ms
133*53ee8cc1Swenshuai.xi #define HVD_FW_EXIT_ACTION_TIMEOUT      3500 // ms
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi #define HVD_CTRL_INIT_FINISHED          BIT(0)    // deflaut: 0
136*53ee8cc1Swenshuai.xi #define HVD_CTRL_PROCESSING             BIT(1)    // deflaut: 0
137*53ee8cc1Swenshuai.xi #define HVD_CTRL_DATA_END               BIT(2)    // deflaut: 0
138*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISPLAY_CTRL           BIT(3)    // deflaut: 0
139*53ee8cc1Swenshuai.xi #define HVD_CTRL_DISP_INFO_RDY          BIT(4)    // deflaut: 0
140*53ee8cc1Swenshuai.xi #define HVD_CTRL_CODE_MIU_1             BIT(5)    // deflaut: 0
141*53ee8cc1Swenshuai.xi #define HVD_CTRL_ES_MIU_1               BIT(6)    // deflaut: 0
142*53ee8cc1Swenshuai.xi #define HVD_CTRL_FRM_MIU_1              BIT(7)    // deflaut: 0
143*53ee8cc1Swenshuai.xi #define HVD_CTRL_DRVPROCC_MIU_1         BIT(8)    // deflaut: 0
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi typedef enum
146*53ee8cc1Swenshuai.xi {
147*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_NONE = 0, //decode -> decode_finish
148*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_INIT,
149*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_TRIGGER_DISP,
150*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_SEEK2PTS,
151*53ee8cc1Swenshuai.xi     E_HVD_CHECK_CMD_MAX,
152*53ee8cc1Swenshuai.xi } HVD_Check_Cmd;
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_HVD     BIT(0)
155*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_MVD     BIT(1)
156*53ee8cc1Swenshuai.xi #define HVD_MIU_PROTECT_VPU     BIT(2)
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi #define _DRV_HVD_Entry()                                \
159*53ee8cc1Swenshuai.xi     do                                                  \
160*53ee8cc1Swenshuai.xi     {                                                   \
161*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= HVD_CTRL_PROCESSING;    \
162*53ee8cc1Swenshuai.xi     } while (0)
163*53ee8cc1Swenshuai.xi 
164*53ee8cc1Swenshuai.xi #define _DRV_HVD_Return(_ret_)                          \
165*53ee8cc1Swenshuai.xi     do                                                  \
166*53ee8cc1Swenshuai.xi     {                                                   \
167*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode &= (~HVD_CTRL_PROCESSING); \
168*53ee8cc1Swenshuai.xi         return (_ret_);                                 \
169*53ee8cc1Swenshuai.xi     } while (0)
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi #define _DRV_HVD_Inited(_ret_)  \
172*53ee8cc1Swenshuai.xi     do                          \
173*53ee8cc1Swenshuai.xi     {                           \
174*53ee8cc1Swenshuai.xi         if (!bHVDIsInited)      \
175*53ee8cc1Swenshuai.xi         {                       \
176*53ee8cc1Swenshuai.xi             return _ret_;       \
177*53ee8cc1Swenshuai.xi         }                       \
178*53ee8cc1Swenshuai.xi     } while (0)
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi #define _DRV_HVD_Rsting(_ret_)  \
181*53ee8cc1Swenshuai.xi     do                          \
182*53ee8cc1Swenshuai.xi     {                           \
183*53ee8cc1Swenshuai.xi         if (bHVDIsIniting)      \
184*53ee8cc1Swenshuai.xi         {                       \
185*53ee8cc1Swenshuai.xi             return _ret_;       \
186*53ee8cc1Swenshuai.xi         }                       \
187*53ee8cc1Swenshuai.xi     } while (0)
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi #define _DRV_HVD_Ctrl(x)    ( gHVDCtrl.u32CtrlMode & (x) )
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi #define _DRV_HVD_SetCtrl(x)             \
192*53ee8cc1Swenshuai.xi     do                                  \
193*53ee8cc1Swenshuai.xi     {                                   \
194*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= (x);    \
195*53ee8cc1Swenshuai.xi     } while (0)
196*53ee8cc1Swenshuai.xi 
197*53ee8cc1Swenshuai.xi #ifndef UNUSED
198*53ee8cc1Swenshuai.xi #define UNUSED(x) (void)(x)
199*53ee8cc1Swenshuai.xi #endif
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
202*53ee8cc1Swenshuai.xi //  Local Structures
203*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi // Local Functions Prototype
207*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
208*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_InitVariables(HVD_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams);
209*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_Check_Cmd(HVD_Check_Cmd eCmd);
210*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_InitShareMem(void);
211*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_InitRegCPU(void);
212*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_SetSyncMode(HVD_Sync_Tbl_Type eMode);
213*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_InitFW_AVC(void);
214*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_Check_FW_Version(void);
215*53ee8cc1Swenshuai.xi static HVD_Result   _DRV_HVD_InitFW(void);
216*53ee8cc1Swenshuai.xi static MS_BOOL      _DRV_HVD_IsAllBufferEmpty(void);
217*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
218*53ee8cc1Swenshuai.xi static MS_S32       _DRV_HVD_ISRHandler(void);
219*53ee8cc1Swenshuai.xi #else
220*53ee8cc1Swenshuai.xi static void         _DRV_HVD_ISRHandler(void);
221*53ee8cc1Swenshuai.xi #endif
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
224*53ee8cc1Swenshuai.xi //  Global Variables
225*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
226*53ee8cc1Swenshuai.xi MS_U32 u32UartCtrl          = (E_HVD_UART_CTRL_ERR | E_HVD_UART_CTRL_MUST);
227*53ee8cc1Swenshuai.xi MS_U32 u32InitSysTimeBase   = 0;
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
230*53ee8cc1Swenshuai.xi //  Local Variables
231*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
232*53ee8cc1Swenshuai.xi static MSIF_Version _drv_hvd_version = {
233*53ee8cc1Swenshuai.xi     .DDI = { HVD_DRV_VERSION, },
234*53ee8cc1Swenshuai.xi };
235*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsInited;
236*53ee8cc1Swenshuai.xi static MS_BOOL bHVDIsIniting;
237*53ee8cc1Swenshuai.xi static HVD_DrvInfo  DrvInfo;
238*53ee8cc1Swenshuai.xi static HVD_ISR_Ctrl gHVDISRCtrl;
239*53ee8cc1Swenshuai.xi static HVD_BBU_Info gHVDPacket;
240*53ee8cc1Swenshuai.xi static HVD_Drv_Ctrl gHVDCtrl;
241*53ee8cc1Swenshuai.xi static HVD_Pre_Ctrl gHVDPreCtrl = {0};
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
244*53ee8cc1Swenshuai.xi //  Debug Functions
245*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi 
248*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
249*53ee8cc1Swenshuai.xi //  Local Functions
250*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_DRV_HVD_InitVariables(HVD_MemCfg * pStMemCfg,HVD_Init_Params * pStInitParams)251*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_InitVariables(HVD_MemCfg *pStMemCfg, HVD_Init_Params *pStInitParams)
252*53ee8cc1Swenshuai.xi {
253*53ee8cc1Swenshuai.xi     // PreSetControl
254*53ee8cc1Swenshuai.xi     HAL_HVD_SetPreCtrlVariables((MS_U32)(&gHVDPreCtrl));
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi     HVD_memset((void *) &gHVDCtrl, 0, sizeof(HVD_Drv_Ctrl));
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi     if (sizeof(HVD_Init_Params) == sizeof(HVD_Init_Settings))
259*53ee8cc1Swenshuai.xi     {
260*53ee8cc1Swenshuai.xi         HVD_memcpy((void *) &gHVDCtrl.InitParams,
261*53ee8cc1Swenshuai.xi                    pStInitParams,
262*53ee8cc1Swenshuai.xi                    sizeof(HVD_Init_Params));
263*53ee8cc1Swenshuai.xi     }
264*53ee8cc1Swenshuai.xi     else
265*53ee8cc1Swenshuai.xi     {
266*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("HVD Err: HVD struct define is diff: HVD_Init_Params(%lu) vs HVD_Init_Settings(%lu)\n",
267*53ee8cc1Swenshuai.xi                     (MS_U32)sizeof(HVD_Init_Params),
268*53ee8cc1Swenshuai.xi                     (MS_U32)sizeof(HVD_Init_Settings));
269*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
270*53ee8cc1Swenshuai.xi     }
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi     // fill memory
273*53ee8cc1Swenshuai.xi     if (pStMemCfg->u32MIU1BaseAddr == 0)
274*53ee8cc1Swenshuai.xi     {
275*53ee8cc1Swenshuai.xi #if HVD_ENABLE_MSOS_MIU1_BASE
276*53ee8cc1Swenshuai.xi         gHVDCtrl.MemMap.u32MIU1BaseAddr = HAL_MIU1_BASE;
277*53ee8cc1Swenshuai.xi #else
278*53ee8cc1Swenshuai.xi         gHVDCtrl.MemMap.u32MIU1BaseAddr = HVD_MIU1_BASE_ADDRESS;
279*53ee8cc1Swenshuai.xi #endif
280*53ee8cc1Swenshuai.xi     }
281*53ee8cc1Swenshuai.xi     else
282*53ee8cc1Swenshuai.xi     {
283*53ee8cc1Swenshuai.xi         gHVDCtrl.MemMap.u32MIU1BaseAddr = pStMemCfg->u32MIU1BaseAddr;
284*53ee8cc1Swenshuai.xi     }
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.eFWSourceType       = (HVD_FWInputSourceType) pStMemCfg->eFWSourceType;
287*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FWBinaryVAddr    = pStMemCfg->u32FWBinaryVAddr;
288*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FWBinaryAddr     = (MS_U32) pStMemCfg->u32FWBinaryAddr;
289*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FWBinarySize     = pStMemCfg->u32FWBinarySize;
290*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32VLCBinaryVAddr   = pStMemCfg->u32VLCBinaryVAddr;
291*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32VLCBinaryAddr    = (MS_U32) pStMemCfg->u32VLCBinaryAddr;
292*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32VLCBinarySize    = pStMemCfg->u32VLCBinarySize;
293*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32CodeBufVAddr     = pStMemCfg->u32CodeBufVAddr;
294*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32CodeBufAddr      = (MS_U32) pStMemCfg->u32CodeBufAddr;
295*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32CodeBufSize      = pStMemCfg->u32CodeBufSize;
296*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FrameBufVAddr    = pStMemCfg->u32FrameBufVAddr;
297*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FrameBufAddr     = (MS_U32) pStMemCfg->u32FrameBufAddr;
298*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32FrameBufSize     = pStMemCfg->u32FrameBufSize;
299*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32BitstreamBufVAddr= pStMemCfg->u32BitstreamBufVAddr;
300*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32BitstreamBufAddr = (MS_U32) pStMemCfg->u32BitstreamBufAddr ;
301*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32BitstreamBufSize = pStMemCfg->u32BitstreamBufSize ;
302*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32DrvProcessBufVAddr = pStMemCfg->u32DrvProcessBufVAddr;
303*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32DrvProcessBufAddr = (MS_U32) pStMemCfg->u32DrvProcessBufAddr;
304*53ee8cc1Swenshuai.xi     gHVDCtrl.MemMap.u32DrvProcessBufSize = pStMemCfg->u32DrvProcessBufSize;
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi     HVD_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",
307*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32MIU1BaseAddr,
308*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.eFWSourceType,
309*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32FWBinaryVAddr,
310*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32FWBinaryAddr,
311*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32FWBinarySize,
312*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32VLCBinaryVAddr,
313*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32VLCBinaryAddr,
314*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32VLCBinarySize,
315*53ee8cc1Swenshuai.xi                  pStMemCfg->u32CodeBufVAddr,
316*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32CodeBufAddr,
317*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32CodeBufSize,
318*53ee8cc1Swenshuai.xi                  pStMemCfg->u32FrameBufVAddr,
319*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32FrameBufAddr,
320*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32FrameBufSize,
321*53ee8cc1Swenshuai.xi                  pStMemCfg->u32BitstreamBufVAddr,
322*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32BitstreamBufAddr,
323*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32BitstreamBufSize,
324*53ee8cc1Swenshuai.xi                  pStMemCfg->u32DrvProcessBufVAddr,
325*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32DrvProcessBufAddr,
326*53ee8cc1Swenshuai.xi                  gHVDCtrl.MemMap.u32DrvProcessBufSize);
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi     gHVDCtrl.InitParams.u16DecoderClock = HAL_HVD_GetCorretClock(pStInitParams->u16DecoderClock);
329*53ee8cc1Swenshuai.xi     {
330*53ee8cc1Swenshuai.xi         MS_U32 offset = HAL_HVD_GetData(E_HVD_GDATA_FW_DUMMY_WRITE_ADDR);
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi         if (offset != 0)
333*53ee8cc1Swenshuai.xi         {
334*53ee8cc1Swenshuai.xi             gHVDCtrl.u32DummyWriteBuf = gHVDCtrl.MemMap.u32CodeBufVAddr + offset;
335*53ee8cc1Swenshuai.xi         }
336*53ee8cc1Swenshuai.xi     }
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi 
339*53ee8cc1Swenshuai.xi     MS_U32 i;
340*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.u8ParsingStatus = 0xff;
341*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.bBufMiu1[0] = gHVDCtrl.CloseCaptionInfo.bBufMiu1[1] = FALSE;
342*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.b708Enable = FALSE;
343*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.u32FWUsrDataRIdx = gHVDCtrl.CloseCaptionInfo.u32FWUsrDataWIdx = 0;
344*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.u32PktLen708 = 0;
345*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.u32PktHdrAddr708 = 0;
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi     for (i=0;i<2;i++)
349*53ee8cc1Swenshuai.xi     {
350*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.u32RingBufStartPAddr[i] = 0;
351*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.u32RingBufLen[i] = 0;
352*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.u32RingBufVacancy[i] = 0;
353*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.u32RingBufRPAddr[i] = 0;
354*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.u32RingBufWPAddr[i] = 0;
355*53ee8cc1Swenshuai.xi         gHVDCtrl.CloseCaptionInfo.bOverFlow[i] = FALSE;
356*53ee8cc1Swenshuai.xi     }
357*53ee8cc1Swenshuai.xi     gHVDCtrl.CloseCaptionInfo.b608InfoEnhance = FALSE;
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi 
360*53ee8cc1Swenshuai.xi #if HVD_ENABLE_STOP_ACCESS_OVER_256
361*53ee8cc1Swenshuai.xi     gHVDCtrl.bCannotAccessMIU256 = TRUE;
362*53ee8cc1Swenshuai.xi #endif
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi     gHVDCtrl.bAutoRmLastZeroByte = TRUE;
365*53ee8cc1Swenshuai.xi     gHVDCtrl.u32CmdTimeout = HVD_FW_CMD_TIMEOUT_DEFAULT;
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi     if (pStInitParams->u8TurboInit & E_HVD_TURBOINIT_FW_RELOAD)
368*53ee8cc1Swenshuai.xi     {
369*53ee8cc1Swenshuai.xi         gHVDCtrl.bTurboFWMode = TRUE;
370*53ee8cc1Swenshuai.xi     }
371*53ee8cc1Swenshuai.xi 
372*53ee8cc1Swenshuai.xi     HAL_HVD_SetMiuBurstLevel(E_HVD_BURST_CNT_DISABLE);
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi     return E_HVD_OK;
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi 
_DRV_HVD_Check_Cmd(HVD_Check_Cmd eCmd)377*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Check_Cmd(HVD_Check_Cmd eCmd)
378*53ee8cc1Swenshuai.xi {
379*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp0 = 0;
380*53ee8cc1Swenshuai.xi     MS_U32 u32Tmp1 = 0;
381*53ee8cc1Swenshuai.xi 
382*53ee8cc1Swenshuai.xi     switch (eCmd)
383*53ee8cc1Swenshuai.xi     {
384*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_INIT:
385*53ee8cc1Swenshuai.xi         {
386*53ee8cc1Swenshuai.xi             if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK))
387*53ee8cc1Swenshuai.xi             {
388*53ee8cc1Swenshuai.xi                 // Check mode
389*53ee8cc1Swenshuai.xi                 u32Tmp0 = gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK;
390*53ee8cc1Swenshuai.xi 
391*53ee8cc1Swenshuai.xi                 if (!MDrv_HVD_GetCaps((HVD_Codec) u32Tmp0))
392*53ee8cc1Swenshuai.xi                 {
393*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("Check Cmd Err: Init: HW not support type:%d\n", eCmd);
394*53ee8cc1Swenshuai.xi                     return E_HVD_RET_UNSUPPORTED;
395*53ee8cc1Swenshuai.xi                 }
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi                 u32Tmp0 = gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi                 if (u32Tmp0 == HVD_INIT_MAIN_LIVE_STREAM)
400*53ee8cc1Swenshuai.xi                 {
401*53ee8cc1Swenshuai.xi                     if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_DRV)
402*53ee8cc1Swenshuai.xi                     {
403*53ee8cc1Swenshuai.xi                         HVD_MSG_ERR("Check Cmd Err: Init: Live stream mode can not use Drv input\n");
404*53ee8cc1Swenshuai.xi                         return E_HVD_RET_INVALID_PARAMETER;
405*53ee8cc1Swenshuai.xi                     }
406*53ee8cc1Swenshuai.xi                     if(!(gHVDCtrl.InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
407*53ee8cc1Swenshuai.xi                     {
408*53ee8cc1Swenshuai.xi                         // need not to check this under debug mode
409*53ee8cc1Swenshuai.xi                         if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK) == HVD_INIT_START_CODE_REMOVED)
410*53ee8cc1Swenshuai.xi                         {
411*53ee8cc1Swenshuai.xi                             HVD_MSG_ERR("Check Cmd Err: Init: Live stream mode must have start code\n");
412*53ee8cc1Swenshuai.xi                             return E_HVD_RET_INVALID_PARAMETER;
413*53ee8cc1Swenshuai.xi                         }
414*53ee8cc1Swenshuai.xi                         if (gHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON)
415*53ee8cc1Swenshuai.xi                         {
416*53ee8cc1Swenshuai.xi                             HVD_MSG_ERR("Check Cmd Err: Init: Live stream mode can not use none ATS sync mode\n");
417*53ee8cc1Swenshuai.xi                             return E_HVD_RET_INVALID_PARAMETER;
418*53ee8cc1Swenshuai.xi                         }
419*53ee8cc1Swenshuai.xi                     }
420*53ee8cc1Swenshuai.xi                 }
421*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 == HVD_INIT_MAIN_FILE_RAW)
422*53ee8cc1Swenshuai.xi                       || (u32Tmp0 == HVD_INIT_MAIN_FILE_TS))
423*53ee8cc1Swenshuai.xi                 {
424*53ee8cc1Swenshuai.xi                     if (!(gHVDCtrl.InitParams.u32ModeFlag & (HVD_INIT_UTOPIA_ENVI | HVD_INIT_DBG_FW)))
425*53ee8cc1Swenshuai.xi                     {
426*53ee8cc1Swenshuai.xi                         if((gHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_DTS)
427*53ee8cc1Swenshuai.xi                          && (gHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_STS)
428*53ee8cc1Swenshuai.xi                         && (gHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_PTS)
429*53ee8cc1Swenshuai.xi                         && (gHVDCtrl.InitParams.u8SyncType != E_HVD_SYNC_TBL_TYPE_NON))
430*53ee8cc1Swenshuai.xi                         {
431*53ee8cc1Swenshuai.xi                             HVD_MSG_ERR("Check Cmd Err: Init: sync mode is not set. use default value:%d\n",
432*53ee8cc1Swenshuai.xi                                         (MS_U16)E_HVD_SYNC_TBL_TYPE_PTS);
433*53ee8cc1Swenshuai.xi                             gHVDCtrl.InitParams.u8SyncType = E_HVD_SYNC_TBL_TYPE_PTS;
434*53ee8cc1Swenshuai.xi                         }
435*53ee8cc1Swenshuai.xi                     }
436*53ee8cc1Swenshuai.xi                 }
437*53ee8cc1Swenshuai.xi #if 0 //Fix coverity of u32Tmp0 compare
438*53ee8cc1Swenshuai.xi                 else if ((u32Tmp0 != HVD_INIT_MAIN_FILE_RAW)
439*53ee8cc1Swenshuai.xi                       && (u32Tmp0 != HVD_INIT_MAIN_FILE_TS))
440*53ee8cc1Swenshuai.xi #else
441*53ee8cc1Swenshuai.xi                 else
442*53ee8cc1Swenshuai.xi #endif
443*53ee8cc1Swenshuai.xi                 {
444*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("Check Cmd Err: Init: main type can not be recognized:%ld\n", u32Tmp0);
445*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
446*53ee8cc1Swenshuai.xi                 }
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi                 // check memory map
449*53ee8cc1Swenshuai.xi                 if (gHVDCtrl.MemMap.u32MIU1BaseAddr == 0)
450*53ee8cc1Swenshuai.xi                 {
451*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("Check Cmd Err: Init: MIU 1 Base addr should not be zero\n");
452*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
453*53ee8cc1Swenshuai.xi                 }
454*53ee8cc1Swenshuai.xi 
455*53ee8cc1Swenshuai.xi                 if ((gHVDCtrl.MemMap.u32CodeBufAddr & 0x7FF) != 0)
456*53ee8cc1Swenshuai.xi                 {
457*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("Check Cmd Err: Init: Error HVD code address(0x%lx) must 2048 byte alignment\n",
458*53ee8cc1Swenshuai.xi                                 gHVDCtrl.MemMap.u32CodeBufAddr);
459*53ee8cc1Swenshuai.xi                     return E_HVD_RET_INVALID_PARAMETER;
460*53ee8cc1Swenshuai.xi                 }
461*53ee8cc1Swenshuai.xi             }
462*53ee8cc1Swenshuai.xi 
463*53ee8cc1Swenshuai.xi             u32Tmp0 = gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
464*53ee8cc1Swenshuai.xi             u32Tmp1 = gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK;
465*53ee8cc1Swenshuai.xi 
466*53ee8cc1Swenshuai.xi             if (u32Tmp0 != HVD_INIT_MAIN_LIVE_STREAM)
467*53ee8cc1Swenshuai.xi             {
468*53ee8cc1Swenshuai.xi                 if (u32Tmp1 == HVD_INIT_INPUT_DRV)
469*53ee8cc1Swenshuai.xi                 {
470*53ee8cc1Swenshuai.xi                     // check if driver process buffer is in bitstream buffer.
471*53ee8cc1Swenshuai.xi                     MS_U32 tmpAddr = gHVDCtrl.MemMap.u32DrvProcessBufAddr;
472*53ee8cc1Swenshuai.xi                     if (gHVDCtrl.MemMap.u32DrvProcessBufAddr == 0)
473*53ee8cc1Swenshuai.xi                     {
474*53ee8cc1Swenshuai.xi                         HVD_MSG_ERR("Check Cmd Err: Init: Drv process buffer address should not be zero\n");
475*53ee8cc1Swenshuai.xi                         gHVDCtrl.bNoDrvProccBuf = TRUE;
476*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
477*53ee8cc1Swenshuai.xi                     }
478*53ee8cc1Swenshuai.xi                     if ((gHVDCtrl.MemMap.u32BitstreamBufAddr > tmpAddr)
479*53ee8cc1Swenshuai.xi                     || (tmpAddr > (gHVDCtrl.MemMap.u32BitstreamBufAddr+gHVDCtrl.MemMap.u32BitstreamBufSize)))
480*53ee8cc1Swenshuai.xi                     {
481*53ee8cc1Swenshuai.xi                         HVD_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");
482*53ee8cc1Swenshuai.xi                         gHVDCtrl.bNoDrvProccBuf = TRUE;
483*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
484*53ee8cc1Swenshuai.xi                     }
485*53ee8cc1Swenshuai.xi                     if (gHVDCtrl.MemMap.u32DrvProcessBufSize
486*53ee8cc1Swenshuai.xi                     < (HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<3) + 8))
487*53ee8cc1Swenshuai.xi                     {
488*53ee8cc1Swenshuai.xi                         HVD_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",
489*53ee8cc1Swenshuai.xi                                     gHVDCtrl.MemMap.u32DrvProcessBufSize,
490*53ee8cc1Swenshuai.xi                                     (MS_U32)(HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB)<<3) + 8) );
491*53ee8cc1Swenshuai.xi                         gHVDCtrl.bNoDrvProccBuf = TRUE;
492*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_OUTOF_MEMORY;
493*53ee8cc1Swenshuai.xi                     }
494*53ee8cc1Swenshuai.xi                     if (gHVDCtrl.MemMap.u32DrvProcessBufSize > 1)
495*53ee8cc1Swenshuai.xi                     {
496*53ee8cc1Swenshuai.xi                         tmpAddr = gHVDCtrl.MemMap.u32DrvProcessBufAddr + gHVDCtrl.MemMap.u32DrvProcessBufSize - 1;
497*53ee8cc1Swenshuai.xi                     }
498*53ee8cc1Swenshuai.xi                     else
499*53ee8cc1Swenshuai.xi                     {
500*53ee8cc1Swenshuai.xi                         tmpAddr = gHVDCtrl.MemMap.u32DrvProcessBufAddr;
501*53ee8cc1Swenshuai.xi                     }
502*53ee8cc1Swenshuai.xi                     if ((gHVDCtrl.MemMap.u32BitstreamBufAddr > tmpAddr)
503*53ee8cc1Swenshuai.xi                     || (tmpAddr > (gHVDCtrl.MemMap.u32BitstreamBufAddr + gHVDCtrl.MemMap.u32BitstreamBufSize)))
504*53ee8cc1Swenshuai.xi                     {
505*53ee8cc1Swenshuai.xi                         HVD_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");
506*53ee8cc1Swenshuai.xi                         gHVDCtrl.bNoDrvProccBuf = TRUE;
507*53ee8cc1Swenshuai.xi                         //return E_HVD_RET_INVALID_PARAMETER;
508*53ee8cc1Swenshuai.xi                     }
509*53ee8cc1Swenshuai.xi                 }
510*53ee8cc1Swenshuai.xi                 else
511*53ee8cc1Swenshuai.xi                 {
512*53ee8cc1Swenshuai.xi                     ;// TODO: check if the TSP MIU sel is the same with the MIU lacation of process buffer.
513*53ee8cc1Swenshuai.xi                 }
514*53ee8cc1Swenshuai.xi             }
515*53ee8cc1Swenshuai.xi             break;
516*53ee8cc1Swenshuai.xi         }
517*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_SEEK2PTS:
518*53ee8cc1Swenshuai.xi         case E_HVD_CHECK_CMD_TRIGGER_DISP:
519*53ee8cc1Swenshuai.xi #if 0
520*53ee8cc1Swenshuai.xi if( MDrv_HVD_GetPlayMode( E_HVD_GMODE_IS_SYNC_ON )  )
521*53ee8cc1Swenshuai.xi {
522*53ee8cc1Swenshuai.xi     HVD_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 ) );
523*53ee8cc1Swenshuai.xi     return E_HVD_RET_ILLEGAL_ACCESS;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi #endif
526*53ee8cc1Swenshuai.xi             break;
527*53ee8cc1Swenshuai.xi         default:
528*53ee8cc1Swenshuai.xi             return E_HVD_OK;
529*53ee8cc1Swenshuai.xi     }
530*53ee8cc1Swenshuai.xi     return E_HVD_OK;
531*53ee8cc1Swenshuai.xi }
532*53ee8cc1Swenshuai.xi 
_DRV_HVD_InitShareMem(void)533*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_InitShareMem(void)
534*53ee8cc1Swenshuai.xi {
535*53ee8cc1Swenshuai.xi     return (HVD_Result) HAL_HVD_InitShareMem();
536*53ee8cc1Swenshuai.xi }
537*53ee8cc1Swenshuai.xi 
_DRV_HVD_GetFrmPckSEIStPtr(void)538*53ee8cc1Swenshuai.xi static HVD_Frame_packing_SEI * _DRV_HVD_GetFrmPckSEIStPtr(void)
539*53ee8cc1Swenshuai.xi {
540*53ee8cc1Swenshuai.xi     MS_U32 u32FPAFrameAddr = 0;
541*53ee8cc1Swenshuai.xi     u32FPAFrameAddr = HAL_HVD_GetData(E_HVD_GDATA_FRM_PACKING_SEI_DATA);
542*53ee8cc1Swenshuai.xi     u32FPAFrameAddr += gHVDCtrl.MemMap.u32CodeBufVAddr; // change to virtual address
543*53ee8cc1Swenshuai.xi     return (HVD_Frame_packing_SEI*)u32FPAFrameAddr;
544*53ee8cc1Swenshuai.xi }
545*53ee8cc1Swenshuai.xi 
_DRV_HVD_InitRegCPU(void)546*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_InitRegCPU(void)
547*53ee8cc1Swenshuai.xi {
548*53ee8cc1Swenshuai.xi     // check MIU select
549*53ee8cc1Swenshuai.xi     if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK))
550*53ee8cc1Swenshuai.xi     {
551*53ee8cc1Swenshuai.xi         HAL_HVD_CheckMIUSel(gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_UTOPIA_ENVI);
552*53ee8cc1Swenshuai.xi     }
553*53ee8cc1Swenshuai.xi 
554*53ee8cc1Swenshuai.xi     return (HVD_Result) HAL_HVD_InitRegCPU();
555*53ee8cc1Swenshuai.xi }
556*53ee8cc1Swenshuai.xi 
_DRV_HVD_RstVariables(void)557*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_RstVariables(void)
558*53ee8cc1Swenshuai.xi {
559*53ee8cc1Swenshuai.xi     MS_BOOL bBitMIU1 = FALSE;
560*53ee8cc1Swenshuai.xi     MS_BOOL bCodeMIU1 = FALSE;
561*53ee8cc1Swenshuai.xi     // Init control flg
562*53ee8cc1Swenshuai.xi     gHVDCtrl.u32CtrlMode=0;
563*53ee8cc1Swenshuai.xi     if( gHVDCtrl.MemMap.u32CodeBufAddr >= gHVDCtrl.MemMap.u32MIU1BaseAddr  )
564*53ee8cc1Swenshuai.xi     {
565*53ee8cc1Swenshuai.xi         //gHVDCtrl.MemMap.u32CodeBufAddr-=gHVDCtrl.MemMap.u32MIU1BaseAddr;
566*53ee8cc1Swenshuai.xi         //gHVDCtrl.MemMap.u32FrameBufAddr-=gHVDCtrl.MemMap.u32MIU1BaseAddr;
567*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= HVD_CTRL_CODE_MIU_1;
568*53ee8cc1Swenshuai.xi         bCodeMIU1=TRUE;
569*53ee8cc1Swenshuai.xi     }
570*53ee8cc1Swenshuai.xi     if( gHVDCtrl.MemMap.u32BitstreamBufAddr >= gHVDCtrl.MemMap.u32MIU1BaseAddr  )
571*53ee8cc1Swenshuai.xi     {
572*53ee8cc1Swenshuai.xi         //gHVDCtrl.MemMap.u32BitstreamBufAddr-=gHVDCtrl.MemMap.u32MIU1BaseAddr;
573*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= HVD_CTRL_ES_MIU_1;
574*53ee8cc1Swenshuai.xi         bBitMIU1=TRUE;
575*53ee8cc1Swenshuai.xi     }
576*53ee8cc1Swenshuai.xi     if( gHVDCtrl.MemMap.u32FrameBufAddr>= gHVDCtrl.MemMap.u32MIU1BaseAddr  )
577*53ee8cc1Swenshuai.xi     {
578*53ee8cc1Swenshuai.xi         //gHVDCtrl.MemMap.u32BitstreamBufAddr-=gHVDCtrl.MemMap.u32MIU1BaseAddr;
579*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= HVD_CTRL_FRM_MIU_1;
580*53ee8cc1Swenshuai.xi     }
581*53ee8cc1Swenshuai.xi     if( gHVDCtrl.MemMap.u32DrvProcessBufAddr>= gHVDCtrl.MemMap.u32MIU1BaseAddr  )
582*53ee8cc1Swenshuai.xi     {
583*53ee8cc1Swenshuai.xi         //gHVDCtrl.MemMap.u32BitstreamBufAddr-=gHVDCtrl.MemMap.u32MIU1BaseAddr;
584*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode |= HVD_CTRL_DRVPROCC_MIU_1;
585*53ee8cc1Swenshuai.xi     }
586*53ee8cc1Swenshuai.xi 
587*53ee8cc1Swenshuai.xi     if(!gHVDCtrl.bNoDrvProccBuf)
588*53ee8cc1Swenshuai.xi     {
589*53ee8cc1Swenshuai.xi         // init nal table buffer start address.
590*53ee8cc1Swenshuai.xi         if( ( gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
591*53ee8cc1Swenshuai.xi         {
592*53ee8cc1Swenshuai.xi             if( bBitMIU1 != bCodeMIU1 )
593*53ee8cc1Swenshuai.xi             {
594*53ee8cc1Swenshuai.xi                 if( gHVDCtrl.MemMap.u32DrvProcessBufSize>
595*53ee8cc1Swenshuai.xi                     ( HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) <<3) + 8))
596*53ee8cc1Swenshuai.xi                 {
597*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32BBUTblInBitstreamBufAddr = HVD_BBU_ST_ADDR_IN_BITSTREAMBUF;
598*53ee8cc1Swenshuai.xi                     if( (( gHVDCtrl.u32BBUTblInBitstreamBufAddr + gHVDCtrl.MemMap.u32DrvProcessBufAddr) % 8) != 0)
599*53ee8cc1Swenshuai.xi                     {
600*53ee8cc1Swenshuai.xi                         gHVDCtrl.u32BBUTblInBitstreamBufAddr = gHVDCtrl.u32BBUTblInBitstreamBufAddr + gHVDCtrl.MemMap.u32DrvProcessBufAddr + 7;
601*53ee8cc1Swenshuai.xi                         gHVDCtrl.u32BBUTblInBitstreamBufAddr -= (gHVDCtrl.u32BBUTblInBitstreamBufAddr ) % 8;
602*53ee8cc1Swenshuai.xi                         gHVDCtrl.u32BBUTblInBitstreamBufAddr -= gHVDCtrl.MemMap.u32DrvProcessBufAddr;
603*53ee8cc1Swenshuai.xi                         HVD_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  , gHVDCtrl.u32BBUTblInBitstreamBufAddr  );
604*53ee8cc1Swenshuai.xi                     }
605*53ee8cc1Swenshuai.xi                 }
606*53ee8cc1Swenshuai.xi                 else
607*53ee8cc1Swenshuai.xi                 {
608*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR( "HVD Err: Driver process buffer size is not enough for driver input path. input:%lx required:%lx" ,  (MS_U32)gHVDCtrl.MemMap.u32DrvProcessBufSize  , ( HVD_BBU_ST_ADDR_IN_BITSTREAMBUF + (HAL_HVD_GetData(E_HVD_GDATA_FW_BBU_TBL_ENTRY_NUMB) <<3) + 8)  );
609*53ee8cc1Swenshuai.xi                     return E_HVD_RET_OUTOF_MEMORY;
610*53ee8cc1Swenshuai.xi                 }
611*53ee8cc1Swenshuai.xi             }
612*53ee8cc1Swenshuai.xi         }
613*53ee8cc1Swenshuai.xi 
614*53ee8cc1Swenshuai.xi         // init AVI NULL packet pattern && RM flush pattern
615*53ee8cc1Swenshuai.xi         if( ( gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
616*53ee8cc1Swenshuai.xi         {
617*53ee8cc1Swenshuai.xi             MS_U8 *pNULLPattern=NULL;
618*53ee8cc1Swenshuai.xi             gHVDCtrl.u32NULLPacketAddr = gHVDCtrl.MemMap.u32DrvProcessBufAddr;
619*53ee8cc1Swenshuai.xi 
620*53ee8cc1Swenshuai.xi             // TODO: use other non-cachable VA addr
621*53ee8cc1Swenshuai.xi             pNULLPattern=(MS_U8 *)(((MS_U32)gHVDCtrl.MemMap.u32CodeBufVAddr)  );
622*53ee8cc1Swenshuai.xi             HVD_memset( (void*)pNULLPattern, 0 , 12 );
623*53ee8cc1Swenshuai.xi             switch( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) )
624*53ee8cc1Swenshuai.xi             {
625*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
626*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
627*53ee8cc1Swenshuai.xi                 if(  gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_START_CODE_MASK )
628*53ee8cc1Swenshuai.xi                 {   // start code removed
629*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32NULLPacketSize = 8;
630*53ee8cc1Swenshuai.xi                     if( gHVDCtrl.MemMap.u32DrvProcessBufSize < gHVDCtrl.u32NULLPacketSize )
631*53ee8cc1Swenshuai.xi                     {
632*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
633*53ee8cc1Swenshuai.xi                     }
634*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xAA , gHVDCtrl.u32NULLPacketSize);
635*53ee8cc1Swenshuai.xi                     pNULLPattern[4] = 0X55;
636*53ee8cc1Swenshuai.xi                 }
637*53ee8cc1Swenshuai.xi                 else // start code remained
638*53ee8cc1Swenshuai.xi                 {
639*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32NULLPacketSize = 12;
640*53ee8cc1Swenshuai.xi                     if( gHVDCtrl.MemMap.u32DrvProcessBufSize < gHVDCtrl.u32NULLPacketSize )
641*53ee8cc1Swenshuai.xi                     {
642*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
643*53ee8cc1Swenshuai.xi                     }
644*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xAA , gHVDCtrl.u32NULLPacketSize);
645*53ee8cc1Swenshuai.xi                     pNULLPattern[0] = 0;
646*53ee8cc1Swenshuai.xi                     pNULLPattern[1] = 0;
647*53ee8cc1Swenshuai.xi                     pNULLPattern[2] = 1;
648*53ee8cc1Swenshuai.xi                     pNULLPattern[3] = 0xFF;
649*53ee8cc1Swenshuai.xi                     pNULLPattern[8] = 0X55;
650*53ee8cc1Swenshuai.xi                     //pNULLPattern[gHVDCtrl.u32NULLPacketSize-1] = 0x80;
651*53ee8cc1Swenshuai.xi                 }
652*53ee8cc1Swenshuai.xi 
653*53ee8cc1Swenshuai.xi                 if( bBitMIU1 != bCodeMIU1  )
654*53ee8cc1Swenshuai.xi                 {
655*53ee8cc1Swenshuai.xi                     #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
656*53ee8cc1Swenshuai.xi                     HAL_HVD_FlushMemory();
657*53ee8cc1Swenshuai.xi                     HVD_dmacpy(  gHVDCtrl.MemMap.u32DrvProcessBufAddr ,  gHVDCtrl.MemMap.u32CodeBufAddr ,  gHVDCtrl.u32NULLPacketSize);
658*53ee8cc1Swenshuai.xi                     #else
659*53ee8cc1Swenshuai.xi                     HVD_memcpy((void*)(gHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gHVDCtrl.u32NULLPacketSize);
660*53ee8cc1Swenshuai.xi                     HAL_HVD_FlushMemory();
661*53ee8cc1Swenshuai.xi                     #endif
662*53ee8cc1Swenshuai.xi                 }
663*53ee8cc1Swenshuai.xi                 else
664*53ee8cc1Swenshuai.xi                 {
665*53ee8cc1Swenshuai.xi                     HVD_memcpy((void*)(gHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gHVDCtrl.u32NULLPacketSize);
666*53ee8cc1Swenshuai.xi                     HAL_HVD_FlushMemory();
667*53ee8cc1Swenshuai.xi                 }
668*53ee8cc1Swenshuai.xi 
669*53ee8cc1Swenshuai.xi                 break;
670*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
671*53ee8cc1Swenshuai.xi                 // RM has no NULL packet
672*53ee8cc1Swenshuai.xi                 gHVDCtrl.u32NULLPacketSize = 0;
673*53ee8cc1Swenshuai.xi                 gHVDCtrl.u32NULLPacketAddr =0;
674*53ee8cc1Swenshuai.xi                 #if HVD_ENABLE_RV_FEATURE
675*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32RV_FlushPacketAddr = gHVDCtrl.MemMap.u32DrvProcessBufAddr;
676*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32RV_FlushPacketSize = 8;
677*53ee8cc1Swenshuai.xi                     if( gHVDCtrl.MemMap.u32DrvProcessBufSize < gHVDCtrl.u32RV_FlushPacketSize )
678*53ee8cc1Swenshuai.xi                     {
679*53ee8cc1Swenshuai.xi                         return E_HVD_RET_OUTOF_MEMORY;
680*53ee8cc1Swenshuai.xi                     }
681*53ee8cc1Swenshuai.xi                     HVD_memset( (void*)pNULLPattern, 0xFF , gHVDCtrl.u32RV_FlushPacketSize);
682*53ee8cc1Swenshuai.xi                     {
683*53ee8cc1Swenshuai.xi                     #if HVD_ENABLE_BDMA_2_BITSTREAMBUF
684*53ee8cc1Swenshuai.xi                         HAL_HVD_FlushMemory();
685*53ee8cc1Swenshuai.xi                         HVD_dmacpy(  gHVDCtrl.MemMap.u32DrvProcessBufAddr ,  gHVDCtrl.MemMap.u32CodeBufAddr ,  gHVDCtrl.u32RV_FlushPacketSize);
686*53ee8cc1Swenshuai.xi                     #else
687*53ee8cc1Swenshuai.xi                         HVD_memcpy((void*)(gHVDCtrl.MemMap.u32DrvProcessBufVAddr), pNULLPattern, gHVDCtrl.u32RV_FlushPacketSize);
688*53ee8cc1Swenshuai.xi                         HAL_HVD_FlushMemory();
689*53ee8cc1Swenshuai.xi                     #endif
690*53ee8cc1Swenshuai.xi                     }
691*53ee8cc1Swenshuai.xi                 #endif
692*53ee8cc1Swenshuai.xi                 break;
693*53ee8cc1Swenshuai.xi 
694*53ee8cc1Swenshuai.xi 
695*53ee8cc1Swenshuai.xi             default:
696*53ee8cc1Swenshuai.xi                 gHVDCtrl.u32NULLPacketSize = 0;
697*53ee8cc1Swenshuai.xi                 gHVDCtrl.u32NULLPacketAddr =0;
698*53ee8cc1Swenshuai.xi                 break;
699*53ee8cc1Swenshuai.xi             }
700*53ee8cc1Swenshuai.xi         }
701*53ee8cc1Swenshuai.xi         else
702*53ee8cc1Swenshuai.xi         {
703*53ee8cc1Swenshuai.xi             gHVDCtrl.u32NULLPacketSize = 0;
704*53ee8cc1Swenshuai.xi             gHVDCtrl.u32NULLPacketAddr =0;
705*53ee8cc1Swenshuai.xi         }
706*53ee8cc1Swenshuai.xi     }
707*53ee8cc1Swenshuai.xi 
708*53ee8cc1Swenshuai.xi     // reset other driver control variables
709*53ee8cc1Swenshuai.xi     gHVDCtrl.u32StepDecodeCnt=0;
710*53ee8cc1Swenshuai.xi     gHVDCtrl.u32LastESRptr=0;
711*53ee8cc1Swenshuai.xi     gHVDCtrl.u32BBUPacketCnt=0;
712*53ee8cc1Swenshuai.xi     gHVDCtrl.u32BBUWptr_Fired=0;
713*53ee8cc1Swenshuai.xi     gHVDCtrl.u32LastErrCode=0;
714*53ee8cc1Swenshuai.xi     gHVDCtrl.bIsDispInfoChg=0;
715*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&(gHVDCtrl.LastNal) ,  0   , sizeof(HVD_Nal_Entry)   );
716*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&(gHVDCtrl.LivingStatus) ,  0   , sizeof(HVD_Alive_Status)   );
717*53ee8cc1Swenshuai.xi 
718*53ee8cc1Swenshuai.xi     // Init HAL variables
719*53ee8cc1Swenshuai.xi     return (HVD_Result) HAL_HVD_InitVariables((MS_U32)(&gHVDCtrl));
720*53ee8cc1Swenshuai.xi }
721*53ee8cc1Swenshuai.xi 
722*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
723*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: _DRV_HVD_SetSyncMode()
724*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to sync video time stamp and STC.
725*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : sync type
726*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)
727*53ee8cc1Swenshuai.xi /// @return -The result of command set sync type
728*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
_DRV_HVD_SetSyncMode(HVD_Sync_Tbl_Type eMode)729*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_SetSyncMode(HVD_Sync_Tbl_Type eMode)
730*53ee8cc1Swenshuai.xi {
731*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_OK;
732*53ee8cc1Swenshuai.xi 
733*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
734*53ee8cc1Swenshuai.xi 
735*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_SYNC_TYPE, eMode);
736*53ee8cc1Swenshuai.xi 
737*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
738*53ee8cc1Swenshuai.xi }
739*53ee8cc1Swenshuai.xi 
_DRV_HVD_InitFW_AVC(void)740*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_InitFW_AVC(void)
741*53ee8cc1Swenshuai.xi {
742*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = gHVDCtrl.InitParams.u32ModeFlag;
743*53ee8cc1Swenshuai.xi 
744*53ee8cc1Swenshuai.xi     // common settings
745*53ee8cc1Swenshuai.xi     if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
746*53ee8cc1Swenshuai.xi     {
747*53ee8cc1Swenshuai.xi         _DRV_HVD_SetSyncMode((HVD_Sync_Tbl_Type) gHVDCtrl.InitParams.u8SyncType);
748*53ee8cc1Swenshuai.xi 
749*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.u8MinFrmGap)
750*53ee8cc1Swenshuai.xi         {
751*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_MIN_FRAME_GAP,
752*53ee8cc1Swenshuai.xi                            gHVDCtrl.InitParams.u8MinFrmGap);
753*53ee8cc1Swenshuai.xi         }
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.u32MaxDecTick)
756*53ee8cc1Swenshuai.xi         {
757*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_MAX_DEC_TICK,
758*53ee8cc1Swenshuai.xi                            gHVDCtrl.InitParams.u32MaxDecTick);
759*53ee8cc1Swenshuai.xi         }
760*53ee8cc1Swenshuai.xi 
761*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.u16Pitch)
762*53ee8cc1Swenshuai.xi         {
763*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_PITCH, gHVDCtrl.InitParams.u16Pitch);
764*53ee8cc1Swenshuai.xi         }
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.bSyncEachFrm)
767*53ee8cc1Swenshuai.xi         {
768*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_SYNC_EACH_FRM, TRUE);
769*53ee8cc1Swenshuai.xi         }
770*53ee8cc1Swenshuai.xi 
771*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.bFastDisplay)
772*53ee8cc1Swenshuai.xi         {
773*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_FAST_DISP, TRUE);
774*53ee8cc1Swenshuai.xi         }
775*53ee8cc1Swenshuai.xi 
776*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.bDynamicScaling)
777*53ee8cc1Swenshuai.xi         {
778*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DYNAMIC_SCALE, TRUE);
779*53ee8cc1Swenshuai.xi         }
780*53ee8cc1Swenshuai.xi 
781*53ee8cc1Swenshuai.xi         if (gHVDCtrl.InitParams.bUserData)
782*53ee8cc1Swenshuai.xi         {
783*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DPO_CC, TRUE);
784*53ee8cc1Swenshuai.xi         }
785*53ee8cc1Swenshuai.xi     }
786*53ee8cc1Swenshuai.xi 
787*53ee8cc1Swenshuai.xi     if (gHVDCtrl.InitParams.u8TimeUnit)
788*53ee8cc1Swenshuai.xi     {
789*53ee8cc1Swenshuai.xi         HAL_HVD_SetCmd(E_HVD_CMD_TIME_UNIT_TYPE,
790*53ee8cc1Swenshuai.xi                        gHVDCtrl.InitParams.u8TimeUnit);
791*53ee8cc1Swenshuai.xi     }
792*53ee8cc1Swenshuai.xi 
793*53ee8cc1Swenshuai.xi     // specific settings
794*53ee8cc1Swenshuai.xi     switch (u32InitMode & HVD_INIT_MAIN_MASK)
795*53ee8cc1Swenshuai.xi     {
796*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_RAW:
797*53ee8cc1Swenshuai.xi         {
798*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DIS_VDEAD, TRUE);
799*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, TRUE);
800*53ee8cc1Swenshuai.xi 			HAL_HVD_SetCmd(E_HVD_CMD_FORCE_RESET_HW, TRUE);
801*53ee8cc1Swenshuai.xi 
802*53ee8cc1Swenshuai.xi             if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
803*53ee8cc1Swenshuai.xi             {
804*53ee8cc1Swenshuai.xi                 HAL_HVD_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
805*53ee8cc1Swenshuai.xi             }
806*53ee8cc1Swenshuai.xi 
807*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_PARSER_BYPASS, TRUE);
808*53ee8cc1Swenshuai.xi 
809*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_PITCH , 1952 );
810*53ee8cc1Swenshuai.xi             // svd only
811*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_ES_FULL_STOP, TRUE);
812*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_BBU_RESIZE, 95);
813*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_PLAY , 0);
814*53ee8cc1Swenshuai.xi             break;
815*53ee8cc1Swenshuai.xi         }
816*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_FILE_TS:
817*53ee8cc1Swenshuai.xi         {
818*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DIS_VDEAD, TRUE);
819*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, TRUE);
820*53ee8cc1Swenshuai.xi 			HAL_HVD_SetCmd(E_HVD_CMD_FORCE_RESET_HW, TRUE);
821*53ee8cc1Swenshuai.xi 
822*53ee8cc1Swenshuai.xi             if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY))
823*53ee8cc1Swenshuai.xi             {
824*53ee8cc1Swenshuai.xi                 HAL_HVD_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, TRUE);
825*53ee8cc1Swenshuai.xi             }
826*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_PITCH , 1952 );
827*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_SYNC_EACH_FRM ,  TRUE );
828*53ee8cc1Swenshuai.xi             // svd ONLY
829*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_ES_FULL_STOP, TRUE);
830*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_AVOID_PTS_TBL_OVERFLOW, TRUE);
831*53ee8cc1Swenshuai.xi 
832*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_PLAY , 0);
833*53ee8cc1Swenshuai.xi             break;
834*53ee8cc1Swenshuai.xi         }
835*53ee8cc1Swenshuai.xi         case HVD_INIT_MAIN_LIVE_STREAM:
836*53ee8cc1Swenshuai.xi         {
837*53ee8cc1Swenshuai.xi 			HAL_HVD_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, TRUE);
838*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_FORCE_RESET_HW, TRUE);
839*53ee8cc1Swenshuai.xi 
840*53ee8cc1Swenshuai.xi             if (gHVDCtrl.InitParams.u8TimeUnit)
841*53ee8cc1Swenshuai.xi             {
842*53ee8cc1Swenshuai.xi                 HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY,
843*53ee8cc1Swenshuai.xi                                (MS_U32) HVD_DTV_VIDEO_DELAY);
844*53ee8cc1Swenshuai.xi             }
845*53ee8cc1Swenshuai.xi             else
846*53ee8cc1Swenshuai.xi             {
847*53ee8cc1Swenshuai.xi                 HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY,
848*53ee8cc1Swenshuai.xi                                (MS_U32) HVD_DTV_VIDEO_DELAY * 90);
849*53ee8cc1Swenshuai.xi             }
850*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_PITCH , 1984 );
851*53ee8cc1Swenshuai.xi             //HAL_HVD_SetCmd( E_HVD_CMD_MAX_DEC_TICK ,  6400000); //for GP only
852*53ee8cc1Swenshuai.xi             break;
853*53ee8cc1Swenshuai.xi         }
854*53ee8cc1Swenshuai.xi         default:
855*53ee8cc1Swenshuai.xi             break;
856*53ee8cc1Swenshuai.xi     }
857*53ee8cc1Swenshuai.xi 
858*53ee8cc1Swenshuai.xi     // svd only
859*53ee8cc1Swenshuai.xi     //HAL_HVD_SetCmd( E_HVD_CMD_FRAME_BUF_RESIZE , (gHVDCtrl.MemMap.u32BitstreamBufSize+gHVDCtrl.MemMap.u32CodeBufSize+gHVDCtrl.MemMap.u32FrameBufSize) >>20);
860*53ee8cc1Swenshuai.xi     return E_HVD_OK;
861*53ee8cc1Swenshuai.xi }
862*53ee8cc1Swenshuai.xi 
_DRV_HVD_InitFW_RM(void)863*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_InitFW_RM(void)
864*53ee8cc1Swenshuai.xi {
865*53ee8cc1Swenshuai.xi     MS_U32 u32InitMode = gHVDCtrl.InitParams.u32ModeFlag;
866*53ee8cc1Swenshuai.xi 
867*53ee8cc1Swenshuai.xi     // common settings
868*53ee8cc1Swenshuai.xi     if( !(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_DISPLAY)  )
869*53ee8cc1Swenshuai.xi     {
870*53ee8cc1Swenshuai.xi         _DRV_HVD_SetSyncMode( (HVD_Sync_Tbl_Type)gHVDCtrl.InitParams.u8SyncType);
871*53ee8cc1Swenshuai.xi         if( gHVDCtrl.InitParams.u16Pitch)
872*53ee8cc1Swenshuai.xi         {
873*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd( E_HVD_CMD_PITCH ,  gHVDCtrl.InitParams.u16Pitch);
874*53ee8cc1Swenshuai.xi         }
875*53ee8cc1Swenshuai.xi         if( gHVDCtrl.InitParams.bSyncEachFrm)
876*53ee8cc1Swenshuai.xi         {
877*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd( E_HVD_CMD_SYNC_EACH_FRM ,  TRUE);
878*53ee8cc1Swenshuai.xi         }
879*53ee8cc1Swenshuai.xi         if( gHVDCtrl.InitParams.bFastDisplay)
880*53ee8cc1Swenshuai.xi         {
881*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd( E_HVD_CMD_FAST_DISP ,  TRUE);
882*53ee8cc1Swenshuai.xi         }
883*53ee8cc1Swenshuai.xi         if( gHVDCtrl.InitParams.bDynamicScaling)
884*53ee8cc1Swenshuai.xi         {
885*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd( E_HVD_CMD_DYNAMIC_SCALE ,  TRUE);
886*53ee8cc1Swenshuai.xi         }
887*53ee8cc1Swenshuai.xi     }
888*53ee8cc1Swenshuai.xi     if( gHVDCtrl.InitParams.u8TimeUnit)
889*53ee8cc1Swenshuai.xi     {
890*53ee8cc1Swenshuai.xi         HAL_HVD_SetCmd( E_HVD_CMD_TIME_UNIT_TYPE ,  gHVDCtrl.InitParams.u8TimeUnit);
891*53ee8cc1Swenshuai.xi     }
892*53ee8cc1Swenshuai.xi     // specific settings
893*53ee8cc1Swenshuai.xi     switch( u32InitMode & HVD_INIT_MAIN_MASK )
894*53ee8cc1Swenshuai.xi     {
895*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_RAW:
896*53ee8cc1Swenshuai.xi         break;
897*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_TS:
898*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_LIVE_STREAM:
899*53ee8cc1Swenshuai.xi     default:
900*53ee8cc1Swenshuai.xi         break;
901*53ee8cc1Swenshuai.xi     }
902*53ee8cc1Swenshuai.xi 
903*53ee8cc1Swenshuai.xi     // svd only
904*53ee8cc1Swenshuai.xi     //HAL_HVD_SetCmd( E_HVD_CMD_FRAME_BUF_RESIZE , (gHVDCtrl.MemMap.u32BitstreamBufSize+gHVDCtrl.MemMap.u32CodeBufSize+gHVDCtrl.MemMap.u32FrameBufSize) >>20);
905*53ee8cc1Swenshuai.xi 
906*53ee8cc1Swenshuai.xi     // fix FFx4 display error
907*53ee8cc1Swenshuai.xi     HAL_HVD_SetCmd( E_HVD_CMD_FORCE_RESET_HW , TRUE );
908*53ee8cc1Swenshuai.xi 
909*53ee8cc1Swenshuai.xi     return E_HVD_OK;
910*53ee8cc1Swenshuai.xi }
911*53ee8cc1Swenshuai.xi 
_DRV_HVD_Check_FW_Version(void)912*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Check_FW_Version(void)
913*53ee8cc1Swenshuai.xi {
914*53ee8cc1Swenshuai.xi     // check FW version ID
915*53ee8cc1Swenshuai.xi     if (!(gHVDCtrl.InitParams.u8TurboInit & E_HVD_TURBOINIT_CHECK))
916*53ee8cc1Swenshuai.xi     {
917*53ee8cc1Swenshuai.xi #if (HVD_HW_VERSION == HVD_HW_SVD)
918*53ee8cc1Swenshuai.xi         if (HVD_FW_VERSION != HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID))
919*53ee8cc1Swenshuai.xi         {
920*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD: fw interface and binary is not the same. fw ID: interface:%lx binary:%lx\n",
921*53ee8cc1Swenshuai.xi                         (MS_U32)HVD_FW_VERSION,
922*53ee8cc1Swenshuai.xi                         HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID));
923*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
924*53ee8cc1Swenshuai.xi         }
925*53ee8cc1Swenshuai.xi         // check if release required
926*53ee8cc1Swenshuai.xi         if (!(gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_DBG_FW))
927*53ee8cc1Swenshuai.xi         {
928*53ee8cc1Swenshuai.xi             // check debug version
929*53ee8cc1Swenshuai.xi             if ((HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_RELEASE_VERSION_MASK) < HVD_FW_VER_RELEASE_VERSION)
930*53ee8cc1Swenshuai.xi             {
931*53ee8cc1Swenshuai.xi                 HVD_MSG_MUST("HVD: FW is not release verion: binary:%lx\n",
932*53ee8cc1Swenshuai.xi                              HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID));
933*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
934*53ee8cc1Swenshuai.xi             }
935*53ee8cc1Swenshuai.xi         }
936*53ee8cc1Swenshuai.xi #else
937*53ee8cc1Swenshuai.xi 
938*53ee8cc1Swenshuai.xi         if( (HVD_FW_IF_VERSION>>16) != (HAL_HVD_GetData(E_HVD_GDATA_FW_IF_VERSION_ID)>>16) )
939*53ee8cc1Swenshuai.xi         {
940*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD: fw interface and binary is not the same. fw ID: interface:%lx binary:%lx\n",
941*53ee8cc1Swenshuai.xi                         (MS_U32)HVD_FW_IF_VERSION,
942*53ee8cc1Swenshuai.xi                         HAL_HVD_GetData(E_HVD_GDATA_FW_IF_VERSION_ID));
943*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
944*53ee8cc1Swenshuai.xi         }
945*53ee8cc1Swenshuai.xi 
946*53ee8cc1Swenshuai.xi         // check if release required
947*53ee8cc1Swenshuai.xi         if (!(gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_DBG_FW))
948*53ee8cc1Swenshuai.xi         {
949*53ee8cc1Swenshuai.xi             // check debug version
950*53ee8cc1Swenshuai.xi             if (!(HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_RELEASE_VERSION))
951*53ee8cc1Swenshuai.xi             {
952*53ee8cc1Swenshuai.xi                 HVD_MSG_MUST("HVD: FW is not release verion: binary:%lx\n",
953*53ee8cc1Swenshuai.xi                              HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID));
954*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
955*53ee8cc1Swenshuai.xi             }
956*53ee8cc1Swenshuai.xi 
957*53ee8cc1Swenshuai.xi             if (HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID) & HVD_FW_VER_DUMP_DEBUG_MSG)
958*53ee8cc1Swenshuai.xi             {
959*53ee8cc1Swenshuai.xi                 HVD_MSG_MUST("HVD: FW release verion, but it has debug message. binary:%lx\n",
960*53ee8cc1Swenshuai.xi                              HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID));
961*53ee8cc1Swenshuai.xi                 //return E_HVD_FAIL;
962*53ee8cc1Swenshuai.xi             }
963*53ee8cc1Swenshuai.xi         }
964*53ee8cc1Swenshuai.xi #endif
965*53ee8cc1Swenshuai.xi     }
966*53ee8cc1Swenshuai.xi     return E_HVD_OK;
967*53ee8cc1Swenshuai.xi }
968*53ee8cc1Swenshuai.xi 
_DRV_HVD_InitFW(void)969*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_InitFW(void)
970*53ee8cc1Swenshuai.xi {
971*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_OK;
972*53ee8cc1Swenshuai.xi 
973*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_Check_FW_Version();
974*53ee8cc1Swenshuai.xi 
975*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_OK)
976*53ee8cc1Swenshuai.xi     {
977*53ee8cc1Swenshuai.xi         return eRet;
978*53ee8cc1Swenshuai.xi     }
979*53ee8cc1Swenshuai.xi 
980*53ee8cc1Swenshuai.xi     switch (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK)
981*53ee8cc1Swenshuai.xi     {
982*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVC:
983*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_InitFW_AVC();
984*53ee8cc1Swenshuai.xi             break;
985*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_AVS:
986*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_InitFW_AVC();
987*53ee8cc1Swenshuai.xi             break;
988*53ee8cc1Swenshuai.xi         case HVD_INIT_HW_RM:
989*53ee8cc1Swenshuai.xi             eRet = _DRV_HVD_InitFW_RM();
990*53ee8cc1Swenshuai.xi             break;
991*53ee8cc1Swenshuai.xi         default:
992*53ee8cc1Swenshuai.xi             break;
993*53ee8cc1Swenshuai.xi     }
994*53ee8cc1Swenshuai.xi 
995*53ee8cc1Swenshuai.xi     return eRet;
996*53ee8cc1Swenshuai.xi }
997*53ee8cc1Swenshuai.xi 
_DRV_HVD_IsAllBufferEmpty(void)998*53ee8cc1Swenshuai.xi static MS_BOOL _DRV_HVD_IsAllBufferEmpty(void)
999*53ee8cc1Swenshuai.xi {
1000*53ee8cc1Swenshuai.xi     MS_U32 u32PlaybackType = gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK;
1001*53ee8cc1Swenshuai.xi 
1002*53ee8cc1Swenshuai.xi     if (u32PlaybackType == HVD_INIT_MAIN_FILE_RAW)
1003*53ee8cc1Swenshuai.xi     {
1004*53ee8cc1Swenshuai.xi         if (HAL_HVD_GetData(E_HVD_GDATA_BBU_Q_NUMB) != 0)
1005*53ee8cc1Swenshuai.xi         {
1006*53ee8cc1Swenshuai.xi             return FALSE;
1007*53ee8cc1Swenshuai.xi         }
1008*53ee8cc1Swenshuai.xi     }
1009*53ee8cc1Swenshuai.xi     else //if( u32PlaybackType == HVD_INIT_MAIN_FILE_TS ) TSP input
1010*53ee8cc1Swenshuai.xi     {
1011*53ee8cc1Swenshuai.xi         #if 0
1012*53ee8cc1Swenshuai.xi         if( HAL_HVD_GetData( E_HVD_GDATA_ES_READ_PTR) != HAL_HVD_GetData( E_HVD_GDATA_ES_WRITE_PTR) )
1013*53ee8cc1Swenshuai.xi         {
1014*53ee8cc1Swenshuai.xi             return FALSE;
1015*53ee8cc1Swenshuai.xi         }
1016*53ee8cc1Swenshuai.xi         #endif
1017*53ee8cc1Swenshuai.xi     }
1018*53ee8cc1Swenshuai.xi 
1019*53ee8cc1Swenshuai.xi     // other Queues
1020*53ee8cc1Swenshuai.xi     if (((HAL_HVD_GetData(E_HVD_GDATA_DEC_Q_NUMB) == 0) && (HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_NUMB) == 0)) &&
1021*53ee8cc1Swenshuai.xi         (HAL_HVD_GetData(E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD))
1022*53ee8cc1Swenshuai.xi     {
1023*53ee8cc1Swenshuai.xi         return TRUE;
1024*53ee8cc1Swenshuai.xi     }
1025*53ee8cc1Swenshuai.xi     else
1026*53ee8cc1Swenshuai.xi     {
1027*53ee8cc1Swenshuai.xi         return FALSE;
1028*53ee8cc1Swenshuai.xi     }
1029*53ee8cc1Swenshuai.xi }
1030*53ee8cc1Swenshuai.xi 
1031*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
_DRV_HVD_ISRHandler(void)1032*53ee8cc1Swenshuai.xi static MS_S32 _DRV_HVD_ISRHandler(void)
1033*53ee8cc1Swenshuai.xi {
1034*53ee8cc1Swenshuai.xi     if (gHVDISRCtrl.pfnISRCallBack != NULL)
1035*53ee8cc1Swenshuai.xi     {
1036*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bInISR = TRUE;
1037*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo = HAL_HVD_GetData(E_HVD_GDATA_HVD_ISR_STATUS);
1038*53ee8cc1Swenshuai.xi 
1039*53ee8cc1Swenshuai.xi         if (gHVDISRCtrl.u32ISRInfo)
1040*53ee8cc1Swenshuai.xi         {
1041*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(FALSE);
1042*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack();
1043*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(TRUE);
1044*53ee8cc1Swenshuai.xi         }
1045*53ee8cc1Swenshuai.xi     }
1046*53ee8cc1Swenshuai.xi     else
1047*53ee8cc1Swenshuai.xi     {
1048*53ee8cc1Swenshuai.xi         HVD_MSG_ERR( "DRV HVD Err: ISR callback is NULL.\n"  );
1049*53ee8cc1Swenshuai.xi     }
1050*53ee8cc1Swenshuai.xi 
1051*53ee8cc1Swenshuai.xi     gHVDISRCtrl.bInISR = FALSE;
1052*53ee8cc1Swenshuai.xi     HAL_HVD_SetClearISR();
1053*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Enable();
1054*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Complete();
1055*53ee8cc1Swenshuai.xi 
1056*53ee8cc1Swenshuai.xi     return 1;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi #else
_DRV_HVD_ISRHandler(void)1059*53ee8cc1Swenshuai.xi static void _DRV_HVD_ISRHandler(void)
1060*53ee8cc1Swenshuai.xi {
1061*53ee8cc1Swenshuai.xi     if (gHVDISRCtrl.pfnISRCallBack != NULL)
1062*53ee8cc1Swenshuai.xi     {
1063*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bInISR = TRUE;
1064*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo = HAL_HVD_GetData(E_HVD_GDATA_HVD_ISR_STATUS);
1065*53ee8cc1Swenshuai.xi 
1066*53ee8cc1Swenshuai.xi         if (gHVDISRCtrl.u32ISRInfo)
1067*53ee8cc1Swenshuai.xi         {
1068*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(FALSE);
1069*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack();
1070*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(TRUE);
1071*53ee8cc1Swenshuai.xi         }
1072*53ee8cc1Swenshuai.xi     }
1073*53ee8cc1Swenshuai.xi     else
1074*53ee8cc1Swenshuai.xi     {
1075*53ee8cc1Swenshuai.xi         HVD_MSG_ERR( "DRV HVD Err: ISR callback is NULL.\n"  );
1076*53ee8cc1Swenshuai.xi     }
1077*53ee8cc1Swenshuai.xi 
1078*53ee8cc1Swenshuai.xi     gHVDISRCtrl.bInISR = FALSE;
1079*53ee8cc1Swenshuai.xi     HAL_HVD_SetClearISR();
1080*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Enable();
1081*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Complete();
1082*53ee8cc1Swenshuai.xi }
1083*53ee8cc1Swenshuai.xi #endif
1084*53ee8cc1Swenshuai.xi 
_DRV_HVD_RecoverySettings(void)1085*53ee8cc1Swenshuai.xi HVD_Result _DRV_HVD_RecoverySettings(void)
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi // TODO: complete this function. and consider more cases. step decoder, display?
1088*53ee8cc1Swenshuai.xi     HVD_Result eRst=E_HVD_OK;
1089*53ee8cc1Swenshuai.xi 
1090*53ee8cc1Swenshuai.xi     switch( gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK )
1091*53ee8cc1Swenshuai.xi     {
1092*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_LIVE_STREAM:
1093*53ee8cc1Swenshuai.xi // temp solution
1094*53ee8cc1Swenshuai.xi     // must before play().
1095*53ee8cc1Swenshuai.xi         if( (gHVDCtrl.Settings.DispInfoTH.u32FrmrateLowBound != 0 )||
1096*53ee8cc1Swenshuai.xi             (gHVDCtrl.Settings.DispInfoTH.u32FrmrateUpBound   != 0)  ||
1097*53ee8cc1Swenshuai.xi             (gHVDCtrl.Settings.DispInfoTH.u32MvopLowBound     != 0)  ||
1098*53ee8cc1Swenshuai.xi             (gHVDCtrl.Settings.DispInfoTH.u32MvopUpBound       != 0)   )
1099*53ee8cc1Swenshuai.xi         {
1100*53ee8cc1Swenshuai.xi             HAL_HVD_SetData(  E_HVD_SDATA_DISP_INFO_TH ,  (MS_U32)(&gHVDCtrl.Settings.DispInfoTH) );
1101*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
1102*53ee8cc1Swenshuai.xi         }
1103*53ee8cc1Swenshuai.xi         if( gHVDCtrl.Settings.u32IsrEvent )
1104*53ee8cc1Swenshuai.xi         {
1105*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_ISR_TYPE, gHVDCtrl.Settings.u32IsrEvent);
1106*53ee8cc1Swenshuai.xi         }
1107*53ee8cc1Swenshuai.xi         HAL_HVD_EnableISR(gHVDCtrl.Settings.bEnISR);
1108*53ee8cc1Swenshuai.xi   // play()
1109*53ee8cc1Swenshuai.xi         HAL_HVD_SetCmd(E_HVD_CMD_PLAY, 0);
1110*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u8SkipMode )
1111*53ee8cc1Swenshuai.xi         {
1112*53ee8cc1Swenshuai.xi             eRst = MDrv_HVD_SetSkipDecMode((HVD_Skip_Decode)(gHVDCtrl.Settings.u8SkipMode));
1113*53ee8cc1Swenshuai.xi             if(E_HVD_OK != eRst)
1114*53ee8cc1Swenshuai.xi             {
1115*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR( "_DRV_HVD_RecoverySettings : Set Skip Mode fail!!.\n"  );
1116*53ee8cc1Swenshuai.xi                 return eRst;
1117*53ee8cc1Swenshuai.xi             }
1118*53ee8cc1Swenshuai.xi         }
1119*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bIsShowErrFrm )
1120*53ee8cc1Swenshuai.xi         {
1121*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DISP_ERR_FRM, TRUE);
1122*53ee8cc1Swenshuai.xi         }
1123*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u8FrcMode )
1124*53ee8cc1Swenshuai.xi         {
1125*53ee8cc1Swenshuai.xi             eRst = MDrv_HVD_SetFrcMode((HVD_FrmRateConv_Mode)(gHVDCtrl.Settings.u8FrcMode));
1126*53ee8cc1Swenshuai.xi             if(E_HVD_OK != eRst)
1127*53ee8cc1Swenshuai.xi             {
1128*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR( "_DRV_HVD_RecoverySettings : Set Frc Mode fail!!.\n"  );
1129*53ee8cc1Swenshuai.xi                 return eRst;
1130*53ee8cc1Swenshuai.xi             }
1131*53ee8cc1Swenshuai.xi         }
1132*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bIsErrConceal )
1133*53ee8cc1Swenshuai.xi         {
1134*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_ERR_CONCEAL, TRUE);
1135*53ee8cc1Swenshuai.xi         }
1136*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bAutoFreeES )
1137*53ee8cc1Swenshuai.xi         {
1138*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_AUTO_FREE_ES, TRUE);
1139*53ee8cc1Swenshuai.xi         }
1140*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bDisDeblocking )
1141*53ee8cc1Swenshuai.xi         {
1142*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DIS_DBF, TRUE);
1143*53ee8cc1Swenshuai.xi         }
1144*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bDisQuarterPixel )
1145*53ee8cc1Swenshuai.xi         {
1146*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_DIS_QUART_PIXEL, TRUE);
1147*53ee8cc1Swenshuai.xi         }
1148*53ee8cc1Swenshuai.xi 
1149*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.bIsSyncOn )
1150*53ee8cc1Swenshuai.xi         {
1151*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_SYNC_ACTIVE, TRUE);
1152*53ee8cc1Swenshuai.xi         }
1153*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u32SyncTolerance )
1154*53ee8cc1Swenshuai.xi         {
1155*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_SYNC_TOLERANCE, gHVDCtrl.Settings.u32SyncTolerance);
1156*53ee8cc1Swenshuai.xi         }
1157*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u32SyncRepeatTH )
1158*53ee8cc1Swenshuai.xi         {
1159*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_SYNC_THRESHOLD, gHVDCtrl.Settings.u32SyncRepeatTH);
1160*53ee8cc1Swenshuai.xi         }
1161*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u32SyncVideoDelay )
1162*53ee8cc1Swenshuai.xi         {
1163*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, gHVDCtrl.Settings.u32SyncVideoDelay);
1164*53ee8cc1Swenshuai.xi         }
1165*53ee8cc1Swenshuai.xi         if(  gHVDCtrl.Settings.u32SyncFreeRunTH )
1166*53ee8cc1Swenshuai.xi         {
1167*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_FREERUN_THRESHOLD, gHVDCtrl.Settings.u32SyncFreeRunTH);
1168*53ee8cc1Swenshuai.xi         }
1169*53ee8cc1Swenshuai.xi 
1170*53ee8cc1Swenshuai.xi         if (E_HVD_BURST_CNT_DISABLE != (HVD_MIU_Burst_Cnt_Ctrl) gHVDCtrl.Settings.u32MiuBurstLevel)
1171*53ee8cc1Swenshuai.xi         {
1172*53ee8cc1Swenshuai.xi             HAL_HVD_SetCmd(E_HVD_CMD_MIU_BURST_CNT, gHVDCtrl.Settings.u32MiuBurstLevel);
1173*53ee8cc1Swenshuai.xi         }
1174*53ee8cc1Swenshuai.xi 
1175*53ee8cc1Swenshuai.xi         //HAL_HVD_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
1176*53ee8cc1Swenshuai.xi         gHVDCtrl.bStepDecoding = 0;
1177*53ee8cc1Swenshuai.xi 
1178*53ee8cc1Swenshuai.xi         break;
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi     case HVD_INIT_MAIN_FILE_RAW:
1181*53ee8cc1Swenshuai.xi     default:
1182*53ee8cc1Swenshuai.xi         gHVDCtrl.bStepDecoding=0;
1183*53ee8cc1Swenshuai.xi         HAL_HVD_SetCmd(E_HVD_CMD_PLAY, 0);
1184*53ee8cc1Swenshuai.xi         break;
1185*53ee8cc1Swenshuai.xi     }
1186*53ee8cc1Swenshuai.xi     return eRst;
1187*53ee8cc1Swenshuai.xi }
1188*53ee8cc1Swenshuai.xi 
_DRV_HVD_Rst(MS_BOOL bErrHandle)1189*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_Rst(MS_BOOL bErrHandle)
1190*53ee8cc1Swenshuai.xi {
1191*53ee8cc1Swenshuai.xi     HVD_Result eRst = E_HVD_RET_ILLEGAL_ACCESS;
1192*53ee8cc1Swenshuai.xi 
1193*53ee8cc1Swenshuai.xi     if (bErrHandle == TRUE)
1194*53ee8cc1Swenshuai.xi     {
1195*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("HVD Not supported reset(TRUE) yet\n");
1196*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1197*53ee8cc1Swenshuai.xi     }
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi     bHVDIsIniting = TRUE;
1200*53ee8cc1Swenshuai.xi 
1201*53ee8cc1Swenshuai.xi #if (defined(CHIP_EDEN))
1202*53ee8cc1Swenshuai.xi     if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
1203*53ee8cc1Swenshuai.xi     {
1204*53ee8cc1Swenshuai.xi         HAL_HVD_RM_PATCH((MS_U32)(&gHVDCtrl));
1205*53ee8cc1Swenshuai.xi     }
1206*53ee8cc1Swenshuai.xi #endif
1207*53ee8cc1Swenshuai.xi 
1208*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(FALSE);
1209*53ee8cc1Swenshuai.xi 
1210*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1211*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1212*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1213*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1214*53ee8cc1Swenshuai.xi                  __LINE__);
1215*53ee8cc1Swenshuai.xi #endif
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_RstVariables();
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1220*53ee8cc1Swenshuai.xi     {
1221*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1222*53ee8cc1Swenshuai.xi     }
1223*53ee8cc1Swenshuai.xi 
1224*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1225*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1226*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1227*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1228*53ee8cc1Swenshuai.xi                  __LINE__);
1229*53ee8cc1Swenshuai.xi #endif
1230*53ee8cc1Swenshuai.xi 
1231*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_InitShareMem();
1232*53ee8cc1Swenshuai.xi 
1233*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1234*53ee8cc1Swenshuai.xi     {
1235*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1236*53ee8cc1Swenshuai.xi     }
1237*53ee8cc1Swenshuai.xi 
1238*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1239*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1240*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1241*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1242*53ee8cc1Swenshuai.xi                  __LINE__);
1243*53ee8cc1Swenshuai.xi #endif
1244*53ee8cc1Swenshuai.xi 
1245*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_InitRegCPU();
1246*53ee8cc1Swenshuai.xi 
1247*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1248*53ee8cc1Swenshuai.xi     {
1249*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1250*53ee8cc1Swenshuai.xi     }
1251*53ee8cc1Swenshuai.xi 
1252*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1253*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1254*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1255*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1256*53ee8cc1Swenshuai.xi                  __LINE__);
1257*53ee8cc1Swenshuai.xi #endif
1258*53ee8cc1Swenshuai.xi 
1259*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_InitFW();
1260*53ee8cc1Swenshuai.xi 
1261*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1262*53ee8cc1Swenshuai.xi     {
1263*53ee8cc1Swenshuai.xi         goto DRV_HVD_Rst_Failed;
1264*53ee8cc1Swenshuai.xi     }
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi     eRst = E_HVD_OK;
1267*53ee8cc1Swenshuai.xi 
1268*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(gHVDCtrl.Settings.bEnISR);
1269*53ee8cc1Swenshuai.xi 
1270*53ee8cc1Swenshuai.xi     bHVDIsIniting = FALSE;
1271*53ee8cc1Swenshuai.xi     return eRst;
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     DRV_HVD_Rst_Failed :
1274*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(gHVDCtrl.Settings.bEnISR);
1275*53ee8cc1Swenshuai.xi     bHVDIsIniting = FALSE;
1276*53ee8cc1Swenshuai.xi 
1277*53ee8cc1Swenshuai.xi     return eRst;
1278*53ee8cc1Swenshuai.xi }
1279*53ee8cc1Swenshuai.xi 
_DRV_HVD_GetDispInfo(HVD_Disp_Info * pinfo,MS_BOOL bClearSeqChg)1280*53ee8cc1Swenshuai.xi static HVD_Result _DRV_HVD_GetDispInfo( HVD_Disp_Info *pinfo, MS_BOOL bClearSeqChg )
1281*53ee8cc1Swenshuai.xi {
1282*53ee8cc1Swenshuai.xi     MS_U32 u32Seqtimes=10;
1283*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1284*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1285*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1286*53ee8cc1Swenshuai.xi 
1287*53ee8cc1Swenshuai.xi     if( !(gHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
1288*53ee8cc1Swenshuai.xi     {
1289*53ee8cc1Swenshuai.xi         if( MDrv_HVD_CheckDispInfoRdy() == E_HVD_RET_NOTREADY )
1290*53ee8cc1Swenshuai.xi         {
1291*53ee8cc1Swenshuai.xi             return E_HVD_RET_NOTREADY;
1292*53ee8cc1Swenshuai.xi         }
1293*53ee8cc1Swenshuai.xi     }
1294*53ee8cc1Swenshuai.xi     if( pinfo == NULL )
1295*53ee8cc1Swenshuai.xi     {
1296*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1297*53ee8cc1Swenshuai.xi     }
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1300*53ee8cc1Swenshuai.xi 
1301*53ee8cc1Swenshuai.xi     HVD_GETDISPINFO_START:
1302*53ee8cc1Swenshuai.xi     if (TRUE == bClearSeqChg)
1303*53ee8cc1Swenshuai.xi     {
1304*53ee8cc1Swenshuai.xi         HAL_HVD_SetData(E_HVD_SDATA_GET_DISP_INFO_START, 0);
1305*53ee8cc1Swenshuai.xi         HVD_memcpy((void*)pinfo, (void*)HAL_HVD_GetData(E_HVD_GDATA_DISP_INFO_ADDR), sizeof(HVD_Display_Info));
1306*53ee8cc1Swenshuai.xi         if (HAL_HVD_GetData(E_HVD_GDATA_IS_DISP_INFO_UNCOPYED))
1307*53ee8cc1Swenshuai.xi         {
1308*53ee8cc1Swenshuai.xi             u32Seqtimes--;
1309*53ee8cc1Swenshuai.xi             if( u32Seqtimes > 0)
1310*53ee8cc1Swenshuai.xi             {
1311*53ee8cc1Swenshuai.xi                 goto HVD_GETDISPINFO_START;
1312*53ee8cc1Swenshuai.xi             }
1313*53ee8cc1Swenshuai.xi             else
1314*53ee8cc1Swenshuai.xi             {
1315*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR("HVD Err: GetDispInfo Timeout:%d\n", (MS_S16)HAL_HVD_GetData(E_HVD_GDATA_IS_DISP_INFO_UNCOPYED));
1316*53ee8cc1Swenshuai.xi                 _DRV_HVD_Return(E_HVD_RET_TIMEOUT);
1317*53ee8cc1Swenshuai.xi             }
1318*53ee8cc1Swenshuai.xi         }
1319*53ee8cc1Swenshuai.xi     }
1320*53ee8cc1Swenshuai.xi     else    //just report disp info, but not to clear the ready flag.
1321*53ee8cc1Swenshuai.xi     {
1322*53ee8cc1Swenshuai.xi         HVD_memcpy((void*)pinfo, (void*)HAL_HVD_GetData(E_HVD_GDATA_DISP_INFO_ADDR), sizeof(HVD_Display_Info));
1323*53ee8cc1Swenshuai.xi     }
1324*53ee8cc1Swenshuai.xi 
1325*53ee8cc1Swenshuai.xi     if ((TRUE == bClearSeqChg) && ( gHVDCtrl.bIsDispInfoChg ))
1326*53ee8cc1Swenshuai.xi     {
1327*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u32FrameRate = %lu\n", pinfo->u32FrameRate);
1328*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u8Interlace = %x \n", (MS_S16)pinfo->u8Interlace);
1329*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16HorSize = %u \n", pinfo->u16HorSize);
1330*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16VerSize = %u \n", pinfo->u16VerSize);
1331*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16Crop R/L = %u, %u \n", pinfo->u16CropRight, pinfo->u16CropLeft);
1332*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16Crop B/T = %u, %u \n", pinfo->u16CropBottom, pinfo->u16CropTop);
1333*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u8AspectRate = %u \n", (MS_S16)pinfo->u8AspectRate);
1334*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16SarWidth = %u \n", pinfo->u16SarWidth);
1335*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16SarHeight = %u \n", pinfo->u16SarHeight);
1336*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u16Pitch = %u \n", pinfo->u16Pitch);
1337*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("pinfo->u8ColourPrimaries = %u \n", pinfo->u8ColourPrimaries);
1338*53ee8cc1Swenshuai.xi         gHVDCtrl.bIsDispInfoChg=FALSE;
1339*53ee8cc1Swenshuai.xi     }
1340*53ee8cc1Swenshuai.xi 
1341*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(E_HVD_OK);
1342*53ee8cc1Swenshuai.xi }
1343*53ee8cc1Swenshuai.xi 
1344*53ee8cc1Swenshuai.xi 
1345*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1346*53ee8cc1Swenshuai.xi //  Global Functions
1347*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
1348*53ee8cc1Swenshuai.xi 
1349*53ee8cc1Swenshuai.xi // System
1350*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1351*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_PowerCtrl()
1352*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/Disable HVD HW clock
1353*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/Disable HVD HW clock
1354*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable
1355*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable
1356*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_PowerCtrl(MS_BOOL bEnable)1357*53ee8cc1Swenshuai.xi void MDrv_HVD_PowerCtrl( MS_BOOL bEnable )
1358*53ee8cc1Swenshuai.xi {
1359*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1360*53ee8cc1Swenshuai.xi     HAL_HVD_MVD_PowerCtrl( bEnable);
1361*53ee8cc1Swenshuai.xi     HAL_HVD_PowerCtrl(bEnable);
1362*53ee8cc1Swenshuai.xi     HAL_VPU_PowerCtrl(bEnable);
1363*53ee8cc1Swenshuai.xi }
1364*53ee8cc1Swenshuai.xi 
1365*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1366*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetOSRegBase()
1367*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set system register base
1368*53ee8cc1Swenshuai.xi /// @param -u32RegBaseAddr \b IN :  system register base
1369*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetOSRegBase(MS_U32 u32RegBaseAddr)1370*53ee8cc1Swenshuai.xi void MDrv_HVD_SetOSRegBase( MS_U32 u32RegBaseAddr )
1371*53ee8cc1Swenshuai.xi {
1372*53ee8cc1Swenshuai.xi     HAL_HVD_InitRegBase( u32RegBaseAddr );
1373*53ee8cc1Swenshuai.xi }
1374*53ee8cc1Swenshuai.xi 
1375*53ee8cc1Swenshuai.xi // Action
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1378*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Init()
1379*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  HVD driver initialization
1380*53ee8cc1Swenshuai.xi /// @param -pStMemCfg \b IN :  pointer to the memory config of HVD driver
1381*53ee8cc1Swenshuai.xi /// @param -pStInitSettings \b IN :  Initialization of HVD driver
1382*53ee8cc1Swenshuai.xi /// @return -The result of initialization process
1383*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Init(HVD_MemCfg * pStMemCfg,HVD_Init_Settings * pStInitSettings)1384*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Init(HVD_MemCfg *pStMemCfg, HVD_Init_Settings *pStInitSettings)
1385*53ee8cc1Swenshuai.xi {
1386*53ee8cc1Swenshuai.xi     HVD_Result eRst = E_HVD_FAIL;
1387*53ee8cc1Swenshuai.xi 
1388*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1389*53ee8cc1Swenshuai.xi 
1390*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1391*53ee8cc1Swenshuai.xi     u32InitSysTimeBase = HVD_GetSysTime_ms();
1392*53ee8cc1Swenshuai.xi #endif
1393*53ee8cc1Swenshuai.xi 
1394*53ee8cc1Swenshuai.xi     if ((pStMemCfg == NULL) || (pStInitSettings == NULL))
1395*53ee8cc1Swenshuai.xi     {
1396*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("HVD Err: Init params are invalid\n");
1397*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1398*53ee8cc1Swenshuai.xi     }
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_SET_REG_BASE
1401*53ee8cc1Swenshuai.xi     {
1402*53ee8cc1Swenshuai.xi         MS_U32 u32NonPMBankSize = 0, u32RiuBaseAdd = 0;
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi         if (!MDrv_MMIO_GetBASE(&u32RiuBaseAdd, &u32NonPMBankSize, MS_MODULE_HW))
1405*53ee8cc1Swenshuai.xi         {
1406*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD Err: MMIO_GetBASE failure\n");
1407*53ee8cc1Swenshuai.xi             return eRst;
1408*53ee8cc1Swenshuai.xi         }
1409*53ee8cc1Swenshuai.xi         else
1410*53ee8cc1Swenshuai.xi         {
1411*53ee8cc1Swenshuai.xi             HVD_MSG_INFO("HVD:1 u32RiuBaseAdd = %lx\n", u32RiuBaseAdd);
1412*53ee8cc1Swenshuai.xi             HAL_HVD_InitRegBase(u32RiuBaseAdd);
1413*53ee8cc1Swenshuai.xi         }
1414*53ee8cc1Swenshuai.xi     }
1415*53ee8cc1Swenshuai.xi #endif
1416*53ee8cc1Swenshuai.xi 
1417*53ee8cc1Swenshuai.xi     HVD_MSG_INFO("HVD: system call type: Mutex:%d clock:%d delay:%d asm_sync:%d\n",
1418*53ee8cc1Swenshuai.xi                  HVD_ENABLE_MUTEX_PROTECT,
1419*53ee8cc1Swenshuai.xi                  HVD_SYSTEM_CLOCK_TYPE,
1420*53ee8cc1Swenshuai.xi                  HVD_SYSTEM_DELAY_MS_TYPE,
1421*53ee8cc1Swenshuai.xi                  HVD_MEMORY_BARRIER_TYPE);
1422*53ee8cc1Swenshuai.xi 
1423*53ee8cc1Swenshuai.xi     if (u32UartCtrl & E_HVD_UART_CTRL_INFO)
1424*53ee8cc1Swenshuai.xi     {
1425*53ee8cc1Swenshuai.xi         MS_U32 u32delaytime = 5;
1426*53ee8cc1Swenshuai.xi         MS_U32 u32FirstTime = HVD_GetSysTime_ms();
1427*53ee8cc1Swenshuai.xi         MS_U32 u32SecondTime= 0;
1428*53ee8cc1Swenshuai.xi 
1429*53ee8cc1Swenshuai.xi         HVD_Delay_ms(u32delaytime);
1430*53ee8cc1Swenshuai.xi         u32SecondTime = HVD_GetSysTime_ms();
1431*53ee8cc1Swenshuai.xi 
1432*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD: MSOS API check: 1st:%lu 2nd:%lu delay:%lu dif:%lu\n",
1433*53ee8cc1Swenshuai.xi                      u32FirstTime,
1434*53ee8cc1Swenshuai.xi                      u32SecondTime,
1435*53ee8cc1Swenshuai.xi                      u32delaytime,
1436*53ee8cc1Swenshuai.xi                      u32SecondTime - u32FirstTime);
1437*53ee8cc1Swenshuai.xi     }
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1440*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1441*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1442*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1443*53ee8cc1Swenshuai.xi                  __LINE__);
1444*53ee8cc1Swenshuai.xi #endif
1445*53ee8cc1Swenshuai.xi 
1446*53ee8cc1Swenshuai.xi     if (bHVDIsInited == TRUE)
1447*53ee8cc1Swenshuai.xi     {
1448*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("HVD Warn: re-init HVD Driver\n");
1449*53ee8cc1Swenshuai.xi 
1450*53ee8cc1Swenshuai.xi #if HVD_ENABLE_REINIT_FAILED
1451*53ee8cc1Swenshuai.xi         eRst = E_HVD_RET_RE_INIT;
1452*53ee8cc1Swenshuai.xi         return eRst;
1453*53ee8cc1Swenshuai.xi #endif
1454*53ee8cc1Swenshuai.xi     }
1455*53ee8cc1Swenshuai.xi 
1456*53ee8cc1Swenshuai.xi     // disable ISR first
1457*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(FALSE);
1458*53ee8cc1Swenshuai.xi 
1459*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_InitVariables(pStMemCfg,
1460*53ee8cc1Swenshuai.xi               (HVD_Init_Params *) pStInitSettings);
1461*53ee8cc1Swenshuai.xi 
1462*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1463*53ee8cc1Swenshuai.xi     {
1464*53ee8cc1Swenshuai.xi         return eRst;
1465*53ee8cc1Swenshuai.xi     }
1466*53ee8cc1Swenshuai.xi 
1467*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1468*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1469*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1470*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1471*53ee8cc1Swenshuai.xi                  __LINE__);
1472*53ee8cc1Swenshuai.xi #endif
1473*53ee8cc1Swenshuai.xi 
1474*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Check_Cmd(E_HVD_CHECK_CMD_INIT);
1477*53ee8cc1Swenshuai.xi 
1478*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1479*53ee8cc1Swenshuai.xi     {
1480*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRst);
1481*53ee8cc1Swenshuai.xi     }
1482*53ee8cc1Swenshuai.xi 
1483*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1484*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1485*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1486*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1487*53ee8cc1Swenshuai.xi                  __LINE__);
1488*53ee8cc1Swenshuai.xi #endif
1489*53ee8cc1Swenshuai.xi 
1490*53ee8cc1Swenshuai.xi     eRst = _DRV_HVD_Rst(FALSE);
1491*53ee8cc1Swenshuai.xi 
1492*53ee8cc1Swenshuai.xi     if (eRst != E_HVD_OK)
1493*53ee8cc1Swenshuai.xi     {
1494*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRst);
1495*53ee8cc1Swenshuai.xi     }
1496*53ee8cc1Swenshuai.xi 
1497*53ee8cc1Swenshuai.xi #if HVD_ENABLE_TIME_MEASURE
1498*53ee8cc1Swenshuai.xi     HVD_MSG_MUST("HVD Time Measure:%d (%s %d) \n",
1499*53ee8cc1Swenshuai.xi                  HVD_GetSysTime_ms() - u32InitSysTimeBase,
1500*53ee8cc1Swenshuai.xi                  __FUNCTION__,
1501*53ee8cc1Swenshuai.xi                  __LINE__);
1502*53ee8cc1Swenshuai.xi #endif
1503*53ee8cc1Swenshuai.xi 
1504*53ee8cc1Swenshuai.xi     gHVDCtrl.u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
1505*53ee8cc1Swenshuai.xi     bHVDIsInited = TRUE;
1506*53ee8cc1Swenshuai.xi     eRst = E_HVD_OK;
1507*53ee8cc1Swenshuai.xi 
1508*53ee8cc1Swenshuai.xi     HVD_MSG_INFO("HVD driver Init successfully.\n");
1509*53ee8cc1Swenshuai.xi 
1510*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRst);
1511*53ee8cc1Swenshuai.xi }
1512*53ee8cc1Swenshuai.xi 
1513*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1514*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Rst()
1515*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD driver
1516*53ee8cc1Swenshuai.xi /// @param -bErrHandle \b IN :  reset option HVD driver
1517*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Reset HVD to clear mode.( do not recovery SPS)
1518*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Reset HVD to clear mode, and recovery SPS.
1519*53ee8cc1Swenshuai.xi /// @return -The result of reset process
1520*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Rst(MS_BOOL bErrHandle)1521*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Rst(MS_BOOL bErrHandle)
1522*53ee8cc1Swenshuai.xi {
1523*53ee8cc1Swenshuai.xi     HVD_Result eRet=E_HVD_RET_ILLEGAL_ACCESS;
1524*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1525*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1526*53ee8cc1Swenshuai.xi     if( bErrHandle == TRUE )
1527*53ee8cc1Swenshuai.xi     {
1528*53ee8cc1Swenshuai.xi         HVD_MSG_ERR( "HVD Not supported reset(TRUE) yet\n");
1529*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1530*53ee8cc1Swenshuai.xi     }
1531*53ee8cc1Swenshuai.xi     if( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) != HVD_INIT_MAIN_LIVE_STREAM)
1532*53ee8cc1Swenshuai.xi     {
1533*53ee8cc1Swenshuai.xi         HVD_MSG_ERR( "HVD rst() only support live stream mode\n");
1534*53ee8cc1Swenshuai.xi         return E_HVD_RET_INVALID_PARAMETER;
1535*53ee8cc1Swenshuai.xi     }
1536*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_Rst(bErrHandle);
1537*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1538*53ee8cc1Swenshuai.xi     {
1539*53ee8cc1Swenshuai.xi         return (eRet);
1540*53ee8cc1Swenshuai.xi     }
1541*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_RecoverySettings();
1542*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1543*53ee8cc1Swenshuai.xi     {
1544*53ee8cc1Swenshuai.xi         return (eRet);
1545*53ee8cc1Swenshuai.xi     }
1546*53ee8cc1Swenshuai.xi     gHVDCtrl.u32CtrlMode |= HVD_CTRL_INIT_FINISHED;
1547*53ee8cc1Swenshuai.xi     bHVDIsInited=TRUE;
1548*53ee8cc1Swenshuai.xi     return (eRet);
1549*53ee8cc1Swenshuai.xi }
1550*53ee8cc1Swenshuai.xi 
1551*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1552*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Play()
1553*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Play HVD
1554*53ee8cc1Swenshuai.xi /// @return -The result of command play
1555*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Play(void)1556*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Play(void)
1557*53ee8cc1Swenshuai.xi {
1558*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1559*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1560*53ee8cc1Swenshuai.xi 
1561*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1564*53ee8cc1Swenshuai.xi 
1565*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
1566*53ee8cc1Swenshuai.xi     if( MDrv_HVD_GetPlayState() != E_HVD_GSTATE_PLAY || gHVDCtrl.bStepDecoding )
1567*53ee8cc1Swenshuai.xi #endif
1568*53ee8cc1Swenshuai.xi     {
1569*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PLAY, 0);
1570*53ee8cc1Swenshuai.xi         if( eRet != E_HVD_OK )
1571*53ee8cc1Swenshuai.xi         {
1572*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1573*53ee8cc1Swenshuai.xi         }
1574*53ee8cc1Swenshuai.xi     }
1575*53ee8cc1Swenshuai.xi     // step display off
1576*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1577*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK  )
1578*53ee8cc1Swenshuai.xi     {
1579*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
1580*53ee8cc1Swenshuai.xi     }
1581*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1582*53ee8cc1Swenshuai.xi }
1583*53ee8cc1Swenshuai.xi 
1584*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1585*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Exit()
1586*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Stop HVD and release resource.
1587*53ee8cc1Swenshuai.xi /// @return -The result of command stop
1588*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Exit(void)1589*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Exit(void)
1590*53ee8cc1Swenshuai.xi {
1591*53ee8cc1Swenshuai.xi     MS_U32 u32Timer=0;
1592*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1593*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1594*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1595*53ee8cc1Swenshuai.xi     _DRV_HVD_Rsting(eRet);
1596*53ee8cc1Swenshuai.xi     bHVDIsInited=FALSE;
1597*53ee8cc1Swenshuai.xi     do
1598*53ee8cc1Swenshuai.xi     {
1599*53ee8cc1Swenshuai.xi         u32Timer++;
1600*53ee8cc1Swenshuai.xi         if(u32Timer>=HVD_FW_EXIT_ACTION_TIMEOUT)
1601*53ee8cc1Swenshuai.xi         {
1602*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_TIMEOUT;
1603*53ee8cc1Swenshuai.xi             return eRet;
1604*53ee8cc1Swenshuai.xi         }
1605*53ee8cc1Swenshuai.xi         else
1606*53ee8cc1Swenshuai.xi         {
1607*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1608*53ee8cc1Swenshuai.xi         }
1609*53ee8cc1Swenshuai.xi     }while(_DRV_HVD_Ctrl(HVD_CTRL_PROCESSING));
1610*53ee8cc1Swenshuai.xi     // release ISR callback
1611*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(FALSE);
1612*53ee8cc1Swenshuai.xi     OSAL_HVD_ISR_Disable();
1613*53ee8cc1Swenshuai.xi     if( gHVDISRCtrl.bRegISR )
1614*53ee8cc1Swenshuai.xi     {
1615*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Detach();
1616*53ee8cc1Swenshuai.xi     }
1617*53ee8cc1Swenshuai.xi     // close HVD FW
1618*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_DeInit();
1619*53ee8cc1Swenshuai.xi     // reset internal control variables
1620*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&gHVDPreCtrl  , 0 , sizeof(HVD_Pre_Ctrl) );
1621*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&gHVDCtrl  , 0 , sizeof(HVD_Drv_Ctrl) );
1622*53ee8cc1Swenshuai.xi     HVD_memset( (void*)&gHVDISRCtrl  , 0 , sizeof(HVD_ISR_Ctrl) );
1623*53ee8cc1Swenshuai.xi     // TODO: check it is really stop
1624*53ee8cc1Swenshuai.xi     //_DRV_HVD_Return(eRet );
1625*53ee8cc1Swenshuai.xi     return eRet;
1626*53ee8cc1Swenshuai.xi }
1627*53ee8cc1Swenshuai.xi 
1628*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1629*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Pause()
1630*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Pause HVD
1631*53ee8cc1Swenshuai.xi /// @return -The result of command pause
1632*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Pause(void)1633*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Pause(void)
1634*53ee8cc1Swenshuai.xi {
1635*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1636*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1637*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1638*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1639*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PAUSE, 0);
1640*53ee8cc1Swenshuai.xi     if( eRet !=  E_HVD_OK)
1641*53ee8cc1Swenshuai.xi     {
1642*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1643*53ee8cc1Swenshuai.xi     }
1644*53ee8cc1Swenshuai.xi     // step display off
1645*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1646*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK  )
1647*53ee8cc1Swenshuai.xi     {
1648*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode &=~HVD_CTRL_DISPLAY_CTRL;
1649*53ee8cc1Swenshuai.xi     }
1650*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
1651*53ee8cc1Swenshuai.xi }
1652*53ee8cc1Swenshuai.xi 
1653*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1654*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Flush()
1655*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Flush queue and buffer
1656*53ee8cc1Swenshuai.xi /// @param -bShowLast \b IN :  TRUE / FALSE
1657*53ee8cc1Swenshuai.xi ///                 -FALSE(0): show current displayed frame
1658*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show last decoded frame
1659*53ee8cc1Swenshuai.xi /// @return -The result of command flush
1660*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Flush(MS_BOOL bShowLast)1661*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Flush(MS_BOOL bShowLast)
1662*53ee8cc1Swenshuai.xi {
1663*53ee8cc1Swenshuai.xi     MS_U32 u32Times = 0;
1664*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1665*53ee8cc1Swenshuai.xi 	MS_U32 u32FlushTime = 0;
1666*53ee8cc1Swenshuai.xi 
1667*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1668*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1669*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1670*53ee8cc1Swenshuai.xi 
1671*53ee8cc1Swenshuai.xi     // pause first
1672*53ee8cc1Swenshuai.xi     if (MDrv_HVD_GetPlayState() != E_HVD_GSTATE_PAUSE)
1673*53ee8cc1Swenshuai.xi     {
1674*53ee8cc1Swenshuai.xi         eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_PAUSE, 0);
1675*53ee8cc1Swenshuai.xi 
1676*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_OK)
1677*53ee8cc1Swenshuai.xi         {
1678*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
1679*53ee8cc1Swenshuai.xi         }
1680*53ee8cc1Swenshuai.xi 
1681*53ee8cc1Swenshuai.xi         // check flush done
1682*53ee8cc1Swenshuai.xi         while (1)
1683*53ee8cc1Swenshuai.xi         {
1684*53ee8cc1Swenshuai.xi             if (MDrv_HVD_GetPlayState() == E_HVD_GSTATE_PAUSE)
1685*53ee8cc1Swenshuai.xi             {
1686*53ee8cc1Swenshuai.xi                 break;
1687*53ee8cc1Swenshuai.xi             }
1688*53ee8cc1Swenshuai.xi 
1689*53ee8cc1Swenshuai.xi             u32Times++;
1690*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1691*53ee8cc1Swenshuai.xi 
1692*53ee8cc1Swenshuai.xi             if (u32Times > 100)
1693*53ee8cc1Swenshuai.xi             {
1694*53ee8cc1Swenshuai.xi                 HVD_MSG_INFO("HVD info: pause in flush() not finished.\n");
1695*53ee8cc1Swenshuai.xi                 break;
1696*53ee8cc1Swenshuai.xi             }
1697*53ee8cc1Swenshuai.xi         }
1698*53ee8cc1Swenshuai.xi     }
1699*53ee8cc1Swenshuai.xi 
1700*53ee8cc1Swenshuai.xi     // step display off
1701*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetData(E_HVD_SDATA_TRIGGER_DISP, 0);
1702*53ee8cc1Swenshuai.xi 
1703*53ee8cc1Swenshuai.xi     if (eRet == E_HVD_OK)
1704*53ee8cc1Swenshuai.xi     {
1705*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode &= ~HVD_CTRL_DISPLAY_CTRL;
1706*53ee8cc1Swenshuai.xi     }
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
1709*53ee8cc1Swenshuai.xi     if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_RM)
1710*53ee8cc1Swenshuai.xi     {
1711*53ee8cc1Swenshuai.xi         if (gHVDCtrl.LastNal.bRVBrokenPacket)
1712*53ee8cc1Swenshuai.xi         {
1713*53ee8cc1Swenshuai.xi             HVD_MSG_INFO("HVD Info: push dummy packet for broken by us packet\n");
1714*53ee8cc1Swenshuai.xi             gHVDPacket.u32Length        = gHVDCtrl.u32RV_FlushPacketSize;
1715*53ee8cc1Swenshuai.xi             gHVDPacket.u32Staddr        = gHVDCtrl.u32RV_FlushPacketAddr - gHVDCtrl.MemMap.u32BitstreamBufAddr;
1716*53ee8cc1Swenshuai.xi             gHVDPacket.u32OriPktAddr    = gHVDPacket.u32Staddr;
1717*53ee8cc1Swenshuai.xi             gHVDPacket.bRVBrokenPacket  = FALSE;
1718*53ee8cc1Swenshuai.xi 
1719*53ee8cc1Swenshuai.xi             eRet = (HVD_Result) HAL_HVD_PushPacket((HVD_BBU_Info *)&gHVDPacket);
1720*53ee8cc1Swenshuai.xi         }
1721*53ee8cc1Swenshuai.xi     }
1722*53ee8cc1Swenshuai.xi #endif
1723*53ee8cc1Swenshuai.xi 
1724*53ee8cc1Swenshuai.xi     // fire all packet to FW
1725*53ee8cc1Swenshuai.xi     if (HAL_HVD_GetData(E_HVD_GDATA_BBU_WRITE_PTR_FIRED) != HAL_HVD_GetData(E_HVD_GDATA_BBU_WRITE_PTR))
1726*53ee8cc1Swenshuai.xi     {
1727*53ee8cc1Swenshuai.xi         HAL_HVD_UpdateESWptr_Fire();
1728*53ee8cc1Swenshuai.xi     }
1729*53ee8cc1Swenshuai.xi 
1730*53ee8cc1Swenshuai.xi     // send command
1731*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FLUSH, (MS_U32) bShowLast);
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_OK)
1734*53ee8cc1Swenshuai.xi     {
1735*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
1736*53ee8cc1Swenshuai.xi     }
1737*53ee8cc1Swenshuai.xi 	u32FlushTime = 0;
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     // check flush done only for raw file mode
1740*53ee8cc1Swenshuai.xi     if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
1741*53ee8cc1Swenshuai.xi     {
1742*53ee8cc1Swenshuai.xi         while (1)
1743*53ee8cc1Swenshuai.xi         {
1744*53ee8cc1Swenshuai.xi             //_DRV_HVD_PushDummy();
1745*53ee8cc1Swenshuai.xi             if (_DRV_HVD_IsAllBufferEmpty() && (u32FlushTime >= 50))
1746*53ee8cc1Swenshuai.xi             {
1747*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
1748*53ee8cc1Swenshuai.xi                 break;
1749*53ee8cc1Swenshuai.xi             }
1750*53ee8cc1Swenshuai.xi             u32Times++;
1751*53ee8cc1Swenshuai.xi 			u32FlushTime++;
1752*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1753*53ee8cc1Swenshuai.xi             if (u32Times > 200)
1754*53ee8cc1Swenshuai.xi             {
1755*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR("HVD Err: Flush() timeout failed: BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx\n" ,
1756*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_BBU_Q_NUMB),
1757*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_DEC_Q_NUMB),
1758*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_NUMB),
1759*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
1760*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_ES_READ_PTR),
1761*53ee8cc1Swenshuai.xi                     HAL_HVD_GetData(E_HVD_GDATA_ES_WRITE_PTR));
1762*53ee8cc1Swenshuai.xi                 eRet = E_HVD_FAIL;
1763*53ee8cc1Swenshuai.xi                 break;
1764*53ee8cc1Swenshuai.xi             }
1765*53ee8cc1Swenshuai.xi         }
1766*53ee8cc1Swenshuai.xi         // reset byte_cnt
1767*53ee8cc1Swenshuai.xi         HAL_HVD_RstPTSCtrlVariable();
1768*53ee8cc1Swenshuai.xi     }
1769*53ee8cc1Swenshuai.xi 
1770*53ee8cc1Swenshuai.xi     HAL_HVD_FlushRstShareMem();
1771*53ee8cc1Swenshuai.xi 
1772*53ee8cc1Swenshuai.xi     // MediaCodec need this to let scan mode to be normal.
1773*53ee8cc1Swenshuai.xi     if (0) //bPlayback)
1774*53ee8cc1Swenshuai.xi     {
1775*53ee8cc1Swenshuai.xi         eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_PLAY, 0);
1776*53ee8cc1Swenshuai.xi 
1777*53ee8cc1Swenshuai.xi         if (eRet != E_HVD_OK)
1778*53ee8cc1Swenshuai.xi         {
1779*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
1780*53ee8cc1Swenshuai.xi         }
1781*53ee8cc1Swenshuai.xi     }
1782*53ee8cc1Swenshuai.xi 
1783*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
1784*53ee8cc1Swenshuai.xi }
1785*53ee8cc1Swenshuai.xi 
1786*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1787*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_StepDisp()
1788*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Trigger HVD to show one frame
1789*53ee8cc1Swenshuai.xi /// @return -The result of command trigger display
1790*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_StepDisp(void)1791*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_StepDisp(void)
1792*53ee8cc1Swenshuai.xi {
1793*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1794*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1795*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1796*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1797*53ee8cc1Swenshuai.xi     // check command
1798*53ee8cc1Swenshuai.xi     eRet=_DRV_HVD_Check_Cmd( E_HVD_CHECK_CMD_TRIGGER_DISP );
1799*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
1800*53ee8cc1Swenshuai.xi     {
1801*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1802*53ee8cc1Swenshuai.xi     }
1803*53ee8cc1Swenshuai.xi 
1804*53ee8cc1Swenshuai.xi     // step display on
1805*53ee8cc1Swenshuai.xi     if( _DRV_HVD_Ctrl(HVD_CTRL_DISPLAY_CTRL) )
1806*53ee8cc1Swenshuai.xi     {
1807*53ee8cc1Swenshuai.xi         if( MDrv_HVD_IsFrameShowed() )
1808*53ee8cc1Swenshuai.xi         {
1809*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_SetData(E_HVD_SDATA_TRIGGER_DISP, 1);
1810*53ee8cc1Swenshuai.xi         }
1811*53ee8cc1Swenshuai.xi         else
1812*53ee8cc1Swenshuai.xi         {
1813*53ee8cc1Swenshuai.xi             HVD_MSG_INFO("HVD Warn: Previous Step Display command is not finished\n");
1814*53ee8cc1Swenshuai.xi             eRet =E_HVD_OK;
1815*53ee8cc1Swenshuai.xi         }
1816*53ee8cc1Swenshuai.xi     }
1817*53ee8cc1Swenshuai.xi     else
1818*53ee8cc1Swenshuai.xi     {
1819*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetData(E_HVD_SDATA_TRIGGER_DISP, 1);
1820*53ee8cc1Swenshuai.xi         if( eRet == E_HVD_OK  )
1821*53ee8cc1Swenshuai.xi         {
1822*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(HVD_CTRL_DISPLAY_CTRL);
1823*53ee8cc1Swenshuai.xi         }
1824*53ee8cc1Swenshuai.xi     }
1825*53ee8cc1Swenshuai.xi     // enter play mode
1826*53ee8cc1Swenshuai.xi     if( 1)//HAL_HVD_GetData(E_HVD_GDATA_FW_STATE) == E_HVD_FW_PAUSE )
1827*53ee8cc1Swenshuai.xi     {
1828*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PLAY, 0);
1829*53ee8cc1Swenshuai.xi         if( eRet !=  E_HVD_OK)
1830*53ee8cc1Swenshuai.xi         {
1831*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1832*53ee8cc1Swenshuai.xi         }
1833*53ee8cc1Swenshuai.xi     }
1834*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1835*53ee8cc1Swenshuai.xi }
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1838*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_StepDecode()
1839*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step decode one frame
1840*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_StepDecode(void)1841*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_StepDecode(void)
1842*53ee8cc1Swenshuai.xi {
1843*53ee8cc1Swenshuai.xi     MS_U32 u32Times=0;
1844*53ee8cc1Swenshuai.xi     MS_U32 FWState=0;
1845*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1846*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1847*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1848*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1849*53ee8cc1Swenshuai.xi     // check if step decoding
1850*53ee8cc1Swenshuai.xi     if( gHVDCtrl.bStepDecoding)
1851*53ee8cc1Swenshuai.xi     {
1852*53ee8cc1Swenshuai.xi         if( gHVDCtrl.u32StepDecodeCnt == HAL_HVD_GetData(E_HVD_GDATA_DECODE_CNT) )
1853*53ee8cc1Swenshuai.xi         {
1854*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_NOTREADY;
1855*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1856*53ee8cc1Swenshuai.xi         }
1857*53ee8cc1Swenshuai.xi     }
1858*53ee8cc1Swenshuai.xi     // Pause first
1859*53ee8cc1Swenshuai.xi     FWState = HAL_HVD_GetData(E_HVD_GDATA_FW_STATE);
1860*53ee8cc1Swenshuai.xi     if( FWState != (MS_U32)E_HVD_FW_PAUSE )
1861*53ee8cc1Swenshuai.xi     {
1862*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PAUSE, 0);
1863*53ee8cc1Swenshuai.xi         if( eRet !=  E_HVD_OK)
1864*53ee8cc1Swenshuai.xi         {
1865*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1866*53ee8cc1Swenshuai.xi         }
1867*53ee8cc1Swenshuai.xi         while( FWState != ((MS_U32)E_HVD_FW_PAUSE)
1868*53ee8cc1Swenshuai.xi             && u32Times <= 10000)
1869*53ee8cc1Swenshuai.xi         {
1870*53ee8cc1Swenshuai.xi             FWState = HAL_HVD_GetData(E_HVD_GDATA_FW_STATE);
1871*53ee8cc1Swenshuai.xi             u32Times++;
1872*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
1873*53ee8cc1Swenshuai.xi         }
1874*53ee8cc1Swenshuai.xi         if( HAL_HVD_GetData(E_HVD_GDATA_FW_STATE) != E_HVD_FW_PAUSE )
1875*53ee8cc1Swenshuai.xi         {
1876*53ee8cc1Swenshuai.xi             eRet = E_HVD_FAIL;
1877*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1878*53ee8cc1Swenshuai.xi         }
1879*53ee8cc1Swenshuai.xi     }
1880*53ee8cc1Swenshuai.xi     gHVDCtrl.bStepDecoding=TRUE;
1881*53ee8cc1Swenshuai.xi     // get decode cnt
1882*53ee8cc1Swenshuai.xi     gHVDCtrl.u32StepDecodeCnt = HAL_HVD_GetData(E_HVD_GDATA_DECODE_CNT);
1883*53ee8cc1Swenshuai.xi     // step decode
1884*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_STEP_DECODE, 0);
1885*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
1886*53ee8cc1Swenshuai.xi }
1887*53ee8cc1Swenshuai.xi 
1888*53ee8cc1Swenshuai.xi // set command, action, status, input
1889*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1890*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_PushQueue()
1891*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  push one entry into the decoding table(BBU table).
1892*53ee8cc1Swenshuai.xi /// @param -pInfo \b IN :  Pointer to the information of input packet.
1893*53ee8cc1Swenshuai.xi /// @return -The result of command push queue
1894*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_PushQueue(HVD_Packet_Info * pInfo)1895*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_PushQueue(HVD_Packet_Info* pInfo)
1896*53ee8cc1Swenshuai.xi {
1897*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
1898*53ee8cc1Swenshuai.xi     MS_BOOL bNULLPacket=FALSE;
1899*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
1900*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
1901*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
1902*53ee8cc1Swenshuai.xi 
1903*53ee8cc1Swenshuai.xi     if( pInfo ==NULL  )
1904*53ee8cc1Swenshuai.xi     {
1905*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1906*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1907*53ee8cc1Swenshuai.xi     }
1908*53ee8cc1Swenshuai.xi     else if( pInfo->u32Length >= 0x200000) // HW bbu tag limitation
1909*53ee8cc1Swenshuai.xi     {
1910*53ee8cc1Swenshuai.xi         HVD_MSG_ERR(  "HVD Err: input packet size(0x%lx) larger than max packet size(0x%lx)\n " , pInfo->u32Length  , 0x200000UL  );
1911*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1912*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1913*53ee8cc1Swenshuai.xi     }
1914*53ee8cc1Swenshuai.xi     else if( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_INPUT_MASK) == HVD_INIT_INPUT_TSP )
1915*53ee8cc1Swenshuai.xi     {
1916*53ee8cc1Swenshuai.xi         HVD_MSG_ERR(  "HVD Err: Init mode is TSP input and PushQueue() is not supported in TSP input."  );
1917*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_ILLEGAL_ACCESS;
1918*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1919*53ee8cc1Swenshuai.xi     }
1920*53ee8cc1Swenshuai.xi     else if( ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM) &&
1921*53ee8cc1Swenshuai.xi        (pInfo->u32Staddr >= gHVDCtrl.MemMap.u32BitstreamBufSize) )
1922*53ee8cc1Swenshuai.xi     {
1923*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1924*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1925*53ee8cc1Swenshuai.xi     }
1926*53ee8cc1Swenshuai.xi 
1927*53ee8cc1Swenshuai.xi     //HVD_memcpy((void*)(&gHVDPacket), (void*)pInfo, sizeof(HVD_Packet_Info));
1928*53ee8cc1Swenshuai.xi     gHVDPacket.u32ID_H=pInfo->u32ID_H;
1929*53ee8cc1Swenshuai.xi     gHVDPacket.u32ID_L=pInfo->u32ID_L;
1930*53ee8cc1Swenshuai.xi     gHVDPacket.u32Length=pInfo->u32Length;
1931*53ee8cc1Swenshuai.xi     gHVDPacket.u32TimeStamp=pInfo->u32TimeStamp;
1932*53ee8cc1Swenshuai.xi     if( pInfo->u32Staddr & HVD_RV_BROKEN_BY_US_MASK )
1933*53ee8cc1Swenshuai.xi     {
1934*53ee8cc1Swenshuai.xi         gHVDPacket.bRVBrokenPacket= TRUE;
1935*53ee8cc1Swenshuai.xi         gHVDPacket.u32OriPktAddr=pInfo->u32Staddr & (~HVD_RV_BROKEN_BY_US_MASK);
1936*53ee8cc1Swenshuai.xi         gHVDPacket.u32Staddr=pInfo->u32Staddr& (~HVD_RV_BROKEN_BY_US_MASK);
1937*53ee8cc1Swenshuai.xi     }
1938*53ee8cc1Swenshuai.xi     else
1939*53ee8cc1Swenshuai.xi     {
1940*53ee8cc1Swenshuai.xi         gHVDPacket.bRVBrokenPacket= FALSE;
1941*53ee8cc1Swenshuai.xi         gHVDPacket.u32OriPktAddr=pInfo->u32Staddr;
1942*53ee8cc1Swenshuai.xi         gHVDPacket.u32Staddr=pInfo->u32Staddr;
1943*53ee8cc1Swenshuai.xi     }
1944*53ee8cc1Swenshuai.xi 
1945*53ee8cc1Swenshuai.xi     // invalid packet
1946*53ee8cc1Swenshuai.xi     if(  (gHVDPacket.u32TimeStamp != HVD_U32_MAX) && (gHVDPacket.u32Length==0))
1947*53ee8cc1Swenshuai.xi     {
1948*53ee8cc1Swenshuai.xi         HVD_MSG_INFO(  "HVD Err: Invalid Packet(size:0x%lx PTS:0x%lx)\n " , gHVDPacket.u32Length  , gHVDPacket.u32TimeStamp );
1949*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_INVALID_PARAMETER;
1950*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
1951*53ee8cc1Swenshuai.xi     }
1952*53ee8cc1Swenshuai.xi     // AVI NULL packet
1953*53ee8cc1Swenshuai.xi #if HVD_ENABLE_AUTO_AVI_NULL_PACKET
1954*53ee8cc1Swenshuai.xi     else if((gHVDPacket.u32TimeStamp == HVD_U32_MAX) && (gHVDPacket.u32Length==0))
1955*53ee8cc1Swenshuai.xi     {
1956*53ee8cc1Swenshuai.xi         if( gHVDCtrl.bNoDrvProccBuf)
1957*53ee8cc1Swenshuai.xi         {
1958*53ee8cc1Swenshuai.xi             HVD_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 , gHVDCtrl.MemMap.u32DrvProcessBufSize);
1959*53ee8cc1Swenshuai.xi             eRet=E_HVD_RET_ILLEGAL_ACCESS;
1960*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
1961*53ee8cc1Swenshuai.xi         }
1962*53ee8cc1Swenshuai.xi         else
1963*53ee8cc1Swenshuai.xi         {
1964*53ee8cc1Swenshuai.xi             bNULLPacket=TRUE;
1965*53ee8cc1Swenshuai.xi             gHVDPacket.u32Length = gHVDCtrl.u32NULLPacketSize;
1966*53ee8cc1Swenshuai.xi             gHVDPacket.u32Staddr= gHVDCtrl.u32NULLPacketAddr - gHVDCtrl.MemMap.u32BitstreamBufAddr;
1967*53ee8cc1Swenshuai.xi         }
1968*53ee8cc1Swenshuai.xi     }
1969*53ee8cc1Swenshuai.xi #endif
1970*53ee8cc1Swenshuai.xi     // the else are all normal cases.
1971*53ee8cc1Swenshuai.xi     if( MDrv_HVD_GetBBUVacancy() != 0)
1972*53ee8cc1Swenshuai.xi     {
1973*53ee8cc1Swenshuai.xi         {
1974*53ee8cc1Swenshuai.xi             MS_U32 u32ESRptr=HAL_HVD_GetData(E_HVD_GDATA_ES_READ_PTR );
1975*53ee8cc1Swenshuai.xi             MS_U32 u32ESWptr=HAL_HVD_GetData(E_HVD_GDATA_ES_WRITE_PTR);
1976*53ee8cc1Swenshuai.xi             if( ( u32ESWptr >= u32ESRptr ) &&
1977*53ee8cc1Swenshuai.xi                  ( gHVDPacket.u32Staddr + gHVDPacket.u32Length >= gHVDCtrl.MemMap.u32BitstreamBufSize )  )
1978*53ee8cc1Swenshuai.xi             {
1979*53ee8cc1Swenshuai.xi                 HVD_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 , gHVDCtrl.MemMap.u32BitstreamBufSize );
1980*53ee8cc1Swenshuai.xi             }
1981*53ee8cc1Swenshuai.xi             if( ( u32ESWptr < u32ESRptr ) &&
1982*53ee8cc1Swenshuai.xi                  ( gHVDPacket.u32Staddr + gHVDPacket.u32Length >= u32ESRptr )  )
1983*53ee8cc1Swenshuai.xi             {
1984*53ee8cc1Swenshuai.xi                 HVD_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 );
1985*53ee8cc1Swenshuai.xi             }
1986*53ee8cc1Swenshuai.xi             if( HAL_HVD_GetData(E_HVD_GDATA_BBU_Q_NUMB) && (!bNULLPacket) &&
1987*53ee8cc1Swenshuai.xi                  (gHVDCtrl.MemMap.u32DrvProcessBufSize != 0) &&
1988*53ee8cc1Swenshuai.xi                  ( gHVDCtrl.MemMap.u32BitstreamBufAddr<= gHVDCtrl.MemMap.u32DrvProcessBufAddr  ) &&
1989*53ee8cc1Swenshuai.xi                  ( gHVDCtrl.MemMap.u32DrvProcessBufAddr < (gHVDCtrl.MemMap.u32BitstreamBufAddr + gHVDCtrl.MemMap.u32BitstreamBufSize)) )
1990*53ee8cc1Swenshuai.xi             {
1991*53ee8cc1Swenshuai.xi                     MS_U32 u32Lower = gHVDCtrl.MemMap.u32DrvProcessBufAddr - gHVDCtrl.MemMap.u32BitstreamBufAddr;
1992*53ee8cc1Swenshuai.xi                     MS_U32 u32Upper = u32Lower+gHVDCtrl.MemMap.u32DrvProcessBufSize;
1993*53ee8cc1Swenshuai.xi                     if( ( (u32Lower <= gHVDPacket.u32Staddr) && (gHVDPacket.u32Staddr < u32Upper)) ||
1994*53ee8cc1Swenshuai.xi                          ( (u32Lower <= (gHVDPacket.u32Staddr + gHVDPacket.u32Length) ) && ( (gHVDPacket.u32Staddr+gHVDPacket.u32Length) < u32Upper)) ||
1995*53ee8cc1Swenshuai.xi                          ( (gHVDPacket.u32Staddr < u32Lower) && (u32Upper<=(gHVDPacket.u32Staddr+gHVDPacket.u32Length)) )   )
1996*53ee8cc1Swenshuai.xi                     {
1997*53ee8cc1Swenshuai.xi                         HVD_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 );
1998*53ee8cc1Swenshuai.xi                     }
1999*53ee8cc1Swenshuai.xi             }
2000*53ee8cc1Swenshuai.xi          //for debug
2001*53ee8cc1Swenshuai.xi             if( 0)
2002*53ee8cc1Swenshuai.xi             {
2003*53ee8cc1Swenshuai.xi                  HVD_MSG_INFO(  "HVD : %lu (%lu %lu) ID:%lx input packet (%lx %lx %lx) (%lx %lx %lx) (%lu %lu %lu)\n " ,
2004*53ee8cc1Swenshuai.xi                     gHVDCtrl.u32BBUPacketCnt , MDrv_HVD_GetDataErrCnt() , MDrv_HVD_GetDecErrCnt(),
2005*53ee8cc1Swenshuai.xi                     gHVDPacket.u32ID_L , gHVDPacket.u32Staddr+gHVDPacket.u32Length , gHVDPacket.u32Length   ,gHVDPacket.u32Staddr    ,
2006*53ee8cc1Swenshuai.xi                     u32ESRptr, gHVDCtrl.MemMap.u32BitstreamBufSize  ,u32ESWptr ,
2007*53ee8cc1Swenshuai.xi                     MDrv_HVD_GetBBUVacancy() ,HAL_HVD_GetData(E_HVD_GDATA_BBU_READ_PTR) ,HAL_HVD_GetData(E_HVD_GDATA_BBU_WRITE_PTR) );
2008*53ee8cc1Swenshuai.xi             }
2009*53ee8cc1Swenshuai.xi         }
2010*53ee8cc1Swenshuai.xi         #if !(defined(UDMA_FPGA_ENVI))
2011*53ee8cc1Swenshuai.xi         if( ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) != HVD_INIT_HW_RM)
2012*53ee8cc1Swenshuai.xi         && (gHVDCtrl.bAutoRmLastZeroByte == TRUE)
2013*53ee8cc1Swenshuai.xi         && ( (!gHVDCtrl.bCannotAccessMIU256) ||
2014*53ee8cc1Swenshuai.xi              (( gHVDCtrl.bCannotAccessMIU256 )  && ( gHVDCtrl.MemMap.u32BitstreamBufAddr < gHVDCtrl.MemMap.u32MIU1BaseAddr))) )
2015*53ee8cc1Swenshuai.xi         {
2016*53ee8cc1Swenshuai.xi             MS_U32 ModifyCnt=0;
2017*53ee8cc1Swenshuai.xi             while(1)//for( ModifyCnt=0 ; ModifyCnt<3;ModifyCnt++ )
2018*53ee8cc1Swenshuai.xi             {
2019*53ee8cc1Swenshuai.xi                 if( gHVDPacket.u32Length )
2020*53ee8cc1Swenshuai.xi                 {
2021*53ee8cc1Swenshuai.xi                     MS_U8 *pByte=NULL;
2022*53ee8cc1Swenshuai.xi                     MS_U32 u32tmp=0;
2023*53ee8cc1Swenshuai.xi                     u32tmp = ( gHVDPacket.u32Staddr + gHVDPacket.u32Length-1);
2024*53ee8cc1Swenshuai.xi                     if( u32tmp >= gHVDCtrl.MemMap.u32BitstreamBufSize )
2025*53ee8cc1Swenshuai.xi                     {
2026*53ee8cc1Swenshuai.xi                         u32tmp-=gHVDCtrl.MemMap.u32BitstreamBufSize;
2027*53ee8cc1Swenshuai.xi                     }
2028*53ee8cc1Swenshuai.xi                     u32tmp+=gHVDCtrl.MemMap.u32BitstreamBufVAddr;
2029*53ee8cc1Swenshuai.xi                     pByte = (MS_U8 *)u32tmp;
2030*53ee8cc1Swenshuai.xi                     if( *pByte == 0 )
2031*53ee8cc1Swenshuai.xi                     {
2032*53ee8cc1Swenshuai.xi                         /*
2033*53ee8cc1Swenshuai.xi                        if( ModifyCnt == 2 )
2034*53ee8cc1Swenshuai.xi                        {
2035*53ee8cc1Swenshuai.xi                             gHVDPacket.u32Length+=ModifyCnt;
2036*53ee8cc1Swenshuai.xi                        }
2037*53ee8cc1Swenshuai.xi                        else
2038*53ee8cc1Swenshuai.xi                        */
2039*53ee8cc1Swenshuai.xi                        {
2040*53ee8cc1Swenshuai.xi                         ModifyCnt++;
2041*53ee8cc1Swenshuai.xi                             gHVDPacket.u32Length--;
2042*53ee8cc1Swenshuai.xi                        }
2043*53ee8cc1Swenshuai.xi                     }
2044*53ee8cc1Swenshuai.xi                     else
2045*53ee8cc1Swenshuai.xi                     {
2046*53ee8cc1Swenshuai.xi                         break;
2047*53ee8cc1Swenshuai.xi                     }
2048*53ee8cc1Swenshuai.xi                 }
2049*53ee8cc1Swenshuai.xi             }
2050*53ee8cc1Swenshuai.xi             if( ModifyCnt != 0)
2051*53ee8cc1Swenshuai.xi             {
2052*53ee8cc1Swenshuai.xi                 //HVD_MSG_INFO("HVD remove last zero byte:%lu\n" , ModifyCnt);
2053*53ee8cc1Swenshuai.xi             }
2054*53ee8cc1Swenshuai.xi             if( gHVDPacket.u32Length == 0 )
2055*53ee8cc1Swenshuai.xi             {
2056*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR(  "HVD Warn: Packet with all zero bytes(staddr:0x%lx remove zero bytes:%lu)\n " ,  gHVDPacket.u32Staddr , ModifyCnt);
2057*53ee8cc1Swenshuai.xi                 eRet=E_HVD_OK;
2058*53ee8cc1Swenshuai.xi                 _DRV_HVD_Return(eRet );
2059*53ee8cc1Swenshuai.xi             }
2060*53ee8cc1Swenshuai.xi         }
2061*53ee8cc1Swenshuai.xi         #endif
2062*53ee8cc1Swenshuai.xi         /*
2063*53ee8cc1Swenshuai.xi         {
2064*53ee8cc1Swenshuai.xi             MS_U8 *pByte=NULL;
2065*53ee8cc1Swenshuai.xi             pByte = (MS_U8 *)((gHVDCtrl.MemMap.u32BitstreamBufVAddr) + gHVDPacket.u32Staddr );
2066*53ee8cc1Swenshuai.xi             HVD_MSG_INFO("HVD remove last zero byte:%02x%02x%02x%02x\n" ,
2067*53ee8cc1Swenshuai.xi                 *pByte  , *(pByte+1) , *(pByte+2) , *(pByte+3) );
2068*53ee8cc1Swenshuai.xi         }
2069*53ee8cc1Swenshuai.xi         */
2070*53ee8cc1Swenshuai.xi         eRet=( HVD_Result )HAL_HVD_PushPacket( (HVD_BBU_Info*)&gHVDPacket );
2071*53ee8cc1Swenshuai.xi 
2072*53ee8cc1Swenshuai.xi     }
2073*53ee8cc1Swenshuai.xi     else
2074*53ee8cc1Swenshuai.xi     {
2075*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("Push queue full\n");
2076*53ee8cc1Swenshuai.xi         eRet=E_HVD_RET_QUEUE_FULL;
2077*53ee8cc1Swenshuai.xi     }
2078*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2079*53ee8cc1Swenshuai.xi }
2080*53ee8cc1Swenshuai.xi 
2081*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2082*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_PushQueue_Fire()
2083*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  fire all waiting entry into the decoding table(BBU table).
2084*53ee8cc1Swenshuai.xi /// @return -The result of command push queue fire
2085*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_PushQueue_Fire(void)2086*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_PushQueue_Fire(void)
2087*53ee8cc1Swenshuai.xi {
2088*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2089*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2090*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2091*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2092*53ee8cc1Swenshuai.xi     HAL_HVD_UpdateESWptr_Fire();
2093*53ee8cc1Swenshuai.xi     eRet= E_HVD_OK;
2094*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
2095*53ee8cc1Swenshuai.xi }
2096*53ee8cc1Swenshuai.xi 
2097*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2098*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_DecodeIFrame()
2099*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Decode I frame only under driver input path.
2100*53ee8cc1Swenshuai.xi /// @param -u32SrcSt \b IN :  The physical address if user has input packet.
2101*53ee8cc1Swenshuai.xi /// @param -u32SrcSize \b IN :  The packet size if user has input packet.
2102*53ee8cc1Swenshuai.xi /// @return -The result of command decode I frame.
2103*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_DecodeIFrame(MS_PHYADDR u32SrcSt,MS_U32 u32SrcSize)2104*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_DecodeIFrame(MS_PHYADDR u32SrcSt , MS_U32 u32SrcSize)
2105*53ee8cc1Swenshuai.xi {
2106*53ee8cc1Swenshuai.xi     MS_U32 timer = 300;
2107*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2108*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2109*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2110*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2111*53ee8cc1Swenshuai.xi 
2112*53ee8cc1Swenshuai.xi     eRet= MDrv_HVD_Pause();
2113*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK)
2114*53ee8cc1Swenshuai.xi     {
2115*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2116*53ee8cc1Swenshuai.xi     }
2117*53ee8cc1Swenshuai.xi     // skip decode I
2118*53ee8cc1Swenshuai.xi     eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SKIP_DEC, E_HVD_SKIP_DECODE_I);
2119*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2120*53ee8cc1Swenshuai.xi     {
2121*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2122*53ee8cc1Swenshuai.xi     }
2123*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_I_DIRECT, TRUE);
2124*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2125*53ee8cc1Swenshuai.xi     {
2126*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2127*53ee8cc1Swenshuai.xi     }
2128*53ee8cc1Swenshuai.xi     eRet = MDrv_HVD_StepDecode();
2129*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK)
2130*53ee8cc1Swenshuai.xi     {
2131*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2132*53ee8cc1Swenshuai.xi     }
2133*53ee8cc1Swenshuai.xi     if( E_HVD_INIT_INPUT_DRV == (gHVDCtrl.InitParams.u32ModeFlag & E_HVD_INIT_INPUT_MASK) )
2134*53ee8cc1Swenshuai.xi     {
2135*53ee8cc1Swenshuai.xi         HVD_Packet_Info packet;
2136*53ee8cc1Swenshuai.xi         if( u32SrcSize ==0 )
2137*53ee8cc1Swenshuai.xi         {
2138*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2139*53ee8cc1Swenshuai.xi             HVD_MSG_ERR( "HVD err: decode I frame input packet size is zero\n" );
2140*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2141*53ee8cc1Swenshuai.xi         }
2142*53ee8cc1Swenshuai.xi         packet.u32Staddr = u32SrcSt - gHVDCtrl.MemMap.u32BitstreamBufAddr ;
2143*53ee8cc1Swenshuai.xi         packet.u32Length = u32SrcSize;
2144*53ee8cc1Swenshuai.xi         if( ( packet.u32Staddr + packet.u32Length )  >  gHVDCtrl.MemMap.u32BitstreamBufSize )
2145*53ee8cc1Swenshuai.xi         {
2146*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2147*53ee8cc1Swenshuai.xi             HVD_MSG_ERR( "HVD err: decode I frame memory overflow, the packet end address is over ES buffer end address\n" );
2148*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2149*53ee8cc1Swenshuai.xi         }
2150*53ee8cc1Swenshuai.xi         packet.u32TimeStamp = 0xFFFFFFFF;
2151*53ee8cc1Swenshuai.xi         packet.u32ID_L=0;
2152*53ee8cc1Swenshuai.xi         packet.u32ID_H=0;
2153*53ee8cc1Swenshuai.xi         MDrv_HVD_PushQueue( &packet  );
2154*53ee8cc1Swenshuai.xi         HAL_HVD_UpdateESWptr_Fire();
2155*53ee8cc1Swenshuai.xi     }
2156*53ee8cc1Swenshuai.xi     while( timer )
2157*53ee8cc1Swenshuai.xi     {
2158*53ee8cc1Swenshuai.xi         HVD_Delay_ms(1);
2159*53ee8cc1Swenshuai.xi         if( MDrv_HVD_IsStepDecodeDone() )
2160*53ee8cc1Swenshuai.xi         {
2161*53ee8cc1Swenshuai.xi             break;
2162*53ee8cc1Swenshuai.xi         }
2163*53ee8cc1Swenshuai.xi         timer--;
2164*53ee8cc1Swenshuai.xi     }
2165*53ee8cc1Swenshuai.xi     if( timer ==0)
2166*53ee8cc1Swenshuai.xi     {
2167*53ee8cc1Swenshuai.xi         eRet= E_HVD_FAIL;
2168*53ee8cc1Swenshuai.xi         HVD_MSG_ERR( "HVD err: decode I frame time out, not enough data\n" );
2169*53ee8cc1Swenshuai.xi         _DRV_HVD_Return( eRet);
2170*53ee8cc1Swenshuai.xi     }
2171*53ee8cc1Swenshuai.xi     eRet= E_HVD_OK;
2172*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
2173*53ee8cc1Swenshuai.xi }
2174*53ee8cc1Swenshuai.xi 
2175*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2176*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDataEnd()
2177*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Upper layer set this to inform driver that there are no more data will be pushed.
2178*53ee8cc1Swenshuai.xi /// @param -bEnd \b IN :  Enable/ Disable
2179*53ee8cc1Swenshuai.xi ///                 -FALSE(0): normal status( default )
2180*53ee8cc1Swenshuai.xi ///                 -TRUE(1): ending status
2181*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDataEnd(MS_BOOL bEnd)2182*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDataEnd( MS_BOOL bEnd )
2183*53ee8cc1Swenshuai.xi {
2184*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2185*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2186*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2187*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2188*53ee8cc1Swenshuai.xi     if( bEnd )
2189*53ee8cc1Swenshuai.xi     {
2190*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode|= HVD_CTRL_DATA_END;
2191*53ee8cc1Swenshuai.xi     }
2192*53ee8cc1Swenshuai.xi     else
2193*53ee8cc1Swenshuai.xi     {
2194*53ee8cc1Swenshuai.xi         gHVDCtrl.u32CtrlMode&=~ HVD_CTRL_DATA_END;
2195*53ee8cc1Swenshuai.xi     }
2196*53ee8cc1Swenshuai.xi     //_DRV_HVD_PushDummy_Rst();
2197*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PLAYBACK_FINISH, bEnd);
2198*53ee8cc1Swenshuai.xi     _DRV_HVD_Return( eRet);
2199*53ee8cc1Swenshuai.xi }
2200*53ee8cc1Swenshuai.xi 
2201*53ee8cc1Swenshuai.xi 
2202*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2203*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDispErrFrm()
2204*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to decode and show error(broken) frames
2205*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
2206*53ee8cc1Swenshuai.xi ///                 -FALSE(0): hide error frames
2207*53ee8cc1Swenshuai.xi ///                 -TRUE(1): show error frames
2208*53ee8cc1Swenshuai.xi /// @return -The result of command set display error frames
2209*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDispErrFrm(MS_BOOL bEnable)2210*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDispErrFrm(MS_BOOL bEnable)
2211*53ee8cc1Swenshuai.xi {
2212*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2213*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2214*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2215*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2216*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_ERR_FRM, bEnable);
2217*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.bIsShowErrFrm=bEnable;
2218*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2219*53ee8cc1Swenshuai.xi }
2220*53ee8cc1Swenshuai.xi 
2221*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2222*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDispRepeatField()
2223*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/ Disable to show last field when FW needs to show repeated field
2224*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable/ Disable
2225*53ee8cc1Swenshuai.xi ///                 -FALSE(0): disable this mode
2226*53ee8cc1Swenshuai.xi ///                 -TRUE(1): enable this mode
2227*53ee8cc1Swenshuai.xi /// @return -The result of command set display repeated field
2228*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDispRepeatField(MS_BOOL bEnable)2229*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDispRepeatField(MS_BOOL bEnable)
2230*53ee8cc1Swenshuai.xi {
2231*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2232*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2233*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2234*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2235*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_REPEAT_LAST_FIELD, bEnable);
2236*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2237*53ee8cc1Swenshuai.xi }
2238*53ee8cc1Swenshuai.xi 
2239*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2240*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSkipDecMode()
2241*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the decoding frame type.
2242*53ee8cc1Swenshuai.xi /// @param -eDecType \b IN : decoding frame type
2243*53ee8cc1Swenshuai.xi /// @return -The result of command set skip decode mode
2244*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSkipDecMode(HVD_Skip_Decode eDecType)2245*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSkipDecMode(HVD_Skip_Decode eDecType)
2246*53ee8cc1Swenshuai.xi {
2247*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2248*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2249*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2250*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2251*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2252*53ee8cc1Swenshuai.xi     if( (HVD_Skip_Decode)HAL_HVD_GetData( E_HVD_GDATA_SKIP_MODE ) != eDecType )
2253*53ee8cc1Swenshuai.xi #endif
2254*53ee8cc1Swenshuai.xi     {
2255*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SKIP_DEC, eDecType);
2256*53ee8cc1Swenshuai.xi         if( eRet != E_HVD_OK )
2257*53ee8cc1Swenshuai.xi         {
2258*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet );
2259*53ee8cc1Swenshuai.xi         }
2260*53ee8cc1Swenshuai.xi         if( eDecType == E_HVD_SKIP_DECODE_I  )
2261*53ee8cc1Swenshuai.xi         {
2262*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_I_DIRECT, TRUE);
2263*53ee8cc1Swenshuai.xi         }
2264*53ee8cc1Swenshuai.xi         else
2265*53ee8cc1Swenshuai.xi         {
2266*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_I_DIRECT, FALSE);
2267*53ee8cc1Swenshuai.xi         }
2268*53ee8cc1Swenshuai.xi     }
2269*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u8SkipMode=(MS_U8)eDecType;
2270*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2271*53ee8cc1Swenshuai.xi }
2272*53ee8cc1Swenshuai.xi 
2273*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2274*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDispSpeed()
2275*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the display speed type.
2276*53ee8cc1Swenshuai.xi /// @param -eSpeed \b IN : display speed type
2277*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
2278*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDispSpeed(HVD_Drv_Disp_Speed eSpeed)2279*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDispSpeed(HVD_Drv_Disp_Speed eSpeed)
2280*53ee8cc1Swenshuai.xi {
2281*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2282*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2283*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2284*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2285*53ee8cc1Swenshuai.xi     HVD_MSG_DEG(" MDrv_HVD_SetDispSpeed:%d\n " , (MS_S16)eSpeed);
2286*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2287*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData( E_HVD_GDATA_DISPLAY_DURATION ) != eSpeed )
2288*53ee8cc1Swenshuai.xi #endif
2289*53ee8cc1Swenshuai.xi     {
2290*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_SPEED, eSpeed);
2291*53ee8cc1Swenshuai.xi     }
2292*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
2293*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK )
2294*53ee8cc1Swenshuai.xi     {
2295*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
2296*53ee8cc1Swenshuai.xi         while( timer )
2297*53ee8cc1Swenshuai.xi         {
2298*53ee8cc1Swenshuai.xi             if( HAL_HVD_GetData( E_HVD_GDATA_DISPLAY_DURATION ) == eSpeed )
2299*53ee8cc1Swenshuai.xi             {
2300*53ee8cc1Swenshuai.xi                 break;
2301*53ee8cc1Swenshuai.xi             }
2302*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2303*53ee8cc1Swenshuai.xi             timer--;
2304*53ee8cc1Swenshuai.xi         }
2305*53ee8cc1Swenshuai.xi     }
2306*53ee8cc1Swenshuai.xi #endif
2307*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2308*53ee8cc1Swenshuai.xi }
2309*53ee8cc1Swenshuai.xi 
2310*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2311*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSyncActive()
2312*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/disable the sync of video time stamp and STC.
2313*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/ Disable
2314*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable sync mode
2315*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable sync mode
2316*53ee8cc1Swenshuai.xi /// @return -The result of command set sync active
2317*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSyncActive(MS_BOOL bEnable)2318*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSyncActive( MS_BOOL bEnable)
2319*53ee8cc1Swenshuai.xi {
2320*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2321*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2322*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2323*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2324*53ee8cc1Swenshuai.xi #if HVD_ENABLE_CHECK_STATE_BEFORE_SET_CMD
2325*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData( E_HVD_GDATA_IS_SYNC_ON ) != bEnable )
2326*53ee8cc1Swenshuai.xi #endif
2327*53ee8cc1Swenshuai.xi     {
2328*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_ACTIVE, bEnable);
2329*53ee8cc1Swenshuai.xi     }
2330*53ee8cc1Swenshuai.xi #if HVD_ENABLE_WAIT_CMD_FINISHED
2331*53ee8cc1Swenshuai.xi     if( eRet == E_HVD_OK )
2332*53ee8cc1Swenshuai.xi     {
2333*53ee8cc1Swenshuai.xi         MS_U32 timer = HVD_DRV_CMD_WAIT_FINISH_TIMEOUT;
2334*53ee8cc1Swenshuai.xi         while( timer )
2335*53ee8cc1Swenshuai.xi         {
2336*53ee8cc1Swenshuai.xi             if( HAL_HVD_GetData( E_HVD_GDATA_IS_SYNC_ON ) == bEnable )
2337*53ee8cc1Swenshuai.xi             {
2338*53ee8cc1Swenshuai.xi                 break;
2339*53ee8cc1Swenshuai.xi             }
2340*53ee8cc1Swenshuai.xi             HVD_Delay_ms(1);
2341*53ee8cc1Swenshuai.xi             timer--;
2342*53ee8cc1Swenshuai.xi         }
2343*53ee8cc1Swenshuai.xi     }
2344*53ee8cc1Swenshuai.xi #endif
2345*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.bIsSyncOn=bEnable;
2346*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2347*53ee8cc1Swenshuai.xi }
2348*53ee8cc1Swenshuai.xi 
2349*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2350*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDropMode()
2351*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the way to drop decoded frames.
2352*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Drop display type.
2353*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The argument of eMode
2354*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_DROP_DISPLAY_AUTO)  , Enable: (u32Arg = TRUE); Disable: (u32Arg = FALSE)
2355*53ee8cc1Swenshuai.xi ///     -( eMode == E_HVD_DROP_DISPLAY_ONCE)  , u32Arg = not zero
2356*53ee8cc1Swenshuai.xi /// @return -The result of command set display speed type
2357*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDropMode(HVD_Drop_Disp eMode,MS_U32 u32Arg)2358*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDropMode( HVD_Drop_Disp eMode , MS_U32 u32Arg)
2359*53ee8cc1Swenshuai.xi {
2360*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2361*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2362*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2363*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2364*53ee8cc1Swenshuai.xi 
2365*53ee8cc1Swenshuai.xi     if( eMode  == E_HVD_DROP_DISPLAY_AUTO )
2366*53ee8cc1Swenshuai.xi     {
2367*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DROP_DISP_AUTO, u32Arg);
2368*53ee8cc1Swenshuai.xi     }
2369*53ee8cc1Swenshuai.xi     else if( eMode  == E_HVD_DROP_DISPLAY_ONCE )
2370*53ee8cc1Swenshuai.xi     {
2371*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DROP_DISP_ONCE, u32Arg);
2372*53ee8cc1Swenshuai.xi     }
2373*53ee8cc1Swenshuai.xi     else
2374*53ee8cc1Swenshuai.xi     {
2375*53ee8cc1Swenshuai.xi         eRet= E_HVD_RET_INVALID_PARAMETER;
2376*53ee8cc1Swenshuai.xi     }
2377*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2378*53ee8cc1Swenshuai.xi }
2379*53ee8cc1Swenshuai.xi 
2380*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2381*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_RstPTS()
2382*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset HVD sync table
2383*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : PTS base
2384*53ee8cc1Swenshuai.xi /// @return -The result of command reset PTS
2385*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_RstPTS(MS_U32 u32PTS)2386*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_RstPTS(MS_U32 u32PTS)
2387*53ee8cc1Swenshuai.xi {
2388*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2389*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2390*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2391*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2392*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_RESET_PTS, u32PTS);
2393*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2394*53ee8cc1Swenshuai.xi }
2395*53ee8cc1Swenshuai.xi 
2396*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2397*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetFrcMode()
2398*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set the frame rate convert mode.
2399*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : mode type
2400*53ee8cc1Swenshuai.xi /// @return -The result of command set frame rate convert mode
2401*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetFrcMode(HVD_FrmRateConv_Mode eMode)2402*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetFrcMode(HVD_FrmRateConv_Mode eMode )
2403*53ee8cc1Swenshuai.xi {
2404*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2405*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2406*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2407*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2408*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FRC_MODE, eMode);
2409*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u8FrcMode=(MS_U8)eMode;
2410*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2411*53ee8cc1Swenshuai.xi }
2412*53ee8cc1Swenshuai.xi 
2413*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSyncTolerance()
2415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
2416*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : tolerance.
2417*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2418*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSyncTolerance(MS_U32 u32Arg)2419*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSyncTolerance(MS_U32 u32Arg )
2420*53ee8cc1Swenshuai.xi {
2421*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2422*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2423*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2424*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2425*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_TOLERANCE, u32Arg);
2426*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u32SyncTolerance=u32Arg;
2427*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2428*53ee8cc1Swenshuai.xi }
2429*53ee8cc1Swenshuai.xi 
2430*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2431*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSyncVideoDelay()
2432*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the video delay from STC when sync mode active.
2433*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : The video delay. unit:ms
2434*53ee8cc1Swenshuai.xi /// @return -The result of command set sync video delay
2435*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSyncVideoDelay(MS_U32 u32Arg)2436*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSyncVideoDelay( MS_U32 u32Arg)
2437*53ee8cc1Swenshuai.xi {
2438*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2439*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2440*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2441*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2442*53ee8cc1Swenshuai.xi     if( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) ==
2443*53ee8cc1Swenshuai.xi          HVD_INIT_MAIN_LIVE_STREAM   )
2444*53ee8cc1Swenshuai.xi     {
2445*53ee8cc1Swenshuai.xi         if( gHVDCtrl.InitParams.u8TimeUnit )
2446*53ee8cc1Swenshuai.xi         {
2447*53ee8cc1Swenshuai.xi             eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, (MS_U32)(u32Arg+HVD_DTV_VIDEO_DELAY)  );
2448*53ee8cc1Swenshuai.xi         }
2449*53ee8cc1Swenshuai.xi         else
2450*53ee8cc1Swenshuai.xi         {
2451*53ee8cc1Swenshuai.xi             eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg+((MS_U32)HVD_DTV_VIDEO_DELAY*90)  );
2452*53ee8cc1Swenshuai.xi         }
2453*53ee8cc1Swenshuai.xi     }
2454*53ee8cc1Swenshuai.xi     else
2455*53ee8cc1Swenshuai.xi     {
2456*53ee8cc1Swenshuai.xi         eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_VIDEO_DELAY, u32Arg);
2457*53ee8cc1Swenshuai.xi     }
2458*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u32SyncVideoDelay=u32Arg;
2459*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2460*53ee8cc1Swenshuai.xi }
2461*53ee8cc1Swenshuai.xi 
2462*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2463*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSyncFreeRunTH()
2464*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the tolerance of FW reporting sync reach.
2465*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : theashold.
2466*53ee8cc1Swenshuai.xi ///                     - 0 : use FW default value
2467*53ee8cc1Swenshuai.xi ///                     - 0xFFFFFFFF : never free run, FW always do sync action.
2468*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2469*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSyncFreeRunTH(MS_U32 u32Arg)2470*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSyncFreeRunTH(MS_U32 u32Arg )
2471*53ee8cc1Swenshuai.xi {
2472*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2473*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2474*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2475*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2476*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FREERUN_THRESHOLD, u32Arg);
2477*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u32SyncFreeRunTH=u32Arg;
2478*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2479*53ee8cc1Swenshuai.xi }
2480*53ee8cc1Swenshuai.xi 
2481*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2482*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSyncRepeatTH()
2483*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the repeat threashold under sync mode.
2484*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : repeat times. 0x01 ~ 0xFF
2485*53ee8cc1Swenshuai.xi ///                 0xff - repeat current frame until STC catch up PTS.
2486*53ee8cc1Swenshuai.xi /// @return -The result of command set sync repeat threashold
2487*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSyncRepeatTH(MS_U32 u32Arg)2488*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSyncRepeatTH( MS_U32 u32Arg)
2489*53ee8cc1Swenshuai.xi {
2490*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2491*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2492*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2493*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2494*53ee8cc1Swenshuai.xi     eRet= (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SYNC_THRESHOLD, u32Arg);
2495*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.u32SyncRepeatTH=u32Arg;
2496*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2497*53ee8cc1Swenshuai.xi }
2498*53ee8cc1Swenshuai.xi 
2499*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2500*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetErrConceal()
2501*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable/Disable error concealment.
2502*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2503*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable error concealment.
2504*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable error concealment.
2505*53ee8cc1Swenshuai.xi /// @return -The result of command set sync tolerance
2506*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetErrConceal(MS_BOOL bEnable)2507*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetErrConceal(MS_BOOL bEnable )
2508*53ee8cc1Swenshuai.xi {
2509*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2510*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2511*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2512*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2513*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_ERR_CONCEAL, bEnable);
2514*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.bIsErrConceal=bEnable;
2515*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2516*53ee8cc1Swenshuai.xi }
2517*53ee8cc1Swenshuai.xi 
2518*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2519*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDbgLevel()
2520*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set debug level
2521*53ee8cc1Swenshuai.xi /// @param -elevel \b IN : debug level
2522*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDbgLevel(HVD_Uart_Level elevel)2523*53ee8cc1Swenshuai.xi void MDrv_HVD_SetDbgLevel( HVD_Uart_Level elevel )
2524*53ee8cc1Swenshuai.xi {
2525*53ee8cc1Swenshuai.xi     if( elevel == E_HVD_UART_LEVEL_FW )
2526*53ee8cc1Swenshuai.xi     {
2527*53ee8cc1Swenshuai.xi         HAL_HVD_UartSwitch2FW(TRUE);
2528*53ee8cc1Swenshuai.xi     }
2529*53ee8cc1Swenshuai.xi     #if 0
2530*53ee8cc1Swenshuai.xi     else
2531*53ee8cc1Swenshuai.xi     {
2532*53ee8cc1Swenshuai.xi         HAL_HVD_UartSwitch2FW(FALSE);
2533*53ee8cc1Swenshuai.xi     }
2534*53ee8cc1Swenshuai.xi     #endif
2535*53ee8cc1Swenshuai.xi     switch( elevel )
2536*53ee8cc1Swenshuai.xi     {
2537*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_ERR:
2538*53ee8cc1Swenshuai.xi         u32UartCtrl =E_HVD_UART_CTRL_ERR;
2539*53ee8cc1Swenshuai.xi         break;
2540*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_INFO:
2541*53ee8cc1Swenshuai.xi         u32UartCtrl =E_HVD_UART_CTRL_INFO|E_HVD_UART_CTRL_ERR;
2542*53ee8cc1Swenshuai.xi         break;
2543*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_DBG:
2544*53ee8cc1Swenshuai.xi         u32UartCtrl =E_HVD_UART_CTRL_DBG|E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_INFO;
2545*53ee8cc1Swenshuai.xi         break;
2546*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_TRACE:
2547*53ee8cc1Swenshuai.xi         u32UartCtrl =E_HVD_UART_CTRL_TRACE|E_HVD_UART_CTRL_ERR|E_HVD_UART_CTRL_INFO|E_HVD_UART_CTRL_DBG;
2548*53ee8cc1Swenshuai.xi         break;
2549*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_FW:
2550*53ee8cc1Swenshuai.xi         //u32UartCtrl =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;
2551*53ee8cc1Swenshuai.xi         //break;
2552*53ee8cc1Swenshuai.xi     case E_HVD_UART_LEVEL_NONE:
2553*53ee8cc1Swenshuai.xi     default:
2554*53ee8cc1Swenshuai.xi         u32UartCtrl=E_HVD_UART_CTRL_DISABLE;
2555*53ee8cc1Swenshuai.xi         break;
2556*53ee8cc1Swenshuai.xi     }
2557*53ee8cc1Swenshuai.xi }
2558*53ee8cc1Swenshuai.xi 
2559*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2560*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SeekToPTS()
2561*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).
2562*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
2563*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
2564*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
2565*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
2566*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SeekToPTS(MS_U32 u32PTS)2567*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SeekToPTS(MS_U32 u32PTS )
2568*53ee8cc1Swenshuai.xi {
2569*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2570*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2571*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2572*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2573*53ee8cc1Swenshuai.xi     eRet=_DRV_HVD_Check_Cmd( E_HVD_CHECK_CMD_SEEK2PTS );
2574*53ee8cc1Swenshuai.xi     if( eRet != E_HVD_OK )
2575*53ee8cc1Swenshuai.xi     {
2576*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet );
2577*53ee8cc1Swenshuai.xi     }
2578*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_JUMP_TO_PTS, u32PTS);
2579*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2580*53ee8cc1Swenshuai.xi }
2581*53ee8cc1Swenshuai.xi 
2582*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2583*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SkipToPTS()
2584*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.
2585*53ee8cc1Swenshuai.xi /// @param -u32PTS \b IN : specific PTS.
2586*53ee8cc1Swenshuai.xi ///                 -0: disable this mode. FW will go back to previous status (play or pause).
2587*53ee8cc1Swenshuai.xi ///                 -any not zero: enable this mode
2588*53ee8cc1Swenshuai.xi /// @return -The result of command seek to specific PTS.
2589*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SkipToPTS(MS_U32 u32PTS)2590*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SkipToPTS(MS_U32 u32PTS )
2591*53ee8cc1Swenshuai.xi {
2592*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2593*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2594*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2595*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2596*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SKIP_TO_PTS, u32PTS);
2597*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2598*53ee8cc1Swenshuai.xi }
2599*53ee8cc1Swenshuai.xi 
2600*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2601*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetFreezeImg()
2602*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync, but decoding process is still going.
2603*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2604*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable freeze image.
2605*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable freeze image.
2606*53ee8cc1Swenshuai.xi /// @return -The result of command freeze image.
2607*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetFreezeImg(MS_BOOL bEnable)2608*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetFreezeImg(MS_BOOL bEnable )
2609*53ee8cc1Swenshuai.xi {
2610*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2611*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2612*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2613*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2614*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FREEZE_IMG, bEnable);
2615*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2616*53ee8cc1Swenshuai.xi }
2617*53ee8cc1Swenshuai.xi 
2618*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2619*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetBlueScreen()
2620*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW stop updating frames when vsync and keep blue screen , but decoding process is still going.
2621*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2622*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable blue screen.
2623*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable blue screen.
2624*53ee8cc1Swenshuai.xi /// @return -The result of command set blue screen.
2625*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetBlueScreen(MS_BOOL bEnable)2626*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetBlueScreen(MS_BOOL bEnable )
2627*53ee8cc1Swenshuai.xi {
2628*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2629*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2630*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2631*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2632*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_BLUE_SCREEN, bEnable);
2633*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2634*53ee8cc1Swenshuai.xi }
2635*53ee8cc1Swenshuai.xi 
2636*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2637*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDispOneField()
2638*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Let FW only show one field(top field only).
2639*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2640*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable display one field.
2641*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable display one field.
2642*53ee8cc1Swenshuai.xi /// @return -The result of command display one field.
2643*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDispOneField(MS_BOOL bEnable)2644*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDispOneField(MS_BOOL bEnable )
2645*53ee8cc1Swenshuai.xi {
2646*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2647*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2648*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2649*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2650*53ee8cc1Swenshuai.xi     if( bEnable )
2651*53ee8cc1Swenshuai.xi     {   // force to show top field only.
2652*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_TOP);
2653*53ee8cc1Swenshuai.xi     }
2654*53ee8cc1Swenshuai.xi     else
2655*53ee8cc1Swenshuai.xi     {
2656*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_DISP_ONE_FIELD, E_HVD_FIELD_CTRL_OFF);
2657*53ee8cc1Swenshuai.xi     }
2658*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2659*53ee8cc1Swenshuai.xi }
2660*53ee8cc1Swenshuai.xi 
2661*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2662*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetISREvent()
2663*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by HVD fw.
2664*53ee8cc1Swenshuai.xi /// @param -u32Event \b IN : event types
2665*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
2666*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
2667*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetISREvent(MS_U32 u32Event,HVD_InterruptCb fnISRHandler)2668*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetISREvent(MS_U32 u32Event, HVD_InterruptCb fnISRHandler)
2669*53ee8cc1Swenshuai.xi {
2670*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2671*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2672*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2673*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2674*53ee8cc1Swenshuai.xi     if( u32Event == E_HVD_ISR_NONE )
2675*53ee8cc1Swenshuai.xi     {
2676*53ee8cc1Swenshuai.xi         gHVDCtrl.Settings.bEnISR = FALSE;
2677*53ee8cc1Swenshuai.xi         HAL_HVD_EnableISR(FALSE);
2678*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Disable();
2679*53ee8cc1Swenshuai.xi         OSAL_HVD_ISR_Detach();
2680*53ee8cc1Swenshuai.xi         gHVDISRCtrl.bRegISR = FALSE;
2681*53ee8cc1Swenshuai.xi         gHVDISRCtrl.pfnISRCallBack = NULL;
2682*53ee8cc1Swenshuai.xi         gHVDCtrl.Settings.u32IsrEvent = (MS_U32)E_HVD_ISR_NONE;
2683*53ee8cc1Swenshuai.xi         eRet = E_HVD_OK;
2684*53ee8cc1Swenshuai.xi     }
2685*53ee8cc1Swenshuai.xi     else
2686*53ee8cc1Swenshuai.xi     {
2687*53ee8cc1Swenshuai.xi         if(fnISRHandler != NULL)
2688*53ee8cc1Swenshuai.xi         {
2689*53ee8cc1Swenshuai.xi #if 1 //If ISR handler has been registerred, we only need to reset event flag.
2690*53ee8cc1Swenshuai.xi             if( gHVDISRCtrl.bRegISR )
2691*53ee8cc1Swenshuai.xi             {
2692*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2693*53ee8cc1Swenshuai.xi                 eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2694*53ee8cc1Swenshuai.xi                 if( eRet != E_HVD_OK)
2695*53ee8cc1Swenshuai.xi                 {
2696*53ee8cc1Swenshuai.xi                     _DRV_HVD_Return(eRet);
2697*53ee8cc1Swenshuai.xi                 }
2698*53ee8cc1Swenshuai.xi                 gHVDCtrl.Settings.u32IsrEvent = u32Event;
2699*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
2700*53ee8cc1Swenshuai.xi             }
2701*53ee8cc1Swenshuai.xi             else
2702*53ee8cc1Swenshuai.xi             {
2703*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2704*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Attach( (void*)_DRV_HVD_ISRHandler );
2705*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Enable();
2706*53ee8cc1Swenshuai.xi                 HVD_MSG_INFO("attach ISR number:%d\n" , HVD_ISR_VECTOR);
2707*53ee8cc1Swenshuai.xi                 eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2708*53ee8cc1Swenshuai.xi                 if(eRet != E_HVD_OK)
2709*53ee8cc1Swenshuai.xi                 {
2710*53ee8cc1Swenshuai.xi                     _DRV_HVD_Return(eRet );
2711*53ee8cc1Swenshuai.xi                 }
2712*53ee8cc1Swenshuai.xi                 gHVDCtrl.Settings.u32IsrEvent = u32Event;
2713*53ee8cc1Swenshuai.xi                 gHVDCtrl.Settings.bEnISR = TRUE;
2714*53ee8cc1Swenshuai.xi                 HAL_HVD_EnableISR(TRUE);
2715*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.bRegISR=TRUE;
2716*53ee8cc1Swenshuai.xi                 eRet = E_HVD_OK;
2717*53ee8cc1Swenshuai.xi             }
2718*53ee8cc1Swenshuai.xi #else
2719*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(FALSE);
2720*53ee8cc1Swenshuai.xi             if( gHVDISRCtrl.bRegISR )
2721*53ee8cc1Swenshuai.xi             {
2722*53ee8cc1Swenshuai.xi                 OSAL_HVD_ISR_Detach();
2723*53ee8cc1Swenshuai.xi                 gHVDISRCtrl.bRegISR=FALSE;
2724*53ee8cc1Swenshuai.xi             }
2725*53ee8cc1Swenshuai.xi             gHVDISRCtrl.pfnISRCallBack = (HVD_ISRCallBack)fnISRHandler;
2726*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Attach( (void*)_DRV_HVD_ISRHandler );
2727*53ee8cc1Swenshuai.xi             OSAL_HVD_ISR_Enable();
2728*53ee8cc1Swenshuai.xi /*
2729*53ee8cc1Swenshuai.xi             {
2730*53ee8cc1Swenshuai.xi                 MS_U32 i=0;
2731*53ee8cc1Swenshuai.xi                 for( i=0;i<68;i++ )
2732*53ee8cc1Swenshuai.xi                 {
2733*53ee8cc1Swenshuai.xi                     MsOS_AttachInterrupt( i , (void*)_DRV_HVD_ISRHandler );//(InterruptCb)fnISRHandler  );
2734*53ee8cc1Swenshuai.xi                     MsOS_EnableInterrupt(i);
2735*53ee8cc1Swenshuai.xi                 }
2736*53ee8cc1Swenshuai.xi             }
2737*53ee8cc1Swenshuai.xi */
2738*53ee8cc1Swenshuai.xi             HVD_MSG_INFO("attach ISR number:%d\n" , HVD_ISR_VECTOR);
2739*53ee8cc1Swenshuai.xi             eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_ISR_TYPE, u32Event);
2740*53ee8cc1Swenshuai.xi             gHVDCtrl.Settings.u32IsrEvent = u32Event;
2741*53ee8cc1Swenshuai.xi             if( eRet != E_HVD_OK)
2742*53ee8cc1Swenshuai.xi             {
2743*53ee8cc1Swenshuai.xi                 _DRV_HVD_Return(eRet );
2744*53ee8cc1Swenshuai.xi             }
2745*53ee8cc1Swenshuai.xi             HAL_HVD_EnableISR(TRUE);
2746*53ee8cc1Swenshuai.xi             gHVDISRCtrl.bRegISR=TRUE;
2747*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
2748*53ee8cc1Swenshuai.xi #endif
2749*53ee8cc1Swenshuai.xi         }
2750*53ee8cc1Swenshuai.xi         else
2751*53ee8cc1Swenshuai.xi         {
2752*53ee8cc1Swenshuai.xi             HVD_MSG_ERR( "HVD DrvErr: SetISREvent with NULL pointer. ISR type:%lu\n", u32Event);
2753*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
2754*53ee8cc1Swenshuai.xi         }
2755*53ee8cc1Swenshuai.xi     }
2756*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
2757*53ee8cc1Swenshuai.xi }
2758*53ee8cc1Swenshuai.xi 
2759*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2760*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetEnableISR()
2761*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable HVD interrupt.
2762*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2763*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable interrupt.
2764*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable interrupt.
2765*53ee8cc1Swenshuai.xi /// @return -The result of command set enable ISR.
2766*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetEnableISR(MS_BOOL bEnable)2767*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetEnableISR(MS_BOOL bEnable)
2768*53ee8cc1Swenshuai.xi {
2769*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2770*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2771*53ee8cc1Swenshuai.xi     HAL_HVD_EnableISR(bEnable);
2772*53ee8cc1Swenshuai.xi     gHVDCtrl.Settings.bEnISR=bEnable;
2773*53ee8cc1Swenshuai.xi     return TRUE;
2774*53ee8cc1Swenshuai.xi }
2775*53ee8cc1Swenshuai.xi 
2776*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2777*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetForceISR()
2778*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: test the HVD interrupt function. Force FW send one interrupt.
2779*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2780*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Clear force interrupt status from HK.
2781*53ee8cc1Swenshuai.xi ///                 -TRUE(1): force one interrupt from HK.
2782*53ee8cc1Swenshuai.xi /// @return -The result of command set force ISR.
2783*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetForceISR(MS_BOOL bEnable)2784*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetForceISR(MS_BOOL bEnable)
2785*53ee8cc1Swenshuai.xi {
2786*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2787*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2788*53ee8cc1Swenshuai.xi     HAL_HVD_SetForceISR( bEnable);
2789*53ee8cc1Swenshuai.xi     return TRUE;
2790*53ee8cc1Swenshuai.xi }
2791*53ee8cc1Swenshuai.xi 
2792*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2793*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetMVOPDone()
2794*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: tell FW MVOP is ready for futher decode.
2795*53ee8cc1Swenshuai.xi /// @return -The result of command.
2796*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetMVOPDone(void)2797*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_SetMVOPDone(void)
2798*53ee8cc1Swenshuai.xi {
2799*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2800*53ee8cc1Swenshuai.xi 
2801*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2802*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2803*53ee8cc1Swenshuai.xi 
2804*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_BLUE_SCREEN, FALSE);
2805*53ee8cc1Swenshuai.xi 
2806*53ee8cc1Swenshuai.xi     if (E_HVD_OK == eRet)
2807*53ee8cc1Swenshuai.xi     {
2808*53ee8cc1Swenshuai.xi         return TRUE;
2809*53ee8cc1Swenshuai.xi     }
2810*53ee8cc1Swenshuai.xi     else
2811*53ee8cc1Swenshuai.xi     {
2812*53ee8cc1Swenshuai.xi         return FALSE;
2813*53ee8cc1Swenshuai.xi     }
2814*53ee8cc1Swenshuai.xi }
2815*53ee8cc1Swenshuai.xi 
2816*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2817*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetVirtualBox()
2818*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set DS width and Height to F/W
2819*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN :  frame width
2820*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN :  frame height
2821*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetVirtualBox(MS_U16 u16Width,MS_U16 u16Height)2822*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetVirtualBox(MS_U16 u16Width, MS_U16 u16Height)
2823*53ee8cc1Swenshuai.xi {
2824*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2825*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2826*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2827*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2828*53ee8cc1Swenshuai.xi     HAL_HVD_SetData(E_HVD_SDATA_VIRTUAL_BOX_WIDTH, u16Width);
2829*53ee8cc1Swenshuai.xi     HAL_HVD_SetData(E_HVD_SDATA_VIRTUAL_BOX_HEIGHT, u16Height);
2830*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
2831*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2832*53ee8cc1Swenshuai.xi }
2833*53ee8cc1Swenshuai.xi 
2834*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2835*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDynScalingParam()
2836*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Pass scalar parameters to decoder
2837*53ee8cc1Swenshuai.xi /// @return -The result of command.
2838*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDynScalingParam(void * pStAddr,MS_U32 u32Size)2839*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDynScalingParam(  void *pStAddr , MS_U32 u32Size )
2840*53ee8cc1Swenshuai.xi {
2841*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2842*53ee8cc1Swenshuai.xi     MS_U32 addr = 0;
2843*53ee8cc1Swenshuai.xi 
2844*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2845*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2846*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2847*53ee8cc1Swenshuai.xi     if( (pStAddr == NULL ) || (u32Size==0)  )
2848*53ee8cc1Swenshuai.xi     {
2849*53ee8cc1Swenshuai.xi         eRet = E_HVD_RET_INVALID_PARAMETER;
2850*53ee8cc1Swenshuai.xi         _DRV_HVD_Inited(eRet);
2851*53ee8cc1Swenshuai.xi     }
2852*53ee8cc1Swenshuai.xi     else
2853*53ee8cc1Swenshuai.xi     {
2854*53ee8cc1Swenshuai.xi         // 1. copy data input data array
2855*53ee8cc1Swenshuai.xi         addr = MDrv_HVD_GetDynamicScalingInfo(E_HVD_DS_INFO_ADDR);
2856*53ee8cc1Swenshuai.xi         HVD_memcpy(MS_PA2KSEG1(addr), pStAddr, u32Size);
2857*53ee8cc1Swenshuai.xi 
2858*53ee8cc1Swenshuai.xi         // 2. while till FW finish it.
2859*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SCALER_INFO_NOTIFY, ((MS_U8 *)pStAddr)[0]);
2860*53ee8cc1Swenshuai.xi     }
2861*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2862*53ee8cc1Swenshuai.xi }
2863*53ee8cc1Swenshuai.xi 
2864*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2865*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetDispInfoTH()
2866*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set the upper and lower limitation of a valid SPS.
2867*53ee8cc1Swenshuai.xi /// @param -DispInfoTH \b IN : tolerance.
2868*53ee8cc1Swenshuai.xi /// @return -The result of command set display inforation threshold
2869*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetDispInfoTH(HVD_Disp_Info_Threshold * DispInfoTH)2870*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDispInfoTH(HVD_Disp_Info_Threshold* DispInfoTH )
2871*53ee8cc1Swenshuai.xi {
2872*53ee8cc1Swenshuai.xi     HVD_Disp_Info_TH DispInfoTHTmp;
2873*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2876*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2877*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2878*53ee8cc1Swenshuai.xi     if( DispInfoTH ==NULL)
2879*53ee8cc1Swenshuai.xi     {
2880*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
2881*53ee8cc1Swenshuai.xi     }
2882*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateLowBound=DispInfoTH->u32FrmrateLowBound;
2883*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32FrmrateUpBound=DispInfoTH->u32FrmrateUpBound;
2884*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopLowBound=DispInfoTH->u32MvopLowBound;
2885*53ee8cc1Swenshuai.xi     DispInfoTHTmp.u32MvopUpBound=DispInfoTH->u32MvopUpBound;
2886*53ee8cc1Swenshuai.xi     HAL_HVD_SetData(  E_HVD_SDATA_DISP_INFO_TH ,  (MS_U32)(&DispInfoTHTmp) );
2887*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_UPDATE_DISP_THRESHOLD, 0);
2888*53ee8cc1Swenshuai.xi     HVD_memcpy((void*)&(gHVDCtrl.Settings.DispInfoTH), (void*)(DispInfoTH), sizeof(HVD_Disp_Info_Threshold) );
2889*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
2890*53ee8cc1Swenshuai.xi }
2891*53ee8cc1Swenshuai.xi 
2892*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2893*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetIgnoreErrRef()
2894*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off ignore error reference.
2895*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN :  Enable/ Disable
2896*53ee8cc1Swenshuai.xi ///                 -FALSE(0): handle error reference
2897*53ee8cc1Swenshuai.xi ///                 -TRUE(1): ignore error reference
2898*53ee8cc1Swenshuai.xi /// @return -The result of command set ignore error reference
2899*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetIgnoreErrRef(MS_BOOL bIgnore)2900*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetIgnoreErrRef(MS_BOOL bIgnore)
2901*53ee8cc1Swenshuai.xi {
2902*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2903*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2904*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2905*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2906*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_IGNORE_ERR_REF, bIgnore);
2907*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
2908*53ee8cc1Swenshuai.xi }
2909*53ee8cc1Swenshuai.xi 
2910*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2911*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_ForceFollowDTVSpec()
2912*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off Force follow DTV Spec
2913*53ee8cc1Swenshuai.xi /// @param -b bEnable \b IN :  Enable/ Disable
2914*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable
2915*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable
2916*53ee8cc1Swenshuai.xi /// @return -The result of command set force follow DTV spec
2917*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_ForceFollowDTVSpec(MS_BOOL bEnable)2918*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_ForceFollowDTVSpec(MS_BOOL bEnable)
2919*53ee8cc1Swenshuai.xi {
2920*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2921*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2922*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2923*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2924*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FORCE_DTV_SPEC, bEnable);
2925*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
2926*53ee8cc1Swenshuai.xi }
2927*53ee8cc1Swenshuai.xi 
2928*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2929*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetFastDisplay()
2930*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Turn on / off fast display.
2931*53ee8cc1Swenshuai.xi /// @param -b bFastDisplay \b IN :  Enable/ Disable
2932*53ee8cc1Swenshuai.xi ///                 -FALSE(0): normal display
2933*53ee8cc1Swenshuai.xi ///                 -TRUE(1): fast display
2934*53ee8cc1Swenshuai.xi /// @return -The result of command set fast display
2935*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetFastDisplay(MS_BOOL bFastDisplay)2936*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetFastDisplay(MS_BOOL bFastDisplay)
2937*53ee8cc1Swenshuai.xi {
2938*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
2939*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2940*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
2941*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
2942*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FAST_DISP, bFastDisplay);
2943*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
2944*53ee8cc1Swenshuai.xi }
2945*53ee8cc1Swenshuai.xi // check status
2946*53ee8cc1Swenshuai.xi 
2947*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2948*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsISROccured()
2949*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check if the ISR is occured or not.
2950*53ee8cc1Swenshuai.xi /// @return - Is occured or not
2951*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): interrupt is not occured.
2952*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): interrupt has been occured.
2953*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsISROccured(void)2954*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsISROccured(void)
2955*53ee8cc1Swenshuai.xi {
2956*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2957*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2958*53ee8cc1Swenshuai.xi     return HAL_HVD_IsISROccured();
2959*53ee8cc1Swenshuai.xi }
2960*53ee8cc1Swenshuai.xi 
2961*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2962*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsDispFinish()
2963*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check this file mode display is finish or not. only work after MDrv_HVD_SetDataEnd(TRUE)
2964*53ee8cc1Swenshuai.xi /// @return - Is finish or not
2965*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not finish or Not in file mode playback
2966*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Display Finished.
2967*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsDispFinish(void)2968*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsDispFinish(void)
2969*53ee8cc1Swenshuai.xi {
2970*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
2971*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
2972*53ee8cc1Swenshuai.xi 
2973*53ee8cc1Swenshuai.xi     if( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_LIVE_STREAM)
2974*53ee8cc1Swenshuai.xi     {
2975*53ee8cc1Swenshuai.xi         return FALSE;
2976*53ee8cc1Swenshuai.xi     }
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi     if( gHVDCtrl.u32CtrlMode & HVD_CTRL_DATA_END)
2979*53ee8cc1Swenshuai.xi     {
2980*53ee8cc1Swenshuai.xi         if( _DRV_HVD_IsAllBufferEmpty() )
2981*53ee8cc1Swenshuai.xi         {
2982*53ee8cc1Swenshuai.xi             return TRUE;
2983*53ee8cc1Swenshuai.xi         }
2984*53ee8cc1Swenshuai.xi         else
2985*53ee8cc1Swenshuai.xi         {
2986*53ee8cc1Swenshuai.xi             //_DRV_HVD_PushDummy();
2987*53ee8cc1Swenshuai.xi             return FALSE;
2988*53ee8cc1Swenshuai.xi         }
2989*53ee8cc1Swenshuai.xi     }
2990*53ee8cc1Swenshuai.xi     else
2991*53ee8cc1Swenshuai.xi     {
2992*53ee8cc1Swenshuai.xi         return FALSE;
2993*53ee8cc1Swenshuai.xi     }
2994*53ee8cc1Swenshuai.xi }
2995*53ee8cc1Swenshuai.xi 
2996*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2997*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsFrameShowed()
2998*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD Frame showed after TriggerDisp(TRUE) or first frame showed
2999*53ee8cc1Swenshuai.xi /// @return - Is frame showed or not
3000*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): New Framed showed
3001*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Not showed
3002*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsFrameShowed(void)3003*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsFrameShowed(void)
3004*53ee8cc1Swenshuai.xi {
3005*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3006*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3007*53ee8cc1Swenshuai.xi 
3008*53ee8cc1Swenshuai.xi     if( !HAL_HVD_GetData(E_HVD_GDATA_IS_1ST_FRM_RDY)  )
3009*53ee8cc1Swenshuai.xi     {// 1st frame not ready or AV sync not ready
3010*53ee8cc1Swenshuai.xi         return FALSE;
3011*53ee8cc1Swenshuai.xi     }
3012*53ee8cc1Swenshuai.xi     else
3013*53ee8cc1Swenshuai.xi     {// 1st frame showed or AV sync ready
3014*53ee8cc1Swenshuai.xi         if( _DRV_HVD_Ctrl( HVD_CTRL_DISPLAY_CTRL))
3015*53ee8cc1Swenshuai.xi         {   // control display
3016*53ee8cc1Swenshuai.xi             return (MS_BOOL)HAL_HVD_GetData(E_HVD_GDATA_IS_FRAME_SHOWED);
3017*53ee8cc1Swenshuai.xi         }
3018*53ee8cc1Swenshuai.xi         else
3019*53ee8cc1Swenshuai.xi         { // cotrol decode
3020*53ee8cc1Swenshuai.xi             return TRUE;
3021*53ee8cc1Swenshuai.xi         }
3022*53ee8cc1Swenshuai.xi     }
3023*53ee8cc1Swenshuai.xi }
3024*53ee8cc1Swenshuai.xi 
3025*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3026*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsStepDecodeDone()
3027*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is HVD step decode done after step decode command.
3028*53ee8cc1Swenshuai.xi /// @return - TRUE/FALSE
3029*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoding, or user did not send corresponding step decode command.
3030*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decode done
3031*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsStepDecodeDone(void)3032*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsStepDecodeDone(void)
3033*53ee8cc1Swenshuai.xi {
3034*53ee8cc1Swenshuai.xi     MS_BOOL bRet=FALSE;
3035*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3036*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3037*53ee8cc1Swenshuai.xi 
3038*53ee8cc1Swenshuai.xi     if( gHVDCtrl.bStepDecoding)
3039*53ee8cc1Swenshuai.xi     {
3040*53ee8cc1Swenshuai.xi         if( gHVDCtrl.u32StepDecodeCnt != HAL_HVD_GetData(E_HVD_GDATA_DECODE_CNT) )
3041*53ee8cc1Swenshuai.xi         {
3042*53ee8cc1Swenshuai.xi             gHVDCtrl.u32StepDecodeCnt = 0;
3043*53ee8cc1Swenshuai.xi             bRet= TRUE;
3044*53ee8cc1Swenshuai.xi             gHVDCtrl.bStepDecoding=FALSE;
3045*53ee8cc1Swenshuai.xi         }
3046*53ee8cc1Swenshuai.xi     }
3047*53ee8cc1Swenshuai.xi     return bRet;
3048*53ee8cc1Swenshuai.xi }
3049*53ee8cc1Swenshuai.xi 
3050*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3051*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_CheckDispInfoRdy()
3052*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info ready and correct or not
3053*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
3054*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_CheckDispInfoRdy(void)3055*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CheckDispInfoRdy(void)
3056*53ee8cc1Swenshuai.xi {
3057*53ee8cc1Swenshuai.xi     MS_U32 u32ErrCode=0;
3058*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
3059*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3060*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3061*53ee8cc1Swenshuai.xi 
3062*53ee8cc1Swenshuai.xi     if( !( gHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY) )
3063*53ee8cc1Swenshuai.xi     {
3064*53ee8cc1Swenshuai.xi         if( !HAL_HVD_GetData(E_HVD_GDATA_IS_DISP_INFO_CHANGE) )
3065*53ee8cc1Swenshuai.xi         {
3066*53ee8cc1Swenshuai.xi             return E_HVD_RET_NOTREADY;
3067*53ee8cc1Swenshuai.xi         }
3068*53ee8cc1Swenshuai.xi         else
3069*53ee8cc1Swenshuai.xi         {
3070*53ee8cc1Swenshuai.xi             gHVDCtrl.bIsDispInfoChg=TRUE;
3071*53ee8cc1Swenshuai.xi             _DRV_HVD_SetCtrl(HVD_CTRL_DISP_INFO_RDY);
3072*53ee8cc1Swenshuai.xi         }
3073*53ee8cc1Swenshuai.xi     }
3074*53ee8cc1Swenshuai.xi     // check if FW report error
3075*53ee8cc1Swenshuai.xi     u32ErrCode = HAL_HVD_GetData(E_HVD_GDATA_ERROR_CODE);
3076*53ee8cc1Swenshuai.xi     if( u32ErrCode != 0 )
3077*53ee8cc1Swenshuai.xi     {
3078*53ee8cc1Swenshuai.xi         if( u32ErrCode == E_HVD_ERR_OUT_OF_MEMORY)
3079*53ee8cc1Swenshuai.xi         {
3080*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD Err: FW error that Out of Memory:%lx. Allocated frame buffer size is smaller than required.\n" , u32ErrCode );
3081*53ee8cc1Swenshuai.xi             gHVDCtrl.bIsDispInfoChg=FALSE;
3082*53ee8cc1Swenshuai.xi             return E_HVD_RET_OUTOF_MEMORY;
3083*53ee8cc1Swenshuai.xi         }
3084*53ee8cc1Swenshuai.xi     }
3085*53ee8cc1Swenshuai.xi     //>> move to FW
3086*53ee8cc1Swenshuai.xi     #if 0
3087*53ee8cc1Swenshuai.xi     if( (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK) == HVD_INIT_HW_AVC )
3088*53ee8cc1Swenshuai.xi     {
3089*53ee8cc1Swenshuai.xi         MS_U32 u32MaxFS = 0, u32FS = 0;
3090*53ee8cc1Swenshuai.xi         MS_U8 u8LevelIdc = HAL_HVD_GetData(E_HVD_GDATA_AVC_LEVEL_IDC);
3091*53ee8cc1Swenshuai.xi         MS_U32 u32Width, u32Height;
3092*53ee8cc1Swenshuai.xi         HVD_Display_Info *pDispInfo  = (HVD_Display_Info *)HAL_HVD_GetData(E_HVD_GDATA_DISP_INFO_ADDR);
3093*53ee8cc1Swenshuai.xi         u32Height = pDispInfo->u16VerSize;
3094*53ee8cc1Swenshuai.xi         u32Width = pDispInfo->u16VerSize;
3095*53ee8cc1Swenshuai.xi         u32FS = (u32Width / 16) * (u32Height / 16);
3096*53ee8cc1Swenshuai.xi 
3097*53ee8cc1Swenshuai.xi         switch(u8LevelIdc)
3098*53ee8cc1Swenshuai.xi         {
3099*53ee8cc1Swenshuai.xi             case 10:
3100*53ee8cc1Swenshuai.xi                 u32MaxFS = 99;
3101*53ee8cc1Swenshuai.xi                 break;
3102*53ee8cc1Swenshuai.xi             case 11:
3103*53ee8cc1Swenshuai.xi             case 12:
3104*53ee8cc1Swenshuai.xi             case 13:
3105*53ee8cc1Swenshuai.xi             case 20:
3106*53ee8cc1Swenshuai.xi                 u32MaxFS = 396;
3107*53ee8cc1Swenshuai.xi                 break;
3108*53ee8cc1Swenshuai.xi             case 21:
3109*53ee8cc1Swenshuai.xi                 u32MaxFS = 792;
3110*53ee8cc1Swenshuai.xi                 break;
3111*53ee8cc1Swenshuai.xi             case 22:
3112*53ee8cc1Swenshuai.xi             case 30:
3113*53ee8cc1Swenshuai.xi                 u32MaxFS = 1620;
3114*53ee8cc1Swenshuai.xi                 break;
3115*53ee8cc1Swenshuai.xi             case 31:
3116*53ee8cc1Swenshuai.xi                 u32MaxFS = 3600;
3117*53ee8cc1Swenshuai.xi                 break;
3118*53ee8cc1Swenshuai.xi             case 32:
3119*53ee8cc1Swenshuai.xi                 u32MaxFS = 5120;
3120*53ee8cc1Swenshuai.xi                 break;
3121*53ee8cc1Swenshuai.xi             case 40:
3122*53ee8cc1Swenshuai.xi             case 41:
3123*53ee8cc1Swenshuai.xi                 u32MaxFS = 8192;
3124*53ee8cc1Swenshuai.xi                 break;
3125*53ee8cc1Swenshuai.xi             case 42:
3126*53ee8cc1Swenshuai.xi                 u32MaxFS = 8704;
3127*53ee8cc1Swenshuai.xi                 break;
3128*53ee8cc1Swenshuai.xi             case 50:
3129*53ee8cc1Swenshuai.xi                 u32MaxFS = 22080;
3130*53ee8cc1Swenshuai.xi                 break;
3131*53ee8cc1Swenshuai.xi             case 51:
3132*53ee8cc1Swenshuai.xi                 u32MaxFS = 36864;
3133*53ee8cc1Swenshuai.xi                 break;
3134*53ee8cc1Swenshuai.xi             default:
3135*53ee8cc1Swenshuai.xi                 u32MaxFS = 0xFFFFFFFF;
3136*53ee8cc1Swenshuai.xi                 break;
3137*53ee8cc1Swenshuai.xi         }
3138*53ee8cc1Swenshuai.xi 
3139*53ee8cc1Swenshuai.xi         if(u32FS > u32MaxFS)
3140*53ee8cc1Swenshuai.xi         {
3141*53ee8cc1Swenshuai.xi             HVD_MSG_DEG("HVD Err : SPS over spec,level = %d u32FS = %lu u32MaxFS = %lu\n", u8LevelIdc ,  u32FS, u32MaxFS);
3142*53ee8cc1Swenshuai.xi             gHVDCtrl.bIsDispInfoChg=FALSE;
3143*53ee8cc1Swenshuai.xi             return E_HVD_RET_UNSUPPORTED;
3144*53ee8cc1Swenshuai.xi         }
3145*53ee8cc1Swenshuai.xi     }
3146*53ee8cc1Swenshuai.xi     #endif
3147*53ee8cc1Swenshuai.xi     return E_HVD_OK;
3148*53ee8cc1Swenshuai.xi }
3149*53ee8cc1Swenshuai.xi 
3150*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3151*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsDispInfoChg()
3152*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info is changed or not
3153*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3154*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not changed
3155*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): changed
3156*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsDispInfoChg(void)3157*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsDispInfoChg(void)
3158*53ee8cc1Swenshuai.xi {
3159*53ee8cc1Swenshuai.xi     MS_BOOL bRet=FALSE;
3160*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3161*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3162*53ee8cc1Swenshuai.xi 
3163*53ee8cc1Swenshuai.xi     bRet = (MS_BOOL)HAL_HVD_GetData(E_HVD_GDATA_IS_DISP_INFO_CHANGE);
3164*53ee8cc1Swenshuai.xi     if( bRet )
3165*53ee8cc1Swenshuai.xi     {
3166*53ee8cc1Swenshuai.xi         gHVDCtrl.bIsDispInfoChg = TRUE;
3167*53ee8cc1Swenshuai.xi         _DRV_HVD_SetCtrl(HVD_CTRL_DISP_INFO_RDY);
3168*53ee8cc1Swenshuai.xi     }
3169*53ee8cc1Swenshuai.xi     #if 0 // debug use
3170*53ee8cc1Swenshuai.xi     {
3171*53ee8cc1Swenshuai.xi         static MS_U32 u32DecodeCnt=0;
3172*53ee8cc1Swenshuai.xi         static MS_U32 u32IdleCnt=0;
3173*53ee8cc1Swenshuai.xi         MS_U32 tmp =0 ;
3174*53ee8cc1Swenshuai.xi         tmp = MDrv_HVD_GetDecodeCnt();
3175*53ee8cc1Swenshuai.xi         if( u32DecodeCnt != tmp )
3176*53ee8cc1Swenshuai.xi         {
3177*53ee8cc1Swenshuai.xi             printf( "%lu decode cnt:%lx PTS:%lx\n" , (MS_U32)bRet ,tmp ,  MDrv_HVD_GetPTS() );
3178*53ee8cc1Swenshuai.xi             u32DecodeCnt =tmp;
3179*53ee8cc1Swenshuai.xi         }
3180*53ee8cc1Swenshuai.xi         else
3181*53ee8cc1Swenshuai.xi         {
3182*53ee8cc1Swenshuai.xi             u32IdleCnt++;
3183*53ee8cc1Swenshuai.xi         }
3184*53ee8cc1Swenshuai.xi         if( u32IdleCnt > 1000)
3185*53ee8cc1Swenshuai.xi         {
3186*53ee8cc1Swenshuai.xi             printf( "HVD: seems IDLE: %lu decode cnt:%lx PTS:%lx\n" , (MS_U32)bRet  ,tmp ,  MDrv_HVD_GetPTS() );
3187*53ee8cc1Swenshuai.xi             u32IdleCnt=0;
3188*53ee8cc1Swenshuai.xi         }
3189*53ee8cc1Swenshuai.xi     }
3190*53ee8cc1Swenshuai.xi     #endif
3191*53ee8cc1Swenshuai.xi     return bRet;
3192*53ee8cc1Swenshuai.xi }
3193*53ee8cc1Swenshuai.xi 
3194*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3195*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsIdle()
3196*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder is idle or not
3197*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3198*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not idle
3199*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is idle
3200*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsIdle(void)3201*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsIdle(void)
3202*53ee8cc1Swenshuai.xi {
3203*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3204*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3205*53ee8cc1Swenshuai.xi 
3206*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_VPU_IDLE_CNT) > HVD_FW_IDLE_THRESHOLD )
3207*53ee8cc1Swenshuai.xi     {
3208*53ee8cc1Swenshuai.xi         return TRUE;
3209*53ee8cc1Swenshuai.xi     }
3210*53ee8cc1Swenshuai.xi     else
3211*53ee8cc1Swenshuai.xi     {
3212*53ee8cc1Swenshuai.xi         return FALSE;
3213*53ee8cc1Swenshuai.xi     }
3214*53ee8cc1Swenshuai.xi }
3215*53ee8cc1Swenshuai.xi 
3216*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3217*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsSyncStart()
3218*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder starts to do sync action(drop or repeat) or not.
3219*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3220*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not doing sync action
3221*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is doing sync action
3222*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsSyncStart(void)3223*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsSyncStart(void)
3224*53ee8cc1Swenshuai.xi {
3225*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3226*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3227*53ee8cc1Swenshuai.xi 
3228*53ee8cc1Swenshuai.xi     if( (MS_BOOL)MDrv_HVD_GetPlayMode(E_HVD_GMODE_IS_SYNC_ON) == FALSE)
3229*53ee8cc1Swenshuai.xi     {
3230*53ee8cc1Swenshuai.xi         return FALSE;
3231*53ee8cc1Swenshuai.xi     }
3232*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_IS_SYNC_START)  )
3233*53ee8cc1Swenshuai.xi     {
3234*53ee8cc1Swenshuai.xi         return TRUE;
3235*53ee8cc1Swenshuai.xi     }
3236*53ee8cc1Swenshuai.xi     else
3237*53ee8cc1Swenshuai.xi     {
3238*53ee8cc1Swenshuai.xi         return FALSE;
3239*53ee8cc1Swenshuai.xi     }
3240*53ee8cc1Swenshuai.xi }
3241*53ee8cc1Swenshuai.xi 
3242*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3243*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsSyncReach()
3244*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: The distance of Video time stamp and STC is closed enough.
3245*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3246*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): The distance is not shorter than sync tolerance.
3247*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): The distance is shorter than sync tolerance.
3248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsSyncReach(void)3249*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsSyncReach(void)
3250*53ee8cc1Swenshuai.xi {
3251*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3252*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3253*53ee8cc1Swenshuai.xi 
3254*53ee8cc1Swenshuai.xi     if( (MS_BOOL)MDrv_HVD_GetPlayMode(E_HVD_GMODE_IS_SYNC_ON) == FALSE)
3255*53ee8cc1Swenshuai.xi     {
3256*53ee8cc1Swenshuai.xi         return FALSE;
3257*53ee8cc1Swenshuai.xi     }
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_IS_SYNC_REACH)  )
3260*53ee8cc1Swenshuai.xi     {
3261*53ee8cc1Swenshuai.xi         return TRUE;
3262*53ee8cc1Swenshuai.xi     }
3263*53ee8cc1Swenshuai.xi     else
3264*53ee8cc1Swenshuai.xi     {
3265*53ee8cc1Swenshuai.xi         return FALSE;
3266*53ee8cc1Swenshuai.xi     }
3267*53ee8cc1Swenshuai.xi }
3268*53ee8cc1Swenshuai.xi 
3269*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3270*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsLowDelay()
3271*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if current stream has low delay flag in SPS.
3272*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3273*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
3274*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
3275*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsLowDelay(void)3276*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsLowDelay(void)
3277*53ee8cc1Swenshuai.xi {
3278*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3279*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3280*53ee8cc1Swenshuai.xi 
3281*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_AVC_LOW_DELAY)  )
3282*53ee8cc1Swenshuai.xi     {
3283*53ee8cc1Swenshuai.xi         return TRUE;
3284*53ee8cc1Swenshuai.xi     }
3285*53ee8cc1Swenshuai.xi     else
3286*53ee8cc1Swenshuai.xi     {
3287*53ee8cc1Swenshuai.xi         return FALSE;
3288*53ee8cc1Swenshuai.xi     }
3289*53ee8cc1Swenshuai.xi }
3290*53ee8cc1Swenshuai.xi 
3291*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3292*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsIFrmFound()
3293*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if I frame found after Init() or flush().
3294*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3295*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): I frame is not found.
3296*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): I frame has been found.
3297*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsIFrmFound(void)3298*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsIFrmFound(void)
3299*53ee8cc1Swenshuai.xi {
3300*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3301*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3302*53ee8cc1Swenshuai.xi 
3303*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_IS_I_FRM_FOUND)  )
3304*53ee8cc1Swenshuai.xi     {
3305*53ee8cc1Swenshuai.xi         return TRUE;
3306*53ee8cc1Swenshuai.xi     }
3307*53ee8cc1Swenshuai.xi     else
3308*53ee8cc1Swenshuai.xi     {
3309*53ee8cc1Swenshuai.xi         return FALSE;
3310*53ee8cc1Swenshuai.xi     }
3311*53ee8cc1Swenshuai.xi }
3312*53ee8cc1Swenshuai.xi 
3313*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3314*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_Is1stFrmRdy()
3315*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if first frame showed on screen after Init() or flush().
3316*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3317*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): First frame is not showed.
3318*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): First frame is showed.
3319*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_Is1stFrmRdy(void)3320*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_Is1stFrmRdy(void)
3321*53ee8cc1Swenshuai.xi {
3322*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3323*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3324*53ee8cc1Swenshuai.xi 
3325*53ee8cc1Swenshuai.xi     if( HAL_HVD_GetData(E_HVD_GDATA_IS_1ST_FRM_RDY)  )
3326*53ee8cc1Swenshuai.xi     {
3327*53ee8cc1Swenshuai.xi         return TRUE;
3328*53ee8cc1Swenshuai.xi     }
3329*53ee8cc1Swenshuai.xi     else
3330*53ee8cc1Swenshuai.xi     {
3331*53ee8cc1Swenshuai.xi         return FALSE;
3332*53ee8cc1Swenshuai.xi     }
3333*53ee8cc1Swenshuai.xi }
3334*53ee8cc1Swenshuai.xi 
3335*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3336*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsAllBufferEmpty()
3337*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if all of the buffers(display, decoded, BBU, bitstream) are empty.
3338*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3339*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not Empty.
3340*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Empty.
3341*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsAllBufferEmpty(void)3342*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_IsAllBufferEmpty(void)
3343*53ee8cc1Swenshuai.xi {
3344*53ee8cc1Swenshuai.xi     //HVD_MSG_TRACE();
3345*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3346*53ee8cc1Swenshuai.xi 
3347*53ee8cc1Swenshuai.xi     if( _DRV_HVD_IsAllBufferEmpty() )
3348*53ee8cc1Swenshuai.xi     {
3349*53ee8cc1Swenshuai.xi         return TRUE;
3350*53ee8cc1Swenshuai.xi     }
3351*53ee8cc1Swenshuai.xi     else
3352*53ee8cc1Swenshuai.xi     {
3353*53ee8cc1Swenshuai.xi         return FALSE;
3354*53ee8cc1Swenshuai.xi     }
3355*53ee8cc1Swenshuai.xi     #if 0
3356*53ee8cc1Swenshuai.xi     if( u32Times > 200 )
3357*53ee8cc1Swenshuai.xi     {
3358*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD Info: Flush() timeout failed:BBU:%lu Dec:%lu Disp:%lu Idle:%lu ESr:%lx ESw:%lx  \n" ,
3359*53ee8cc1Swenshuai.xi             HAL_HVD_GetData(E_HVD_GDATA_BBU_Q_NUMB) ,
3360*53ee8cc1Swenshuai.xi             HAL_HVD_GetData(E_HVD_GDATA_DEC_Q_NUMB),
3361*53ee8cc1Swenshuai.xi             HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_NUMB),
3362*53ee8cc1Swenshuai.xi             HAL_HVD_GetData(E_HVD_GDATA_VPU_IDLE_CNT),
3363*53ee8cc1Swenshuai.xi             HAL_HVD_GetData( E_HVD_GDATA_ES_READ_PTR),
3364*53ee8cc1Swenshuai.xi             HAL_HVD_GetData( E_HVD_GDATA_ES_WRITE_PTR) );
3365*53ee8cc1Swenshuai.xi         eRet = E_HVD_FAIL;
3366*53ee8cc1Swenshuai.xi         break;
3367*53ee8cc1Swenshuai.xi     }
3368*53ee8cc1Swenshuai.xi     return TRUE;
3369*53ee8cc1Swenshuai.xi     #endif
3370*53ee8cc1Swenshuai.xi }
3371*53ee8cc1Swenshuai.xi 
3372*53ee8cc1Swenshuai.xi // get infomation
3373*53ee8cc1Swenshuai.xi 
3374*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3375*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetBBUVacancy()
3376*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the vacancy of BBU queue.
3377*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3378*53ee8cc1Swenshuai.xi /// @retval     -0: queue is full.
3379*53ee8cc1Swenshuai.xi /// @retval     -not zero: queue is not full.
3380*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetBBUVacancy(void)3381*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetBBUVacancy(void)
3382*53ee8cc1Swenshuai.xi {
3383*53ee8cc1Swenshuai.xi     MS_U32 u32BBUQnumb=0;
3384*53ee8cc1Swenshuai.xi     MS_U32 u32BBUTotal=0;
3385*53ee8cc1Swenshuai.xi     MS_U32 u32PTSQnumb=0;
3386*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3387*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3388*53ee8cc1Swenshuai.xi     u32BBUTotal = HAL_HVD_GetData(E_HVD_GDATA_FW_BBU_TOTAL_TBL_ENTRY);
3389*53ee8cc1Swenshuai.xi     u32BBUQnumb = HAL_HVD_GetData(E_HVD_GDATA_BBU_Q_NUMB);
3390*53ee8cc1Swenshuai.xi     if( u32BBUTotal <= u32BBUQnumb )
3391*53ee8cc1Swenshuai.xi     {
3392*53ee8cc1Swenshuai.xi         //HVD_MSG_ERR("HVD err: GetBBUVacancy has error that total number(%lx) is smaller than current number(%lx)\n" , u32BBUTotal, u32BBUQnumb);
3393*53ee8cc1Swenshuai.xi         u32BBUQnumb=0;
3394*53ee8cc1Swenshuai.xi     }
3395*53ee8cc1Swenshuai.xi     else
3396*53ee8cc1Swenshuai.xi     {
3397*53ee8cc1Swenshuai.xi         u32BBUQnumb = u32BBUTotal - u32BBUQnumb;
3398*53ee8cc1Swenshuai.xi     }
3399*53ee8cc1Swenshuai.xi     if( u32BBUQnumb )
3400*53ee8cc1Swenshuai.xi     {
3401*53ee8cc1Swenshuai.xi         u32BBUTotal=HAL_HVD_GetData(E_HVD_GDATA_FW_PTS_TOTAL_ENTRY_NUMB) - 1; // add -1 for full case
3402*53ee8cc1Swenshuai.xi         u32PTSQnumb=HAL_HVD_GetData(E_HVD_GDATA_PTS_Q_NUMB);
3403*53ee8cc1Swenshuai.xi         if( u32BBUTotal <= u32PTSQnumb  )
3404*53ee8cc1Swenshuai.xi         {
3405*53ee8cc1Swenshuai.xi             HVD_MSG_DEG("HVD Warn: GetBBUVacancy has error that total PTS Q number(%lx) is smaller than current PTS Q number(%lx)\n" , u32BBUTotal, u32PTSQnumb);
3406*53ee8cc1Swenshuai.xi             u32BBUQnumb=0;
3407*53ee8cc1Swenshuai.xi         }
3408*53ee8cc1Swenshuai.xi     }
3409*53ee8cc1Swenshuai.xi     return u32BBUQnumb;
3410*53ee8cc1Swenshuai.xi }
3411*53ee8cc1Swenshuai.xi 
3412*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3413*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDispInfo()
3414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get video display information
3415*53ee8cc1Swenshuai.xi /// @param -pinfo \b OUT : pointer to video display information.
3416*53ee8cc1Swenshuai.xi /// @return -The result of command get display information
3417*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDispInfo(HVD_Disp_Info * pinfo)3418*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GetDispInfo( HVD_Disp_Info *pinfo )
3419*53ee8cc1Swenshuai.xi {
3420*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
3421*53ee8cc1Swenshuai.xi     eRet = _DRV_HVD_GetDispInfo(pinfo, TRUE);
3422*53ee8cc1Swenshuai.xi 
3423*53ee8cc1Swenshuai.xi #if HVD_ENABLE_RV_FEATURE
3424*53ee8cc1Swenshuai.xi     if(E_HVD_OK == eRet)
3425*53ee8cc1Swenshuai.xi     {
3426*53ee8cc1Swenshuai.xi         if(HVD_INIT_HW_RM == (gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
3427*53ee8cc1Swenshuai.xi         {  //RM is always displayed by 60 frames per sec.
3428*53ee8cc1Swenshuai.xi             pinfo->u32FrameRate = 60000;
3429*53ee8cc1Swenshuai.xi             HVD_MSG_DEG("rm force set 60fps\n");
3430*53ee8cc1Swenshuai.xi         }
3431*53ee8cc1Swenshuai.xi     }
3432*53ee8cc1Swenshuai.xi #endif
3433*53ee8cc1Swenshuai.xi     return eRet;
3434*53ee8cc1Swenshuai.xi }
3435*53ee8cc1Swenshuai.xi 
3436*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3437*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetPtsStcDiff()
3438*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get the difference of PTS and STC
3439*53ee8cc1Swenshuai.xi /// @return - PTS
3440*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetPtsStcDiff(void)3441*53ee8cc1Swenshuai.xi MS_S64 MDrv_HVD_GetPtsStcDiff(void)
3442*53ee8cc1Swenshuai.xi {
3443*53ee8cc1Swenshuai.xi     MS_S64 s64PTS = 0;
3444*53ee8cc1Swenshuai.xi 
3445*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3446*53ee8cc1Swenshuai.xi 
3447*53ee8cc1Swenshuai.xi     s64PTS = HAL_HVD_GetData_EX(E_HVD_GDATA_PTS_STC_DIFF);
3448*53ee8cc1Swenshuai.xi 
3449*53ee8cc1Swenshuai.xi     return s64PTS;
3450*53ee8cc1Swenshuai.xi }
3451*53ee8cc1Swenshuai.xi 
3452*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3453*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetPTS()
3454*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of current displayed video frame. unit: ms
3455*53ee8cc1Swenshuai.xi /// @return - PTS
3456*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetPTS(void)3457*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetPTS(void)
3458*53ee8cc1Swenshuai.xi {
3459*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
3460*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3461*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_GetData(E_HVD_GDATA_PTS);
3462*53ee8cc1Swenshuai.xi     return u32PTS;
3463*53ee8cc1Swenshuai.xi }
3464*53ee8cc1Swenshuai.xi 
3465*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3466*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetNextPTS()
3467*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of next displayed video frame. unit: ms
3468*53ee8cc1Swenshuai.xi /// @return - PTS
3469*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetNextPTS(void)3470*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetNextPTS(void)
3471*53ee8cc1Swenshuai.xi {
3472*53ee8cc1Swenshuai.xi     MS_U32 u32PTS = 0;
3473*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3474*53ee8cc1Swenshuai.xi     u32PTS = HAL_HVD_GetData(E_HVD_GDATA_NEXT_PTS);
3475*53ee8cc1Swenshuai.xi     return u32PTS;
3476*53ee8cc1Swenshuai.xi }
3477*53ee8cc1Swenshuai.xi 
3478*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3479*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetNextDispQPtr()
3480*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pointer of next displayed video frame.
3481*53ee8cc1Swenshuai.xi /// @return - Pointer in the display queue
3482*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetNextDispQPtr(void)3483*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetNextDispQPtr(void)
3484*53ee8cc1Swenshuai.xi {
3485*53ee8cc1Swenshuai.xi     MS_U32 u32Ptr = 0;
3486*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3487*53ee8cc1Swenshuai.xi     //printf("GetNextDispQPtr DqNum=%ld, DqPtr=%ld\n", HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_NUMB), HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_PTR));
3488*53ee8cc1Swenshuai.xi     //if (HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_NUMB) != 0)
3489*53ee8cc1Swenshuai.xi     {
3490*53ee8cc1Swenshuai.xi         u32Ptr = HAL_HVD_GetData(E_HVD_GDATA_DISP_Q_PTR);
3491*53ee8cc1Swenshuai.xi     }
3492*53ee8cc1Swenshuai.xi     return u32Ptr;
3493*53ee8cc1Swenshuai.xi }
3494*53ee8cc1Swenshuai.xi 
3495*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3496*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDataErrCnt()
3497*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated data Error Count
3498*53ee8cc1Swenshuai.xi /// @return -data error count
3499*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDataErrCnt(void)3500*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDataErrCnt(void)
3501*53ee8cc1Swenshuai.xi {
3502*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3503*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_DATA_ERROR_CNT);
3504*53ee8cc1Swenshuai.xi }
3505*53ee8cc1Swenshuai.xi 
3506*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3507*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDecErrCnt()
3508*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decode Error Count
3509*53ee8cc1Swenshuai.xi /// @return -decode error count
3510*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDecErrCnt(void)3511*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDecErrCnt(void)
3512*53ee8cc1Swenshuai.xi {
3513*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3514*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_DEC_ERROR_CNT);
3515*53ee8cc1Swenshuai.xi }
3516*53ee8cc1Swenshuai.xi 
3517*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3518*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetESWritePtr()
3519*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer write point
3520*53ee8cc1Swenshuai.xi /// @return - ES buffer write point offset from bitstream buffer base
3521*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetESWritePtr(void)3522*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetESWritePtr(void)
3523*53ee8cc1Swenshuai.xi {
3524*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3525*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_ES_WRITE_PTR);
3526*53ee8cc1Swenshuai.xi }
3527*53ee8cc1Swenshuai.xi 
3528*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3529*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetESReadPtr()
3530*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer read point
3531*53ee8cc1Swenshuai.xi /// @return - ES buffer read point offset from bitstream buffer base
3532*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetESReadPtr(void)3533*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetESReadPtr(void)
3534*53ee8cc1Swenshuai.xi {
3535*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3536*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_ES_READ_PTR);
3537*53ee8cc1Swenshuai.xi }
3538*53ee8cc1Swenshuai.xi #define FATAL_ERROR(x) ((x)==E_HVD_RETURN_OUTOF_MEMORY)
3539*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3540*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetErrCode()
3541*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get error code
3542*53ee8cc1Swenshuai.xi /// @return - error code number
3543*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetErrCode(void)3544*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetErrCode(void)
3545*53ee8cc1Swenshuai.xi {
3546*53ee8cc1Swenshuai.xi // TODO: define driver error code  for upper layer
3547*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3548*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3549*53ee8cc1Swenshuai.xi 
3550*53ee8cc1Swenshuai.xi     u32Ret = HAL_HVD_GetData(E_HVD_GDATA_ERROR_CODE);
3551*53ee8cc1Swenshuai.xi #if 1
3552*53ee8cc1Swenshuai.xi     if (!FATAL_ERROR(u32Ret))
3553*53ee8cc1Swenshuai.xi     {
3554*53ee8cc1Swenshuai.xi         HAL_HVD_SetData(E_HVD_SDATA_ERROR_CODE , 0);
3555*53ee8cc1Swenshuai.xi     }
3556*53ee8cc1Swenshuai.xi #endif
3557*53ee8cc1Swenshuai.xi     gHVDCtrl.u32LastErrCode = u32Ret;
3558*53ee8cc1Swenshuai.xi     return u32Ret;
3559*53ee8cc1Swenshuai.xi }
3560*53ee8cc1Swenshuai.xi 
3561*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3562*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetPlayMode()
3563*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current play mode status.
3564*53ee8cc1Swenshuai.xi /// @param -eMode \b IN : Mode type.
3565*53ee8cc1Swenshuai.xi /// @return - mode status
3566*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetPlayMode(HVD_Get_Mode_Status eMode)3567*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetPlayMode(HVD_Get_Mode_Status eMode)
3568*53ee8cc1Swenshuai.xi {
3569*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3570*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3571*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3572*53ee8cc1Swenshuai.xi     switch( eMode )
3573*53ee8cc1Swenshuai.xi     {
3574*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_SHOW_ERR_FRM:
3575*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_REPEAT_LAST_FIELD:
3576*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_ERR_CONCEAL:
3577*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_SYNC_ON:
3578*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_PLAYBACK_FINISH:
3579*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_SYNC_MODE:
3580*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_SKIP_MODE:
3581*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_DROP_MODE:
3582*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_DISPLAY_SPEED:
3583*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_FRC_MODE:
3584*53ee8cc1Swenshuai.xi         // TODO: add isr type here
3585*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_ISR_TYPE:
3586*53ee8cc1Swenshuai.xi         u32Ret=HAL_HVD_GetData( (HVD_GetData)((MS_U32)eMode+ (MS_U32)E_HVD_GDATA_IS_SHOW_ERR_FRM));
3587*53ee8cc1Swenshuai.xi         break;
3588*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_IS_STEP_DISPLAY:
3589*53ee8cc1Swenshuai.xi         u32Ret = _DRV_HVD_Ctrl(HVD_CTRL_DISPLAY_CTRL);
3590*53ee8cc1Swenshuai.xi         break;
3591*53ee8cc1Swenshuai.xi     case E_HVD_GMODE_STREAM_TYPE:
3592*53ee8cc1Swenshuai.xi         u32Ret = gHVDCtrl.InitParams.u32ModeFlag & E_HVD_INIT_MAIN_MASK;
3593*53ee8cc1Swenshuai.xi         break;
3594*53ee8cc1Swenshuai.xi     default:
3595*53ee8cc1Swenshuai.xi         break;
3596*53ee8cc1Swenshuai.xi     }
3597*53ee8cc1Swenshuai.xi     return u32Ret;
3598*53ee8cc1Swenshuai.xi }
3599*53ee8cc1Swenshuai.xi 
3600*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3601*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetPlayState()
3602*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get current play state
3603*53ee8cc1Swenshuai.xi /// @return - play state
3604*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetPlayState(void)3605*53ee8cc1Swenshuai.xi HVD_Get_Play_State MDrv_HVD_GetPlayState(void)
3606*53ee8cc1Swenshuai.xi {
3607*53ee8cc1Swenshuai.xi     MS_U32 u32FWstate=0;
3608*53ee8cc1Swenshuai.xi     HVD_Get_Play_State eRet=E_HVD_GSTATE_INIT;
3609*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3610*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3611*53ee8cc1Swenshuai.xi     u32FWstate=HAL_HVD_GetData(E_HVD_GDATA_FW_STATE);
3612*53ee8cc1Swenshuai.xi     u32FWstate &= E_HVD_FW_STATE_MASK;
3613*53ee8cc1Swenshuai.xi     switch( u32FWstate )
3614*53ee8cc1Swenshuai.xi     {
3615*53ee8cc1Swenshuai.xi     case E_HVD_FW_INIT:
3616*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_INIT;
3617*53ee8cc1Swenshuai.xi         break;
3618*53ee8cc1Swenshuai.xi     case E_HVD_FW_PLAY:
3619*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_PLAY;
3620*53ee8cc1Swenshuai.xi         break;
3621*53ee8cc1Swenshuai.xi     case E_HVD_FW_PAUSE:
3622*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_PAUSE;
3623*53ee8cc1Swenshuai.xi         break;
3624*53ee8cc1Swenshuai.xi     case E_HVD_FW_STOP:
3625*53ee8cc1Swenshuai.xi         eRet = E_HVD_GSTATE_STOP;
3626*53ee8cc1Swenshuai.xi         break;
3627*53ee8cc1Swenshuai.xi     default:
3628*53ee8cc1Swenshuai.xi         break;
3629*53ee8cc1Swenshuai.xi     }
3630*53ee8cc1Swenshuai.xi     return eRet;
3631*53ee8cc1Swenshuai.xi }
3632*53ee8cc1Swenshuai.xi 
3633*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3634*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDecodeCnt()
3635*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decoded frame Count
3636*53ee8cc1Swenshuai.xi /// @return - decoded frame Count
3637*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDecodeCnt(void)3638*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDecodeCnt(void)
3639*53ee8cc1Swenshuai.xi {
3640*53ee8cc1Swenshuai.xi     //HVD_MSG_TRACE();
3641*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3642*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_DECODE_CNT);
3643*53ee8cc1Swenshuai.xi }
3644*53ee8cc1Swenshuai.xi 
3645*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3646*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetActiveFormat()
3647*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current AFD ID
3648*53ee8cc1Swenshuai.xi /// @return - AFD ID, 0xFF:invalid value
3649*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetActiveFormat(void)3650*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_GetActiveFormat(void)
3651*53ee8cc1Swenshuai.xi {
3652*53ee8cc1Swenshuai.xi     HVD_Display_Info *pDispInfo = NULL;
3653*53ee8cc1Swenshuai.xi 
3654*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3655*53ee8cc1Swenshuai.xi 
3656*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(~0);
3657*53ee8cc1Swenshuai.xi 
3658*53ee8cc1Swenshuai.xi     if (!(gHVDCtrl.u32CtrlMode & HVD_CTRL_DISP_INFO_RDY))
3659*53ee8cc1Swenshuai.xi     {
3660*53ee8cc1Swenshuai.xi         return 0;
3661*53ee8cc1Swenshuai.xi     }
3662*53ee8cc1Swenshuai.xi 
3663*53ee8cc1Swenshuai.xi     pDispInfo = (HVD_Display_Info *) HAL_HVD_GetData(E_HVD_GDATA_DISP_INFO_ADDR);
3664*53ee8cc1Swenshuai.xi 
3665*53ee8cc1Swenshuai.xi     if (pDispInfo != NULL)
3666*53ee8cc1Swenshuai.xi     {
3667*53ee8cc1Swenshuai.xi         return pDispInfo->u8AFD;
3668*53ee8cc1Swenshuai.xi     }
3669*53ee8cc1Swenshuai.xi     else
3670*53ee8cc1Swenshuai.xi     {
3671*53ee8cc1Swenshuai.xi         return ~0;
3672*53ee8cc1Swenshuai.xi     }
3673*53ee8cc1Swenshuai.xi }
3674*53ee8cc1Swenshuai.xi 
3675*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3676*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetInfo()
3677*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver.
3678*53ee8cc1Swenshuai.xi /// @return - driver information
3679*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetInfo(void)3680*53ee8cc1Swenshuai.xi const HVD_DrvInfo* MDrv_HVD_GetInfo( void )
3681*53ee8cc1Swenshuai.xi {
3682*53ee8cc1Swenshuai.xi     DrvInfo.bAVC=MDrv_HVD_GetCaps( E_HVD_AVC);
3683*53ee8cc1Swenshuai.xi     DrvInfo.bAVS=MDrv_HVD_GetCaps( E_HVD_AVS);
3684*53ee8cc1Swenshuai.xi     DrvInfo.bRM=MDrv_HVD_GetCaps( E_HVD_RM);
3685*53ee8cc1Swenshuai.xi     DrvInfo.FWversion=HVD_FW_VERSION;
3686*53ee8cc1Swenshuai.xi     return (&DrvInfo);
3687*53ee8cc1Swenshuai.xi }
3688*53ee8cc1Swenshuai.xi 
3689*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3690*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetLibVer()
3691*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get verion ID of HVD library.
3692*53ee8cc1Swenshuai.xi /// @param -pVerString \b OUT : pointer to HVD driver version ID.
3693*53ee8cc1Swenshuai.xi /// @return - driver library verion ID
3694*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetLibVer(const MSIF_Version ** ppVersion)3695*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GetLibVer(const MSIF_Version **ppVersion)
3696*53ee8cc1Swenshuai.xi {
3697*53ee8cc1Swenshuai.xi     if (!ppVersion)
3698*53ee8cc1Swenshuai.xi     {
3699*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
3700*53ee8cc1Swenshuai.xi     }
3701*53ee8cc1Swenshuai.xi 
3702*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_hvd_version;
3703*53ee8cc1Swenshuai.xi     return E_HVD_OK;
3704*53ee8cc1Swenshuai.xi }
3705*53ee8cc1Swenshuai.xi 
3706*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3707*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetStatus()
3708*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get status of HVD driver
3709*53ee8cc1Swenshuai.xi /// @param -pstatus \b OUT : driver status
3710*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
3711*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Low delay flag not found.
3712*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Low delay flag found.
3713*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetStatus(HVD_DrvStatus * pstatus)3714*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_GetStatus( HVD_DrvStatus *pstatus)
3715*53ee8cc1Swenshuai.xi {
3716*53ee8cc1Swenshuai.xi     if( pstatus ==  NULL )
3717*53ee8cc1Swenshuai.xi     {
3718*53ee8cc1Swenshuai.xi         return FALSE;
3719*53ee8cc1Swenshuai.xi     }
3720*53ee8cc1Swenshuai.xi     pstatus->bInit = gHVDCtrl.u32CtrlMode&HVD_CTRL_INIT_FINISHED;
3721*53ee8cc1Swenshuai.xi     pstatus->bBusy = gHVDCtrl.u32CtrlMode&HVD_CTRL_PROCESSING;
3722*53ee8cc1Swenshuai.xi     return TRUE;
3723*53ee8cc1Swenshuai.xi }
3724*53ee8cc1Swenshuai.xi 
3725*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3726*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmInfo()
3727*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current displayed or decoded frame information of HVD driver
3728*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
3729*53ee8cc1Swenshuai.xi /// @param -pInfo \b OUT : frame information
3730*53ee8cc1Swenshuai.xi /// @return -The result of command get frame information
3731*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetFrmInfo(HVD_Get_Frm_Info_Type eType,HVD_Frame_Info * pInfo)3732*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GetFrmInfo( HVD_Get_Frm_Info_Type eType  ,  HVD_Frame_Info *pInfo)
3733*53ee8cc1Swenshuai.xi {
3734*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo =NULL;
3735*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3736*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(E_HVD_FAIL);
3737*53ee8cc1Swenshuai.xi     if( pInfo ==  NULL )
3738*53ee8cc1Swenshuai.xi     {
3739*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
3740*53ee8cc1Swenshuai.xi     }
3741*53ee8cc1Swenshuai.xi     if( eType == E_HVD_GFRMINFO_DISPLAY )
3742*53ee8cc1Swenshuai.xi     {
3743*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_GetData(E_HVD_GDATA_DISP_FRM_INFO);
3744*53ee8cc1Swenshuai.xi     }
3745*53ee8cc1Swenshuai.xi     else if(  eType == E_HVD_GFRMINFO_DECODE )
3746*53ee8cc1Swenshuai.xi     {
3747*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_GetData(E_HVD_GDATA_DEC_FRM_INFO);
3748*53ee8cc1Swenshuai.xi     }
3749*53ee8cc1Swenshuai.xi     else if(  eType == E_HVD_GFRMINFO_NEXT_DISPLAY )
3750*53ee8cc1Swenshuai.xi     {
3751*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_GetData(E_HVD_GDATA_NEXT_DISP_FRM_INFO);
3752*53ee8cc1Swenshuai.xi     }
3753*53ee8cc1Swenshuai.xi 
3754*53ee8cc1Swenshuai.xi     if(  pFrmInfo != NULL  )
3755*53ee8cc1Swenshuai.xi     {
3756*53ee8cc1Swenshuai.xi         pInfo->u32LumaAddr = (MS_PHYADDR)(pFrmInfo->u32LumaAddr);
3757*53ee8cc1Swenshuai.xi         pInfo->u32ChromaAddr = (MS_PHYADDR)(pFrmInfo->u32ChromaAddr);
3758*53ee8cc1Swenshuai.xi         if( gHVDCtrl.u32CtrlMode & HVD_CTRL_FRM_MIU_1 )
3759*53ee8cc1Swenshuai.xi         {
3760*53ee8cc1Swenshuai.xi             pInfo->u32LumaAddr+=gHVDCtrl.MemMap.u32MIU1BaseAddr;
3761*53ee8cc1Swenshuai.xi             pInfo->u32ChromaAddr+=gHVDCtrl.MemMap.u32MIU1BaseAddr;
3762*53ee8cc1Swenshuai.xi         }
3763*53ee8cc1Swenshuai.xi         pInfo->u32TimeStamp= pFrmInfo->u32TimeStamp;
3764*53ee8cc1Swenshuai.xi         pInfo->u32ID_L= pFrmInfo->u32ID_L;
3765*53ee8cc1Swenshuai.xi         pInfo->u32ID_H= pFrmInfo->u32ID_H;
3766*53ee8cc1Swenshuai.xi         pInfo->u16Pitch = pFrmInfo->u16Pitch;
3767*53ee8cc1Swenshuai.xi         pInfo->u16Height = pFrmInfo->u16Height;
3768*53ee8cc1Swenshuai.xi         pInfo->u16Width = pFrmInfo->u16Width;
3769*53ee8cc1Swenshuai.xi         pInfo->eFrmType= (HVD_Frm_Type)(pFrmInfo->u8FrmType);
3770*53ee8cc1Swenshuai.xi         pInfo->eFieldType=(HVD_FieldType)(pFrmInfo->u8FieldType);
3771*53ee8cc1Swenshuai.xi         if( (pInfo->u16Pitch ==0) && (pInfo->u16Width == 0) && (pInfo->u16Height ==0) )
3772*53ee8cc1Swenshuai.xi         {
3773*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
3774*53ee8cc1Swenshuai.xi         }
3775*53ee8cc1Swenshuai.xi     }
3776*53ee8cc1Swenshuai.xi     else
3777*53ee8cc1Swenshuai.xi     {
3778*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
3779*53ee8cc1Swenshuai.xi     }
3780*53ee8cc1Swenshuai.xi     return E_HVD_OK;
3781*53ee8cc1Swenshuai.xi }
3782*53ee8cc1Swenshuai.xi 
3783*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3784*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetISRInfo()
3785*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver interrupt
3786*53ee8cc1Swenshuai.xi /// @param -eType \b OUT : ISR information
3787*53ee8cc1Swenshuai.xi /// @return -the result of get ISR information
3788*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetISRInfo(MS_U32 * eType)3789*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_GetISRInfo(MS_U32* eType)
3790*53ee8cc1Swenshuai.xi {
3791*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3792*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3793*53ee8cc1Swenshuai.xi 
3794*53ee8cc1Swenshuai.xi     if(TRUE == gHVDISRCtrl.bInISR)
3795*53ee8cc1Swenshuai.xi     {
3796*53ee8cc1Swenshuai.xi         gHVDISRCtrl.u32ISRInfo |= HAL_HVD_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
3797*53ee8cc1Swenshuai.xi         *eType = gHVDISRCtrl.u32ISRInfo;
3798*53ee8cc1Swenshuai.xi     }
3799*53ee8cc1Swenshuai.xi     else
3800*53ee8cc1Swenshuai.xi     {
3801*53ee8cc1Swenshuai.xi         *eType = HAL_HVD_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
3802*53ee8cc1Swenshuai.xi     }
3803*53ee8cc1Swenshuai.xi     return TRUE;
3804*53ee8cc1Swenshuai.xi }
3805*53ee8cc1Swenshuai.xi 
3806*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3807*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_CalLumaSum()
3808*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get the sum of luma data in a frame.
3809*53ee8cc1Swenshuai.xi /// @param -eType \b IN : Type of frame information
3810*53ee8cc1Swenshuai.xi /// @return -the sum
3811*53ee8cc1Swenshuai.xi /// @retval     -0xFFFFFFFF: error occer.
3812*53ee8cc1Swenshuai.xi /// @retval     -not zero: the sum.
3813*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_CalLumaSum(HVD_Get_Frm_Info_Type eType)3814*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_CalLumaSum(  HVD_Get_Frm_Info_Type eType  )
3815*53ee8cc1Swenshuai.xi {
3816*53ee8cc1Swenshuai.xi     HVD_Frm_Information *pFrmInfo =NULL;
3817*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=HVD_U32_MAX;
3818*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3819*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u32Ret);
3820*53ee8cc1Swenshuai.xi     if( eType == E_HVD_GFRMINFO_DISPLAY )
3821*53ee8cc1Swenshuai.xi     {
3822*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_GetData(E_HVD_GDATA_DISP_FRM_INFO);
3823*53ee8cc1Swenshuai.xi     }
3824*53ee8cc1Swenshuai.xi     else if(  eType == E_HVD_GFRMINFO_DECODE )
3825*53ee8cc1Swenshuai.xi     {
3826*53ee8cc1Swenshuai.xi         pFrmInfo =(HVD_Frm_Information *)HAL_HVD_GetData(E_HVD_GDATA_DEC_FRM_INFO);
3827*53ee8cc1Swenshuai.xi     }
3828*53ee8cc1Swenshuai.xi 
3829*53ee8cc1Swenshuai.xi     if(  pFrmInfo != NULL  )
3830*53ee8cc1Swenshuai.xi     {
3831*53ee8cc1Swenshuai.xi         MS_U32 u32tmp=0;
3832*53ee8cc1Swenshuai.xi         MS_U32 u32PitchCnt=0;
3833*53ee8cc1Swenshuai.xi         MS_U32 u32HeightCnt=0;
3834*53ee8cc1Swenshuai.xi         volatile MS_U8* pLumaData=NULL;
3835*53ee8cc1Swenshuai.xi         // PA2VA
3836*53ee8cc1Swenshuai.xi         u32tmp = gHVDCtrl.MemMap.u32FrameBufAddr;
3837*53ee8cc1Swenshuai.xi         if( gHVDCtrl.u32CtrlMode & HVD_CTRL_FRM_MIU_1 )
3838*53ee8cc1Swenshuai.xi         {
3839*53ee8cc1Swenshuai.xi             u32tmp -=gHVDCtrl.MemMap.u32MIU1BaseAddr;
3840*53ee8cc1Swenshuai.xi         }
3841*53ee8cc1Swenshuai.xi         pLumaData = (volatile MS_U8*)(gHVDCtrl.MemMap.u32FrameBufVAddr+(pFrmInfo->u32LumaAddr -u32tmp)  );
3842*53ee8cc1Swenshuai.xi         for( u32HeightCnt=0 ; u32HeightCnt < pFrmInfo->u16Height ; u32HeightCnt++  )
3843*53ee8cc1Swenshuai.xi         {
3844*53ee8cc1Swenshuai.xi             for( u32PitchCnt =0   ; u32PitchCnt < pFrmInfo->u16Pitch  ;u32PitchCnt++ )
3845*53ee8cc1Swenshuai.xi             {
3846*53ee8cc1Swenshuai.xi                 if( u32PitchCnt < pFrmInfo->u16Pitch )
3847*53ee8cc1Swenshuai.xi                 {
3848*53ee8cc1Swenshuai.xi                     u32Ret+=(MS_U32)(*pLumaData);
3849*53ee8cc1Swenshuai.xi                 }
3850*53ee8cc1Swenshuai.xi                 pLumaData++;
3851*53ee8cc1Swenshuai.xi             }
3852*53ee8cc1Swenshuai.xi         }
3853*53ee8cc1Swenshuai.xi     }
3854*53ee8cc1Swenshuai.xi     return u32Ret;
3855*53ee8cc1Swenshuai.xi }
3856*53ee8cc1Swenshuai.xi 
3857*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3858*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetUserData_Wptr()
3859*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get write pointer of user data.
3860*53ee8cc1Swenshuai.xi /// @return -the information of write pointer of user data.
3861*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetUserData_Wptr(void)3862*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetUserData_Wptr( void )
3863*53ee8cc1Swenshuai.xi {
3864*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3865*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3866*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3867*53ee8cc1Swenshuai.xi     u32Ret = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_WPTR);
3868*53ee8cc1Swenshuai.xi     return u32Ret;
3869*53ee8cc1Swenshuai.xi }
3870*53ee8cc1Swenshuai.xi 
3871*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3872*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetUserData_Packet()
3873*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of user data packet.
3874*53ee8cc1Swenshuai.xi /// @param -u32Idx \b IN : the pointer of required user data packet( valid range is 0 ~ 11 )
3875*53ee8cc1Swenshuai.xi /// @param -u32Size \b OUT : the size of required user data packet
3876*53ee8cc1Swenshuai.xi /// @return -the offset of user data packet form code buffer start address
3877*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetUserData_Packet(MS_U32 u32Idx,MS_U32 * u32Size)3878*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetUserData_Packet( MS_U32 u32Idx , MS_U32* u32Size )
3879*53ee8cc1Swenshuai.xi {
3880*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
3881*53ee8cc1Swenshuai.xi     MS_U32 tmp=0;
3882*53ee8cc1Swenshuai.xi     MS_U8* pIdx=NULL;
3883*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3884*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
3885*53ee8cc1Swenshuai.xi     *u32Size=0;
3886*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
3887*53ee8cc1Swenshuai.xi     if(  u32Idx >= tmp )
3888*53ee8cc1Swenshuai.xi     {
3889*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("HVD ERR: input user data index(%lu) is larger than max index(%lu)\n"  , u32Idx   , tmp  );
3890*53ee8cc1Swenshuai.xi         return 0;
3891*53ee8cc1Swenshuai.xi     }
3892*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_ADDR);
3893*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3894*53ee8cc1Swenshuai.xi     {
3895*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD FW ERR: user data packet idx tbl base addr(%lx) is zero\n"   , tmp  );
3896*53ee8cc1Swenshuai.xi         return 0;
3897*53ee8cc1Swenshuai.xi     }
3898*53ee8cc1Swenshuai.xi     pIdx = (MS_U8*)(tmp + u32Idx);
3899*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_PACKET_TBL_SIZE);
3900*53ee8cc1Swenshuai.xi     if( (*pIdx) >= tmp )
3901*53ee8cc1Swenshuai.xi     {
3902*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD FW ERR: user data packet tbl ptr(%lu) is larger than max size(%lu)\n"  , (MS_U32)(*pIdx)   , tmp  );
3903*53ee8cc1Swenshuai.xi         return 0;
3904*53ee8cc1Swenshuai.xi     }
3905*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_PACKET_TBL_ADDR);
3906*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3907*53ee8cc1Swenshuai.xi     {
3908*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD FW ERR: user data packet packet tbl base offset(%lx) is zero\n"   , tmp  );
3909*53ee8cc1Swenshuai.xi         return 0;
3910*53ee8cc1Swenshuai.xi     }
3911*53ee8cc1Swenshuai.xi     u32Ret= tmp ;//+ gHVDCtrl.MemMap.u32CodeBufAddr;
3912*53ee8cc1Swenshuai.xi     tmp = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_PACKET_SIZE);
3913*53ee8cc1Swenshuai.xi     if(  tmp == 0 )
3914*53ee8cc1Swenshuai.xi     {
3915*53ee8cc1Swenshuai.xi         HVD_MSG_INFO("HVD FW ERR: user data packet packet size(%lu) is zero\n"   , tmp  );
3916*53ee8cc1Swenshuai.xi         return 0;
3917*53ee8cc1Swenshuai.xi     }
3918*53ee8cc1Swenshuai.xi     *u32Size=tmp;
3919*53ee8cc1Swenshuai.xi     u32Ret +=  (MS_U32)(*pIdx) * tmp;
3920*53ee8cc1Swenshuai.xi     return u32Ret;
3921*53ee8cc1Swenshuai.xi }
3922*53ee8cc1Swenshuai.xi 
3923*53ee8cc1Swenshuai.xi // VDEC Interal control
3924*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
3925*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GenPattern()
3926*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Generate spcific pattern to support some special function.
3927*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the virtual address of spcific pattern
3928*53ee8cc1Swenshuai.xi /// @param -u32VAddr \b IN : the virtual address of spcific pattern
3929*53ee8cc1Swenshuai.xi /// @param -u32Size \b IN, OUT :
3930*53ee8cc1Swenshuai.xi ///                             IN: the input array size.
3931*53ee8cc1Swenshuai.xi ///                             OUT: the used array size.
3932*53ee8cc1Swenshuai.xi /// @return -The result of command generate spcific pattern
3933*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GenPattern(HVD_PatternType eType,MS_U32 u32VAddr,MS_U32 * pu32Size)3934*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GenPattern(HVD_PatternType eType, MS_U32 u32VAddr, MS_U32 *pu32Size)
3935*53ee8cc1Swenshuai.xi {
3936*53ee8cc1Swenshuai.xi     HVD_Result eRet             = E_HVD_RET_ILLEGAL_ACCESS;
3937*53ee8cc1Swenshuai.xi     MS_U8 *pDummyData           = NULL;
3938*53ee8cc1Swenshuai.xi     MS_U32 u32MinPatternSize    = 0;
3939*53ee8cc1Swenshuai.xi 
3940*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
3941*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
3942*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
3943*53ee8cc1Swenshuai.xi 
3944*53ee8cc1Swenshuai.xi     if (eType == E_HVD_PATTERN_FLUSH) // flush pattern
3945*53ee8cc1Swenshuai.xi     {
3946*53ee8cc1Swenshuai.xi         // Driver input need not to push flush pattern
3947*53ee8cc1Swenshuai.xi         if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
3948*53ee8cc1Swenshuai.xi         {
3949*53ee8cc1Swenshuai.xi             *pu32Size = 0;
3950*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
3951*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
3952*53ee8cc1Swenshuai.xi         }
3953*53ee8cc1Swenshuai.xi 
3954*53ee8cc1Swenshuai.xi         // TSP input process
3955*53ee8cc1Swenshuai.xi         if (u32VAddr == 0)
3956*53ee8cc1Swenshuai.xi         {
3957*53ee8cc1Swenshuai.xi             *pu32Size = 8 + 144;
3958*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD ERR: Flush Pattern address shall not be zero\n" );
3959*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
3960*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
3961*53ee8cc1Swenshuai.xi         }
3962*53ee8cc1Swenshuai.xi 
3963*53ee8cc1Swenshuai.xi         switch ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
3964*53ee8cc1Swenshuai.xi         {
3965*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
3966*53ee8cc1Swenshuai.xi             {
3967*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
3968*53ee8cc1Swenshuai.xi                 break;
3969*53ee8cc1Swenshuai.xi             }
3970*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
3971*53ee8cc1Swenshuai.xi             {
3972*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
3973*53ee8cc1Swenshuai.xi                 break;
3974*53ee8cc1Swenshuai.xi             }
3975*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
3976*53ee8cc1Swenshuai.xi             default:
3977*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 0;
3978*53ee8cc1Swenshuai.xi                 break;
3979*53ee8cc1Swenshuai.xi         }
3980*53ee8cc1Swenshuai.xi 
3981*53ee8cc1Swenshuai.xi         if (*pu32Size < u32MinPatternSize)
3982*53ee8cc1Swenshuai.xi         {
3983*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD ERR: Flush Pattern must have at least %lu bytes, input:%lu\n", u32MinPatternSize, (MS_U32) (*pu32Size));
3984*53ee8cc1Swenshuai.xi             *pu32Size = u32MinPatternSize;
3985*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_OUTOF_MEMORY;
3986*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
3987*53ee8cc1Swenshuai.xi         }
3988*53ee8cc1Swenshuai.xi 
3989*53ee8cc1Swenshuai.xi         *pu32Size = u32MinPatternSize;
3990*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8 *) u32VAddr;
3991*53ee8cc1Swenshuai.xi 
3992*53ee8cc1Swenshuai.xi         HVD_memset((void *) pDummyData, 0, *pu32Size);
3993*53ee8cc1Swenshuai.xi 
3994*53ee8cc1Swenshuai.xi         switch ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
3995*53ee8cc1Swenshuai.xi         {
3996*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
3997*53ee8cc1Swenshuai.xi             {
3998*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
3999*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
4000*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
4001*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xFF;
4002*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
4003*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x55;
4004*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
4005*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x55;
4006*53ee8cc1Swenshuai.xi 
4007*53ee8cc1Swenshuai.xi                 break;
4008*53ee8cc1Swenshuai.xi             }
4009*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
4010*53ee8cc1Swenshuai.xi             {
4011*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
4012*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
4013*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
4014*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xB4;
4015*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
4016*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x55;
4017*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
4018*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x55;
4019*53ee8cc1Swenshuai.xi 
4020*53ee8cc1Swenshuai.xi                 break;
4021*53ee8cc1Swenshuai.xi             }
4022*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
4023*53ee8cc1Swenshuai.xi             default:
4024*53ee8cc1Swenshuai.xi                 break;
4025*53ee8cc1Swenshuai.xi         }
4026*53ee8cc1Swenshuai.xi     }
4027*53ee8cc1Swenshuai.xi     else if (eType == E_HVD_PATTERN_FILEEND) // dummy pattern
4028*53ee8cc1Swenshuai.xi     {
4029*53ee8cc1Swenshuai.xi         // Driver input need not to push dummy pattern
4030*53ee8cc1Swenshuai.xi         if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW)
4031*53ee8cc1Swenshuai.xi         {
4032*53ee8cc1Swenshuai.xi             *pu32Size = 0;
4033*53ee8cc1Swenshuai.xi             eRet = E_HVD_OK;
4034*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
4035*53ee8cc1Swenshuai.xi         }
4036*53ee8cc1Swenshuai.xi 
4037*53ee8cc1Swenshuai.xi         // TSP input process
4038*53ee8cc1Swenshuai.xi         if (u32VAddr == 0)
4039*53ee8cc1Swenshuai.xi         {
4040*53ee8cc1Swenshuai.xi             *pu32Size = 8 + 144;
4041*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD ERR: Dummy Pattern address shall not be zero\n");
4042*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_INVALID_PARAMETER;
4043*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
4044*53ee8cc1Swenshuai.xi         }
4045*53ee8cc1Swenshuai.xi 
4046*53ee8cc1Swenshuai.xi         switch ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
4047*53ee8cc1Swenshuai.xi         {
4048*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
4049*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
4050*53ee8cc1Swenshuai.xi                 break;
4051*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
4052*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 8 + 144;
4053*53ee8cc1Swenshuai.xi                 break;
4054*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
4055*53ee8cc1Swenshuai.xi             default:
4056*53ee8cc1Swenshuai.xi                 u32MinPatternSize = 0;
4057*53ee8cc1Swenshuai.xi                 break;
4058*53ee8cc1Swenshuai.xi         }
4059*53ee8cc1Swenshuai.xi 
4060*53ee8cc1Swenshuai.xi         if (*pu32Size < u32MinPatternSize)
4061*53ee8cc1Swenshuai.xi         {
4062*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("HVD ERR: Dummy Pattern must have at least %lu bytes, input:%lu\n" , u32MinPatternSize , (MS_U32)(*pu32Size)  );
4063*53ee8cc1Swenshuai.xi             *pu32Size = u32MinPatternSize;
4064*53ee8cc1Swenshuai.xi             eRet = E_HVD_RET_OUTOF_MEMORY;
4065*53ee8cc1Swenshuai.xi             _DRV_HVD_Return(eRet);
4066*53ee8cc1Swenshuai.xi         }
4067*53ee8cc1Swenshuai.xi 
4068*53ee8cc1Swenshuai.xi         pDummyData = (MS_U8 *) u32VAddr;
4069*53ee8cc1Swenshuai.xi 
4070*53ee8cc1Swenshuai.xi         HVD_memset((void *) pDummyData, 0, *pu32Size);
4071*53ee8cc1Swenshuai.xi 
4072*53ee8cc1Swenshuai.xi         switch ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_HW_MASK))
4073*53ee8cc1Swenshuai.xi         {
4074*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVC:
4075*53ee8cc1Swenshuai.xi             {
4076*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
4077*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
4078*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
4079*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xFF;
4080*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xFF;
4081*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0xFF;
4082*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xFF;
4083*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0xFF;
4084*53ee8cc1Swenshuai.xi 
4085*53ee8cc1Swenshuai.xi                 break;
4086*53ee8cc1Swenshuai.xi             }
4087*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_AVS:
4088*53ee8cc1Swenshuai.xi             {
4089*53ee8cc1Swenshuai.xi                 pDummyData[0] = 0;
4090*53ee8cc1Swenshuai.xi                 pDummyData[1] = 0;
4091*53ee8cc1Swenshuai.xi                 pDummyData[2] = 1;
4092*53ee8cc1Swenshuai.xi                 pDummyData[3] = 0xB4;
4093*53ee8cc1Swenshuai.xi                 pDummyData[4] = 0xAA;
4094*53ee8cc1Swenshuai.xi                 pDummyData[5] = 0x66;
4095*53ee8cc1Swenshuai.xi                 pDummyData[6] = 0xAA;
4096*53ee8cc1Swenshuai.xi                 pDummyData[7] = 0x66;
4097*53ee8cc1Swenshuai.xi 
4098*53ee8cc1Swenshuai.xi                 break;
4099*53ee8cc1Swenshuai.xi             }
4100*53ee8cc1Swenshuai.xi             case HVD_INIT_HW_RM:
4101*53ee8cc1Swenshuai.xi             default:
4102*53ee8cc1Swenshuai.xi                 *pu32Size = u32MinPatternSize;
4103*53ee8cc1Swenshuai.xi                 break;
4104*53ee8cc1Swenshuai.xi         }
4105*53ee8cc1Swenshuai.xi     }
4106*53ee8cc1Swenshuai.xi 
4107*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
4108*53ee8cc1Swenshuai.xi 
4109*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4110*53ee8cc1Swenshuai.xi }
4111*53ee8cc1Swenshuai.xi 
4112*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4113*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetPatternInfo()
4114*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get driver specific data information
4115*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific data information
4116*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
4117*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetPatternInfo(HVD_Pattern_Info eType)4118*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetPatternInfo(HVD_Pattern_Info eType)
4119*53ee8cc1Swenshuai.xi {
4120*53ee8cc1Swenshuai.xi     MS_U32 eRet = 0;
4121*53ee8cc1Swenshuai.xi 
4122*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4123*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4124*53ee8cc1Swenshuai.xi 
4125*53ee8cc1Swenshuai.xi     switch (eType)
4126*53ee8cc1Swenshuai.xi     {
4127*53ee8cc1Swenshuai.xi         case E_HVD_FLUSH_PATTERN_SIZE:
4128*53ee8cc1Swenshuai.xi         {
4129*53ee8cc1Swenshuai.xi             if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
4130*53ee8cc1Swenshuai.xi             {
4131*53ee8cc1Swenshuai.xi                 eRet = 0;
4132*53ee8cc1Swenshuai.xi             }
4133*53ee8cc1Swenshuai.xi             else if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
4134*53ee8cc1Swenshuai.xi             {
4135*53ee8cc1Swenshuai.xi                 eRet = 8 + 144;
4136*53ee8cc1Swenshuai.xi             }
4137*53ee8cc1Swenshuai.xi             break;
4138*53ee8cc1Swenshuai.xi         }
4139*53ee8cc1Swenshuai.xi         case E_HVD_DUMMY_HW_FIFO:
4140*53ee8cc1Swenshuai.xi         {
4141*53ee8cc1Swenshuai.xi             if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_RAW )
4142*53ee8cc1Swenshuai.xi             {
4143*53ee8cc1Swenshuai.xi                 eRet = 0;
4144*53ee8cc1Swenshuai.xi             }
4145*53ee8cc1Swenshuai.xi             else if ((gHVDCtrl.InitParams.u32ModeFlag & HVD_INIT_MAIN_MASK) == HVD_INIT_MAIN_FILE_TS)
4146*53ee8cc1Swenshuai.xi             {
4147*53ee8cc1Swenshuai.xi                 eRet = (MS_U32) HAL_HVD_GetData(E_HVD_GDATA_FW_MAX_DUMMY_FIFO);
4148*53ee8cc1Swenshuai.xi             }
4149*53ee8cc1Swenshuai.xi             break;
4150*53ee8cc1Swenshuai.xi         }
4151*53ee8cc1Swenshuai.xi     }
4152*53ee8cc1Swenshuai.xi 
4153*53ee8cc1Swenshuai.xi     return eRet;
4154*53ee8cc1Swenshuai.xi }
4155*53ee8cc1Swenshuai.xi 
4156*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4157*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDynamicScalingInfo()
4158*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of Dynamic Scaling
4159*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific information
4160*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
4161*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDynamicScalingInfo(HVD_DynamicScaling_Info eType)4162*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDynamicScalingInfo(   HVD_DynamicScaling_Info eType )
4163*53ee8cc1Swenshuai.xi {
4164*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4165*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4166*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4167*53ee8cc1Swenshuai.xi     switch( eType )
4168*53ee8cc1Swenshuai.xi     {
4169*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_MIUSEL:
4170*53ee8cc1Swenshuai.xi         if( gHVDCtrl.MemMap.u32CodeBufAddr >= gHVDCtrl.MemMap.u32MIU1BaseAddr )
4171*53ee8cc1Swenshuai.xi         {
4172*53ee8cc1Swenshuai.xi             u32Ret=TRUE;
4173*53ee8cc1Swenshuai.xi         }
4174*53ee8cc1Swenshuai.xi         else
4175*53ee8cc1Swenshuai.xi         {
4176*53ee8cc1Swenshuai.xi             u32Ret=FALSE;
4177*53ee8cc1Swenshuai.xi         }
4178*53ee8cc1Swenshuai.xi         break;
4179*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_ADDR:
4180*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_GetData(E_HVD_GDATA_FW_DS_BUF_ADDR);
4181*53ee8cc1Swenshuai.xi         u32Ret+=gHVDCtrl.MemMap.u32CodeBufAddr;
4182*53ee8cc1Swenshuai.xi         break;
4183*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_SIZE:
4184*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_GetData(E_HVD_GDATA_FW_DS_BUF_SIZE);
4185*53ee8cc1Swenshuai.xi         break;
4186*53ee8cc1Swenshuai.xi     case E_HVD_DS_VECTOR_DEPTH:
4187*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_GetData(E_HVD_GDATA_FW_DS_VECTOR_DEPTH);
4188*53ee8cc1Swenshuai.xi         break;
4189*53ee8cc1Swenshuai.xi     case E_HVD_DS_INFO_ADDR:
4190*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_GetData(E_HVD_GDATA_FW_DS_INFO_ADDR);
4191*53ee8cc1Swenshuai.xi         u32Ret+=gHVDCtrl.MemMap.u32CodeBufAddr;
4192*53ee8cc1Swenshuai.xi         break;
4193*53ee8cc1Swenshuai.xi     case E_HVD_DS_IS_ENABLED:
4194*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)HAL_HVD_GetData(E_HVD_GDATA_FW_DS_IS_ENABLED);
4195*53ee8cc1Swenshuai.xi         break;
4196*53ee8cc1Swenshuai.xi     }
4197*53ee8cc1Swenshuai.xi     return u32Ret;
4198*53ee8cc1Swenshuai.xi }
4199*53ee8cc1Swenshuai.xi 
4200*53ee8cc1Swenshuai.xi #if 0
4201*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4202*53ee8cc1Swenshuai.xi /// @brief \b Enum \b Name: HVD_DynamicScaling_Info
4203*53ee8cc1Swenshuai.xi /// @brief \b Enum \b Description:  The information type of dynamic scaling.
4204*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4205*53ee8cc1Swenshuai.xi typedef enum
4206*53ee8cc1Swenshuai.xi {
4207*53ee8cc1Swenshuai.xi     E_HVD_DS_CAPABILITY,         ///< the capability of dynamic sacling. Ret: TRUE /FALSE
4208*53ee8cc1Swenshuai.xi     E_HVD_DS_BUF_ADDR,         ///< the buffer start physcial address.
4209*53ee8cc1Swenshuai.xi     E_HVD_DS_BUF_SIZE,            ///< the buffer size.
4210*53ee8cc1Swenshuai.xi     E_HVD_DS_VECTOR_DEPTH,            ///< the depth of scaling vector.
4211*53ee8cc1Swenshuai.xi } HVD_DynamicScaling_Info;
4212*53ee8cc1Swenshuai.xi 
4213*53ee8cc1Swenshuai.xi 
4214*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4215*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDynamicScalingInfo()
4216*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get driver information of dynamic scaling
4217*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of specific dynamic scaling information
4218*53ee8cc1Swenshuai.xi /// @return -the information of choosed type
4219*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4220*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDynamicScalingInfo(   HVD_DynamicScaling_Info eType )
4221*53ee8cc1Swenshuai.xi {
4222*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4223*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4224*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4225*53ee8cc1Swenshuai.xi 
4226*53ee8cc1Swenshuai.xi     switch( eType )
4227*53ee8cc1Swenshuai.xi     {
4228*53ee8cc1Swenshuai.xi     case E_HVD_DS_CAPABILITY:
4229*53ee8cc1Swenshuai.xi         HAL_HVD_GetData(  E_HVD_GDATA_DS_CAPABILITY );
4230*53ee8cc1Swenshuai.xi         break;
4231*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_ADDR:
4232*53ee8cc1Swenshuai.xi         HAL_HVD_GetData(  E_HVD_GDATA_DS_BUF_ADDR );
4233*53ee8cc1Swenshuai.xi         break;
4234*53ee8cc1Swenshuai.xi     case E_HVD_DS_BUF_SIZE:
4235*53ee8cc1Swenshuai.xi         HAL_HVD_GetData(  E_HVD_GDATA_DS_BUF_SIZE );
4236*53ee8cc1Swenshuai.xi         break;
4237*53ee8cc1Swenshuai.xi     case E_HVD_DS_VECTOR_DEPTH:
4238*53ee8cc1Swenshuai.xi         HAL_HVD_GetData(  E_HVD_GDATA_DS_VECTOR_DEPTH );
4239*53ee8cc1Swenshuai.xi         break;
4240*53ee8cc1Swenshuai.xi     default:
4241*53ee8cc1Swenshuai.xi         break;
4242*53ee8cc1Swenshuai.xi     }
4243*53ee8cc1Swenshuai.xi     return u32Ret;
4244*53ee8cc1Swenshuai.xi }
4245*53ee8cc1Swenshuai.xi #endif
4246*53ee8cc1Swenshuai.xi // debug
4247*53ee8cc1Swenshuai.xi 
4248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4249*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetData()
4250*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get target data from HVD driver
4251*53ee8cc1Swenshuai.xi /// @param -eType \b IN : the type of the target data
4252*53ee8cc1Swenshuai.xi /// @return -the value of the target data
4253*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetData(HVD_GData_Type eType)4254*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetData(HVD_GData_Type eType)
4255*53ee8cc1Swenshuai.xi {
4256*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4257*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4258*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(FALSE);
4259*53ee8cc1Swenshuai.xi     switch( eType )
4260*53ee8cc1Swenshuai.xi     {
4261*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_CNT:
4262*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_DISP_CNT );
4263*53ee8cc1Swenshuai.xi         break;
4264*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_SKIP_CNT:
4265*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_SKIP_CNT );
4266*53ee8cc1Swenshuai.xi         break;
4267*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DROP_CNT:
4268*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_DROP_CNT );
4269*53ee8cc1Swenshuai.xi         break;
4270*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_IDLE_CNT:
4271*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_VPU_IDLE_CNT );
4272*53ee8cc1Swenshuai.xi         break;
4273*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_VSYNC_CNT:
4274*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_VSYNC_CNT );
4275*53ee8cc1Swenshuai.xi         break;
4276*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_MAIN_LOOP_CNT:
4277*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_MAIN_LOOP_CNT );
4278*53ee8cc1Swenshuai.xi         break;
4279*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_AVC_LEVEL_IDC:
4280*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_AVC_LEVEL_IDC );
4281*53ee8cc1Swenshuai.xi         break;
4282*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_FB_USAGE_MEM:
4283*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_FB_USAGE_MEM );
4284*53ee8cc1Swenshuai.xi         break;
4285*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_Q_SIZE:
4286*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_DISP_Q_NUMB );
4287*53ee8cc1Swenshuai.xi         break;
4288*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_ES_LEVEL:
4289*53ee8cc1Swenshuai.xi         u32Ret = (MS_U32)(HVD_ES_Level)HAL_HVD_GetData(  E_HVD_GDATA_ES_LEVEL );
4290*53ee8cc1Swenshuai.xi         break;
4291*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_AVC_VUI_DISP_INFO:
4292*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_AVC_VUI_DISP_INFO );
4293*53ee8cc1Swenshuai.xi         break;
4294*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_DISP_STC:
4295*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_DISP_STC );
4296*53ee8cc1Swenshuai.xi         break;
4297*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_USERDATA_IDX_TBL_SIZE:
4298*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
4299*53ee8cc1Swenshuai.xi         break;
4300*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_USERDATA_PACKET_SIZE:
4301*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(E_HVD_GDATA_USERDATA_PACKET_SIZE);
4302*53ee8cc1Swenshuai.xi         break;
4303*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_REAL_FRAMERATE:
4304*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(E_HVD_GDATA_REAL_FRAMERATE);
4305*53ee8cc1Swenshuai.xi         break;
4306*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_IS_ORI_INTERLACE_MODE:
4307*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(E_HVD_GDATA_IS_ORI_INTERLACE_MODE);
4308*53ee8cc1Swenshuai.xi         break;
4309*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_FRMPAC_ARRANGE_CNL_FLAG:
4310*53ee8cc1Swenshuai.xi     {
4311*53ee8cc1Swenshuai.xi         HVD_Frame_packing_SEI *pstFrmPckSEI = _DRV_HVD_GetFrmPckSEIStPtr();
4312*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)pstFrmPckSEI->u8Frm_packing_arr_cnl_flag;
4313*53ee8cc1Swenshuai.xi         break;
4314*53ee8cc1Swenshuai.xi     }
4315*53ee8cc1Swenshuai.xi     case E_HVD_GDATA_TYPE_FRMPAC_ARRANGE_TYPE:
4316*53ee8cc1Swenshuai.xi     {
4317*53ee8cc1Swenshuai.xi         HVD_Frame_packing_SEI *pstFrmPckSEI = _DRV_HVD_GetFrmPckSEIStPtr();
4318*53ee8cc1Swenshuai.xi         u32Ret=(MS_U32)pstFrmPckSEI->u8Frm_packing_arr_type;
4319*53ee8cc1Swenshuai.xi         break;
4320*53ee8cc1Swenshuai.xi     }
4321*53ee8cc1Swenshuai.xi     default:
4322*53ee8cc1Swenshuai.xi         break;
4323*53ee8cc1Swenshuai.xi 
4324*53ee8cc1Swenshuai.xi     }
4325*53ee8cc1Swenshuai.xi     return u32Ret;
4326*53ee8cc1Swenshuai.xi }
4327*53ee8cc1Swenshuai.xi 
4328*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4329*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetMem_Dbg()
4330*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get any data from any memory address
4331*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target data
4332*53ee8cc1Swenshuai.xi /// @return -the value of the memory
4333*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetMem_Dbg(MS_U32 u32Addr)4334*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetMem_Dbg(MS_U32 u32Addr)
4335*53ee8cc1Swenshuai.xi {
4336*53ee8cc1Swenshuai.xi     MS_U32 u32Ret=0;
4337*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4338*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(u32Ret);
4339*53ee8cc1Swenshuai.xi     switch(u32Addr)
4340*53ee8cc1Swenshuai.xi     {
4341*53ee8cc1Swenshuai.xi     case 1:
4342*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_BBU_READ_PTR );
4343*53ee8cc1Swenshuai.xi         break;
4344*53ee8cc1Swenshuai.xi     case 2:
4345*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_VPU_PC_CNT );
4346*53ee8cc1Swenshuai.xi         break;
4347*53ee8cc1Swenshuai.xi     case 3:
4348*53ee8cc1Swenshuai.xi         u32Ret = HAL_HVD_GetData(  E_HVD_GDATA_BBU_WRITE_PTR );
4349*53ee8cc1Swenshuai.xi         break;
4350*53ee8cc1Swenshuai.xi     default:
4351*53ee8cc1Swenshuai.xi         break;
4352*53ee8cc1Swenshuai.xi     }
4353*53ee8cc1Swenshuai.xi     return u32Ret;
4354*53ee8cc1Swenshuai.xi //        break;
4355*53ee8cc1Swenshuai.xi //    return HAL_HVD_GetData_Dbg(u32Addr);
4356*53ee8cc1Swenshuai.xi }
4357*53ee8cc1Swenshuai.xi 
4358*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4359*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_DbgDumpStatus()
4360*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Dump specific information to standard output.
4361*53ee8cc1Swenshuai.xi /// @param -eFlag \b IN : the type of information.
4362*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_DbgDumpStatus(HVD_DumpStatus eFlag)4363*53ee8cc1Swenshuai.xi void MDrv_HVD_DbgDumpStatus(HVD_DumpStatus eFlag)
4364*53ee8cc1Swenshuai.xi {
4365*53ee8cc1Swenshuai.xi     if (!bHVDIsInited)
4366*53ee8cc1Swenshuai.xi     {
4367*53ee8cc1Swenshuai.xi         return;
4368*53ee8cc1Swenshuai.xi     }
4369*53ee8cc1Swenshuai.xi 
4370*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_DRV )
4371*53ee8cc1Swenshuai.xi     {
4372*53ee8cc1Swenshuai.xi         ;
4373*53ee8cc1Swenshuai.xi     }
4374*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_FW )
4375*53ee8cc1Swenshuai.xi     {
4376*53ee8cc1Swenshuai.xi         HAL_HVD_Dump_FW_Status();
4377*53ee8cc1Swenshuai.xi     }
4378*53ee8cc1Swenshuai.xi     if( eFlag & E_HVD_DUMP_STATUS_HW )
4379*53ee8cc1Swenshuai.xi     {
4380*53ee8cc1Swenshuai.xi         HAL_HVD_Dump_HW_Status(HVD_U32_MAX);
4381*53ee8cc1Swenshuai.xi     }
4382*53ee8cc1Swenshuai.xi }
4383*53ee8cc1Swenshuai.xi 
4384*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4385*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetMem_Dbg()
4386*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any data into any memory address
4387*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : the memory address of the target destination
4388*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : the value of input content
4389*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetMem_Dbg(MS_U32 u32Addr,MS_U32 u32Arg)4390*53ee8cc1Swenshuai.xi void MDrv_HVD_SetMem_Dbg(MS_U32 u32Addr , MS_U32 u32Arg)
4391*53ee8cc1Swenshuai.xi {
4392*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4393*53ee8cc1Swenshuai.xi     HAL_HVD_SetData_Dbg(u32Addr ,u32Arg );
4394*53ee8cc1Swenshuai.xi }
4395*53ee8cc1Swenshuai.xi 
4396*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4397*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetData_Dbg()
4398*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
4399*53ee8cc1Swenshuai.xi /// @param -u32Cmd \b IN : specify the FW command ID.
4400*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of FW command.
4401*53ee8cc1Swenshuai.xi /// @return -the result of debug command
4402*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetCmd_Dbg(MS_U32 u32Cmd,MS_U32 u32Arg)4403*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetCmd_Dbg( MS_U32 u32Cmd , MS_U32 u32Arg)
4404*53ee8cc1Swenshuai.xi {
4405*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4406*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4407*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4408*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4409*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd((HVD_User_Cmd)u32Cmd , u32Arg);
4410*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet );
4411*53ee8cc1Swenshuai.xi }
4412*53ee8cc1Swenshuai.xi 
4413*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetSettings_Pro()
4415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set any FW debug command
4416*53ee8cc1Swenshuai.xi /// @param -eType \b IN : specify the type of setting.
4417*53ee8cc1Swenshuai.xi /// @param -u32Arg \b IN : specify the argument of the setting.
4418*53ee8cc1Swenshuai.xi /// @return -the result of set professional settings.
4419*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetSettings_Pro(HVD_SSettings_Type eType,MS_U32 u32Arg)4420*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetSettings_Pro( HVD_SSettings_Type eType , MS_U32 u32Arg)
4421*53ee8cc1Swenshuai.xi {
4422*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4423*53ee8cc1Swenshuai.xi     HVD_User_Cmd eCmd = E_HVD_CMD_INVALID_CMD;
4424*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4425*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4426*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4427*53ee8cc1Swenshuai.xi     switch( eType )
4428*53ee8cc1Swenshuai.xi     {
4429*53ee8cc1Swenshuai.xi         case E_HVD_SSET_TIME_UNIT:
4430*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_TIME_UNIT_TYPE;
4431*53ee8cc1Swenshuai.xi             break;
4432*53ee8cc1Swenshuai.xi         case E_HVD_SSET_PITCH:
4433*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_PITCH;
4434*53ee8cc1Swenshuai.xi             break;
4435*53ee8cc1Swenshuai.xi         case E_HVD_SSET_SYNC_EACH_FRM:
4436*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_SYNC_EACH_FRM;
4437*53ee8cc1Swenshuai.xi             break;
4438*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MAX_DEC_TICK:
4439*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MAX_DEC_TICK;
4440*53ee8cc1Swenshuai.xi             break;
4441*53ee8cc1Swenshuai.xi         case E_HVD_SSET_AUTO_FREE_ES:
4442*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_AUTO_FREE_ES;
4443*53ee8cc1Swenshuai.xi             gHVDCtrl.Settings.bAutoFreeES=u32Arg;
4444*53ee8cc1Swenshuai.xi             break;
4445*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MIN_FRAME_GAP:
4446*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MIN_FRAME_GAP;
4447*53ee8cc1Swenshuai.xi             break;
4448*53ee8cc1Swenshuai.xi         case E_HVD_SSET_DISABLE_DEBLOCKING:
4449*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_DBF;
4450*53ee8cc1Swenshuai.xi             if( u32Arg > 2 )
4451*53ee8cc1Swenshuai.xi             {
4452*53ee8cc1Swenshuai.xi                 u32Arg =1;
4453*53ee8cc1Swenshuai.xi             }
4454*53ee8cc1Swenshuai.xi             gHVDCtrl.Settings.bDisDeblocking=u32Arg;
4455*53ee8cc1Swenshuai.xi             break;
4456*53ee8cc1Swenshuai.xi         case E_HVD_SSET_DISABLE_QUARTER_PIXEL:
4457*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_QUART_PIXEL;
4458*53ee8cc1Swenshuai.xi             if( u32Arg > 2 )
4459*53ee8cc1Swenshuai.xi             {
4460*53ee8cc1Swenshuai.xi                 u32Arg =1;
4461*53ee8cc1Swenshuai.xi             }
4462*53ee8cc1Swenshuai.xi             gHVDCtrl.Settings.bDisQuarterPixel=u32Arg;
4463*53ee8cc1Swenshuai.xi             break;
4464*53ee8cc1Swenshuai.xi         case E_HVD_SSET_MIU_BURST_CNT_LEVEL:
4465*53ee8cc1Swenshuai.xi         {
4466*53ee8cc1Swenshuai.xi             gHVDCtrl.Settings.u32MiuBurstLevel = u32Arg;
4467*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_MIU_BURST_CNT;
4468*53ee8cc1Swenshuai.xi 
4469*53ee8cc1Swenshuai.xi             break;
4470*53ee8cc1Swenshuai.xi         }
4471*53ee8cc1Swenshuai.xi         case E_HVD_SSET_DISABLE_ANTI_VDEAD:
4472*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_DIS_VDEAD;
4473*53ee8cc1Swenshuai.xi             break;
4474*53ee8cc1Swenshuai.xi         case E_HVD_SSET_FLUSH_FRM_BUF:
4475*53ee8cc1Swenshuai.xi             eCmd = E_HVD_CMD_FLUSH_FRM_BUF;
4476*53ee8cc1Swenshuai.xi             break;
4477*53ee8cc1Swenshuai.xi         default:
4478*53ee8cc1Swenshuai.xi             break;
4479*53ee8cc1Swenshuai.xi     }
4480*53ee8cc1Swenshuai.xi 
4481*53ee8cc1Swenshuai.xi     if (eCmd != E_HVD_CMD_INVALID_CMD)
4482*53ee8cc1Swenshuai.xi     {
4483*53ee8cc1Swenshuai.xi         eRet = (HVD_Result) HAL_HVD_SetCmd(eCmd , u32Arg);
4484*53ee8cc1Swenshuai.xi     }
4485*53ee8cc1Swenshuai.xi     else
4486*53ee8cc1Swenshuai.xi     {
4487*53ee8cc1Swenshuai.xi         eRet = E_HVD_RET_INVALID_PARAMETER;
4488*53ee8cc1Swenshuai.xi     }
4489*53ee8cc1Swenshuai.xi 
4490*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4491*53ee8cc1Swenshuai.xi }
4492*53ee8cc1Swenshuai.xi 
4493*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4494*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetCaps()
4495*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if HW support this format
4496*53ee8cc1Swenshuai.xi /// @param -u32Type \b IN : specify the format type
4497*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
4498*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not supported by HW
4499*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): supported by HW
4500*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetCaps(HVD_Codec u32Type)4501*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_GetCaps( HVD_Codec u32Type)
4502*53ee8cc1Swenshuai.xi {
4503*53ee8cc1Swenshuai.xi     //AVCH264DBG(printf("HVD rev id: 0x%x \n\n", verID );
4504*53ee8cc1Swenshuai.xi #if ( HVD_HW_VERSION == HVD_HW_HVD)
4505*53ee8cc1Swenshuai.xi     MS_U32 verID=HAL_HVD_Get_HWVersionID();
4506*53ee8cc1Swenshuai.xi     verID=verID >> 12;
4507*53ee8cc1Swenshuai.xi     switch( u32Type )
4508*53ee8cc1Swenshuai.xi     {
4509*53ee8cc1Swenshuai.xi         case E_HVD_AVC:
4510*53ee8cc1Swenshuai.xi         case E_HVD_AVS:
4511*53ee8cc1Swenshuai.xi         case E_HVD_RM:
4512*53ee8cc1Swenshuai.xi             if( (verID & BIT(u32Type)) == 0 )
4513*53ee8cc1Swenshuai.xi             {
4514*53ee8cc1Swenshuai.xi                 return FALSE;
4515*53ee8cc1Swenshuai.xi             }
4516*53ee8cc1Swenshuai.xi             break;
4517*53ee8cc1Swenshuai.xi         default:
4518*53ee8cc1Swenshuai.xi             return FALSE;
4519*53ee8cc1Swenshuai.xi     }
4520*53ee8cc1Swenshuai.xi #else
4521*53ee8cc1Swenshuai.xi     if( u32Type != E_HVD_AVC )
4522*53ee8cc1Swenshuai.xi     {
4523*53ee8cc1Swenshuai.xi         return FALSE;
4524*53ee8cc1Swenshuai.xi     }
4525*53ee8cc1Swenshuai.xi #endif
4526*53ee8cc1Swenshuai.xi     return TRUE;
4527*53ee8cc1Swenshuai.xi }
4528*53ee8cc1Swenshuai.xi 
MDrv_HVD_LinkWeakSymbolPatch(void)4529*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_LinkWeakSymbolPatch(void)
4530*53ee8cc1Swenshuai.xi {
4531*53ee8cc1Swenshuai.xi     return TRUE;
4532*53ee8cc1Swenshuai.xi }
4533*53ee8cc1Swenshuai.xi 
4534*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4535*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetAutoRmLstZeroByte
4536*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Turn on/off auto remove last zero byte
4537*53ee8cc1Swenshuai.xi /// @param -bOn \b IN : Turn on/off auto remove last zero byte
4538*53ee8cc1Swenshuai.xi /// @return -the result of turn on/off auto remove last zero byte
4539*53ee8cc1Swenshuai.xi ///\b NOTE: The default mode after initialization is On.
4540*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetAutoRmLstZeroByte(MS_BOOL bOn)4541*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetAutoRmLstZeroByte(MS_BOOL bOn)
4542*53ee8cc1Swenshuai.xi {
4543*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4544*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4545*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4546*53ee8cc1Swenshuai.xi     gHVDCtrl.bAutoRmLastZeroByte = bOn;
4547*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4548*53ee8cc1Swenshuai.xi }
4549*53ee8cc1Swenshuai.xi 
4550*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4551*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_IsAlive
4552*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:Check Whether HVD is alive or not(check cnt)
4553*53ee8cc1Swenshuai.xi /// @return -the result of HVD alive status(E_HVD_OK/E_HVD_RET_NOT_RUNNING)
4554*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_IsAlive(void)4555*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_IsAlive(void)
4556*53ee8cc1Swenshuai.xi {
4557*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(E_HVD_FAIL);
4558*53ee8cc1Swenshuai.xi 
4559*53ee8cc1Swenshuai.xi     if (HAL_HVD_IsAlive())
4560*53ee8cc1Swenshuai.xi     {
4561*53ee8cc1Swenshuai.xi         gHVDCtrl.LivingStatus.u32DecCnt         = HAL_HVD_GetData(E_HVD_GDATA_DECODE_CNT);
4562*53ee8cc1Swenshuai.xi         gHVDCtrl.LivingStatus.u32SkipCnt        = HAL_HVD_GetData(E_HVD_GDATA_SKIP_CNT);
4563*53ee8cc1Swenshuai.xi         gHVDCtrl.LivingStatus.u32IdleCnt        = HAL_HVD_GetData(E_HVD_GDATA_VPU_IDLE_CNT);
4564*53ee8cc1Swenshuai.xi         gHVDCtrl.LivingStatus.u32MainLoopCnt    = HAL_HVD_GetData(E_HVD_GDATA_MAIN_LOOP_CNT);
4565*53ee8cc1Swenshuai.xi 
4566*53ee8cc1Swenshuai.xi         return E_HVD_OK;
4567*53ee8cc1Swenshuai.xi     }
4568*53ee8cc1Swenshuai.xi     else
4569*53ee8cc1Swenshuai.xi     {
4570*53ee8cc1Swenshuai.xi         return E_HVD_RET_NOT_RUNNING;
4571*53ee8cc1Swenshuai.xi     }
4572*53ee8cc1Swenshuai.xi }
4573*53ee8cc1Swenshuai.xi 
4574*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4575*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetBalanceBW
4576*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: bandwidth adjustment
4577*53ee8cc1Swenshuai.xi /// @param -qp_cnt \b IN : QP threshold for overtime counter
4578*53ee8cc1Swenshuai.xi /// @param -db_cnt \b IN : Deblocking threshod for overtime counter
4579*53ee8cc1Swenshuai.xi /// @param -upper \b IN : upper bound for overtime counter
4580*53ee8cc1Swenshuai.xi /// @return -the result of command E_HVD_CMD_BALANCE_BW
4581*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetBalanceBW(MS_U8 qp_cnt,MS_U8 db_cnt,MS_U8 upper)4582*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetBalanceBW(MS_U8 qp_cnt, MS_U8 db_cnt, MS_U8 upper)
4583*53ee8cc1Swenshuai.xi {
4584*53ee8cc1Swenshuai.xi     HVD_Result eRst=E_HVD_FAIL;
4585*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4586*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRst);
4587*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4588*53ee8cc1Swenshuai.xi     eRst = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_BALANCE_BW, qp_cnt | (db_cnt << 8) | (upper << 16));
4589*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRst);
4590*53ee8cc1Swenshuai.xi }
4591*53ee8cc1Swenshuai.xi 
4592*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4593*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetFdMaskDelayCnt()
4594*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set fd mask muting count
4595*53ee8cc1Swenshuai.xi /// @param -u8DelayCnt \b IN : 0~0xFF, Fdmask delay count, arg >= 0xFF -> use default
4596*53ee8cc1Swenshuai.xi /// @return -The result of command setting fd_mask muting count
4597*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetFdMaskDelayCnt(MS_U8 u8DelayCnt)4598*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetFdMaskDelayCnt(MS_U8 u8DelayCnt)
4599*53ee8cc1Swenshuai.xi {
4600*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4603*53ee8cc1Swenshuai.xi 
4604*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4605*53ee8cc1Swenshuai.xi 
4606*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4607*53ee8cc1Swenshuai.xi 
4608*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FDMASK_DELAY_CNT, u8DelayCnt);
4609*53ee8cc1Swenshuai.xi 
4610*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4611*53ee8cc1Swenshuai.xi }
4612*53ee8cc1Swenshuai.xi 
4613*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4614*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetOutputFRCMode()
4615*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set output frame rate convert mode.
4616*53ee8cc1Swenshuai.xi /// @param -u8FrameRate \b IN : output vsync count.
4617*53ee8cc1Swenshuai.xi /// @param -u8Interlace \b IN : output scan type: 0:progress, 1:interlace.
4618*53ee8cc1Swenshuai.xi /// @return -The result of command setting output FRC mode
4619*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetOutputFRCMode(MS_U8 u8FrameRate,MS_U8 u8Interlace)4620*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetOutputFRCMode(MS_U8 u8FrameRate, MS_U8 u8Interlace)
4621*53ee8cc1Swenshuai.xi {
4622*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4623*53ee8cc1Swenshuai.xi 
4624*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
4625*53ee8cc1Swenshuai.xi 
4626*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4627*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4628*53ee8cc1Swenshuai.xi 
4629*53ee8cc1Swenshuai.xi     if ((u8Interlace != 0) && (u8Interlace != 1))
4630*53ee8cc1Swenshuai.xi     {
4631*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
4632*53ee8cc1Swenshuai.xi     }
4633*53ee8cc1Swenshuai.xi 
4634*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FRC_OUTPUT_FRAMERATE, u8FrameRate);
4635*53ee8cc1Swenshuai.xi 
4636*53ee8cc1Swenshuai.xi     if (eRet != E_HVD_OK)
4637*53ee8cc1Swenshuai.xi     {
4638*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
4639*53ee8cc1Swenshuai.xi     }
4640*53ee8cc1Swenshuai.xi 
4641*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_FRC_OUTPUT_INTERLACE, u8Interlace);
4642*53ee8cc1Swenshuai.xi 
4643*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4644*53ee8cc1Swenshuai.xi }
4645*53ee8cc1Swenshuai.xi 
MDrv_HVD_DispFrame(MS_U32 u32FrmIdx)4646*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_DispFrame(MS_U32 u32FrmIdx)
4647*53ee8cc1Swenshuai.xi {
4648*53ee8cc1Swenshuai.xi     HAL_HVD_SetData(E_HVD_SDATA_DISPQ_STATUS_DISP, u32FrmIdx);
4649*53ee8cc1Swenshuai.xi 
4650*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4651*53ee8cc1Swenshuai.xi }
4652*53ee8cc1Swenshuai.xi 
MDrv_HVD_FreeFrame(MS_U32 u32FrmIdx)4653*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_FreeFrame(MS_U32 u32FrmIdx)
4654*53ee8cc1Swenshuai.xi {
4655*53ee8cc1Swenshuai.xi     HAL_HVD_SetData(E_HVD_SDATA_DISPQ_STATUS_FREE, u32FrmIdx);
4656*53ee8cc1Swenshuai.xi 
4657*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4658*53ee8cc1Swenshuai.xi }
4659*53ee8cc1Swenshuai.xi 
MDrv_HVD_EnableDispQue(MS_BOOL bEnable)4660*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_EnableDispQue(MS_BOOL bEnable)
4661*53ee8cc1Swenshuai.xi {
4662*53ee8cc1Swenshuai.xi     HAL_HVD_SetCmd(E_HVD_CMD_ENABLE_DISP_QUEUE, bEnable);
4663*53ee8cc1Swenshuai.xi 
4664*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4665*53ee8cc1Swenshuai.xi }
4666*53ee8cc1Swenshuai.xi 
MDrv_HVD_EnableVSizeAlign(MS_BOOL bEnable)4667*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_EnableVSizeAlign(MS_BOOL bEnable)
4668*53ee8cc1Swenshuai.xi {
4669*53ee8cc1Swenshuai.xi     return E_HVD_FAIL;
4670*53ee8cc1Swenshuai.xi     //HAL_HVD_SetCmd(E_HVD_CMD_FORCE_ALIGN_VSIZE, bEnable);
4671*53ee8cc1Swenshuai.xi 
4672*53ee8cc1Swenshuai.xi     //return E_HVD_OK;
4673*53ee8cc1Swenshuai.xi }
4674*53ee8cc1Swenshuai.xi 
MDrv_HVD_Disp_Ignore_Crop(MS_BOOL bEnable)4675*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_Disp_Ignore_Crop(MS_BOOL bEnable)
4676*53ee8cc1Swenshuai.xi {
4677*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
4678*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4679*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4680*53ee8cc1Swenshuai.xi 
4681*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_DISP_IGNORE_CROP, bEnable);
4682*53ee8cc1Swenshuai.xi 
4683*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4684*53ee8cc1Swenshuai.xi }
4685*53ee8cc1Swenshuai.xi 
4686*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4687*53ee8cc1Swenshuai.xi /// Set HVD FRC drop type.
4688*53ee8cc1Swenshuai.xi /// @param u8DropType \b IN : drop type. 0:drop frame, 1:drop field. default:0
4689*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
4690*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_SetFRCDropType(MS_U8 u8DropType)4691*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetFRCDropType(MS_U8 u8DropType)
4692*53ee8cc1Swenshuai.xi {
4693*53ee8cc1Swenshuai.xi 	HVD_Result eRet = E_HVD_FAIL;
4694*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4695*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4696*53ee8cc1Swenshuai.xi 
4697*53ee8cc1Swenshuai.xi 	if (u8DropType != 0 && u8DropType != 1)
4698*53ee8cc1Swenshuai.xi     {
4699*53ee8cc1Swenshuai.xi     	eRet = E_HVD_RET_INVALID_PARAMETER;
4700*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
4701*53ee8cc1Swenshuai.xi     }
4702*53ee8cc1Swenshuai.xi 
4703*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FRC_DROP_MODE, u8DropType);
4704*53ee8cc1Swenshuai.xi 
4705*53ee8cc1Swenshuai.xi 	_DRV_HVD_Return(eRet);
4706*53ee8cc1Swenshuai.xi }
4707*53ee8cc1Swenshuai.xi 
4708*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4709*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetDrvFwVer()
4710*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
4711*53ee8cc1Swenshuai.xi /// @return - Driver's FW version, determined at compile time.
4712*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetDrvFwVer(void)4713*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetDrvFwVer(void)
4714*53ee8cc1Swenshuai.xi {
4715*53ee8cc1Swenshuai.xi     return HVD_FW_VERSION;
4716*53ee8cc1Swenshuai.xi }
4717*53ee8cc1Swenshuai.xi 
4718*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4719*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFwVer()
4720*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get driver's FW version
4721*53ee8cc1Swenshuai.xi /// @return - FW version obtained by querying FW
4722*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetFwVer(void)4723*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_GetFwVer(void)
4724*53ee8cc1Swenshuai.xi {
4725*53ee8cc1Swenshuai.xi     return HAL_HVD_GetData(E_HVD_GDATA_FW_VERSION_ID);
4726*53ee8cc1Swenshuai.xi }
4727*53ee8cc1Swenshuai.xi 
4728*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4729*53ee8cc1Swenshuai.xi /// Get SEI USER DATA Info
4730*53ee8cc1Swenshuai.xi /// @param pUsrInfo \b OUT : Get CC USER Data info
4731*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
4732*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_GetUserDataInfo(HVD_UserData_Info * pUsrInfo)4733*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GetUserDataInfo(HVD_UserData_Info* pUsrInfo)
4734*53ee8cc1Swenshuai.xi {
4735*53ee8cc1Swenshuai.xi 	HVD_Result eRet = E_HVD_FAIL;
4736*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataIdxSize = 0;
4737*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
4738*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataSize = 0;
4739*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataAddr = 0;
4740*53ee8cc1Swenshuai.xi     DTV_BUF_type* pHVD_User_Data = NULL;
4741*53ee8cc1Swenshuai.xi 
4742*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4743*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4744*53ee8cc1Swenshuai.xi 
4745*53ee8cc1Swenshuai.xi     u32UserDataIdxSize = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
4746*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr = MDrv_HVD_GetUserData_Wptr();
4747*53ee8cc1Swenshuai.xi 
4748*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
4749*53ee8cc1Swenshuai.xi     {
4750*53ee8cc1Swenshuai.xi         gHVDCtrl.u32UsrDataWr = u32UsrDataIdxWptr;
4751*53ee8cc1Swenshuai.xi     }
4752*53ee8cc1Swenshuai.xi 
4753*53ee8cc1Swenshuai.xi     if (gHVDCtrl.u32UsrDataRd == gHVDCtrl.u32UsrDataWr)
4754*53ee8cc1Swenshuai.xi     {   // User Data Buffer Empty
4755*53ee8cc1Swenshuai.xi         _DRV_HVD_Return(eRet);
4756*53ee8cc1Swenshuai.xi     }
4757*53ee8cc1Swenshuai.xi 
4758*53ee8cc1Swenshuai.xi     u32UserDataAddr = MDrv_HVD_GetUserData_Packet( gHVDCtrl.u32UsrDataRd, (MS_U32*)&u32UserDataSize );
4759*53ee8cc1Swenshuai.xi     u32UserDataAddr += gHVDCtrl.MemMap.u32CodeBufVAddr; // change to virtual address
4760*53ee8cc1Swenshuai.xi 
4761*53ee8cc1Swenshuai.xi     pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
4762*53ee8cc1Swenshuai.xi 
4763*53ee8cc1Swenshuai.xi     pUsrInfo->u16TmpRef = pHVD_User_Data->u16TempRefCnt;
4764*53ee8cc1Swenshuai.xi     pUsrInfo->u8PicStruct = pHVD_User_Data->pic_struct;
4765*53ee8cc1Swenshuai.xi     pUsrInfo->u8PicType = pHVD_User_Data->type;
4766*53ee8cc1Swenshuai.xi     pUsrInfo->u32Pts = pHVD_User_Data->pts;
4767*53ee8cc1Swenshuai.xi     pUsrInfo->u8ByteCnt = pHVD_User_Data->len;
4768*53ee8cc1Swenshuai.xi     pUsrInfo->u32DataBuf = (MS_U32)pHVD_User_Data->buf;
4769*53ee8cc1Swenshuai.xi 
4770*53ee8cc1Swenshuai.xi     gHVDCtrl.u32UsrDataRd++;
4771*53ee8cc1Swenshuai.xi 
4772*53ee8cc1Swenshuai.xi     if (gHVDCtrl.u32UsrDataRd >= u32UserDataIdxSize)
4773*53ee8cc1Swenshuai.xi     {
4774*53ee8cc1Swenshuai.xi         gHVDCtrl.u32UsrDataRd = 0;
4775*53ee8cc1Swenshuai.xi     }
4776*53ee8cc1Swenshuai.xi 
4777*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
4778*53ee8cc1Swenshuai.xi 
4779*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4780*53ee8cc1Swenshuai.xi }
4781*53ee8cc1Swenshuai.xi 
4782*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4783*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetUsrDataIsAvailable()
4784*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Is there new user data info.
4785*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
4786*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): no new user data info
4787*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): has new user data info
4788*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_GetUsrDataIsAvailable(void)4789*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_GetUsrDataIsAvailable(void)
4790*53ee8cc1Swenshuai.xi {
4791*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
4792*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr = MDrv_HVD_GetUserData_Wptr();
4793*53ee8cc1Swenshuai.xi 
4794*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
4795*53ee8cc1Swenshuai.xi     {
4796*53ee8cc1Swenshuai.xi         gHVDCtrl.u32UsrDataWr = u32UsrDataIdxWptr;
4797*53ee8cc1Swenshuai.xi     }
4798*53ee8cc1Swenshuai.xi 
4799*53ee8cc1Swenshuai.xi     return !(gHVDCtrl.u32UsrDataWr == gHVDCtrl.u32UsrDataRd);
4800*53ee8cc1Swenshuai.xi }
4801*53ee8cc1Swenshuai.xi 
4802*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4803*53ee8cc1Swenshuai.xi /// Set HVD DTV User Data Packet Mode
4804*53ee8cc1Swenshuai.xi /// @param u8UserDataMode \b IN : User Data Packet Mode. 0: DVB normal, 1: ATSC DirectTV. default:0
4805*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
4806*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_SetDTVUserDataMode(MS_U8 u8UserDataMode)4807*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetDTVUserDataMode(MS_U8 u8UserDataMode)
4808*53ee8cc1Swenshuai.xi {
4809*53ee8cc1Swenshuai.xi 	HVD_Result eRet = E_HVD_FAIL;
4810*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4811*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4812*53ee8cc1Swenshuai.xi 
4813*53ee8cc1Swenshuai.xi     if (u8UserDataMode == 0)
4814*53ee8cc1Swenshuai.xi     {   // Noraml DVB USER DATA
4815*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SET_USERDATA_MODE, 0);
4816*53ee8cc1Swenshuai.xi     }
4817*53ee8cc1Swenshuai.xi     else if (u8UserDataMode == 1)
4818*53ee8cc1Swenshuai.xi     {   //
4819*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SET_USERDATA_MODE, 1);
4820*53ee8cc1Swenshuai.xi     }
4821*53ee8cc1Swenshuai.xi 
4822*53ee8cc1Swenshuai.xi 	_DRV_HVD_Return(eRet);
4823*53ee8cc1Swenshuai.xi }
4824*53ee8cc1Swenshuai.xi 
4825*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4826*53ee8cc1Swenshuai.xi /// Force into interlace mode
4827*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
4828*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
4829*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_ForceInterlaceMode(MS_U8 u8Mode)4830*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_ForceInterlaceMode(MS_U8 u8Mode)
4831*53ee8cc1Swenshuai.xi {
4832*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
4833*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4834*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4835*53ee8cc1Swenshuai.xi 
4836*53ee8cc1Swenshuai.xi     if (u8Mode == 0)
4837*53ee8cc1Swenshuai.xi     {   // Noraml DVB USER DATA
4838*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FORCE_INTERLACE, 0);
4839*53ee8cc1Swenshuai.xi     }
4840*53ee8cc1Swenshuai.xi     else if (u8Mode == 1)
4841*53ee8cc1Swenshuai.xi     {   //
4842*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_FORCE_INTERLACE, 1);
4843*53ee8cc1Swenshuai.xi     }
4844*53ee8cc1Swenshuai.xi 
4845*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4846*53ee8cc1Swenshuai.xi }
4847*53ee8cc1Swenshuai.xi 
4848*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
4849*53ee8cc1Swenshuai.xi /// Show Decode Order
4850*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
4851*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
4852*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_ShowDecodeOrder(MS_U8 u8Mode)4853*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_ShowDecodeOrder(MS_U8 u8Mode)
4854*53ee8cc1Swenshuai.xi {
4855*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
4856*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
4857*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
4858*53ee8cc1Swenshuai.xi 
4859*53ee8cc1Swenshuai.xi     if (u8Mode == 0)
4860*53ee8cc1Swenshuai.xi     {   // Display Order
4861*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SHOW_DECODE_ORDER, 0);
4862*53ee8cc1Swenshuai.xi     }
4863*53ee8cc1Swenshuai.xi     else if (u8Mode == 1)
4864*53ee8cc1Swenshuai.xi     {   // Decode Order
4865*53ee8cc1Swenshuai.xi         eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SHOW_DECODE_ORDER, 1);
4866*53ee8cc1Swenshuai.xi     }
4867*53ee8cc1Swenshuai.xi 
4868*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
4869*53ee8cc1Swenshuai.xi }
4870*53ee8cc1Swenshuai.xi 
4871*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4872*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmRateIsSupported()
4873*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get if the framerate is supported
4874*53ee8cc1Swenshuai.xi /// @return -The result of supported or not.
4875*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetFrmRateIsSupported(void)4876*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_GetFrmRateIsSupported(void)
4877*53ee8cc1Swenshuai.xi {
4878*53ee8cc1Swenshuai.xi     HVD_Disp_Info stInfo;
4879*53ee8cc1Swenshuai.xi     if (E_HVD_OK != _DRV_HVD_GetDispInfo(&stInfo, FALSE))
4880*53ee8cc1Swenshuai.xi     {
4881*53ee8cc1Swenshuai.xi         return FALSE;
4882*53ee8cc1Swenshuai.xi     }
4883*53ee8cc1Swenshuai.xi     return HAL_HVD_GetFrmRateIsSupported(stInfo.u16HorSize, stInfo.u16VerSize, stInfo.u32FrameRate);
4884*53ee8cc1Swenshuai.xi }
4885*53ee8cc1Swenshuai.xi 
4886*53ee8cc1Swenshuai.xi 
4887*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4888*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_GetFrmPackingArrSEI()
4889*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get if the Frame packing arrangement SEI data
4890*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : The frame packing SEI struct
4891*53ee8cc1Swenshuai.xi /// @return -The result of got the info. or not.
4892*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_GetFrmPackingArrSEI(HVD_FrmPackingSEI * pFrmPacking)4893*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_GetFrmPackingArrSEI(HVD_FrmPackingSEI *pFrmPacking)
4894*53ee8cc1Swenshuai.xi {
4895*53ee8cc1Swenshuai.xi 
4896*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
4897*53ee8cc1Swenshuai.xi     MS_U32 u32FPAFrameAddr = 0 ;
4898*53ee8cc1Swenshuai.xi     HVD_Frame_packing_SEI *pFrmPackingSrc = NULL;
4899*53ee8cc1Swenshuai.xi 
4900*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(E_HVD_FAIL);
4901*53ee8cc1Swenshuai.xi     u32FPAFrameAddr = HAL_HVD_GetData(E_HVD_GDATA_FRM_PACKING_SEI_DATA);
4902*53ee8cc1Swenshuai.xi     u32FPAFrameAddr += gHVDCtrl.MemMap.u32CodeBufVAddr; // change to virtual address
4903*53ee8cc1Swenshuai.xi     pFrmPackingSrc = (HVD_Frame_packing_SEI *)u32FPAFrameAddr;
4904*53ee8cc1Swenshuai.xi     if((pFrmPacking != NULL) && (pFrmPackingSrc->bvaild == TRUE))
4905*53ee8cc1Swenshuai.xi     {
4906*53ee8cc1Swenshuai.xi         pFrmPacking->u8Frm_packing_arr_cnl_flag = pFrmPackingSrc->u8Frm_packing_arr_cnl_flag;
4907*53ee8cc1Swenshuai.xi         pFrmPacking->u8Frm_packing_arr_type = pFrmPackingSrc->u8Frm_packing_arr_type;
4908*53ee8cc1Swenshuai.xi         pFrmPacking->u8content_interpretation_type = pFrmPackingSrc->u8content_interpretation_type;
4909*53ee8cc1Swenshuai.xi 
4910*53ee8cc1Swenshuai.xi         pFrmPacking->u1Quincunx_sampling_flag = pFrmPackingSrc->u1Quincunx_sampling_flag;
4911*53ee8cc1Swenshuai.xi 
4912*53ee8cc1Swenshuai.xi         pFrmPacking->u1Spatial_flipping_flag = pFrmPackingSrc->u1Spatial_flipping_flag;
4913*53ee8cc1Swenshuai.xi         pFrmPacking->u1Frame0_flipping_flag = pFrmPackingSrc->u1Frame0_flipping_flag;
4914*53ee8cc1Swenshuai.xi         pFrmPacking->u1Field_views_flag = pFrmPackingSrc->u1Field_views_flag;
4915*53ee8cc1Swenshuai.xi         pFrmPacking->u1Current_frame_is_frame0_flag = pFrmPackingSrc->u1Current_frame_is_frame0_flag;
4916*53ee8cc1Swenshuai.xi 
4917*53ee8cc1Swenshuai.xi         pFrmPacking->u1Frame0_self_contained_flag = pFrmPackingSrc->u1Frame0_self_contained_flag;
4918*53ee8cc1Swenshuai.xi         pFrmPacking->u1Frame1_self_contained_flag = pFrmPackingSrc->u1Frame1_self_contained_flag;
4919*53ee8cc1Swenshuai.xi         pFrmPacking->u4Frame0_grid_position_x = pFrmPackingSrc->u4Frame0_grid_position_x;
4920*53ee8cc1Swenshuai.xi         pFrmPacking->u4Frame0_grid_position_y = pFrmPackingSrc->u4Frame0_grid_position_y;
4921*53ee8cc1Swenshuai.xi 
4922*53ee8cc1Swenshuai.xi         pFrmPacking->u4Frame1_grid_position_x = pFrmPackingSrc->u4Frame1_grid_position_x;
4923*53ee8cc1Swenshuai.xi         pFrmPacking->u4Frame1_grid_position_y = pFrmPackingSrc->u4Frame1_grid_position_y;
4924*53ee8cc1Swenshuai.xi 
4925*53ee8cc1Swenshuai.xi         eRet = E_HVD_OK;
4926*53ee8cc1Swenshuai.xi     }
4927*53ee8cc1Swenshuai.xi     else
4928*53ee8cc1Swenshuai.xi     {
4929*53ee8cc1Swenshuai.xi         eRet = E_HVD_FAIL;
4930*53ee8cc1Swenshuai.xi     }
4931*53ee8cc1Swenshuai.xi     return eRet;
4932*53ee8cc1Swenshuai.xi 
4933*53ee8cc1Swenshuai.xi }
4934*53ee8cc1Swenshuai.xi 
4935*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4936*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetHVDClockSpeed()
4937*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set hvd clock speed
4938*53ee8cc1Swenshuai.xi /// @return - The result of setting hvd clock speed
4939*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetHVDClockSpeed(HVD_ClockSpeed eClockSpeed)4940*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetHVDClockSpeed(HVD_ClockSpeed eClockSpeed)
4941*53ee8cc1Swenshuai.xi {
4942*53ee8cc1Swenshuai.xi #if defined(CHIP_A3) || defined(CHIP_K1)|| defined(CHIP_KELTIC) || defined(CHIP_KAPPA)
4943*53ee8cc1Swenshuai.xi     HAL_HVD_ClockSpeed eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_NONE;
4944*53ee8cc1Swenshuai.xi     switch (eClockSpeed)
4945*53ee8cc1Swenshuai.xi     {
4946*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_HIGHEST:
4947*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_HIGHEST;
4948*53ee8cc1Swenshuai.xi             break;
4949*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_HIGH:
4950*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_HIGH;
4951*53ee8cc1Swenshuai.xi             break;
4952*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_MEDIUM:
4953*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_MEDIUM;
4954*53ee8cc1Swenshuai.xi             break;
4955*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_LOW:
4956*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_LOW;
4957*53ee8cc1Swenshuai.xi             break;
4958*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_LOWEST:
4959*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_LOWEST;
4960*53ee8cc1Swenshuai.xi             break;
4961*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_DEFAULT:
4962*53ee8cc1Swenshuai.xi             eHVDClockSpeed = E_HAL_HVD_CLOCK_SPEED_DEFAULT;
4963*53ee8cc1Swenshuai.xi             break;
4964*53ee8cc1Swenshuai.xi         default:
4965*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("hvd clock setting is wrong(%d)\n", eClockSpeed);
4966*53ee8cc1Swenshuai.xi             return E_HVD_FAIL;
4967*53ee8cc1Swenshuai.xi             break;
4968*53ee8cc1Swenshuai.xi     }
4969*53ee8cc1Swenshuai.xi 
4970*53ee8cc1Swenshuai.xi     if(E_HVD_RETURN_SUCCESS != HAL_HVD_SetClockSpeed(eHVDClockSpeed))
4971*53ee8cc1Swenshuai.xi     {
4972*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
4973*53ee8cc1Swenshuai.xi     }
4974*53ee8cc1Swenshuai.xi     return E_HVD_OK;
4975*53ee8cc1Swenshuai.xi #else
4976*53ee8cc1Swenshuai.xi     UNUSED(eClockSpeed);
4977*53ee8cc1Swenshuai.xi     printf("This chip does not support hvd clock presetting~\n");
4978*53ee8cc1Swenshuai.xi     return E_HVD_RET_UNSUPPORTED;
4979*53ee8cc1Swenshuai.xi #endif
4980*53ee8cc1Swenshuai.xi }
4981*53ee8cc1Swenshuai.xi 
4982*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
4983*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_HVD_SetVPUClockSpeed()
4984*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  set vpu clock speed
4985*53ee8cc1Swenshuai.xi /// @return - The result of setting vpu clock speed
4986*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_HVD_SetVPUClockSpeed(HVD_ClockSpeed eClockSpeed)4987*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetVPUClockSpeed(HVD_ClockSpeed eClockSpeed)
4988*53ee8cc1Swenshuai.xi {
4989*53ee8cc1Swenshuai.xi #if defined(CHIP_A3) || defined(CHIP_K1)|| defined(CHIP_KELTIC)
4990*53ee8cc1Swenshuai.xi     HAL_VPU_ClockSpeedType eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_NONE;
4991*53ee8cc1Swenshuai.xi     switch (eClockSpeed)
4992*53ee8cc1Swenshuai.xi     {
4993*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_HIGHEST:
4994*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_HIGHEST;
4995*53ee8cc1Swenshuai.xi             break;
4996*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_HIGH:
4997*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_HIGH;
4998*53ee8cc1Swenshuai.xi             break;
4999*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_MEDIUM:
5000*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_MEDIUM;
5001*53ee8cc1Swenshuai.xi             break;
5002*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_LOW:
5003*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_LOW;
5004*53ee8cc1Swenshuai.xi             break;
5005*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_LOWEST:
5006*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_LOWEST;
5007*53ee8cc1Swenshuai.xi             break;
5008*53ee8cc1Swenshuai.xi         case E_HVD_CLOCK_SPEED_DEFAULT:
5009*53ee8cc1Swenshuai.xi             eVPUClockSpeed = E_HAL_VPU_CLOCK_SPEED_DEFAULT;
5010*53ee8cc1Swenshuai.xi             break;
5011*53ee8cc1Swenshuai.xi         default:
5012*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("vpu clock setting is wrong(%d)\n", eVPUClockSpeed);
5013*53ee8cc1Swenshuai.xi             return E_HVD_RETURN_FAIL;
5014*53ee8cc1Swenshuai.xi             break;
5015*53ee8cc1Swenshuai.xi     }
5016*53ee8cc1Swenshuai.xi 
5017*53ee8cc1Swenshuai.xi     if(FALSE == HAL_VPU_SetClockSpeedType(eVPUClockSpeed))
5018*53ee8cc1Swenshuai.xi     {
5019*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
5020*53ee8cc1Swenshuai.xi     }
5021*53ee8cc1Swenshuai.xi 
5022*53ee8cc1Swenshuai.xi     return E_HVD_OK;
5023*53ee8cc1Swenshuai.xi #else
5024*53ee8cc1Swenshuai.xi     UNUSED(eClockSpeed);
5025*53ee8cc1Swenshuai.xi     printf("This chip does not support vpu clock presetting~\n");
5026*53ee8cc1Swenshuai.xi     return E_HVD_RET_UNSUPPORTED;
5027*53ee8cc1Swenshuai.xi #endif
5028*53ee8cc1Swenshuai.xi }
5029*53ee8cc1Swenshuai.xi 
5030*53ee8cc1Swenshuai.xi 
5031*53ee8cc1Swenshuai.xi 
5032*53ee8cc1Swenshuai.xi 
_HVD_CC_Update_UserData_Wptr(void)5033*53ee8cc1Swenshuai.xi static MS_U32 _HVD_CC_Update_UserData_Wptr(void)
5034*53ee8cc1Swenshuai.xi {
5035*53ee8cc1Swenshuai.xi 
5036*53ee8cc1Swenshuai.xi 
5037*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5038*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = MDrv_HVD_GetUserData_Wptr();
5039*53ee8cc1Swenshuai.xi 
5040*53ee8cc1Swenshuai.xi     if (u32UsrDataIdxWptr != 0xFFFFFFFF)
5041*53ee8cc1Swenshuai.xi         pCCInfo->u32FWUsrDataWIdx = u32UsrDataIdxWptr;
5042*53ee8cc1Swenshuai.xi 
5043*53ee8cc1Swenshuai.xi     return pCCInfo->u32FWUsrDataWIdx;
5044*53ee8cc1Swenshuai.xi }
5045*53ee8cc1Swenshuai.xi 
5046*53ee8cc1Swenshuai.xi 
_HVD_CC_Parse_AFD_data(MS_U8 ** pUserDataBuf)5047*53ee8cc1Swenshuai.xi static void _HVD_CC_Parse_AFD_data(MS_U8 **pUserDataBuf)
5048*53ee8cc1Swenshuai.xi {
5049*53ee8cc1Swenshuai.xi     MS_BOOL bActiveFormatFlag;
5050*53ee8cc1Swenshuai.xi     MS_U8 u8ActiveFormat;
5051*53ee8cc1Swenshuai.xi 
5052*53ee8cc1Swenshuai.xi     bActiveFormatFlag = ((*((*pUserDataBuf)++) & 0x40) == 0x40);
5053*53ee8cc1Swenshuai.xi     if (bActiveFormatFlag)
5054*53ee8cc1Swenshuai.xi     {
5055*53ee8cc1Swenshuai.xi         u8ActiveFormat = (**pUserDataBuf) & 0x0F;
5056*53ee8cc1Swenshuai.xi     }
5057*53ee8cc1Swenshuai.xi     (*pUserDataBuf)++;
5058*53ee8cc1Swenshuai.xi 
5059*53ee8cc1Swenshuai.xi 
5060*53ee8cc1Swenshuai.xi }
5061*53ee8cc1Swenshuai.xi 
_HVD_CC_Parse_BAR_data(MS_U8 ** pUserDataBuf)5062*53ee8cc1Swenshuai.xi static void _HVD_CC_Parse_BAR_data(MS_U8 **pUserDataBuf)
5063*53ee8cc1Swenshuai.xi {
5064*53ee8cc1Swenshuai.xi 
5065*53ee8cc1Swenshuai.xi     MS_BOOL bTopBarFlag, bBottomBarFlag, bLeftBarFlag, bRightBarlag;
5066*53ee8cc1Swenshuai.xi     MS_S16 s16RectTop, s16RectBottom, s16RectLeft, s16RectRight;
5067*53ee8cc1Swenshuai.xi 
5068*53ee8cc1Swenshuai.xi     MS_U16 u16Val;
5069*53ee8cc1Swenshuai.xi     bTopBarFlag    = (((**pUserDataBuf) & 0x80) == 0x80); //u_f(1,"top_bar_flag");
5070*53ee8cc1Swenshuai.xi     bBottomBarFlag = (((**pUserDataBuf) & 0x40) == 0x40); //u_f(1,"bottom_bar_flag");
5071*53ee8cc1Swenshuai.xi     bLeftBarFlag   = (((**pUserDataBuf) & 0x20) == 0x20); //u_f(1,"left_bar_flag");
5072*53ee8cc1Swenshuai.xi     bRightBarlag  = ((*((*pUserDataBuf)++) & 0x10) == 0x10); //u_f(1,"right_bar_flag"); u_f(4,"reserved");
5073*53ee8cc1Swenshuai.xi 
5074*53ee8cc1Swenshuai.xi     if (bTopBarFlag)
5075*53ee8cc1Swenshuai.xi     {
5076*53ee8cc1Swenshuai.xi         u16Val = ((**pUserDataBuf) << 8) | (*((*pUserDataBuf)+1));
5077*53ee8cc1Swenshuai.xi         s16RectTop = u16Val & 0x3FFF; //u_f(2,"marker_bits"); u_f(14,"line_number_end_of_top_bar");
5078*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
5079*53ee8cc1Swenshuai.xi     }
5080*53ee8cc1Swenshuai.xi     else
5081*53ee8cc1Swenshuai.xi         s16RectTop = 0;
5082*53ee8cc1Swenshuai.xi 
5083*53ee8cc1Swenshuai.xi     if (bBottomBarFlag)
5084*53ee8cc1Swenshuai.xi     {
5085*53ee8cc1Swenshuai.xi         u16Val = (**pUserDataBuf << 8) | (*(*pUserDataBuf+1)); //u_f(2,"marker_bits"); u_f(14,"line_number_end_of_bottom_bar");
5086*53ee8cc1Swenshuai.xi         s16RectBottom = u16Val & 0x3FFF;
5087*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
5088*53ee8cc1Swenshuai.xi     }
5089*53ee8cc1Swenshuai.xi     else
5090*53ee8cc1Swenshuai.xi         s16RectBottom = 0;
5091*53ee8cc1Swenshuai.xi 
5092*53ee8cc1Swenshuai.xi     if (bLeftBarFlag)
5093*53ee8cc1Swenshuai.xi     {
5094*53ee8cc1Swenshuai.xi         u16Val = ((**pUserDataBuf) << 8) | (*(*pUserDataBuf+1)); //u_f(2,"marker_bits"); u_f(14,"line_number_end_of_left_bar");
5095*53ee8cc1Swenshuai.xi         s16RectLeft = u16Val & 0x3FFF;
5096*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
5097*53ee8cc1Swenshuai.xi     }
5098*53ee8cc1Swenshuai.xi     else
5099*53ee8cc1Swenshuai.xi         s16RectLeft = 0;
5100*53ee8cc1Swenshuai.xi 
5101*53ee8cc1Swenshuai.xi     if (bRightBarlag)
5102*53ee8cc1Swenshuai.xi     {
5103*53ee8cc1Swenshuai.xi         u16Val = ((**pUserDataBuf) << 8) | (*(*pUserDataBuf+1)); //u_f(2,"marker_bits"); u_f(14,"line_number_end_of_right_bar");
5104*53ee8cc1Swenshuai.xi         s16RectRight = u16Val & 0x3FFF;
5105*53ee8cc1Swenshuai.xi         *pUserDataBuf += 2;
5106*53ee8cc1Swenshuai.xi     }
5107*53ee8cc1Swenshuai.xi     else
5108*53ee8cc1Swenshuai.xi         s16RectRight = 0;
5109*53ee8cc1Swenshuai.xi 
5110*53ee8cc1Swenshuai.xi }
5111*53ee8cc1Swenshuai.xi 
5112*53ee8cc1Swenshuai.xi 
5113*53ee8cc1Swenshuai.xi 
_HVD_CC_Parse_CC_data(MS_U8 u8CCMode,MS_U8 ** pSrc,MS_U8 * pDst608,MS_U32 * pu32Dst608Len,MS_U8 * pDst708,MS_U32 * pu32Dst708Len,HVD_CC_608EnhanceInfo * pEhInfo608)5114*53ee8cc1Swenshuai.xi static void _HVD_CC_Parse_CC_data(MS_U8 u8CCMode,MS_U8 **pSrc, MS_U8 *pDst608, MS_U32 *pu32Dst608Len, MS_U8 *pDst708, MS_U32 *pu32Dst708Len, HVD_CC_608EnhanceInfo *pEhInfo608)
5115*53ee8cc1Swenshuai.xi {
5116*53ee8cc1Swenshuai.xi 
5117*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5118*53ee8cc1Swenshuai.xi 
5119*53ee8cc1Swenshuai.xi     MS_U32 i,j;
5120*53ee8cc1Swenshuai.xi     MS_U32 u32CC_Count;
5121*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Code;
5122*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Type;
5123*53ee8cc1Swenshuai.xi     MS_U8 u8CC_Data1, u8CC_Data2;
5124*53ee8cc1Swenshuai.xi     MS_U32 u32Pad;
5125*53ee8cc1Swenshuai.xi 
5126*53ee8cc1Swenshuai.xi 
5127*53ee8cc1Swenshuai.xi 
5128*53ee8cc1Swenshuai.xi     u8CC_Code = *((*pSrc)++); //u_f(8,"cc_data_flag cc_count");
5129*53ee8cc1Swenshuai.xi 
5130*53ee8cc1Swenshuai.xi     u32CC_Count = u8CC_Code & 0x1F;            // cc_count
5131*53ee8cc1Swenshuai.xi     if (!(u8CC_Code & 0x40)) return;        // process_cc_data_flag
5132*53ee8cc1Swenshuai.xi 
5133*53ee8cc1Swenshuai.xi 
5134*53ee8cc1Swenshuai.xi 
5135*53ee8cc1Swenshuai.xi     (*pSrc)++; //u_f(8,"reserved 1");
5136*53ee8cc1Swenshuai.xi 
5137*53ee8cc1Swenshuai.xi 
5138*53ee8cc1Swenshuai.xi 
5139*53ee8cc1Swenshuai.xi     for (i=0;i<u32CC_Count;i++)
5140*53ee8cc1Swenshuai.xi     {
5141*53ee8cc1Swenshuai.xi         MS_U8 u8Code;
5142*53ee8cc1Swenshuai.xi 
5143*53ee8cc1Swenshuai.xi 
5144*53ee8cc1Swenshuai.xi         u8Code = *((*pSrc)++); // u_f(8,"cc_valid and cc_type");
5145*53ee8cc1Swenshuai.xi 
5146*53ee8cc1Swenshuai.xi 
5147*53ee8cc1Swenshuai.xi         u8CC_Type  = u8Code & 0x03;
5148*53ee8cc1Swenshuai.xi 
5149*53ee8cc1Swenshuai.xi         u8CC_Data1 = *((*pSrc)++); // u_f(8,"cc_data_1");
5150*53ee8cc1Swenshuai.xi         u8CC_Data2 = *((*pSrc)++); // u_f(8,"cc_data_2");
5151*53ee8cc1Swenshuai.xi 
5152*53ee8cc1Swenshuai.xi         if (!(u8Code & 0x04)) continue; // cc_valid
5153*53ee8cc1Swenshuai.xi 
5154*53ee8cc1Swenshuai.xi         //NTSC CC 608
5155*53ee8cc1Swenshuai.xi         if ((u8CC_Type == 0) || (u8CC_Type == 1))
5156*53ee8cc1Swenshuai.xi         {
5157*53ee8cc1Swenshuai.xi             //g_DTV_CC.ntsc_cc_data[g_DTV_CC.NTSC_element++] = (cc_type << 16) | (cc_data2 << 8) | (cc_data1);
5158*53ee8cc1Swenshuai.xi 
5159*53ee8cc1Swenshuai.xi             if(pCCInfo->b608InfoEnhance)
5160*53ee8cc1Swenshuai.xi             {
5161*53ee8cc1Swenshuai.xi                 if( ( (*pu32Dst608Len) + 16) > MAX_608_CC_LEN)
5162*53ee8cc1Swenshuai.xi                 {
5163*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("u32Dst608Len+16: %ld is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+16));
5164*53ee8cc1Swenshuai.xi                     return;
5165*53ee8cc1Swenshuai.xi                 }
5166*53ee8cc1Swenshuai.xi             }
5167*53ee8cc1Swenshuai.xi             else
5168*53ee8cc1Swenshuai.xi             {
5169*53ee8cc1Swenshuai.xi                 if( ( (*pu32Dst608Len) + 4) > MAX_608_CC_LEN)
5170*53ee8cc1Swenshuai.xi                 {
5171*53ee8cc1Swenshuai.xi                     HVD_MSG_ERR("u32Dst608Len+4: %ld is larger than MAX_608_CC_LEN !! \n",((*pu32Dst608Len)+4));
5172*53ee8cc1Swenshuai.xi                     return;
5173*53ee8cc1Swenshuai.xi                 }
5174*53ee8cc1Swenshuai.xi             }
5175*53ee8cc1Swenshuai.xi 
5176*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Data1;
5177*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Data2;
5178*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = u8CC_Type;
5179*53ee8cc1Swenshuai.xi             pDst608[(*pu32Dst608Len)++] = 0;
5180*53ee8cc1Swenshuai.xi 
5181*53ee8cc1Swenshuai.xi             if (pCCInfo->b608InfoEnhance)
5182*53ee8cc1Swenshuai.xi             {
5183*53ee8cc1Swenshuai.xi                 //   PTS searched_pts;
5184*53ee8cc1Swenshuai.xi                 //search_pts(pContext, &searched_pts);
5185*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16TmpRef&0xff);
5186*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16TmpRef>>8)&0xff);
5187*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u16PicStruct&0xff);
5188*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u16PicStruct>>8)&0xff);
5189*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = (pEhInfo608->u32Pts&0xff);
5190*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>8)&0xff);
5191*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>16)&0xff);
5192*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = ((pEhInfo608->u32Pts>>24)&0xff);
5193*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = pEhInfo608->u8UsrDataCnt;
5194*53ee8cc1Swenshuai.xi 
5195*53ee8cc1Swenshuai.xi                 // for enhance cc-608 data dump, 16bytes/pkt
5196*53ee8cc1Swenshuai.xi                 u32Pad = (*pu32Dst608Len) & 0xf; //align to 16 byte
5197*53ee8cc1Swenshuai.xi                 if(u32Pad) u32Pad = 16-u32Pad;
5198*53ee8cc1Swenshuai.xi                 for(j=0;j<u32Pad;j++)
5199*53ee8cc1Swenshuai.xi                     pDst608[(*pu32Dst608Len)++] = 0xff;
5200*53ee8cc1Swenshuai.xi 
5201*53ee8cc1Swenshuai.xi             }
5202*53ee8cc1Swenshuai.xi 
5203*53ee8cc1Swenshuai.xi 
5204*53ee8cc1Swenshuai.xi 
5205*53ee8cc1Swenshuai.xi 
5206*53ee8cc1Swenshuai.xi         }
5207*53ee8cc1Swenshuai.xi         else // ATSC_CC 708
5208*53ee8cc1Swenshuai.xi         {
5209*53ee8cc1Swenshuai.xi             if( ( (*pu32Dst708Len) + 4) > MAX_708_CC_LEN)
5210*53ee8cc1Swenshuai.xi             {
5211*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR(" u32Dst708Len+4: %ld is larger than MAX_708_CC_LEN !! \n",((*pu32Dst708Len)+4));
5212*53ee8cc1Swenshuai.xi                 return;
5213*53ee8cc1Swenshuai.xi             }
5214*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Data1;
5215*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Data2;
5216*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = u8CC_Type;
5217*53ee8cc1Swenshuai.xi             pDst708[(*pu32Dst708Len)++] = 0;
5218*53ee8cc1Swenshuai.xi 
5219*53ee8cc1Swenshuai.xi         }
5220*53ee8cc1Swenshuai.xi         //new DTV CC header
5221*53ee8cc1Swenshuai.xi 
5222*53ee8cc1Swenshuai.xi     }
5223*53ee8cc1Swenshuai.xi 
5224*53ee8cc1Swenshuai.xi 
5225*53ee8cc1Swenshuai.xi 
5226*53ee8cc1Swenshuai.xi     //padding cc608
5227*53ee8cc1Swenshuai.xi 
5228*53ee8cc1Swenshuai.xi 
5229*53ee8cc1Swenshuai.xi     if(u8CCMode & (CC_NTSC1|CC_NTSC2))
5230*53ee8cc1Swenshuai.xi     {
5231*53ee8cc1Swenshuai.xi         if (pCCInfo->b608InfoEnhance==0)
5232*53ee8cc1Swenshuai.xi         {   // for original cc-608 data dump, 16bytes/pkt
5233*53ee8cc1Swenshuai.xi 
5234*53ee8cc1Swenshuai.xi 
5235*53ee8cc1Swenshuai.xi             u32Pad = (*pu32Dst608Len) & 0xf;
5236*53ee8cc1Swenshuai.xi             if(u32Pad) u32Pad = 16 - u32Pad;
5237*53ee8cc1Swenshuai.xi 
5238*53ee8cc1Swenshuai.xi             if((u32Pad + (*pu32Dst608Len)) > MAX_608_CC_LEN)
5239*53ee8cc1Swenshuai.xi             {
5240*53ee8cc1Swenshuai.xi                 HVD_MSG_ERR("u32Dst608Len:%ld + u32Pad: %ld is larger than MAX_608_CC_LEN !! \n",(*pu32Dst608Len), u32Pad);
5241*53ee8cc1Swenshuai.xi                 return;
5242*53ee8cc1Swenshuai.xi             }
5243*53ee8cc1Swenshuai.xi             for(i=0;i<u32Pad;i++)
5244*53ee8cc1Swenshuai.xi                 pDst608[(*pu32Dst608Len)++] = 0xff;
5245*53ee8cc1Swenshuai.xi         }
5246*53ee8cc1Swenshuai.xi     }
5247*53ee8cc1Swenshuai.xi 
5248*53ee8cc1Swenshuai.xi 
5249*53ee8cc1Swenshuai.xi }
5250*53ee8cc1Swenshuai.xi 
5251*53ee8cc1Swenshuai.xi 
5252*53ee8cc1Swenshuai.xi 
_HVD_CC_Extract_CCdata(MS_U8 * pDst608Buf,MS_U32 * pu32Dst608Len,MS_U8 * pDst708Buf,MS_U32 * pu32Dst708Len,DTV_BUF_type * pUserData)5253*53ee8cc1Swenshuai.xi static void _HVD_CC_Extract_CCdata(MS_U8 *pDst608Buf ,MS_U32 *pu32Dst608Len,MS_U8 *pDst708Buf ,MS_U32 *pu32Dst708Len, DTV_BUF_type* pUserData)
5254*53ee8cc1Swenshuai.xi {
5255*53ee8cc1Swenshuai.xi 
5256*53ee8cc1Swenshuai.xi 
5257*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5258*53ee8cc1Swenshuai.xi 
5259*53ee8cc1Swenshuai.xi 
5260*53ee8cc1Swenshuai.xi 
5261*53ee8cc1Swenshuai.xi     MS_U8 * pUserDataStartBuf = &pUserData->buf[0];//&pSrcBuf[0];
5262*53ee8cc1Swenshuai.xi     MS_U8 * pUserDataBuf;
5263*53ee8cc1Swenshuai.xi 
5264*53ee8cc1Swenshuai.xi     //if(pCCInfo->u8UserDataMode == USER_DATA_MODE_DIRECTTV_CC)
5265*53ee8cc1Swenshuai.xi     //    pUserDataBuf = &pUserData->buf[0];
5266*53ee8cc1Swenshuai.xi     //else
5267*53ee8cc1Swenshuai.xi         pUserDataBuf = &pUserData->buf[6];
5268*53ee8cc1Swenshuai.xi 
5269*53ee8cc1Swenshuai.xi 
5270*53ee8cc1Swenshuai.xi     HVD_CC_608EnhanceInfo stEhInfo608;
5271*53ee8cc1Swenshuai.xi     stEhInfo608.u16TmpRef = pUserData->u16TempRefCnt;
5272*53ee8cc1Swenshuai.xi     stEhInfo608.u16PicStruct = (MS_U16)pUserData->pic_struct;
5273*53ee8cc1Swenshuai.xi     stEhInfo608.u32Pts = pUserData->pts;
5274*53ee8cc1Swenshuai.xi     stEhInfo608.u8UsrDataCnt = 0;
5275*53ee8cc1Swenshuai.xi 
5276*53ee8cc1Swenshuai.xi 
5277*53ee8cc1Swenshuai.xi 
5278*53ee8cc1Swenshuai.xi 
5279*53ee8cc1Swenshuai.xi     #if 0
5280*53ee8cc1Swenshuai.xi     if(pCCInfo->u8UserDataMode == USER_DATA_MODE_DIRECTTV_CC)
5281*53ee8cc1Swenshuai.xi     {
5282*53ee8cc1Swenshuai.xi         MS_U32 dvb_code;
5283*53ee8cc1Swenshuai.xi 
5284*53ee8cc1Swenshuai.xi         dvb_code = (*pUserDataBuf << 24) | (*(pUserDataBuf+1) << 16) | (*(pUserDataBuf+2) << 8) | *(pUserDataBuf+3); //(u_f(16,"provider_code") << 16) | u_f(16,"provider_code");
5285*53ee8cc1Swenshuai.xi         pUserDataBuf += 4;
5286*53ee8cc1Swenshuai.xi 
5287*53ee8cc1Swenshuai.xi         if (dvb_code == DTV_DTB1_CODE)
5288*53ee8cc1Swenshuai.xi         {
5289*53ee8cc1Swenshuai.xi             MS_U8 code;
5290*53ee8cc1Swenshuai.xi 
5291*53ee8cc1Swenshuai.xi             code = *pUserDataBuf++; //u_f(8,"code");
5292*53ee8cc1Swenshuai.xi 
5293*53ee8cc1Swenshuai.xi             if (code == DTV_CC_CODE)
5294*53ee8cc1Swenshuai.xi             {
5295*53ee8cc1Swenshuai.xi                 _HVD_CC_Parse_CC_data(pCCInfo->u8ParsingStatus,&pUserDataBuf, pDst608Buf, u32Dst608Len, pDst708Buf, u32Dst708Len, &EhInfo608);
5296*53ee8cc1Swenshuai.xi             }
5297*53ee8cc1Swenshuai.xi             //#ifdef PAN_SCAN
5298*53ee8cc1Swenshuai.xi             else if (code == DTV_BAR_CODE)
5299*53ee8cc1Swenshuai.xi             {
5300*53ee8cc1Swenshuai.xi                 _HVD_CC_Parse_BAR_data(&pUserDataBuf);
5301*53ee8cc1Swenshuai.xi             }
5302*53ee8cc1Swenshuai.xi             //#endif
5303*53ee8cc1Swenshuai.xi         }
5304*53ee8cc1Swenshuai.xi         //#ifdef PAN_SCAN
5305*53ee8cc1Swenshuai.xi         else if (dvb_code == DTV_AFD_CODE)
5306*53ee8cc1Swenshuai.xi         {
5307*53ee8cc1Swenshuai.xi             _HVD_CC_Parse_AFD_data(&pUserDataBuf);
5308*53ee8cc1Swenshuai.xi         }
5309*53ee8cc1Swenshuai.xi 
5310*53ee8cc1Swenshuai.xi 
5311*53ee8cc1Swenshuai.xi     }
5312*53ee8cc1Swenshuai.xi     else
5313*53ee8cc1Swenshuai.xi     #endif
5314*53ee8cc1Swenshuai.xi 
5315*53ee8cc1Swenshuai.xi     {
5316*53ee8cc1Swenshuai.xi         if (*pUserDataBuf++ == T35_DVB_COUNTRY_CODE)
5317*53ee8cc1Swenshuai.xi         {
5318*53ee8cc1Swenshuai.xi             MS_U16 itu_t_t35_provider_code;
5319*53ee8cc1Swenshuai.xi 
5320*53ee8cc1Swenshuai.xi             itu_t_t35_provider_code = (*pUserDataBuf << 8) | (*(pUserDataBuf+1)); //u_f(16,"provider_code");
5321*53ee8cc1Swenshuai.xi             pUserDataBuf += 2;
5322*53ee8cc1Swenshuai.xi 
5323*53ee8cc1Swenshuai.xi             if (itu_t_t35_provider_code == T35_DVB_PROVIDER_CODE)
5324*53ee8cc1Swenshuai.xi             {
5325*53ee8cc1Swenshuai.xi                 MS_U32 dvb_code;
5326*53ee8cc1Swenshuai.xi 
5327*53ee8cc1Swenshuai.xi                 dvb_code = (*pUserDataBuf << 24) | (*(pUserDataBuf+1) << 16) | (*(pUserDataBuf+2) << 8) | *(pUserDataBuf+3); //(u_f(16,"provider_code") << 16) | u_f(16,"provider_code");
5328*53ee8cc1Swenshuai.xi                 pUserDataBuf += 4;
5329*53ee8cc1Swenshuai.xi 
5330*53ee8cc1Swenshuai.xi                 if (dvb_code == DTV_DTB1_CODE)
5331*53ee8cc1Swenshuai.xi                 {
5332*53ee8cc1Swenshuai.xi                     MS_U8 code;
5333*53ee8cc1Swenshuai.xi 
5334*53ee8cc1Swenshuai.xi                     code = *pUserDataBuf++; //u_f(8,"code");
5335*53ee8cc1Swenshuai.xi 
5336*53ee8cc1Swenshuai.xi                     if (code == DTV_CC_CODE)
5337*53ee8cc1Swenshuai.xi                     {
5338*53ee8cc1Swenshuai.xi                         _HVD_CC_Parse_CC_data(pCCInfo->u8ParsingStatus,&pUserDataBuf, pDst608Buf, pu32Dst608Len, pDst708Buf, pu32Dst708Len, &stEhInfo608);
5339*53ee8cc1Swenshuai.xi                     }
5340*53ee8cc1Swenshuai.xi                     else if (code == DTV_BAR_CODE)
5341*53ee8cc1Swenshuai.xi                     {
5342*53ee8cc1Swenshuai.xi                         _HVD_CC_Parse_BAR_data(&pUserDataBuf);
5343*53ee8cc1Swenshuai.xi                     }
5344*53ee8cc1Swenshuai.xi 
5345*53ee8cc1Swenshuai.xi                 }
5346*53ee8cc1Swenshuai.xi                 else if (dvb_code == DTV_AFD_CODE)
5347*53ee8cc1Swenshuai.xi                 {
5348*53ee8cc1Swenshuai.xi                     _HVD_CC_Parse_AFD_data(&pUserDataBuf);
5349*53ee8cc1Swenshuai.xi                 }
5350*53ee8cc1Swenshuai.xi 
5351*53ee8cc1Swenshuai.xi             }
5352*53ee8cc1Swenshuai.xi         }
5353*53ee8cc1Swenshuai.xi     }
5354*53ee8cc1Swenshuai.xi 
5355*53ee8cc1Swenshuai.xi     if((pUserDataBuf - pUserDataStartBuf) > pUserData->len)
5356*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("ERROR!!!!  (pUserDataBuf - pUserDataStartBuf) > u32SrcLen\n");
5357*53ee8cc1Swenshuai.xi 
5358*53ee8cc1Swenshuai.xi 
5359*53ee8cc1Swenshuai.xi }
5360*53ee8cc1Swenshuai.xi 
5361*53ee8cc1Swenshuai.xi 
5362*53ee8cc1Swenshuai.xi 
5363*53ee8cc1Swenshuai.xi 
_HVD_CC_RB_Have_Avail_Space(MS_U8 u8CC608,MS_U32 u32QuerySize)5364*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_CC_RB_Have_Avail_Space(MS_U8 u8CC608, MS_U32 u32QuerySize)
5365*53ee8cc1Swenshuai.xi {
5366*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5367*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufVacancy = pCCInfo->u32RingBufVacancy[u8CC608];
5368*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
5369*53ee8cc1Swenshuai.xi 
5370*53ee8cc1Swenshuai.xi     if ((u32QuerySize % HVD_CCRB_PACKET_LENGTH) != 0)
5371*53ee8cc1Swenshuai.xi     {
5372*53ee8cc1Swenshuai.xi         u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32QuerySize / HVD_CCRB_PACKET_LENGTH)+1);
5373*53ee8cc1Swenshuai.xi     }
5374*53ee8cc1Swenshuai.xi     else
5375*53ee8cc1Swenshuai.xi     {
5376*53ee8cc1Swenshuai.xi         u32AlignCCLen = u32QuerySize;
5377*53ee8cc1Swenshuai.xi     }
5378*53ee8cc1Swenshuai.xi 
5379*53ee8cc1Swenshuai.xi 
5380*53ee8cc1Swenshuai.xi     if(u32RingBufVacancy >= u32AlignCCLen)
5381*53ee8cc1Swenshuai.xi         return TRUE;
5382*53ee8cc1Swenshuai.xi     else
5383*53ee8cc1Swenshuai.xi         return FALSE;
5384*53ee8cc1Swenshuai.xi 
5385*53ee8cc1Swenshuai.xi 
5386*53ee8cc1Swenshuai.xi }
5387*53ee8cc1Swenshuai.xi 
5388*53ee8cc1Swenshuai.xi 
5389*53ee8cc1Swenshuai.xi 
_HVD_CC_Copy_CCdata_To_RB(MS_U8 u8CC608,MS_U8 * pSrcBuf,MS_U32 u32SrcLen)5390*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_CC_Copy_CCdata_To_RB(MS_U8 u8CC608,MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
5391*53ee8cc1Swenshuai.xi {
5392*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5393*53ee8cc1Swenshuai.xi 
5394*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufRPAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
5395*53ee8cc1Swenshuai.xi     MS_U32 u32RingBufWPAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
5396*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
5397*53ee8cc1Swenshuai.xi 
5398*53ee8cc1Swenshuai.xi 
5399*53ee8cc1Swenshuai.xi 
5400*53ee8cc1Swenshuai.xi     if(u32SrcLen == 0)
5401*53ee8cc1Swenshuai.xi         return FALSE;
5402*53ee8cc1Swenshuai.xi 
5403*53ee8cc1Swenshuai.xi 
5404*53ee8cc1Swenshuai.xi     if ((u32SrcLen % HVD_CCRB_PACKET_LENGTH) != 0)
5405*53ee8cc1Swenshuai.xi     {
5406*53ee8cc1Swenshuai.xi         u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32SrcLen / HVD_CCRB_PACKET_LENGTH)+1);
5407*53ee8cc1Swenshuai.xi     }
5408*53ee8cc1Swenshuai.xi     else
5409*53ee8cc1Swenshuai.xi     {
5410*53ee8cc1Swenshuai.xi         u32AlignCCLen = u32SrcLen;
5411*53ee8cc1Swenshuai.xi     }
5412*53ee8cc1Swenshuai.xi 
5413*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufVacancy[u8CC608] < u32AlignCCLen)
5414*53ee8cc1Swenshuai.xi     {
5415*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("overflow !!!, u32RingBufVacancy: %ld, u32AlignLen: %ld\n",pCCInfo->u32RingBufVacancy[u8CC608], u32AlignCCLen);
5416*53ee8cc1Swenshuai.xi         return TRUE;
5417*53ee8cc1Swenshuai.xi     }
5418*53ee8cc1Swenshuai.xi 
5419*53ee8cc1Swenshuai.xi 
5420*53ee8cc1Swenshuai.xi     if(u32RingBufWPAddr >= u32RingBufRPAddr)
5421*53ee8cc1Swenshuai.xi     {
5422*53ee8cc1Swenshuai.xi         if( (u32RingBufWPAddr + u32AlignCCLen) <= (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
5423*53ee8cc1Swenshuai.xi         {
5424*53ee8cc1Swenshuai.xi 
5425*53ee8cc1Swenshuai.xi             HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
5426*53ee8cc1Swenshuai.xi 
5427*53ee8cc1Swenshuai.xi 
5428*53ee8cc1Swenshuai.xi             if((pCCInfo->u32RingBufWPAddr[u8CC608] + u32AlignCCLen) == (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
5429*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = pCCInfo->u32RingBufStartPAddr[u8CC608];
5430*53ee8cc1Swenshuai.xi             else
5431*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
5432*53ee8cc1Swenshuai.xi 
5433*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
5434*53ee8cc1Swenshuai.xi 
5435*53ee8cc1Swenshuai.xi         }
5436*53ee8cc1Swenshuai.xi         else
5437*53ee8cc1Swenshuai.xi         {
5438*53ee8cc1Swenshuai.xi             MS_U32 part1_len = (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]) - u32RingBufWPAddr;
5439*53ee8cc1Swenshuai.xi             MS_U32 part2_len = u32AlignCCLen - part1_len;
5440*53ee8cc1Swenshuai.xi 
5441*53ee8cc1Swenshuai.xi 
5442*53ee8cc1Swenshuai.xi 
5443*53ee8cc1Swenshuai.xi 
5444*53ee8cc1Swenshuai.xi             {
5445*53ee8cc1Swenshuai.xi 
5446*53ee8cc1Swenshuai.xi 
5447*53ee8cc1Swenshuai.xi                 HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)pSrcBuf, part1_len);
5448*53ee8cc1Swenshuai.xi 
5449*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608];
5450*53ee8cc1Swenshuai.xi 
5451*53ee8cc1Swenshuai.xi                 HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)),(void *)(&pSrcBuf[part1_len]), part2_len);
5452*53ee8cc1Swenshuai.xi 
5453*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufWPAddr[u8CC608] = u32RingBufWPAddr = pCCInfo->u32RingBufStartPAddr[u8CC608] + part2_len;
5454*53ee8cc1Swenshuai.xi                 pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
5455*53ee8cc1Swenshuai.xi             }
5456*53ee8cc1Swenshuai.xi 
5457*53ee8cc1Swenshuai.xi         }
5458*53ee8cc1Swenshuai.xi 
5459*53ee8cc1Swenshuai.xi     }
5460*53ee8cc1Swenshuai.xi     else
5461*53ee8cc1Swenshuai.xi     {
5462*53ee8cc1Swenshuai.xi 
5463*53ee8cc1Swenshuai.xi 
5464*53ee8cc1Swenshuai.xi         {
5465*53ee8cc1Swenshuai.xi 
5466*53ee8cc1Swenshuai.xi             HVD_memcpy((void *)(HVD_PA2VA(u32RingBufWPAddr)), (void *)pSrcBuf, u32AlignCCLen);
5467*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufWPAddr[u8CC608] += u32AlignCCLen;
5468*53ee8cc1Swenshuai.xi             pCCInfo->u32RingBufVacancy[u8CC608] -= u32AlignCCLen;
5469*53ee8cc1Swenshuai.xi         }
5470*53ee8cc1Swenshuai.xi 
5471*53ee8cc1Swenshuai.xi 
5472*53ee8cc1Swenshuai.xi     }
5473*53ee8cc1Swenshuai.xi 
5474*53ee8cc1Swenshuai.xi     return FALSE;
5475*53ee8cc1Swenshuai.xi }
5476*53ee8cc1Swenshuai.xi 
5477*53ee8cc1Swenshuai.xi 
_HVD_CC_Add_PaddingData_To_608(MS_U8 * pSrcBuf,MS_U32 u32SrcLen)5478*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_CC_Add_PaddingData_To_608(MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
5479*53ee8cc1Swenshuai.xi {
5480*53ee8cc1Swenshuai.xi 
5481*53ee8cc1Swenshuai.xi     MS_U32 u32AlignCCLen;
5482*53ee8cc1Swenshuai.xi     MS_U32 i;
5483*53ee8cc1Swenshuai.xi     MS_BOOL b608OverFlow;
5484*53ee8cc1Swenshuai.xi 
5485*53ee8cc1Swenshuai.xi     if ((u32SrcLen % HVD_CCRB_PACKET_LENGTH) != 0)
5486*53ee8cc1Swenshuai.xi     {
5487*53ee8cc1Swenshuai.xi         u32AlignCCLen = HVD_CCRB_PACKET_LENGTH * ((u32SrcLen / HVD_CCRB_PACKET_LENGTH)+1);
5488*53ee8cc1Swenshuai.xi     }
5489*53ee8cc1Swenshuai.xi     else
5490*53ee8cc1Swenshuai.xi     {
5491*53ee8cc1Swenshuai.xi         u32AlignCCLen = u32SrcLen;
5492*53ee8cc1Swenshuai.xi     }
5493*53ee8cc1Swenshuai.xi 
5494*53ee8cc1Swenshuai.xi 
5495*53ee8cc1Swenshuai.xi 
5496*53ee8cc1Swenshuai.xi     if(u32AlignCCLen > MAX_608_CC_LEN)
5497*53ee8cc1Swenshuai.xi     {
5498*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("u32AlignCCLen:%ld > MAX_608_CC_LEN", u32AlignCCLen);
5499*53ee8cc1Swenshuai.xi         return TRUE;
5500*53ee8cc1Swenshuai.xi     }
5501*53ee8cc1Swenshuai.xi 
5502*53ee8cc1Swenshuai.xi 
5503*53ee8cc1Swenshuai.xi 
5504*53ee8cc1Swenshuai.xi     for(i =0; i < (u32AlignCCLen-u32SrcLen);i++)
5505*53ee8cc1Swenshuai.xi         pSrcBuf[u32SrcLen+i] = 0xff;// add padinng data
5506*53ee8cc1Swenshuai.xi 
5507*53ee8cc1Swenshuai.xi     b608OverFlow =_HVD_CC_Copy_CCdata_To_RB(1, &(pSrcBuf[0]), u32AlignCCLen);
5508*53ee8cc1Swenshuai.xi     return b608OverFlow;
5509*53ee8cc1Swenshuai.xi 
5510*53ee8cc1Swenshuai.xi }
5511*53ee8cc1Swenshuai.xi 
_HVD_CC_Add_PaddingData_To_708(MS_U8 * pSrcBuf,MS_U32 u32SrcLen)5512*53ee8cc1Swenshuai.xi static MS_BOOL _HVD_CC_Add_PaddingData_To_708(MS_U8 *pSrcBuf, MS_U32 u32SrcLen)
5513*53ee8cc1Swenshuai.xi {
5514*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5515*53ee8cc1Swenshuai.xi 
5516*53ee8cc1Swenshuai.xi     MS_U32 *u32RingBufWAddr = (MS_U32 *)(HVD_PA2VA(pCCInfo->u32RingBufWPAddr[0]));
5517*53ee8cc1Swenshuai.xi 
5518*53ee8cc1Swenshuai.xi     MS_U8  u8CC_Type, u8CC_Data1, u8CC_Data2,u8Temp;
5519*53ee8cc1Swenshuai.xi     MS_U16 i,j,u16Pad,u16DataCount;
5520*53ee8cc1Swenshuai.xi     MS_U8  *pAddr;
5521*53ee8cc1Swenshuai.xi     MS_U8 u8CCPading[MAX_708_CC_LEN];
5522*53ee8cc1Swenshuai.xi     MS_BOOL b708OverFlow = FALSE;
5523*53ee8cc1Swenshuai.xi     u16DataCount = 0;
5524*53ee8cc1Swenshuai.xi 
5525*53ee8cc1Swenshuai.xi     for(j=0;j<u32SrcLen;j+=4)
5526*53ee8cc1Swenshuai.xi     {
5527*53ee8cc1Swenshuai.xi         u8CC_Data1 = *pSrcBuf++;
5528*53ee8cc1Swenshuai.xi         u8CC_Data2 = *pSrcBuf++;
5529*53ee8cc1Swenshuai.xi         u8CC_Type  = *pSrcBuf++;
5530*53ee8cc1Swenshuai.xi         u8Temp     = *pSrcBuf++;
5531*53ee8cc1Swenshuai.xi 
5532*53ee8cc1Swenshuai.xi         if(u8CC_Type==3) //padd_out();
5533*53ee8cc1Swenshuai.xi         {
5534*53ee8cc1Swenshuai.xi             if( pCCInfo->u32PktLen708 > 0 )
5535*53ee8cc1Swenshuai.xi             {
5536*53ee8cc1Swenshuai.xi                 u16Pad = pCCInfo->u32PktLen708;
5537*53ee8cc1Swenshuai.xi                 for (i=0;i<u16Pad;i++)
5538*53ee8cc1Swenshuai.xi                     u8CCPading[u16DataCount++] = 0xff;
5539*53ee8cc1Swenshuai.xi                 pCCInfo->u32PktLen708 = 0;
5540*53ee8cc1Swenshuai.xi #if 1
5541*53ee8cc1Swenshuai.xi 
5542*53ee8cc1Swenshuai.xi                 pAddr = (MS_U8 *)pCCInfo->u32PktHdrAddr708;
5543*53ee8cc1Swenshuai.xi                 if(pAddr)
5544*53ee8cc1Swenshuai.xi                 {
5545*53ee8cc1Swenshuai.xi                     u8Temp = *pAddr;
5546*53ee8cc1Swenshuai.xi                     u16Pad = (u8Temp&0x3f)<<1;
5547*53ee8cc1Swenshuai.xi                     if((i!=0)&&(u16Pad > i))
5548*53ee8cc1Swenshuai.xi                     {
5549*53ee8cc1Swenshuai.xi                         i = i>>1;
5550*53ee8cc1Swenshuai.xi                         u8Temp = u8Temp - i;
5551*53ee8cc1Swenshuai.xi                         *pAddr = (u8Temp&0xff);
5552*53ee8cc1Swenshuai.xi                     }
5553*53ee8cc1Swenshuai.xi                 }
5554*53ee8cc1Swenshuai.xi #endif
5555*53ee8cc1Swenshuai.xi             }
5556*53ee8cc1Swenshuai.xi 
5557*53ee8cc1Swenshuai.xi             u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
5558*53ee8cc1Swenshuai.xi             if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
5559*53ee8cc1Swenshuai.xi             for(i=0;i<u16Pad;i++)
5560*53ee8cc1Swenshuai.xi                 u8CCPading[u16DataCount++] = 0xff;
5561*53ee8cc1Swenshuai.xi 
5562*53ee8cc1Swenshuai.xi 
5563*53ee8cc1Swenshuai.xi             b708OverFlow =_HVD_CC_Copy_CCdata_To_RB(0, u8CCPading, u16DataCount);
5564*53ee8cc1Swenshuai.xi             if(b708OverFlow)
5565*53ee8cc1Swenshuai.xi                 return TRUE;
5566*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = (u8CC_Data1 & 0x3f)*2;
5567*53ee8cc1Swenshuai.xi             if(pCCInfo->u32PktLen708 == 0) pCCInfo->u32PktLen708 = 128;
5568*53ee8cc1Swenshuai.xi             u16DataCount = 0;
5569*53ee8cc1Swenshuai.xi 
5570*53ee8cc1Swenshuai.xi             pCCInfo->u32PktHdrAddr708 = (MS_U32)(u32RingBufWAddr);
5571*53ee8cc1Swenshuai.xi         }
5572*53ee8cc1Swenshuai.xi 
5573*53ee8cc1Swenshuai.xi         if(pCCInfo->u32PktLen708 > 0)
5574*53ee8cc1Swenshuai.xi         {
5575*53ee8cc1Swenshuai.xi             u8CCPading[u16DataCount++] = u8CC_Data1;
5576*53ee8cc1Swenshuai.xi             u8CCPading[u16DataCount++] = u8CC_Data2;
5577*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = pCCInfo->u32PktLen708 - 2;
5578*53ee8cc1Swenshuai.xi         }
5579*53ee8cc1Swenshuai.xi         else
5580*53ee8cc1Swenshuai.xi         {
5581*53ee8cc1Swenshuai.xi             pCCInfo->u32PktLen708 = 0;
5582*53ee8cc1Swenshuai.xi         }
5583*53ee8cc1Swenshuai.xi     }
5584*53ee8cc1Swenshuai.xi 
5585*53ee8cc1Swenshuai.xi     if(u16DataCount > 0)
5586*53ee8cc1Swenshuai.xi     {
5587*53ee8cc1Swenshuai.xi         if( pCCInfo->u32PktLen708 ==0 )
5588*53ee8cc1Swenshuai.xi         {
5589*53ee8cc1Swenshuai.xi             u16Pad = (pCCInfo->u32RingBufWPAddr[0] + u16DataCount) & 7;
5590*53ee8cc1Swenshuai.xi             if(u16Pad) u16Pad = HVD_CCRB_PACKET_LENGTH-u16Pad;
5591*53ee8cc1Swenshuai.xi             for(i=0;i<u16Pad;i++)
5592*53ee8cc1Swenshuai.xi                 u8CCPading[u16DataCount++] = 0xff;
5593*53ee8cc1Swenshuai.xi 
5594*53ee8cc1Swenshuai.xi         }
5595*53ee8cc1Swenshuai.xi 
5596*53ee8cc1Swenshuai.xi         b708OverFlow = _HVD_CC_Copy_CCdata_To_RB(0, u8CCPading, u16DataCount);
5597*53ee8cc1Swenshuai.xi         if(b708OverFlow)
5598*53ee8cc1Swenshuai.xi             return TRUE;
5599*53ee8cc1Swenshuai.xi     }
5600*53ee8cc1Swenshuai.xi 
5601*53ee8cc1Swenshuai.xi     return FALSE;
5602*53ee8cc1Swenshuai.xi 
5603*53ee8cc1Swenshuai.xi }
5604*53ee8cc1Swenshuai.xi 
5605*53ee8cc1Swenshuai.xi 
5606*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5607*53ee8cc1Swenshuai.xi /// Closed Caption Driver Initialization
5608*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_Init(void)5609*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_Init(void)
5610*53ee8cc1Swenshuai.xi {
5611*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5612*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5613*53ee8cc1Swenshuai.xi 
5614*53ee8cc1Swenshuai.xi 
5615*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
5616*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
5617*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
5618*53ee8cc1Swenshuai.xi 
5619*53ee8cc1Swenshuai.xi 
5620*53ee8cc1Swenshuai.xi     pCCInfo->u8UserDataMode = USER_DATA_MODE_DVB_NORMAL;
5621*53ee8cc1Swenshuai.xi 
5622*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SET_USERDATA_MODE, pCCInfo->u8UserDataMode);
5623*53ee8cc1Swenshuai.xi 
5624*53ee8cc1Swenshuai.xi     if (pCCInfo->u8ParsingStatus == 0xff)
5625*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus = 0x00;
5626*53ee8cc1Swenshuai.xi 
5627*53ee8cc1Swenshuai.xi     //eRet = E_HVD_OK;
5628*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5629*53ee8cc1Swenshuai.xi }
5630*53ee8cc1Swenshuai.xi 
5631*53ee8cc1Swenshuai.xi 
5632*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5633*53ee8cc1Swenshuai.xi /// Set Closed Caption config
5634*53ee8cc1Swenshuai.xi /// @param u8Operation \b IN Digital Closed Caption Type
5635*53ee8cc1Swenshuai.xi /// @param u16BufferSize \b IN buffer size of the given hardware parser
5636*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5637*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5638*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5639*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_SetCfg(MS_U8 u8Operation,MS_U16 u16BufferSize,MS_U8 u8CC608)5640*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_SetCfg(MS_U8 u8Operation, MS_U16 u16BufferSize, MS_U8 u8CC608)
5641*53ee8cc1Swenshuai.xi {
5642*53ee8cc1Swenshuai.xi 
5643*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5644*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5645*53ee8cc1Swenshuai.xi 
5646*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
5647*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
5648*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
5649*53ee8cc1Swenshuai.xi 
5650*53ee8cc1Swenshuai.xi 
5651*53ee8cc1Swenshuai.xi 
5652*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufLen[u8CC608] =  pCCInfo->u32RingBufVacancy[u8CC608] = u16BufferSize;
5653*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus |= u8Operation;
5654*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus &= 0x07;
5655*53ee8cc1Swenshuai.xi 
5656*53ee8cc1Swenshuai.xi     HVD_MSG_DEG("u8Operation: %x, u16BufferSize:%x, u8CC608:%d\n",u8Operation, u16BufferSize,u8CC608);
5657*53ee8cc1Swenshuai.xi 
5658*53ee8cc1Swenshuai.xi 
5659*53ee8cc1Swenshuai.xi     if (u8CC608==0x00)
5660*53ee8cc1Swenshuai.xi         pCCInfo->b708Enable = TRUE;
5661*53ee8cc1Swenshuai.xi 
5662*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5663*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5664*53ee8cc1Swenshuai.xi 
5665*53ee8cc1Swenshuai.xi 
5666*53ee8cc1Swenshuai.xi 
5667*53ee8cc1Swenshuai.xi 
5668*53ee8cc1Swenshuai.xi 
5669*53ee8cc1Swenshuai.xi }
5670*53ee8cc1Swenshuai.xi 
5671*53ee8cc1Swenshuai.xi 
5672*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5673*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Start Address
5674*53ee8cc1Swenshuai.xi /// @param u32StartAddress \b IN Ring Buffer's Address
5675*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5676*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5677*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5678*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_Set_RB_StartAddr(MS_U32 u32StartPAddress,MS_U8 u8CC608)5679*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_Set_RB_StartAddr(MS_U32 u32StartPAddress, MS_U8 u8CC608)
5680*53ee8cc1Swenshuai.xi {
5681*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5682*53ee8cc1Swenshuai.xi     HVD_Drv_Ctrl *pCtrl = &gHVDCtrl;
5683*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5684*53ee8cc1Swenshuai.xi 
5685*53ee8cc1Swenshuai.xi 
5686*53ee8cc1Swenshuai.xi     HVD_MSG_TRACE();
5687*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
5688*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
5689*53ee8cc1Swenshuai.xi 
5690*53ee8cc1Swenshuai.xi 
5691*53ee8cc1Swenshuai.xi 
5692*53ee8cc1Swenshuai.xi     if ( (u32StartPAddress  &  pCtrl->MemMap.u32MIU1BaseAddr) == pCtrl->MemMap.u32MIU1BaseAddr)
5693*53ee8cc1Swenshuai.xi     {
5694*53ee8cc1Swenshuai.xi         pCCInfo->bBufMiu1[u8CC608] = TRUE;
5695*53ee8cc1Swenshuai.xi     }
5696*53ee8cc1Swenshuai.xi     else
5697*53ee8cc1Swenshuai.xi     {
5698*53ee8cc1Swenshuai.xi         pCCInfo->bBufMiu1[u8CC608] = FALSE;
5699*53ee8cc1Swenshuai.xi     }
5700*53ee8cc1Swenshuai.xi     HVD_MSG_DEG("u32StartPAddress: 0x%lx ,u8CC608: 0x%x, pCCInfo->bBufMiu1[u8CC608]: %d, pCtrl->MemMap.u32MIU1BaseAddr: 0x%lx\n",
5701*53ee8cc1Swenshuai.xi         u32StartPAddress , u8CC608,pCCInfo->bBufMiu1[u8CC608], pCtrl->MemMap.u32MIU1BaseAddr);
5702*53ee8cc1Swenshuai.xi 
5703*53ee8cc1Swenshuai.xi 
5704*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufStartPAddr[u8CC608] = pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608] = u32StartPAddress;
5705*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufLen[u8CC608] > 0)
5706*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
5707*53ee8cc1Swenshuai.xi 
5708*53ee8cc1Swenshuai.xi 
5709*53ee8cc1Swenshuai.xi     _HVD_CC_Update_UserData_Wptr();
5710*53ee8cc1Swenshuai.xi     pCCInfo->u32FWUsrDataRIdx = /*pCCInfo->u32FWUsrDataPrevWIdx =*/ pCCInfo->u32FWUsrDataWIdx;
5711*53ee8cc1Swenshuai.xi 
5712*53ee8cc1Swenshuai.xi 
5713*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5714*53ee8cc1Swenshuai.xi 
5715*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5716*53ee8cc1Swenshuai.xi 
5717*53ee8cc1Swenshuai.xi 
5718*53ee8cc1Swenshuai.xi }
5719*53ee8cc1Swenshuai.xi 
5720*53ee8cc1Swenshuai.xi 
5721*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5722*53ee8cc1Swenshuai.xi /// Set HVD Ring Buffer's Read Address as Write Address
5723*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5724*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5725*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5726*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_SyncRB_RdAddr2WrAddr(MS_U8 u8CC608)5727*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_SyncRB_RdAddr2WrAddr(MS_U8 u8CC608)
5728*53ee8cc1Swenshuai.xi {
5729*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5730*53ee8cc1Swenshuai.xi 
5731*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5732*53ee8cc1Swenshuai.xi 
5733*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufRPAddr[u8CC608] = pCCInfo->u32RingBufWPAddr[u8CC608];//u32ReadAddress;
5734*53ee8cc1Swenshuai.xi     _HVD_CC_Update_UserData_Wptr();
5735*53ee8cc1Swenshuai.xi     pCCInfo->u32FWUsrDataRIdx = pCCInfo->u32FWUsrDataWIdx;
5736*53ee8cc1Swenshuai.xi     if(pCCInfo->u32RingBufLen[u8CC608] > 0)
5737*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufVacancy[u8CC608] = pCCInfo->u32RingBufLen[u8CC608];
5738*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5739*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5740*53ee8cc1Swenshuai.xi 
5741*53ee8cc1Swenshuai.xi }
5742*53ee8cc1Swenshuai.xi 
5743*53ee8cc1Swenshuai.xi 
5744*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5745*53ee8cc1Swenshuai.xi /// Advance Read Address of HVD CC Ring Buffer by u32EachPacketSize
5746*53ee8cc1Swenshuai.xi /// @param u32EachPacketSize \b IN
5747*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5748*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5749*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5750*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_Adv_RB_ReadAddr(MS_U32 u32EachPacketSize,MS_U8 u8CC608)5751*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_Adv_RB_ReadAddr(MS_U32 u32EachPacketSize, MS_U8 u8CC608)
5752*53ee8cc1Swenshuai.xi {
5753*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
5754*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5755*53ee8cc1Swenshuai.xi     MS_U32 u32ParsedDataSize;
5756*53ee8cc1Swenshuai.xi 
5757*53ee8cc1Swenshuai.xi     // Get the Parsed Data Size
5758*53ee8cc1Swenshuai.xi     if ((u32EachPacketSize % HVD_CCRB_PACKET_LENGTH) != 0)
5759*53ee8cc1Swenshuai.xi     {
5760*53ee8cc1Swenshuai.xi         u32ParsedDataSize = HVD_CCRB_PACKET_LENGTH * ((u32EachPacketSize / HVD_CCRB_PACKET_LENGTH)+1); //HVD_CCRB_PACKET_LENGTH bytes alignment
5761*53ee8cc1Swenshuai.xi     }
5762*53ee8cc1Swenshuai.xi     else
5763*53ee8cc1Swenshuai.xi     {
5764*53ee8cc1Swenshuai.xi         u32ParsedDataSize = u32EachPacketSize;
5765*53ee8cc1Swenshuai.xi     }
5766*53ee8cc1Swenshuai.xi 
5767*53ee8cc1Swenshuai.xi     if(u32ParsedDataSize > (pCCInfo->u32RingBufLen[u8CC608] - pCCInfo->u32RingBufVacancy[u8CC608]))
5768*53ee8cc1Swenshuai.xi     {
5769*53ee8cc1Swenshuai.xi         HVD_MSG_ERR("MDrv_HVD_CC_Adv_RB_ReadAddr fail!, no enough data!, vacancy: %ld, u32ParsedDataSize: %ld, u32RingBufLen:%ld, u32RingBufRPAddr: 0x%lx, u32RingBufWPAddr: 0x%lx\n",
5770*53ee8cc1Swenshuai.xi                         pCCInfo->u32RingBufVacancy[u8CC608], u32ParsedDataSize, pCCInfo->u32RingBufLen[u8CC608], pCCInfo->u32RingBufRPAddr[u8CC608],pCCInfo->u32RingBufWPAddr[u8CC608]);
5771*53ee8cc1Swenshuai.xi         return E_HVD_FAIL;
5772*53ee8cc1Swenshuai.xi     }
5773*53ee8cc1Swenshuai.xi 
5774*53ee8cc1Swenshuai.xi 
5775*53ee8cc1Swenshuai.xi     if ((pCCInfo->u32RingBufRPAddr[u8CC608] + u32ParsedDataSize) < (pCCInfo->u32RingBufStartPAddr[u8CC608] + pCCInfo->u32RingBufLen[u8CC608]))
5776*53ee8cc1Swenshuai.xi     {
5777*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufRPAddr[u8CC608] += u32ParsedDataSize;
5778*53ee8cc1Swenshuai.xi     }
5779*53ee8cc1Swenshuai.xi     else
5780*53ee8cc1Swenshuai.xi     {
5781*53ee8cc1Swenshuai.xi         pCCInfo->u32RingBufRPAddr[u8CC608] = (u32ParsedDataSize + pCCInfo->u32RingBufRPAddr[u8CC608] - pCCInfo->u32RingBufLen[u8CC608]);
5782*53ee8cc1Swenshuai.xi     }
5783*53ee8cc1Swenshuai.xi 
5784*53ee8cc1Swenshuai.xi     pCCInfo->u32RingBufVacancy[u8CC608] += u32ParsedDataSize ;
5785*53ee8cc1Swenshuai.xi 
5786*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5787*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5788*53ee8cc1Swenshuai.xi 
5789*53ee8cc1Swenshuai.xi }
5790*53ee8cc1Swenshuai.xi 
5791*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5792*53ee8cc1Swenshuai.xi /// Stop HVD CC parsing
5793*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5794*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5795*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5796*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_DisableParsing(MS_U8 u8CC608)5797*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_DisableParsing(MS_U8 u8CC608)
5798*53ee8cc1Swenshuai.xi {
5799*53ee8cc1Swenshuai.xi 
5800*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5801*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5802*53ee8cc1Swenshuai.xi 
5803*53ee8cc1Swenshuai.xi     if (u8CC608==0)
5804*53ee8cc1Swenshuai.xi     {
5805*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus &= ~0x04;
5806*53ee8cc1Swenshuai.xi         pCCInfo->b708Enable = FALSE;
5807*53ee8cc1Swenshuai.xi     }
5808*53ee8cc1Swenshuai.xi     else
5809*53ee8cc1Swenshuai.xi         pCCInfo->u8ParsingStatus &= ~0x03;
5810*53ee8cc1Swenshuai.xi 
5811*53ee8cc1Swenshuai.xi     pCCInfo->u8ParsingStatus &= 0x07;
5812*53ee8cc1Swenshuai.xi 
5813*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5814*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5815*53ee8cc1Swenshuai.xi }
5816*53ee8cc1Swenshuai.xi 
5817*53ee8cc1Swenshuai.xi 
MDrv_HVD_CC_GetInfo(MS_U32 selector,MS_U8 type,MS_U32 * p1,MS_U32 * p2)5818*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_CC_GetInfo(MS_U32 selector, MS_U8 type, MS_U32 *p1, MS_U32 *p2)
5819*53ee8cc1Swenshuai.xi {
5820*53ee8cc1Swenshuai.xi 
5821*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_RET_ILLEGAL_ACCESS;
5822*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5823*53ee8cc1Swenshuai.xi 
5824*53ee8cc1Swenshuai.xi     // Functionality select
5825*53ee8cc1Swenshuai.xi     switch (selector)
5826*53ee8cc1Swenshuai.xi     {
5827*53ee8cc1Swenshuai.xi         case HVD_CC_SELECTOR_708_SW:
5828*53ee8cc1Swenshuai.xi             *p1 = (MS_U32)pCCInfo->b708Enable;
5829*53ee8cc1Swenshuai.xi             break;
5830*53ee8cc1Swenshuai.xi 
5831*53ee8cc1Swenshuai.xi #if defined( MSOS_TYPE_LINUX )
5832*53ee8cc1Swenshuai.xi         case HVD_CC_SELECTOR_RINGBUFFER:
5833*53ee8cc1Swenshuai.xi             {
5834*53ee8cc1Swenshuai.xi                 MS_U32 u32PAddr;
5835*53ee8cc1Swenshuai.xi                 u32PAddr = pCCInfo->u32RingBufStartPAddr[type];
5836*53ee8cc1Swenshuai.xi                 *p1 = u32PAddr;
5837*53ee8cc1Swenshuai.xi                 *p2 = (MS_U32) pCCInfo->u32RingBufLen[type];
5838*53ee8cc1Swenshuai.xi             }
5839*53ee8cc1Swenshuai.xi             break;
5840*53ee8cc1Swenshuai.xi #endif
5841*53ee8cc1Swenshuai.xi 
5842*53ee8cc1Swenshuai.xi         default:
5843*53ee8cc1Swenshuai.xi             *p1 = *p2 = 0;
5844*53ee8cc1Swenshuai.xi             break;
5845*53ee8cc1Swenshuai.xi     }
5846*53ee8cc1Swenshuai.xi     eRet = E_HVD_OK;
5847*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
5848*53ee8cc1Swenshuai.xi }
5849*53ee8cc1Swenshuai.xi 
5850*53ee8cc1Swenshuai.xi 
MDrv_HVD_CC_IsHvdRstDone(MS_U8 type)5851*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_CC_IsHvdRstDone(MS_U8 type)
5852*53ee8cc1Swenshuai.xi {
5853*53ee8cc1Swenshuai.xi     MS_BOOL bRet = FALSE;
5854*53ee8cc1Swenshuai.xi 
5855*53ee8cc1Swenshuai.xi     bRet = TRUE;
5856*53ee8cc1Swenshuai.xi 
5857*53ee8cc1Swenshuai.xi     return bRet;
5858*53ee8cc1Swenshuai.xi }
5859*53ee8cc1Swenshuai.xi 
5860*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5861*53ee8cc1Swenshuai.xi /// Get Overflow Status of HVD CC Ring Buffer
5862*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5863*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5864*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5865*53ee8cc1Swenshuai.xi /// Return value:: Overflow Status Flag
5866*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_GetOverflowStatus(MS_U8 u8CC608)5867*53ee8cc1Swenshuai.xi MS_U8 MDrv_HVD_CC_GetOverflowStatus(MS_U8 u8CC608)
5868*53ee8cc1Swenshuai.xi {
5869*53ee8cc1Swenshuai.xi 
5870*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5871*53ee8cc1Swenshuai.xi     MS_BOOL bOverFlow = pCCInfo->bOverFlow[u8CC608];
5872*53ee8cc1Swenshuai.xi     pCCInfo->bOverFlow[u8CC608] = FALSE;
5873*53ee8cc1Swenshuai.xi     return (bOverFlow);
5874*53ee8cc1Swenshuai.xi }
5875*53ee8cc1Swenshuai.xi 
5876*53ee8cc1Swenshuai.xi 
5877*53ee8cc1Swenshuai.xi 
5878*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
5879*53ee8cc1Swenshuai.xi /// Get Write Address of HVD CC Ring Buffer
5880*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
5881*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
5882*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
5883*53ee8cc1Swenshuai.xi /// Return value:: Write Address
5884*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_Get_RB_WriteAddr(MS_U8 u8CC608)5885*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_CC_Get_RB_WriteAddr(MS_U8 u8CC608)
5886*53ee8cc1Swenshuai.xi {
5887*53ee8cc1Swenshuai.xi 
5888*53ee8cc1Swenshuai.xi     HVD_Drv_Ctrl *pCtrl = &gHVDCtrl;
5889*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataIdxSize = 0;
5890*53ee8cc1Swenshuai.xi     MS_U32 u32UsrDataIdxWptr = 0xFFFFFFFF;
5891*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataSize = 0;
5892*53ee8cc1Swenshuai.xi     MS_U32 u32UserDataAddr = 0;
5893*53ee8cc1Swenshuai.xi     DTV_BUF_type* pHVD_User_Data = NULL;
5894*53ee8cc1Swenshuai.xi 
5895*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
5896*53ee8cc1Swenshuai.xi     MS_U32 u32FwParseCnt;
5897*53ee8cc1Swenshuai.xi     MS_U32 u32PAddr;
5898*53ee8cc1Swenshuai.xi 
5899*53ee8cc1Swenshuai.xi 
5900*53ee8cc1Swenshuai.xi     if ((pCCInfo->u8ParsingStatus == 0xff) || (pCCInfo->u8ParsingStatus == 0x00))
5901*53ee8cc1Swenshuai.xi     {
5902*53ee8cc1Swenshuai.xi 
5903*53ee8cc1Swenshuai.xi          u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
5904*53ee8cc1Swenshuai.xi 
5905*53ee8cc1Swenshuai.xi         if(!pCCInfo->bBufMiu1[u8CC608])
5906*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
5907*53ee8cc1Swenshuai.xi 
5908*53ee8cc1Swenshuai.xi         return u32PAddr;
5909*53ee8cc1Swenshuai.xi     }
5910*53ee8cc1Swenshuai.xi 
5911*53ee8cc1Swenshuai.xi     u32UserDataIdxSize = (MS_U32)HAL_HVD_GetData(E_HVD_GDATA_USERDATA_IDX_TBL_SIZE);
5912*53ee8cc1Swenshuai.xi 
5913*53ee8cc1Swenshuai.xi     u32UsrDataIdxWptr =_HVD_CC_Update_UserData_Wptr();
5914*53ee8cc1Swenshuai.xi 
5915*53ee8cc1Swenshuai.xi 
5916*53ee8cc1Swenshuai.xi 
5917*53ee8cc1Swenshuai.xi     if (pCCInfo->u32FWUsrDataRIdx == pCCInfo->u32FWUsrDataWIdx)
5918*53ee8cc1Swenshuai.xi     {
5919*53ee8cc1Swenshuai.xi         // User Data Buffer Empty
5920*53ee8cc1Swenshuai.xi         HVD_MSG_DEG("RIdx(%ld) == WIdx(%ld) , empty !!!\n", pCCInfo->u32FWUsrDataRIdx,pCCInfo->u32FWUsrDataWIdx);
5921*53ee8cc1Swenshuai.xi         u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
5922*53ee8cc1Swenshuai.xi 
5923*53ee8cc1Swenshuai.xi         if(!pCCInfo->bBufMiu1[u8CC608])
5924*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
5925*53ee8cc1Swenshuai.xi 
5926*53ee8cc1Swenshuai.xi         return u32PAddr;
5927*53ee8cc1Swenshuai.xi 
5928*53ee8cc1Swenshuai.xi     }
5929*53ee8cc1Swenshuai.xi     else if (pCCInfo->u32FWUsrDataWIdx > pCCInfo->u32FWUsrDataRIdx)
5930*53ee8cc1Swenshuai.xi     {
5931*53ee8cc1Swenshuai.xi         u32FwParseCnt = pCCInfo->u32FWUsrDataWIdx - pCCInfo->u32FWUsrDataRIdx;
5932*53ee8cc1Swenshuai.xi     }
5933*53ee8cc1Swenshuai.xi     else// pCCInfo->u32FWUsrDataWIdx < pCCInfo->u32FWUsrDataRIdx
5934*53ee8cc1Swenshuai.xi     {
5935*53ee8cc1Swenshuai.xi         u32FwParseCnt =  u32UserDataIdxSize - (pCCInfo->u32FWUsrDataRIdx - pCCInfo->u32FWUsrDataWIdx);
5936*53ee8cc1Swenshuai.xi     }
5937*53ee8cc1Swenshuai.xi 
5938*53ee8cc1Swenshuai.xi     HVD_MSG_DEG("u32FwParseCnt(%ld)  !!!,  pCCInfo->u32RingBufWPAddr[%d]: 0x%lx\n", u32FwParseCnt, u8CC608,pCCInfo->u32RingBufWPAddr[u8CC608] );
5939*53ee8cc1Swenshuai.xi 
5940*53ee8cc1Swenshuai.xi     MS_BOOL b608OverFlow = FALSE, b708OverFlow = FALSE;
5941*53ee8cc1Swenshuai.xi     MS_U8 *pCC608buf = &(pCCInfo->u8CC608buf[0]);
5942*53ee8cc1Swenshuai.xi     MS_U8 *pCC708buf = &(pCCInfo->u8CC708buf[0]);
5943*53ee8cc1Swenshuai.xi     MS_U32 u32CC608Len = 0;
5944*53ee8cc1Swenshuai.xi     MS_U32 u32CC708Len = 0;
5945*53ee8cc1Swenshuai.xi 
5946*53ee8cc1Swenshuai.xi 
5947*53ee8cc1Swenshuai.xi 
5948*53ee8cc1Swenshuai.xi 
5949*53ee8cc1Swenshuai.xi     while(u32FwParseCnt)
5950*53ee8cc1Swenshuai.xi     {
5951*53ee8cc1Swenshuai.xi 
5952*53ee8cc1Swenshuai.xi         if( (!_HVD_CC_RB_Have_Avail_Space(1, MAX_608_CC_LEN)) || (!_HVD_CC_RB_Have_Avail_Space(0, MAX_708_CC_LEN)))
5953*53ee8cc1Swenshuai.xi         {
5954*53ee8cc1Swenshuai.xi             HVD_MSG_DEG("not have available space!!!\n");
5955*53ee8cc1Swenshuai.xi             break;
5956*53ee8cc1Swenshuai.xi         }
5957*53ee8cc1Swenshuai.xi         u32UserDataAddr = MDrv_HVD_GetUserData_Packet(pCCInfo->u32FWUsrDataRIdx, (MS_U32*)&u32UserDataSize);
5958*53ee8cc1Swenshuai.xi         u32UserDataAddr += gHVDCtrl.MemMap.u32CodeBufVAddr; // change to virtual address
5959*53ee8cc1Swenshuai.xi 
5960*53ee8cc1Swenshuai.xi         pHVD_User_Data = (DTV_BUF_type*)u32UserDataAddr;
5961*53ee8cc1Swenshuai.xi 
5962*53ee8cc1Swenshuai.xi         u32CC608Len  = 0;
5963*53ee8cc1Swenshuai.xi         u32CC708Len  = 0;
5964*53ee8cc1Swenshuai.xi 
5965*53ee8cc1Swenshuai.xi 
5966*53ee8cc1Swenshuai.xi 
5967*53ee8cc1Swenshuai.xi         _HVD_CC_Extract_CCdata(pCC608buf, &u32CC608Len,pCC708buf, &u32CC708Len, pHVD_User_Data);
5968*53ee8cc1Swenshuai.xi 
5969*53ee8cc1Swenshuai.xi         if(u32CC608Len > 0)
5970*53ee8cc1Swenshuai.xi             b608OverFlow =_HVD_CC_Add_PaddingData_To_608(&(pCCInfo->u8CC608buf[0]), u32CC608Len);
5971*53ee8cc1Swenshuai.xi 
5972*53ee8cc1Swenshuai.xi 
5973*53ee8cc1Swenshuai.xi 
5974*53ee8cc1Swenshuai.xi 
5975*53ee8cc1Swenshuai.xi         if(u32CC708Len > 0)
5976*53ee8cc1Swenshuai.xi             b708OverFlow = _HVD_CC_Add_PaddingData_To_708(&(pCCInfo->u8CC708buf[0]), u32CC708Len);
5977*53ee8cc1Swenshuai.xi             //b708OverFlow =_HVD_CC_Copy_CCdata_To_RB(0, &CC708buf[0], u32CC708Len);
5978*53ee8cc1Swenshuai.xi 
5979*53ee8cc1Swenshuai.xi 
5980*53ee8cc1Swenshuai.xi 
5981*53ee8cc1Swenshuai.xi 
5982*53ee8cc1Swenshuai.xi         if(b608OverFlow)
5983*53ee8cc1Swenshuai.xi         {
5984*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("##### Critical error!!!! b608OverFlow: %d!!!\n",b608OverFlow);
5985*53ee8cc1Swenshuai.xi             pCCInfo->bOverFlow[1] = TRUE;
5986*53ee8cc1Swenshuai.xi         }
5987*53ee8cc1Swenshuai.xi 
5988*53ee8cc1Swenshuai.xi         if(b708OverFlow)
5989*53ee8cc1Swenshuai.xi         {
5990*53ee8cc1Swenshuai.xi             HVD_MSG_ERR("##### Critical error!!!! b708OverFlow:%d !!!\n",b708OverFlow);
5991*53ee8cc1Swenshuai.xi             pCCInfo->bOverFlow[0] = TRUE;
5992*53ee8cc1Swenshuai.xi         }
5993*53ee8cc1Swenshuai.xi 
5994*53ee8cc1Swenshuai.xi 
5995*53ee8cc1Swenshuai.xi 
5996*53ee8cc1Swenshuai.xi         pCCInfo->u32FWUsrDataRIdx++;
5997*53ee8cc1Swenshuai.xi 
5998*53ee8cc1Swenshuai.xi         if (pCCInfo->u32FWUsrDataRIdx >= u32UserDataIdxSize)
5999*53ee8cc1Swenshuai.xi         {
6000*53ee8cc1Swenshuai.xi             pCCInfo->u32FWUsrDataRIdx = 0;
6001*53ee8cc1Swenshuai.xi         }
6002*53ee8cc1Swenshuai.xi 
6003*53ee8cc1Swenshuai.xi 
6004*53ee8cc1Swenshuai.xi         u32FwParseCnt--;
6005*53ee8cc1Swenshuai.xi     }
6006*53ee8cc1Swenshuai.xi 
6007*53ee8cc1Swenshuai.xi 
6008*53ee8cc1Swenshuai.xi     u32PAddr = pCCInfo->u32RingBufWPAddr[u8CC608];
6009*53ee8cc1Swenshuai.xi     if(!pCCInfo->bBufMiu1[u8CC608])
6010*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
6011*53ee8cc1Swenshuai.xi 
6012*53ee8cc1Swenshuai.xi     return u32PAddr;
6013*53ee8cc1Swenshuai.xi 
6014*53ee8cc1Swenshuai.xi 
6015*53ee8cc1Swenshuai.xi 
6016*53ee8cc1Swenshuai.xi 
6017*53ee8cc1Swenshuai.xi }
6018*53ee8cc1Swenshuai.xi 
6019*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
6020*53ee8cc1Swenshuai.xi /// Get Read Address of HVD CC Ring Buffer
6021*53ee8cc1Swenshuai.xi /// @param u8CC608 \b IN
6022*53ee8cc1Swenshuai.xi ///   - # TRUE for CC608 parser
6023*53ee8cc1Swenshuai.xi ///   - # FALSE for CC708 parser
6024*53ee8cc1Swenshuai.xi /// Return value:: Read Address
6025*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_Get_RB_ReadAddr(MS_U8 u8CC608)6026*53ee8cc1Swenshuai.xi MS_U32 MDrv_HVD_CC_Get_RB_ReadAddr(MS_U8 u8CC608)
6027*53ee8cc1Swenshuai.xi {
6028*53ee8cc1Swenshuai.xi 
6029*53ee8cc1Swenshuai.xi    // MS_U8 u8DrvId = _HVD_EX_GetDrvId(u32Id);
6030*53ee8cc1Swenshuai.xi     HVD_Drv_Ctrl *pCtrl = &gHVDCtrl;
6031*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
6032*53ee8cc1Swenshuai.xi 
6033*53ee8cc1Swenshuai.xi     MS_U32 u32PAddr = pCCInfo->u32RingBufRPAddr[u8CC608];
6034*53ee8cc1Swenshuai.xi     if(!pCCInfo->bBufMiu1[u8CC608])
6035*53ee8cc1Swenshuai.xi             u32PAddr = u32PAddr & (pCtrl->MemMap.u32MIU1BaseAddr - 1);
6036*53ee8cc1Swenshuai.xi 
6037*53ee8cc1Swenshuai.xi     return u32PAddr;
6038*53ee8cc1Swenshuai.xi 
6039*53ee8cc1Swenshuai.xi }
6040*53ee8cc1Swenshuai.xi 
6041*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
6042*53ee8cc1Swenshuai.xi /// Enhance CC info mode, only support cc608
6043*53ee8cc1Swenshuai.xi /// @param bEnable \b IN
6044*53ee8cc1Swenshuai.xi ///   - # TRUE for enhance to dump the pts/tmp_ref info
6045*53ee8cc1Swenshuai.xi ///   - # FALSE for original
6046*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
MDrv_HVD_CC_InfoEnhanceMode(MS_BOOL bEnable)6047*53ee8cc1Swenshuai.xi MS_BOOL MDrv_HVD_CC_InfoEnhanceMode(MS_BOOL bEnable)
6048*53ee8cc1Swenshuai.xi {
6049*53ee8cc1Swenshuai.xi 
6050*53ee8cc1Swenshuai.xi     HVD_CC_Info *pCCInfo = &(gHVDCtrl.CloseCaptionInfo);
6051*53ee8cc1Swenshuai.xi 
6052*53ee8cc1Swenshuai.xi     pCCInfo->b608InfoEnhance = bEnable;
6053*53ee8cc1Swenshuai.xi 
6054*53ee8cc1Swenshuai.xi     return TRUE;
6055*53ee8cc1Swenshuai.xi }
6056*53ee8cc1Swenshuai.xi 
6057*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6058*53ee8cc1Swenshuai.xi /// Push Disp Q with Ref num
6059*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
6060*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6061*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_PushDispQWithRefNum(MS_BOOL bEnable)6062*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_PushDispQWithRefNum(MS_BOOL bEnable)
6063*53ee8cc1Swenshuai.xi {
6064*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
6065*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
6066*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
6067*53ee8cc1Swenshuai.xi 
6068*53ee8cc1Swenshuai.xi     eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_PUSH_DISPQ_WITH_REF_NUM, bEnable);
6069*53ee8cc1Swenshuai.xi 
6070*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
6071*53ee8cc1Swenshuai.xi }
6072*53ee8cc1Swenshuai.xi 
6073*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6074*53ee8cc1Swenshuai.xi /// Push First Frame to Display Queue Directly
6075*53ee8cc1Swenshuai.xi /// @param u8Mode \b IN : 0: Disable, 1: Enable
6076*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6077*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_ShowFirstFrameDirect(MS_BOOL bEnable)6078*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_ShowFirstFrameDirect(MS_BOOL bEnable)
6079*53ee8cc1Swenshuai.xi {
6080*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
6081*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
6082*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
6083*53ee8cc1Swenshuai.xi 
6084*53ee8cc1Swenshuai.xi    eRet = (HVD_Result)HAL_HVD_SetCmd(E_HVD_CMD_SHOW_FIRST_FRAME_DIRECT, bEnable);
6085*53ee8cc1Swenshuai.xi 
6086*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
6087*53ee8cc1Swenshuai.xi }
6088*53ee8cc1Swenshuai.xi 
6089*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6090*53ee8cc1Swenshuai.xi /// PreSetControl: Use only one pending buffer instead of two
6091*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
6092*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6093*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_OnePendingBufferMode(MS_BOOL bEnable)6094*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_OnePendingBufferMode(MS_BOOL bEnable)
6095*53ee8cc1Swenshuai.xi {
6096*53ee8cc1Swenshuai.xi     gHVDPreCtrl.bOnePendingBuffer = bEnable;
6097*53ee8cc1Swenshuai.xi 
6098*53ee8cc1Swenshuai.xi     return E_HVD_OK;
6099*53ee8cc1Swenshuai.xi }
6100*53ee8cc1Swenshuai.xi 
6101*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6102*53ee8cc1Swenshuai.xi /// PreSetControl : Framerate Handling
6103*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
6104*53ee8cc1Swenshuai.xi /// @param u32FrameRate \b IN : framerate used if the sequence did not have framerate info
6105*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6106*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_FrameRateHandling(MS_BOOL bEnable,MS_U32 u32FrameRate)6107*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_FrameRateHandling(MS_BOOL bEnable, MS_U32 u32FrameRate)
6108*53ee8cc1Swenshuai.xi {
6109*53ee8cc1Swenshuai.xi     gHVDPreCtrl.bFrameRateHandling = bEnable;
6110*53ee8cc1Swenshuai.xi     gHVDPreCtrl.u32PreSetFrameRate = u32FrameRate;
6111*53ee8cc1Swenshuai.xi 
6112*53ee8cc1Swenshuai.xi     return E_HVD_OK;
6113*53ee8cc1Swenshuai.xi }
6114*53ee8cc1Swenshuai.xi 
6115*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6116*53ee8cc1Swenshuai.xi /// Auto Exhaust ES Data
6117*53ee8cc1Swenshuai.xi /// @param u32ESbound \b IN : ES upper bound bits[31:16],  ES lower bound bits[15:0]
6118*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6119*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_AutoExhaustESMode(MS_U32 u32ESbound)6120*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_AutoExhaustESMode(MS_U32 u32ESbound)
6121*53ee8cc1Swenshuai.xi {
6122*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
6123*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
6124*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
6125*53ee8cc1Swenshuai.xi 
6126*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_AUTO_EXHAUST_ES_MODE, u32ESbound);
6127*53ee8cc1Swenshuai.xi 
6128*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
6129*53ee8cc1Swenshuai.xi }
6130*53ee8cc1Swenshuai.xi 
6131*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6132*53ee8cc1Swenshuai.xi /// Set Min TSP Data Size
6133*53ee8cc1Swenshuai.xi /// @param u32Size \b IN : Min TSP Data Size
6134*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6135*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_SetMinTspDataSize(MS_U32 u32Size)6136*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_SetMinTspDataSize(MS_U32 u32Size)
6137*53ee8cc1Swenshuai.xi {
6138*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
6139*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
6140*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
6141*53ee8cc1Swenshuai.xi 
6142*53ee8cc1Swenshuai.xi     eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_SET_MIN_TSP_DATA_SIZE, u32Size);
6143*53ee8cc1Swenshuai.xi 
6144*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
6145*53ee8cc1Swenshuai.xi }
6146*53ee8cc1Swenshuai.xi 
6147*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
6148*53ee8cc1Swenshuai.xi /// AVC support reference number over max DPB size when frame buffer is enough.
6149*53ee8cc1Swenshuai.xi /// @param bEnable \b IN : 0: Disable, 1: Enable
6150*53ee8cc1Swenshuai.xi /// @return -E_HVD_OK for success; E_HVD_FAIL for failure.
6151*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_HVD_AVCSupportRefNumOverMaxDBPSize(MS_BOOL bEnable)6152*53ee8cc1Swenshuai.xi HVD_Result MDrv_HVD_AVCSupportRefNumOverMaxDBPSize(MS_BOOL bEnable)
6153*53ee8cc1Swenshuai.xi {
6154*53ee8cc1Swenshuai.xi     HVD_Result eRet = E_HVD_FAIL;
6155*53ee8cc1Swenshuai.xi     _DRV_HVD_Inited(eRet);
6156*53ee8cc1Swenshuai.xi     _DRV_HVD_Entry();
6157*53ee8cc1Swenshuai.xi 
6158*53ee8cc1Swenshuai.xi    eRet = (HVD_Result) HAL_HVD_SetCmd(E_HVD_CMD_AVC_SUPPORT_REF_NUM_OVER_MAX_DPB_SIZE, bEnable);
6159*53ee8cc1Swenshuai.xi 
6160*53ee8cc1Swenshuai.xi     _DRV_HVD_Return(eRet);
6161*53ee8cc1Swenshuai.xi }
6162*53ee8cc1Swenshuai.xi 
6163