xref: /utopia/UTPA2-700.0.x/modules/vdec_v1/drv/rvd/drvRVD.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    drvRVD.c
98*53ee8cc1Swenshuai.xi /// @brief  RVD Driver Interface
99*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
100*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
103*53ee8cc1Swenshuai.xi //  Include Files
104*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
105*53ee8cc1Swenshuai.xi // Common Definition
106*53ee8cc1Swenshuai.xi #include "MsCommon.h"
107*53ee8cc1Swenshuai.xi #include "MsVersion.h"
108*53ee8cc1Swenshuai.xi #include "regRVD.h"
109*53ee8cc1Swenshuai.xi //load H/w Setting
110*53ee8cc1Swenshuai.xi ////////////////
111*53ee8cc1Swenshuai.xi #include "osalRVD.h"
112*53ee8cc1Swenshuai.xi #include "halRVD.h"
113*53ee8cc1Swenshuai.xi #include "drvRVD.h"
114*53ee8cc1Swenshuai.xi // Internal Definition
115*53ee8cc1Swenshuai.xi #include "drvMMIO.h"
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi #include "drvBDMA.h"
118*53ee8cc1Swenshuai.xi #define dmacpy( DESTADDR, SRCADDR , LEN)   MDrv_BDMA_CopyHnd((MS_PHYADDR)(SRCADDR), (MS_PHYADDR)(DESTADDR), (LEN), E_BDMA_SDRAM2SDRAM1, BDMA_OPCFG_DEF)
119*53ee8cc1Swenshuai.xi #define BDMAcpy(DESTADDR, SRCADDR, LEN , Flag)   MDrv_BDMA_CopyHnd((MS_PHYADDR)(SRCADDR), (MS_PHYADDR)(DESTADDR), (LEN), (Flag), BDMA_OPCFG_DEF)
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
122*53ee8cc1Swenshuai.xi //  Driver Compiler Options
123*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
124*53ee8cc1Swenshuai.xi //#define __TESTCODE__
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
127*53ee8cc1Swenshuai.xi //  Local Defines
128*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
129*53ee8cc1Swenshuai.xi #if RVD_ENABLE_EMBEDDED_FW_BINARY
130*53ee8cc1Swenshuai.xi static MS_U8 VLC_TAB[] =
131*53ee8cc1Swenshuai.xi {
132*53ee8cc1Swenshuai.xi     #include "fwRVDvlcmem.dat"
133*53ee8cc1Swenshuai.xi };
134*53ee8cc1Swenshuai.xi #endif
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi #define USING_ID_LINK 1
137*53ee8cc1Swenshuai.xi #define QMEM_BBU_TABLE_SIZE 0x4000
138*53ee8cc1Swenshuai.xi #define RVD_BBU_DEPTH 1600
139*53ee8cc1Swenshuai.xi #define BYTECOUNT_LIMIT 16777216 // 2^24
140*53ee8cc1Swenshuai.xi #define RVD_ISR_ENABLE 0 //Maybe used at Build broken index problem
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
143*53ee8cc1Swenshuai.xi //  Local Structurs
144*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
145*53ee8cc1Swenshuai.xi //Version
146*53ee8cc1Swenshuai.xi //#define RVD_DRV_VERSION     "xx.xxx.xxxx"
147*53ee8cc1Swenshuai.xi #define RVD_FW_CMD_TIMEOUT_DEFAULT    100      ///<Check FW cmd timeout threshold unit: ms
148*53ee8cc1Swenshuai.xi //extern MS_U32 eRvdDynCfgByChip;                ///<Dynamic scaling config bit (Got from hal layer)
149*53ee8cc1Swenshuai.xi #define RVD_CTRL_INIT_FINISHED        BIT(0)   ///<RVD init status :Finish
150*53ee8cc1Swenshuai.xi #define RVD_CTRL_PROCESSING           BIT(1)   ///<RVD init status :processing
151*53ee8cc1Swenshuai.xi #define RVD_CTRL_DATA_END             BIT(2)   ///< RVD init status : data end
152*53ee8cc1Swenshuai.xi #define RVD_CTRL_DISPLAY_CTRL         BIT(3)   ///< RVD init status :Set Disp ctrl mode
153*53ee8cc1Swenshuai.xi #define RVD_CTRL_DISP_INFO_RDY        BIT(4)   ///< RVD init status Get Disp Info Rdy
154*53ee8cc1Swenshuai.xi #define RVD_CTRL_CODE_MIU_1           BIT(5)   ///< RVD init status :Open Bin Addr in MIU1
155*53ee8cc1Swenshuai.xi #define RVD_CTRL_ES_MIU_1             BIT(6)   ///< RVD init status :ES buffer in MIU1
156*53ee8cc1Swenshuai.xi 
157*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
158*53ee8cc1Swenshuai.xi //  Global Variables
159*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
160*53ee8cc1Swenshuai.xi /// Version string
161*53ee8cc1Swenshuai.xi static MSIF_Version _drv_rvd_version = {
162*53ee8cc1Swenshuai.xi     .DDI = { RVD_DRV_VERSION, },
163*53ee8cc1Swenshuai.xi };
164*53ee8cc1Swenshuai.xi // Used for F/W Qmem exchange
165*53ee8cc1Swenshuai.xi static MS_U32 gu32QmemExchangeInfoAddr;
166*53ee8cc1Swenshuai.xi static MS_U32 gu32QmemBbuAddr = 0;
167*53ee8cc1Swenshuai.xi static RVD_DrvInfo DrvRVDInfo;
168*53ee8cc1Swenshuai.xi static MS_U8 u8RVD_DbgLevel = E_RVD_DEBUG_NONE;
169*53ee8cc1Swenshuai.xi static MS_U32 u32RVDCtrlMode = 0;
170*53ee8cc1Swenshuai.xi static MS_U32 u32StepPlayCnt = 0; // check if step play done
171*53ee8cc1Swenshuai.xi static MS_U32 u32StepDecodeCnt = 0; // check if step play done
172*53ee8cc1Swenshuai.xi static MS_U32 u32BytePos = 0;
173*53ee8cc1Swenshuai.xi static MS_U16 u16QmemBbuWptr = 0;
174*53ee8cc1Swenshuai.xi MS_U32 u32FWBinAddr = 0;
175*53ee8cc1Swenshuai.xi static MS_BOOL bRVDIsInit = FALSE;
176*53ee8cc1Swenshuai.xi static RVD_ISR_Ctrl gRVDISRCtrl = { FALSE  , 0  , NULL };
177*53ee8cc1Swenshuai.xi RVD_MEMCfg *MEMCfgRst;
178*53ee8cc1Swenshuai.xi RVD_FileInfo *FileInfoRst;
179*53ee8cc1Swenshuai.xi RVD_MiuInfo gRVDInfo;
180*53ee8cc1Swenshuai.xi extern MS_U32 u32SVDRegOSBase;
181*53ee8cc1Swenshuai.xi extern MS_U32 MsOS_GetSystemTime(void);
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi static MS_BOOL gbEnableRVTurboFWMode = FALSE;
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi #define RVD_ENABLE_TIME_MEASURE 0
186*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
187*53ee8cc1Swenshuai.xi #define RVD_GetSysTime_ms()    MsOS_GetSystemTime()
188*53ee8cc1Swenshuai.xi MS_U32 u32RvdInitSysTimeBase = 0;
189*53ee8cc1Swenshuai.xi #endif
190*53ee8cc1Swenshuai.xi 
191*53ee8cc1Swenshuai.xi #define MW_RVD_BROKEN_BY_US   0x00800000
192*53ee8cc1Swenshuai.xi #define RVD_FW_IDLE_THRESHOLD 100
193*53ee8cc1Swenshuai.xi #define RVD_GetSystemTime  MsOS_GetSystemTime
194*53ee8cc1Swenshuai.xi #define RVD_VLC_TABLE_SIZE 0x20000
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi /************* RVD debug define *************/
197*53ee8cc1Swenshuai.xi #define RVD_MSG_INF(format, args...)  do{if(MDrv_RVD_IsDbgEnable(E_RVD_DEBUG_INF)) printf(format, ##args);}while(0) ///< output general message
198*53ee8cc1Swenshuai.xi #define RVD_MSG_DRV(format, args...)  do{if(MDrv_RVD_IsDbgEnable(E_RVD_DEBUG_DRV)) printf(format, ##args);}while(0)///< output drv layer message
199*53ee8cc1Swenshuai.xi #define RVD_MSG_HAL(format, args...)  do{if(MDrv_RVD_IsDbgEnable(E_RVD_DEBUG_HAL)) printf(format, ##args);}while(0)///< output hal layer message
200*53ee8cc1Swenshuai.xi #define RVD_MSG_ERR(format, args...)  do{if(MDrv_RVD_IsDbgEnable(E_RVD_DEBUG_ERR)) printf(format, ##args);}while(0)///< Only output error message
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi #define _DRV_RVD_Entry()      { u32RVDCtrlMode |=  RVD_CTRL_PROCESSING; }
203*53ee8cc1Swenshuai.xi #define _DRV_RVD_Return(_ret) { u32RVDCtrlMode &= (~RVD_CTRL_PROCESSING); return _ret; }
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
206*53ee8cc1Swenshuai.xi //  Local Variables
207*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
208*53ee8cc1Swenshuai.xi 
209*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
210*53ee8cc1Swenshuai.xi //  Debug Functions
211*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
214*53ee8cc1Swenshuai.xi //  Local Functions
215*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
216*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
217*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBU_ID()
218*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Push the BBU Table ID in F/W remapping area
219*53ee8cc1Swenshuai.xi /// @param  -u32Address \b IN  F/W RISC AREA
220*53ee8cc1Swenshuai.xi /// @param  -u32Byte_Pos \b IN BBU Byte Position
221*53ee8cc1Swenshuai.xi /// @param  -u32ID_High \b IN BBU ID High Address
222*53ee8cc1Swenshuai.xi /// @param  -u32ID_Low \b IN BBU ID Low Address
223*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBBU_ID(MS_U32 u32Address,MS_U32 u32Byte_Pos,MS_U32 u32ID_High,MS_U32 u32ID_Low)224*53ee8cc1Swenshuai.xi void MDrv_RVD_SetBBU_ID(MS_U32 u32Address,MS_U32 u32Byte_Pos, MS_U32 u32ID_High, MS_U32 u32ID_Low)
225*53ee8cc1Swenshuai.xi {
226*53ee8cc1Swenshuai.xi      HAL_RVD_MemWrite( u32Address,u32Byte_Pos);
227*53ee8cc1Swenshuai.xi      HAL_RVD_MemWrite( (u32Address+4),u32ID_Low);
228*53ee8cc1Swenshuai.xi      HAL_RVD_MemWrite( (u32Address+8),u32ID_High);
229*53ee8cc1Swenshuai.xi }
230*53ee8cc1Swenshuai.xi 
231*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
232*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBU_OffsetLength()
233*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Push the offset and length in F/W remapping area
234*53ee8cc1Swenshuai.xi /// @param  -u32Address \b IN  F/W RISC AREA
235*53ee8cc1Swenshuai.xi /// @param  -u32offset \b IN BBU offet
236*53ee8cc1Swenshuai.xi /// @param  -u32length \b IN BBU length
237*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBBU_OffsetLength(MS_U32 u32Address,MS_U32 u32offset,MS_U32 u32length)238*53ee8cc1Swenshuai.xi void MDrv_RVD_SetBBU_OffsetLength(MS_U32 u32Address,MS_U32 u32offset, MS_U32 u32length)
239*53ee8cc1Swenshuai.xi {
240*53ee8cc1Swenshuai.xi      HAL_RVD_MemWrite( u32Address,u32offset);
241*53ee8cc1Swenshuai.xi      HAL_RVD_MemWrite( (u32Address+4),u32length);
242*53ee8cc1Swenshuai.xi }
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
245*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetBBUStartAddr()
246*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get  BBU Statr address
247*53ee8cc1Swenshuai.xi /// @return - BBU Statr address
248*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetBBUStartAddr(void)249*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetBBUStartAddr(void)
250*53ee8cc1Swenshuai.xi {
251*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_OFFSET_BBU_ADDR);
252*53ee8cc1Swenshuai.xi }
253*53ee8cc1Swenshuai.xi 
254*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
255*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDecErrCnt()
256*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get  BBU Statr address
257*53ee8cc1Swenshuai.xi /// @return - BBU Statr address
258*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDecErrCnt(void)259*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetDecErrCnt(void)
260*53ee8cc1Swenshuai.xi {
261*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_DECERRCNT);
262*53ee8cc1Swenshuai.xi }
263*53ee8cc1Swenshuai.xi 
264*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
265*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDataErrCnt()
266*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Data Error Count
267*53ee8cc1Swenshuai.xi /// @return - Data Error count
268*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDataErrCnt(void)269*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetDataErrCnt(void)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_DATAERRCNT);
272*53ee8cc1Swenshuai.xi }
273*53ee8cc1Swenshuai.xi 
274*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
275*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetSkipCnt()
276*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Frame Skip Count
277*53ee8cc1Swenshuai.xi /// @return - Skip frame number
278*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetSkipCnt(void)279*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetSkipCnt(void)
280*53ee8cc1Swenshuai.xi {
281*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_SKIP_CNT);
282*53ee8cc1Swenshuai.xi }
283*53ee8cc1Swenshuai.xi 
284*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
285*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDropCnt()
286*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Frame drop Count
287*53ee8cc1Swenshuai.xi /// @return - Drop frame number
288*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDropCnt(void)289*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetDropCnt(void)
290*53ee8cc1Swenshuai.xi {
291*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_DROP_CNT);
292*53ee8cc1Swenshuai.xi }
293*53ee8cc1Swenshuai.xi 
294*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
295*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDispQueNum()
296*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Display queue number
297*53ee8cc1Swenshuai.xi /// @return - Display queue number
298*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDispQueNum(void)299*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetDispQueNum(void)
300*53ee8cc1Swenshuai.xi {
301*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_DISP_QUE_NUM);
302*53ee8cc1Swenshuai.xi }
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
305*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBUDepth()
306*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set vaild BBU Queue depth.
307*53ee8cc1Swenshuai.xi /// @param  -u32Rptr \b IN from MDrv_RVD_GetQMEM_Info
308*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBBUDepth(MS_U32 u32Rptr)309*53ee8cc1Swenshuai.xi void MDrv_RVD_SetBBUDepth(MS_U32 u32Rptr)
310*53ee8cc1Swenshuai.xi {
311*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_DEPTH), u32Rptr);
312*53ee8cc1Swenshuai.xi }
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
315*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBUDepth()
316*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set vaild BBU Queue depth.
317*53ee8cc1Swenshuai.xi /// @param  -u32Rptr \b IN from MDrv_RVD_GetQMEM_Info
318*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetPBInfo(MS_PHYADDR u32Addr,MS_U32 u32Size)319*53ee8cc1Swenshuai.xi void MDrv_RVD_SetPBInfo(MS_PHYADDR u32Addr , MS_U32 u32Size)
320*53ee8cc1Swenshuai.xi {
321*53ee8cc1Swenshuai.xi     if(u32Size)
322*53ee8cc1Swenshuai.xi     {
323*53ee8cc1Swenshuai.xi         HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DUMMY_OFFSET), u32Addr &(HAL_MIU1_BASE -1));
324*53ee8cc1Swenshuai.xi         HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DUMMY_LENGTH), u32Size);
325*53ee8cc1Swenshuai.xi     }
326*53ee8cc1Swenshuai.xi     else
327*53ee8cc1Swenshuai.xi     {
328*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("<Warning>PB Size 0x%lx !!!\n",u32Size);
329*53ee8cc1Swenshuai.xi     }
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi }
332*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
333*53ee8cc1Swenshuai.xi //  Global Functions
334*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
335*53ee8cc1Swenshuai.xi //------------------------------------------------------------------
336*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetCfg()
337*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set RVD Memory map and FW info
338*53ee8cc1Swenshuai.xi /// @param -memCfg \b IN RVD_MEMCfg
339*53ee8cc1Swenshuai.xi /// @return - Display Count
340*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
341*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_INVALID_PARAM, the config setting invalid
342*53ee8cc1Swenshuai.xi //------------------------------------------------------------------
MDrv_RVD_SetCfg(RVD_MEMCfg * memCfg)343*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetCfg( RVD_MEMCfg* memCfg)
344*53ee8cc1Swenshuai.xi {
345*53ee8cc1Swenshuai.xi     if (!memCfg)
346*53ee8cc1Swenshuai.xi         return E_RVD_RET_INVALID_PARAM;
347*53ee8cc1Swenshuai.xi 
348*53ee8cc1Swenshuai.xi     //config memory
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_FW, memCfg->u32FWAddr, memCfg->u32FWSize);
351*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_FB, memCfg->u32FBAddr, memCfg->u32FBSize);
352*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_BS, memCfg->u32BSAddr, memCfg->u32BSSize);
353*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_PB, memCfg->u32PBAddr, memCfg->u32PBSize);
354*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_FW_BIN, memCfg->u32FWBinAddr, memCfg->u32FWBinSize);
355*53ee8cc1Swenshuai.xi     HAL_RVD_MemSetMap(E_RVD_MMAP_VLC_BIN, memCfg->u32VLCBinAddr, memCfg->u32VLCBinSize);
356*53ee8cc1Swenshuai.xi     return E_RVD_RET_SUCCESS;
357*53ee8cc1Swenshuai.xi }
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
360*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetOSRegBase()
361*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set system register base
362*53ee8cc1Swenshuai.xi /// @param -u32RegBaseAddr \b IN :  system register base
363*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetOSRegBase(MS_U32 u32RegBaseAddr)364*53ee8cc1Swenshuai.xi void MDrv_RVD_SetOSRegBase(MS_U32 u32RegBaseAddr )
365*53ee8cc1Swenshuai.xi {
366*53ee8cc1Swenshuai.xi     HAL_RVD_InitRegBase(u32RegBaseAddr);
367*53ee8cc1Swenshuai.xi }
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
370*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetQmemSwBbuVacancy()
371*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the vacancy of BBU queue.
372*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
373*53ee8cc1Swenshuai.xi /// @retval     -0: queue is full.
374*53ee8cc1Swenshuai.xi /// @retval     -not zero: queue is not full.
375*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetQmemSwBbuVacancy(void)376*53ee8cc1Swenshuai.xi MS_S16 MDrv_RVD_GetQmemSwBbuVacancy(void)
377*53ee8cc1Swenshuai.xi {
378*53ee8cc1Swenshuai.xi     MS_S16 s16Vac;
379*53ee8cc1Swenshuai.xi     MS_S16 s16Rptr;
380*53ee8cc1Swenshuai.xi     MS_S16 s16Wptr;
381*53ee8cc1Swenshuai.xi     MS_S16 s16BBUDepth;
382*53ee8cc1Swenshuai.xi 
383*53ee8cc1Swenshuai.xi #if USING_ID_LINK
384*53ee8cc1Swenshuai.xi     s16Rptr = (MS_S16)MDrv_RVD_GetIDReadPtr();
385*53ee8cc1Swenshuai.xi     //s16Wptr = (MS_S16)MDrv_RVD_GetIDWritePtr();
386*53ee8cc1Swenshuai.xi   #else
387*53ee8cc1Swenshuai.xi     s16Rptr = (MS_S16)MDrv_RVD_GetBBUReadPtr();
388*53ee8cc1Swenshuai.xi     //s16Wptr = (MS_S16)MDrv_RVD_GetBBUWritePtr();
389*53ee8cc1Swenshuai.xi #endif
390*53ee8cc1Swenshuai.xi     s16Wptr =(MS_S16)u16QmemBbuWptr;
391*53ee8cc1Swenshuai.xi     s16BBUDepth = (MS_S16)MDrv_RVD_GetBBUDepth();
392*53ee8cc1Swenshuai.xi 
393*53ee8cc1Swenshuai.xi     if(s16Wptr < s16Rptr)
394*53ee8cc1Swenshuai.xi     {
395*53ee8cc1Swenshuai.xi         s16Vac = s16Rptr - s16Wptr - 1;
396*53ee8cc1Swenshuai.xi     }
397*53ee8cc1Swenshuai.xi     else if(s16Wptr >= s16Rptr)
398*53ee8cc1Swenshuai.xi     {
399*53ee8cc1Swenshuai.xi         s16Vac = (s16BBUDepth-1)  - s16Wptr + s16Rptr;
400*53ee8cc1Swenshuai.xi     }
401*53ee8cc1Swenshuai.xi 
402*53ee8cc1Swenshuai.xi     return s16Vac;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi #if RVD_ENABLE_BDMA_FW_FLASH_2_SDRAM
406*53ee8cc1Swenshuai.xi #if 0
407*53ee8cc1Swenshuai.xi BDMA_CpyType MDrv_RVD_BDMAFlag(MS_BOOL bDirect)
408*53ee8cc1Swenshuai.xi {
409*53ee8cc1Swenshuai.xi     if(bDirect)
410*53ee8cc1Swenshuai.xi         return E_BDMA_FLASH2SDRAM1;
411*53ee8cc1Swenshuai.xi     else
412*53ee8cc1Swenshuai.xi         return E_BDMA_FLASH2SDRAM;
413*53ee8cc1Swenshuai.xi }
414*53ee8cc1Swenshuai.xi #endif
415*53ee8cc1Swenshuai.xi #endif
416*53ee8cc1Swenshuai.xi 
MDrv_RVD_BDMAFlag(MS_BOOL bDst,MS_BOOL bSrc,RVD_FWSourceType eType)417*53ee8cc1Swenshuai.xi BDMA_CpyType MDrv_RVD_BDMAFlag(MS_BOOL bDst ,MS_BOOL bSrc, RVD_FWSourceType eType)
418*53ee8cc1Swenshuai.xi {
419*53ee8cc1Swenshuai.xi     RVD_MSG_HAL("Dst : %d Src :%d\n SourceType: %d",bDst,bSrc,eType);
420*53ee8cc1Swenshuai.xi     switch(eType)
421*53ee8cc1Swenshuai.xi     {
422*53ee8cc1Swenshuai.xi         case E_RVD_FW_SOURCE_DRAM:
423*53ee8cc1Swenshuai.xi             if(bDst < bSrc)
424*53ee8cc1Swenshuai.xi             {
425*53ee8cc1Swenshuai.xi                 return E_BDMA_SDRAM12SDRAM;
426*53ee8cc1Swenshuai.xi             }
427*53ee8cc1Swenshuai.xi             else if(bDst > bSrc )
428*53ee8cc1Swenshuai.xi             {
429*53ee8cc1Swenshuai.xi                 return E_BDMA_SDRAM2SDRAM1;
430*53ee8cc1Swenshuai.xi             }
431*53ee8cc1Swenshuai.xi             else
432*53ee8cc1Swenshuai.xi             {
433*53ee8cc1Swenshuai.xi                 if(bSrc)
434*53ee8cc1Swenshuai.xi                     return E_BDMA_SDRAM12SDRAM1;
435*53ee8cc1Swenshuai.xi                 else
436*53ee8cc1Swenshuai.xi                     return E_BDMA_SDRAM2SDRAM;
437*53ee8cc1Swenshuai.xi             }
438*53ee8cc1Swenshuai.xi         case E_RVD_FW_SOURCE_FLASH:
439*53ee8cc1Swenshuai.xi             if(bDst)
440*53ee8cc1Swenshuai.xi                 return E_BDMA_FLASH2SDRAM1;
441*53ee8cc1Swenshuai.xi             else
442*53ee8cc1Swenshuai.xi                 return E_BDMA_FLASH2SDRAM;
443*53ee8cc1Swenshuai.xi         default:
444*53ee8cc1Swenshuai.xi             return (BDMA_CpyType)0;
445*53ee8cc1Swenshuai.xi     }
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi 
MDrv_RVD_BDMA_SDFlag(MS_BOOL bDst,MS_BOOL bSrc)448*53ee8cc1Swenshuai.xi BDMA_CpyType MDrv_RVD_BDMA_SDFlag(MS_BOOL bDst ,MS_BOOL bSrc)
449*53ee8cc1Swenshuai.xi {
450*53ee8cc1Swenshuai.xi     RVD_MSG_HAL("Dst : %d Src :%d\n",bDst,bSrc);
451*53ee8cc1Swenshuai.xi     if(bDst < bSrc)
452*53ee8cc1Swenshuai.xi     {
453*53ee8cc1Swenshuai.xi         return E_BDMA_SDRAM12SDRAM;
454*53ee8cc1Swenshuai.xi     }
455*53ee8cc1Swenshuai.xi     else if(bDst > bSrc )
456*53ee8cc1Swenshuai.xi     {
457*53ee8cc1Swenshuai.xi         return E_BDMA_SDRAM2SDRAM1;
458*53ee8cc1Swenshuai.xi     }
459*53ee8cc1Swenshuai.xi     else
460*53ee8cc1Swenshuai.xi     {
461*53ee8cc1Swenshuai.xi         if(bSrc)
462*53ee8cc1Swenshuai.xi             return E_BDMA_SDRAM12SDRAM1;
463*53ee8cc1Swenshuai.xi         else
464*53ee8cc1Swenshuai.xi             return E_BDMA_SDRAM2SDRAM;
465*53ee8cc1Swenshuai.xi     }
466*53ee8cc1Swenshuai.xi }
467*53ee8cc1Swenshuai.xi 
468*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
469*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetFrameSize()
470*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the frame size from Qmem used for RPR
471*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN Frame Size Width
472*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN Frame Size Height
473*53ee8cc1Swenshuai.xi /// @return status
474*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetFrameSize(MS_U16 * u16Width,MS_U16 * u16Height)475*53ee8cc1Swenshuai.xi void MDrv_RVD_GetFrameSize(MS_U16* u16Width,MS_U16* u16Height)
476*53ee8cc1Swenshuai.xi {
477*53ee8cc1Swenshuai.xi     *u16Width =  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_FRAME0_WIDTH);
478*53ee8cc1Swenshuai.xi     *u16Height =  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_FRAME0_HEIGHT);
479*53ee8cc1Swenshuai.xi }
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
482*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetLibVer()
483*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the RVD Drv and FW Version
484*53ee8cc1Swenshuai.xi /// @return none
485*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetLibVer(const MSIF_Version ** ppVersion)486*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_GetLibVer(const MSIF_Version **ppVersion)
487*53ee8cc1Swenshuai.xi {
488*53ee8cc1Swenshuai.xi     if (!ppVersion)
489*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
490*53ee8cc1Swenshuai.xi 
491*53ee8cc1Swenshuai.xi     *ppVersion = &_drv_rvd_version;
492*53ee8cc1Swenshuai.xi     return E_RVD_RET_SUCCESS;
493*53ee8cc1Swenshuai.xi }
494*53ee8cc1Swenshuai.xi 
495*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
496*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetDispRepeatCnt()
497*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Disp repeat cnt to f/w
498*53ee8cc1Swenshuai.xi /// @param -u32Num \b IN Repeat cnt
499*53ee8cc1Swenshuai.xi /// @return status
500*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetDispRepeatCnt(MS_U32 u32Num)501*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetDispRepeatCnt(MS_U32 u32Num)
502*53ee8cc1Swenshuai.xi {
503*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_DISP_REPEAT_MAX, u32Num);
504*53ee8cc1Swenshuai.xi }
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
507*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetInfo()
508*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of RVD driver.
509*53ee8cc1Swenshuai.xi /// @return - driver information
510*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetInfo(void)511*53ee8cc1Swenshuai.xi const RVD_DrvInfo* MDrv_RVD_GetInfo( void )
512*53ee8cc1Swenshuai.xi {
513*53ee8cc1Swenshuai.xi     if(!bRVDIsInit)
514*53ee8cc1Swenshuai.xi         return 0;
515*53ee8cc1Swenshuai.xi     DrvRVDInfo.bRVD=MDrv_RVD_CheckCaps();
516*53ee8cc1Swenshuai.xi     return (&DrvRVDInfo);
517*53ee8cc1Swenshuai.xi }
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
520*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetTimeStamp()
521*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get the pts of current displayed video frame
522*53ee8cc1Swenshuai.xi /// @return - PTS
523*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetTimeStamp(void)524*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetTimeStamp(void)
525*53ee8cc1Swenshuai.xi {
526*53ee8cc1Swenshuai.xi     MS_U32 u32FrameInfoAddr;
527*53ee8cc1Swenshuai.xi 
528*53ee8cc1Swenshuai.xi     u32FrameInfoAddr = HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DISP_FRAME_INFO_ADDR);
529*53ee8cc1Swenshuai.xi     return HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_TIMESTAMP );
530*53ee8cc1Swenshuai.xi }
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
533*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDecodeCnt()
534*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated decoded frame Count
535*53ee8cc1Swenshuai.xi /// @return - decoded frame Count
536*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDecodeCnt(void)537*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetDecodeCnt(void)
538*53ee8cc1Swenshuai.xi {
539*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DECODECNT) );
540*53ee8cc1Swenshuai.xi }
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
543*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetFrameCnt()
544*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get accumulated display Count
545*53ee8cc1Swenshuai.xi /// @return - Display Count
546*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetFrameCnt(void)547*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetFrameCnt(void)
548*53ee8cc1Swenshuai.xi {
549*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DISPLAYCNT) );
550*53ee8cc1Swenshuai.xi }
551*53ee8cc1Swenshuai.xi 
552*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
553*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBUReadPtr()
554*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set BBU Read point to f/w
555*53ee8cc1Swenshuai.xi /// @param  -u32Rptr \b IN BBU Read Pointer
556*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBBUReadPtr(MS_U32 u32Rptr)557*53ee8cc1Swenshuai.xi void MDrv_RVD_SetBBUReadPtr(MS_U32 u32Rptr)
558*53ee8cc1Swenshuai.xi {
559*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_RPTR), u32Rptr);
560*53ee8cc1Swenshuai.xi }
561*53ee8cc1Swenshuai.xi 
562*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
563*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBBUWritePtr()
564*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set BBU write point to f/w
565*53ee8cc1Swenshuai.xi /// @param  -u32Wptr \b IN BBU Read Pointer
566*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBBUWritePtr(MS_U32 u32Wptr)567*53ee8cc1Swenshuai.xi void MDrv_RVD_SetBBUWritePtr(MS_U32 u32Wptr)
568*53ee8cc1Swenshuai.xi {
569*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_WPTR), u32Wptr);
570*53ee8cc1Swenshuai.xi }
571*53ee8cc1Swenshuai.xi 
572*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
573*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetIDReadPtr()
574*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set BBU read point to f/w (Flush only)
575*53ee8cc1Swenshuai.xi /// @param  -u32Wptr \b IN BBU Read Pointer
576*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetIDReadPtr(MS_U32 u32Wptr)577*53ee8cc1Swenshuai.xi void MDrv_RVD_SetIDReadPtr(MS_U32 u32Wptr)
578*53ee8cc1Swenshuai.xi {
579*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ID_RPTR), u32Wptr);
580*53ee8cc1Swenshuai.xi }
581*53ee8cc1Swenshuai.xi 
582*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
583*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetIDWritePtr()
584*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set BBU write point to f/w
585*53ee8cc1Swenshuai.xi /// @param  -u32Wptr \b IN BBU Read Pointer
586*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetIDWritePtr(MS_U32 u32Wptr)587*53ee8cc1Swenshuai.xi void MDrv_RVD_SetIDWritePtr(MS_U32 u32Wptr)
588*53ee8cc1Swenshuai.xi {
589*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite((gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ID_WPTR), u32Wptr);
590*53ee8cc1Swenshuai.xi }
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
593*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetBBUReadPtr()
594*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU Read point from f/w
595*53ee8cc1Swenshuai.xi /// @return - bbu read pointer
596*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetBBUReadPtr(void)597*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetBBUReadPtr(void)
598*53ee8cc1Swenshuai.xi {
599*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_RPTR);
600*53ee8cc1Swenshuai.xi }
601*53ee8cc1Swenshuai.xi 
602*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
603*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetFrameInfo()
604*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Frame Info
605*53ee8cc1Swenshuai.xi /// @return - bbu read pointer
606*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetFrameInfo(RVD_FrameBuff_Info * framebuffinfo,MS_BOOL bGETDISP)607*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_GetFrameInfo(RVD_FrameBuff_Info *framebuffinfo ,MS_BOOL bGETDISP)
608*53ee8cc1Swenshuai.xi {
609*53ee8cc1Swenshuai.xi     MS_U32 u32FrameInfoAddr = 0;
610*53ee8cc1Swenshuai.xi     MS_U32 u32MIUBaseAddr = 0;
611*53ee8cc1Swenshuai.xi 
612*53ee8cc1Swenshuai.xi     if (bGETDISP)
613*53ee8cc1Swenshuai.xi        u32FrameInfoAddr = HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DISP_FRAME_INFO_ADDR);
614*53ee8cc1Swenshuai.xi     else
615*53ee8cc1Swenshuai.xi        u32FrameInfoAddr = HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DEC_FRAME_INFO_ADDR);
616*53ee8cc1Swenshuai.xi 
617*53ee8cc1Swenshuai.xi     RVD_MSG_HAL("u32FrameInfoAddr = 0x%lx",u32FrameInfoAddr);
618*53ee8cc1Swenshuai.xi     if (u32FrameInfoAddr)
619*53ee8cc1Swenshuai.xi     {
620*53ee8cc1Swenshuai.xi         if (gRVDInfo.bRVD_HWinMIU1)
621*53ee8cc1Swenshuai.xi             u32MIUBaseAddr = HAL_MIU1_BASE;
622*53ee8cc1Swenshuai.xi 
623*53ee8cc1Swenshuai.xi         framebuffinfo->u32LumaAddr = HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_LUMAADDR ) |u32MIUBaseAddr;
624*53ee8cc1Swenshuai.xi         framebuffinfo->u32ChromaAddr = HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_CHROMADDR )|u32MIUBaseAddr;
625*53ee8cc1Swenshuai.xi         framebuffinfo->u32TimeStamp =  HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_TIMESTAMP );
626*53ee8cc1Swenshuai.xi         framebuffinfo->u32ID_L = HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_ID_L );
627*53ee8cc1Swenshuai.xi         framebuffinfo->u32ID_H = HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_ID_H );
628*53ee8cc1Swenshuai.xi         framebuffinfo->u16FrmType = (MS_U16)(HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_FRAME_TYPE )&0x0000ffff);
629*53ee8cc1Swenshuai.xi         framebuffinfo->u16Pitch = (MS_U16)((HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_PITCH)&0xffff0000)>>16);
630*53ee8cc1Swenshuai.xi         framebuffinfo->u16Width = (MS_U16) (HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_WIDTH)&0x0000ffff);
631*53ee8cc1Swenshuai.xi         framebuffinfo->u16Height = (MS_U16)((HAL_RVD_MemRead(u32FrameInfoAddr + E_RVD_FRAMEBUFF_INFO_HEIGHT)&0xffff0000)>>16);
632*53ee8cc1Swenshuai.xi         RVD_MSG_HAL("Luma = 0x%lx  Chroma = 0x%lx Width =0x%x Height =0x%x Pitch = 0x%x",framebuffinfo->u32LumaAddr, framebuffinfo->u32ChromaAddr,
633*53ee8cc1Swenshuai.xi              framebuffinfo->u16Width, framebuffinfo->u16Height, framebuffinfo->u16Pitch );
634*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
635*53ee8cc1Swenshuai.xi     }
636*53ee8cc1Swenshuai.xi     else
637*53ee8cc1Swenshuai.xi     {
638*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
639*53ee8cc1Swenshuai.xi     }
640*53ee8cc1Swenshuai.xi }
641*53ee8cc1Swenshuai.xi 
642*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
643*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetIDReadPtr()
644*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU Read point from f/w
645*53ee8cc1Swenshuai.xi /// @return - bbu read pointer
646*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetIDReadPtr(void)647*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetIDReadPtr(void)
648*53ee8cc1Swenshuai.xi {
649*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ID_RPTR);
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi 
652*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
653*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetIDWritePtr()
654*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get ID write point from f/w
655*53ee8cc1Swenshuai.xi /// @return - bbu write pointer
656*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetIDWritePtr(void)657*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetIDWritePtr(void)
658*53ee8cc1Swenshuai.xi {
659*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ID_WPTR);
660*53ee8cc1Swenshuai.xi }
661*53ee8cc1Swenshuai.xi 
662*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
663*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetBBUWritePtr()
664*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU write point from f/w
665*53ee8cc1Swenshuai.xi /// @return - bbu write pointer
666*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetBBUWritePtr(void)667*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetBBUWritePtr(void)
668*53ee8cc1Swenshuai.xi {
669*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_WPTR);
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi 
672*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
673*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetBBUDepth()
674*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU Depth
675*53ee8cc1Swenshuai.xi /// @return - BBU Depth
676*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetBBUDepth(void)677*53ee8cc1Swenshuai.xi MS_U16 MDrv_RVD_GetBBUDepth(void)
678*53ee8cc1Swenshuai.xi {
679*53ee8cc1Swenshuai.xi     return  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_BBU_DEPTH);
680*53ee8cc1Swenshuai.xi }
681*53ee8cc1Swenshuai.xi 
682*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
683*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetPictureSize()
684*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Picture width and Height to F/W
685*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN The frame Width
686*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN  The frame Height
687*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetPictureSize(MS_U16 u16Width,MS_U16 u16Height)688*53ee8cc1Swenshuai.xi void MDrv_RVD_SetPictureSize(MS_U16 u16Width, MS_U16 u16Height)
689*53ee8cc1Swenshuai.xi {
690*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_PIC_WIDTH) , u16Width);
691*53ee8cc1Swenshuai.xi      HAL_RVD_QMemWrite( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_PIC_HEIGHT) , u16Height);
692*53ee8cc1Swenshuai.xi }
693*53ee8cc1Swenshuai.xi 
694*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
695*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetPictureSize()
696*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Picture width and Height to F/W
697*53ee8cc1Swenshuai.xi /// @param -u32Width \b IN The frame Width
698*53ee8cc1Swenshuai.xi /// @param -u32Height \b IN  The frame Height
699*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetPictureSize(MS_U16 * u16Width,MS_U16 * u16Height)700*53ee8cc1Swenshuai.xi void MDrv_RVD_GetPictureSize(MS_U16* u16Width, MS_U16* u16Height)
701*53ee8cc1Swenshuai.xi {
702*53ee8cc1Swenshuai.xi     *u16Width = HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_PIC_WIDTH);
703*53ee8cc1Swenshuai.xi     *u16Height = HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_OFFSET_PIC_HEIGHT);
704*53ee8cc1Swenshuai.xi }
705*53ee8cc1Swenshuai.xi 
706*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
707*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetPlayMode()
708*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  HK Command ()
709*53ee8cc1Swenshuai.xi /// @param -u32PlayMode \b IN RVD_PlayMode
710*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetDisplay(RVD_DisplayMode u32PlayMode)711*53ee8cc1Swenshuai.xi void MDrv_RVD_SetDisplay(RVD_DisplayMode u32PlayMode)
712*53ee8cc1Swenshuai.xi {
713*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite( gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_PLAY_MODE, u32PlayMode);
714*53ee8cc1Swenshuai.xi }
715*53ee8cc1Swenshuai.xi 
716*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
717*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_PushBBU()
718*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  push one entry into the decoding table(BBU table).
719*53ee8cc1Swenshuai.xi /// @param -u32offset \b IN :  the start physical address of the entry.(unit:byte)
720*53ee8cc1Swenshuai.xi /// @param -u32length \b IN :  the data size of the entry. (unit:byte)
721*53ee8cc1Swenshuai.xi /// @param -rvdPackerInfo \b IN :  the ID  of the entry. (unit:byte)
722*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_PushBBU(MS_U32 u32offset,MS_U32 u32length,RVD_Packet_ID * rvdPackerInfo)723*53ee8cc1Swenshuai.xi void MDrv_RVD_PushBBU (MS_U32 u32offset, MS_U32 u32length ,RVD_Packet_ID *rvdPackerInfo)
724*53ee8cc1Swenshuai.xi {
725*53ee8cc1Swenshuai.xi     MS_U32 u32Addr;
726*53ee8cc1Swenshuai.xi     //MS_U16 u16QmemIDWptr = 0;
727*53ee8cc1Swenshuai.xi 
728*53ee8cc1Swenshuai.xi     if(u32offset&MW_RVD_BROKEN_BY_US)
729*53ee8cc1Swenshuai.xi     {
730*53ee8cc1Swenshuai.xi         u32offset = (u32offset & (~MW_RVD_BROKEN_BY_US)) | BROKEN_BY_US;
731*53ee8cc1Swenshuai.xi         RVD_MSG_DRV("Broken by us is True\n");
732*53ee8cc1Swenshuai.xi     }
733*53ee8cc1Swenshuai.xi     RVD_MSG_INF("OFFSET LENGTH<%lx  , %lx>\n",u32offset,u32length);
734*53ee8cc1Swenshuai.xi     #if 0
735*53ee8cc1Swenshuai.xi     #if USING_ID_LINK
736*53ee8cc1Swenshuai.xi     u16QmemBbuWptr = (MS_U16)MDrv_RVD_GetIDWritePtr();
737*53ee8cc1Swenshuai.xi     #else
738*53ee8cc1Swenshuai.xi     u16QmemBbuWptr = (MS_U16)MDrv_RVD_GetBBUWritePtr();
739*53ee8cc1Swenshuai.xi     #endif
740*53ee8cc1Swenshuai.xi     #endif
741*53ee8cc1Swenshuai.xi 
742*53ee8cc1Swenshuai.xi     u32Addr = gu32QmemBbuAddr + ( ((MS_U32)u16QmemBbuWptr) << 3); //offset + length : 8 byte
743*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBU_OffsetLength(u32Addr,u32offset,u32length);
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi     u32Addr = gu32QmemBbuAddr + QMEM_BBU_TABLE_SIZE + ( ((MS_U32)u16QmemBbuWptr) * 12); // byte_pos, ID_L, ID_H
746*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBU_ID(u32Addr,u32BytePos,rvdPackerInfo->u32PacketID_HI,rvdPackerInfo->u32PacketID_LO);
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi     u32BytePos += u32length;
749*53ee8cc1Swenshuai.xi     u32BytePos %=BYTECOUNT_LIMIT;
750*53ee8cc1Swenshuai.xi 
751*53ee8cc1Swenshuai.xi     if ( u16QmemBbuWptr == (RVD_BBU_DEPTH - 1) )
752*53ee8cc1Swenshuai.xi     {
753*53ee8cc1Swenshuai.xi         u16QmemBbuWptr = 0;
754*53ee8cc1Swenshuai.xi     }
755*53ee8cc1Swenshuai.xi     else
756*53ee8cc1Swenshuai.xi     {
757*53ee8cc1Swenshuai.xi         u16QmemBbuWptr++;
758*53ee8cc1Swenshuai.xi     }
759*53ee8cc1Swenshuai.xi 
760*53ee8cc1Swenshuai.xi     #if 0
761*53ee8cc1Swenshuai.xi     MDrv_RVD_SetIDWritePtr((MS_U32)(u16QmemBbuWptr));
762*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBUWritePtr((MS_U32)(u16QmemBbuWptr));
763*53ee8cc1Swenshuai.xi     #endif
764*53ee8cc1Swenshuai.xi }
765*53ee8cc1Swenshuai.xi 
766*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
767*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_FireDecCmd()
768*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Fire the decode command which be pushed since last fired
769*53ee8cc1Swenshuai.xi /// @return Status
770*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
771*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_FAIL, Failed
772*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_RVD_FireDecCmd(void)773*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_FireDecCmd(void)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBUWritePtr(u16QmemBbuWptr);
776*53ee8cc1Swenshuai.xi     MDrv_RVD_SetIDWritePtr(u16QmemBbuWptr);
777*53ee8cc1Swenshuai.xi     return E_RVD_RET_SUCCESS;
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi 
780*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
781*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetFileInfo()
782*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set RM File information for F/W INFO Table.
783*53ee8cc1Swenshuai.xi /// @param -pFileInfo \b IN :  the file information of RM file
784*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetFileInfo(RVD_FileInfo * pFileInfo)785*53ee8cc1Swenshuai.xi void MDrv_RVD_SetFileInfo( RVD_FileInfo *pFileInfo)
786*53ee8cc1Swenshuai.xi {
787*53ee8cc1Swenshuai.xi     MS_U8 i = 0;
788*53ee8cc1Swenshuai.xi     MS_U32 u32Addr = 0;
789*53ee8cc1Swenshuai.xi 
790*53ee8cc1Swenshuai.xi     if( NULL == pFileInfo )
791*53ee8cc1Swenshuai.xi     {
792*53ee8cc1Swenshuai.xi         return ;
793*53ee8cc1Swenshuai.xi     }
794*53ee8cc1Swenshuai.xi 
795*53ee8cc1Swenshuai.xi     // file info addr = bin addr + bin size
796*53ee8cc1Swenshuai.xi     u32Addr = OPENRISC_BIN_SIZE;
797*53ee8cc1Swenshuai.xi 
798*53ee8cc1Swenshuai.xi     if ( pFileInfo->RV_Version == 0 ) // RV8
799*53ee8cc1Swenshuai.xi     {
800*53ee8cc1Swenshuai.xi         HAL_RVD_SetRVInfo(pFileInfo->RV_Version);
801*53ee8cc1Swenshuai.xi 
802*53ee8cc1Swenshuai.xi         // write RV_Version = 0
803*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, pFileInfo->RV_Version);
804*53ee8cc1Swenshuai.xi         u32Addr+=4;
805*53ee8cc1Swenshuai.xi 
806*53ee8cc1Swenshuai.xi         // write ulNumSizes
807*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, pFileInfo->ulNumSizes);
808*53ee8cc1Swenshuai.xi         u32Addr+=4;
809*53ee8cc1Swenshuai.xi 
810*53ee8cc1Swenshuai.xi         // write ulPicSizes_w[8]
811*53ee8cc1Swenshuai.xi         for( i = 0; i<8; i++ )
812*53ee8cc1Swenshuai.xi         {
813*53ee8cc1Swenshuai.xi             HAL_RVD_MemWrite(u32Addr, pFileInfo->ulPicSizes_w[i]);
814*53ee8cc1Swenshuai.xi             u32Addr+=4;
815*53ee8cc1Swenshuai.xi         }
816*53ee8cc1Swenshuai.xi 
817*53ee8cc1Swenshuai.xi         // write ulPicSizes_h[8]
818*53ee8cc1Swenshuai.xi         for( i = 0; i<8; i++ )
819*53ee8cc1Swenshuai.xi         {
820*53ee8cc1Swenshuai.xi             HAL_RVD_MemWrite(u32Addr, pFileInfo->ulPicSizes_h[i]);
821*53ee8cc1Swenshuai.xi             u32Addr+=4;
822*53ee8cc1Swenshuai.xi         }
823*53ee8cc1Swenshuai.xi     }
824*53ee8cc1Swenshuai.xi     else
825*53ee8cc1Swenshuai.xi     {
826*53ee8cc1Swenshuai.xi         HAL_RVD_SetRVInfo(pFileInfo->RV_Version );
827*53ee8cc1Swenshuai.xi 
828*53ee8cc1Swenshuai.xi         // write RV_Version = 1
829*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, 1);
830*53ee8cc1Swenshuai.xi         u32Addr+=4;
831*53ee8cc1Swenshuai.xi 
832*53ee8cc1Swenshuai.xi         // write ulNumSizes = 0
833*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, 0);
834*53ee8cc1Swenshuai.xi         u32Addr+=4;
835*53ee8cc1Swenshuai.xi 
836*53ee8cc1Swenshuai.xi         // jump ulPicSizes_w[8], ulPicSizes_h[8]
837*53ee8cc1Swenshuai.xi         u32Addr += (4 * 8 * 2); // 4 bytes * 8 * 2
838*53ee8cc1Swenshuai.xi     }
839*53ee8cc1Swenshuai.xi 
840*53ee8cc1Swenshuai.xi     // write buffer mode
841*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->ulBufMode);
842*53ee8cc1Swenshuai.xi     u32Addr+=4;
843*53ee8cc1Swenshuai.xi 
844*53ee8cc1Swenshuai.xi     // write frame buffer start addr
845*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->ulFBAddr);
846*53ee8cc1Swenshuai.xi     u32Addr+=4;
847*53ee8cc1Swenshuai.xi 
848*53ee8cc1Swenshuai.xi     // write frame buffer size (total frame buffer size + IAP size)
849*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->ulFBSize);
850*53ee8cc1Swenshuai.xi     u32Addr+=4;
851*53ee8cc1Swenshuai.xi 
852*53ee8cc1Swenshuai.xi     // write VLC addr = FB addr + FB size
853*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->ulVLCAddr );
854*53ee8cc1Swenshuai.xi     u32Addr+=4;
855*53ee8cc1Swenshuai.xi #if 0
856*53ee8cc1Swenshuai.xi     // write DS setting
857*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->RV_DynScaling.u32DynAddr);
858*53ee8cc1Swenshuai.xi     u32Addr+=4;
859*53ee8cc1Swenshuai.xi 
860*53ee8cc1Swenshuai.xi     HAL_RVD_MemWrite(u32Addr, pFileInfo->RV_DynScaling.u32Depth);
861*53ee8cc1Swenshuai.xi     u32Addr+=4;
862*53ee8cc1Swenshuai.xi 
863*53ee8cc1Swenshuai.xi     if (pFileInfo->RV_DynScaling.bEnable)
864*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, eRvdDynCfgByChip);
865*53ee8cc1Swenshuai.xi     else
866*53ee8cc1Swenshuai.xi         HAL_RVD_MemWrite(u32Addr, 0);
867*53ee8cc1Swenshuai.xi #endif
868*53ee8cc1Swenshuai.xi     u32Addr+=4;
869*53ee8cc1Swenshuai.xi }
870*53ee8cc1Swenshuai.xi 
871*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
872*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetQMEM_Info()
873*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get QmemExchangeInfoAddr From F/W
874*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetQMEM_Info(void)875*53ee8cc1Swenshuai.xi void MDrv_RVD_GetQMEM_Info(void)
876*53ee8cc1Swenshuai.xi {
877*53ee8cc1Swenshuai.xi     gu32QmemExchangeInfoAddr = HAL_RVD_GetExchangeInfoAddr();
878*53ee8cc1Swenshuai.xi     RVD_MSG_INF("QmemExchangeInfoAddr = 0x%lx\n", gu32QmemExchangeInfoAddr);
879*53ee8cc1Swenshuai.xi 
880*53ee8cc1Swenshuai.xi     gu32QmemBbuAddr = MDrv_RVD_GetBBUStartAddr();
881*53ee8cc1Swenshuai.xi     RVD_MSG_INF("QmemBbuAddr = 0x%lx\n", gu32QmemBbuAddr);
882*53ee8cc1Swenshuai.xi 
883*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBUDepth(RVD_BBU_DEPTH);
884*53ee8cc1Swenshuai.xi     RVD_MSG_INF("<gdbg>RVD_BBU_DEPTH = %d\n", RVD_BBU_DEPTH);
885*53ee8cc1Swenshuai.xi }
886*53ee8cc1Swenshuai.xi 
887*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
888*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetTrickRefInfo()
889*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Mark the dummy data for flush BBU
890*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetTrickRefInfo(MS_PHYADDR u32DstAddr,MS_PHYADDR u32ScrAddr)891*53ee8cc1Swenshuai.xi void MDrv_RVD_SetTrickRefInfo(MS_PHYADDR u32DstAddr ,MS_PHYADDR u32ScrAddr)
892*53ee8cc1Swenshuai.xi {
893*53ee8cc1Swenshuai.xi     MS_U32 tmpAdr ,tmpLen,tmpTotal;
894*53ee8cc1Swenshuai.xi     RVD_FWSourceType eType = E_RVD_FW_SOURCE_DRAM;
895*53ee8cc1Swenshuai.xi 
896*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FW, &tmpAdr, &tmpLen,1);
897*53ee8cc1Swenshuai.xi     tmpTotal = tmpAdr + tmpLen - 8;
898*53ee8cc1Swenshuai.xi     WRITE_LONG((MS_U32)tmpTotal,(MS_U32)0xffffffff);
899*53ee8cc1Swenshuai.xi     WRITE_LONG((MS_U32)((tmpTotal)+4),(MS_U32)0xffffffff);
900*53ee8cc1Swenshuai.xi     tmpTotal = u32ScrAddr + tmpLen - 8;
901*53ee8cc1Swenshuai.xi     gRVDInfo.u32BDMAFlag = MDrv_RVD_BDMAFlag(gRVDInfo.bRVD_HWinMIU1,gRVDInfo.bRVD_FWinMIU1,eType);//E_RVD_FW_SOURCE_DRAM);
902*53ee8cc1Swenshuai.xi     if (E_BDMA_OK != BDMAcpy( u32DstAddr,
903*53ee8cc1Swenshuai.xi                               tmpTotal,
904*53ee8cc1Swenshuai.xi                               16,
905*53ee8cc1Swenshuai.xi                               (BDMA_CpyType)gRVDInfo.u32BDMAFlag) )
906*53ee8cc1Swenshuai.xi     {
907*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("RVD ERR: BDMAcpy Flash 2 DRAM failed: dest:0x%lx src:0x%lx flag:%lu\n" ,u32DstAddr, tmpTotal, (MS_U32)gRVDInfo.u32BDMAFlag) ;
908*53ee8cc1Swenshuai.xi     }
909*53ee8cc1Swenshuai.xi 
910*53ee8cc1Swenshuai.xi     RVD_MSG_INF("DummyDataAddr: 0x%lx\n", u32DstAddr);
911*53ee8cc1Swenshuai.xi }
912*53ee8cc1Swenshuai.xi 
913*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
914*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetFWInfo()
915*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get RVD FW and HW version(reported from f/w)
916*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetFWInfo(void)917*53ee8cc1Swenshuai.xi void MDrv_RVD_GetFWInfo(void)
918*53ee8cc1Swenshuai.xi {
919*53ee8cc1Swenshuai.xi     #define FWVerAddr 0 //base : Open bin addr
920*53ee8cc1Swenshuai.xi     #define HWVerAddr 4 //base : Open bin addr
921*53ee8cc1Swenshuai.xi 
922*53ee8cc1Swenshuai.xi     DrvRVDInfo.FWversion = HAL_RVD_MemRead(FWVerAddr);
923*53ee8cc1Swenshuai.xi     DrvRVDInfo.HWversion = HAL_RVD_MemRead(HWVerAddr);
924*53ee8cc1Swenshuai.xi     RVD_MSG_INF("FW INFO>>RVD.FWversion:0x%lx\t RVD.HWversion: 0x%lx\n", DrvRVDInfo.FWversion, DrvRVDInfo.HWversion);
925*53ee8cc1Swenshuai.xi }
926*53ee8cc1Swenshuai.xi 
927*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
928*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_LoadVLCTable()
929*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Load VLC table to Dram
930*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_LoadVLCTable(MS_U32 u32Addr,RVD_FWSourceType eType)931*53ee8cc1Swenshuai.xi void MDrv_RVD_LoadVLCTable(MS_U32 u32Addr ,RVD_FWSourceType eType)
932*53ee8cc1Swenshuai.xi {
933*53ee8cc1Swenshuai.xi     RVD_MSG_INF("vlc_addr  = 0x%lx\n",u32Addr);
934*53ee8cc1Swenshuai.xi #if (!RVD_ENABLE_BDMA_FW_FLASH_2_SDRAM)
935*53ee8cc1Swenshuai.xi     MS_U32 tmpAdr , tmpLen;
936*53ee8cc1Swenshuai.xi     //RVD_FWSourceType eTypetmp = E_RVD_FW_SOURCE_DRAM;
937*53ee8cc1Swenshuai.xi 
938*53ee8cc1Swenshuai.xi     eType = E_RVD_FW_SOURCE_DRAM;
939*53ee8cc1Swenshuai.xi     gRVDInfo.u32BDMAFlag = MDrv_RVD_BDMAFlag(gRVDInfo.bRVD_HWinMIU1,gRVDInfo.bRVD_FWinMIU1,eType);
940*53ee8cc1Swenshuai.xi     gRVDInfo.u32VLC_ScrAddr = gRVDInfo.u32FW_PhyAddr;
941*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FW, &tmpAdr, &tmpLen, 1);
942*53ee8cc1Swenshuai.xi     gRVDInfo.u32VLC_ScrSize = sizeof(VLC_TAB);
943*53ee8cc1Swenshuai.xi     RVD_memcpy((void*)tmpAdr,(void*)VLC_TAB, gRVDInfo.u32VLC_ScrSize);
944*53ee8cc1Swenshuai.xi     RVD_MSG_INF("RVD Check: BDMAcpy DRAM 2 DRAM: dest:0x%lx src:0x%lx size:0x%lx flag:%lx\n" ,u32Addr, gRVDInfo.u32VLC_ScrAddr , gRVDInfo.u32VLC_ScrSize , (MS_U32)gRVDInfo.u32BDMAFlag) ;
945*53ee8cc1Swenshuai.xi     if (E_BDMA_OK != BDMAcpy( u32Addr,
946*53ee8cc1Swenshuai.xi                               gRVDInfo.u32VLC_ScrAddr,
947*53ee8cc1Swenshuai.xi                               gRVDInfo.u32VLC_ScrSize,
948*53ee8cc1Swenshuai.xi                               (BDMA_CpyType)gRVDInfo.u32BDMAFlag) )
949*53ee8cc1Swenshuai.xi     {
950*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("RVD ERR: BDMAcpy Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n" ,u32Addr, gRVDInfo.u32VLC_ScrAddr , gRVDInfo.u32VLC_ScrSize , (MS_U32)gRVDInfo.u32BDMAFlag) ;
951*53ee8cc1Swenshuai.xi     }
952*53ee8cc1Swenshuai.xi #else
953*53ee8cc1Swenshuai.xi     gRVDInfo.u32BDMAFlag = MDrv_RVD_BDMAFlag(gRVDInfo.bRVD_HWinMIU1, gRVDInfo.bRVD_VLCBinInMIU1,eType);
954*53ee8cc1Swenshuai.xi     if(E_BDMA_OK != BDMAcpy(u32Addr, gRVDInfo.u32VLC_ScrAddr, gRVDInfo.u32VLC_ScrSize,  (BDMA_CpyType)gRVDInfo.u32BDMAFlag) )
955*53ee8cc1Swenshuai.xi     {
956*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("RVD ERR: BDMAcpy Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n" ,u32Addr  , gRVDInfo.u32VLC_ScrAddr , gRVDInfo.u32VLC_ScrSize , (MS_U32)gRVDInfo.u32BDMAFlag) ;
957*53ee8cc1Swenshuai.xi     }
958*53ee8cc1Swenshuai.xi #endif
959*53ee8cc1Swenshuai.xi }
960*53ee8cc1Swenshuai.xi 
961*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
962*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_ResetVariable()
963*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset Variable
964*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_ResetVariable(void)965*53ee8cc1Swenshuai.xi void MDrv_RVD_ResetVariable(void)
966*53ee8cc1Swenshuai.xi {
967*53ee8cc1Swenshuai.xi     u32StepPlayCnt= 0 ; // check if step play done
968*53ee8cc1Swenshuai.xi     u32StepDecodeCnt= 0 ; // check if step play done
969*53ee8cc1Swenshuai.xi     u32BytePos= 0 ;
970*53ee8cc1Swenshuai.xi     u16QmemBbuWptr = 0;
971*53ee8cc1Swenshuai.xi     RVD_memset((void*)&gRVDInfo, 0, sizeof(RVD_MiuInfo));
972*53ee8cc1Swenshuai.xi }
973*53ee8cc1Swenshuai.xi 
974*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
975*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Init()
976*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  RVD Initial
977*53ee8cc1Swenshuai.xi /// @param -pFileInfo \b IN :  the file information of RM file
978*53ee8cc1Swenshuai.xi /// @param -memCfg \b IN :  the RVD memmap config
979*53ee8cc1Swenshuai.xi /// @return -The result of RVD Init
980*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Init(RVD_FileInfo * pFileInfo,RVD_MEMCfg * memCfg)981*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Init(RVD_FileInfo *pFileInfo, RVD_MEMCfg* memCfg)
982*53ee8cc1Swenshuai.xi {
983*53ee8cc1Swenshuai.xi     MS_U32 tmpAdr, tmpLen;
984*53ee8cc1Swenshuai.xi     MS_U8 u8Ret = E_RVD_RET_FAIL;
985*53ee8cc1Swenshuai.xi     MS_U32 u32TmpAddr;
986*53ee8cc1Swenshuai.xi     MS_BOOL bNeedReloadFW = TRUE;
987*53ee8cc1Swenshuai.xi 
988*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
989*53ee8cc1Swenshuai.xi     u32RvdInitSysTimeBase = RVD_GetSysTime_ms();
990*53ee8cc1Swenshuai.xi #endif
991*53ee8cc1Swenshuai.xi     if (NULL == pFileInfo)
992*53ee8cc1Swenshuai.xi     {
993*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("Hal_RVD_Init Err : don't have file_info!!\n");
994*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
995*53ee8cc1Swenshuai.xi     }
996*53ee8cc1Swenshuai.xi 
997*53ee8cc1Swenshuai.xi     MDrv_RVD_ResetVariable();
998*53ee8cc1Swenshuai.xi     if (MDrv_RVD_SetCfg(memCfg) != E_RVD_RET_SUCCESS)
999*53ee8cc1Swenshuai.xi         return E_RVD_RET_INVALID_PARAM;
1000*53ee8cc1Swenshuai.xi 
1001*53ee8cc1Swenshuai.xi     //the very first step: Get register base addr
1002*53ee8cc1Swenshuai.xi     //notice: must do this first before accessing any register.
1003*53ee8cc1Swenshuai.xi #if 0
1004*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankSize;
1005*53ee8cc1Swenshuai.xi     MS_U32 u32NonPMBankAddr;
1006*53ee8cc1Swenshuai.xi     if( !MDrv_MMIO_GetBASE( &u32NonPMBankAddr, &u32NonPMBankSize, MS_MODULE_RVD))
1007*53ee8cc1Swenshuai.xi     {
1008*53ee8cc1Swenshuai.xi         RVD_MSG_INF("_MDrv_RVD_Init: IOMap failure\n");
1009*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
1010*53ee8cc1Swenshuai.xi     }
1011*53ee8cc1Swenshuai.xi     else
1012*53ee8cc1Swenshuai.xi     {
1013*53ee8cc1Swenshuai.xi         MDrv_RVD_SetOSRegBase(u32NonPMBankAddr);
1014*53ee8cc1Swenshuai.xi         RVD_MSG_INF("_MDrv_RVD_Init: u32RiuBaseAdd = %lx\n", u32NonPMBankAddr);
1015*53ee8cc1Swenshuai.xi     }
1016*53ee8cc1Swenshuai.xi #endif
1017*53ee8cc1Swenshuai.xi 
1018*53ee8cc1Swenshuai.xi     if (bRVDIsInit == TRUE)
1019*53ee8cc1Swenshuai.xi     {
1020*53ee8cc1Swenshuai.xi         return E_RVD_RET_RE_INIT;
1021*53ee8cc1Swenshuai.xi     }
1022*53ee8cc1Swenshuai.xi 
1023*53ee8cc1Swenshuai.xi     RVD_MSG_INF("GO RVD INIT\n");
1024*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1025*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1026*53ee8cc1Swenshuai.xi #endif
1027*53ee8cc1Swenshuai.xi 
1028*53ee8cc1Swenshuai.xi #if RVD_ISR_ENABLE
1029*53ee8cc1Swenshuai.xi     //Release RVD ISR
1030*53ee8cc1Swenshuai.xi     HAL_RVD_Enable_ISR(FALSE);
1031*53ee8cc1Swenshuai.xi #endif
1032*53ee8cc1Swenshuai.xi 
1033*53ee8cc1Swenshuai.xi     HAL_RVD_Reset_RVD_SVD();
1034*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1035*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1036*53ee8cc1Swenshuai.xi #endif
1037*53ee8cc1Swenshuai.xi 
1038*53ee8cc1Swenshuai.xi     // Using FWAddr as tmp buffer to mark flush pattern
1039*53ee8cc1Swenshuai.xi     //MDrv_RVD_SetTrickRefInfo(memCfg->u32BSAddr, memCfg->u32FWAddr);
1040*53ee8cc1Swenshuai.xi     MDrv_RVD_SetTrickRefInfo(memCfg->u32PBAddr, memCfg->u32FWAddr);
1041*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1042*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1043*53ee8cc1Swenshuai.xi #endif
1044*53ee8cc1Swenshuai.xi 
1045*53ee8cc1Swenshuai.xi     //Check whether need to reload fw or not
1046*53ee8cc1Swenshuai.xi     if((TRUE == gbEnableRVTurboFWMode)
1047*53ee8cc1Swenshuai.xi     && (FALSE == HAL_RVD_IsNeedReload()))
1048*53ee8cc1Swenshuai.xi     {
1049*53ee8cc1Swenshuai.xi         bNeedReloadFW = FALSE;
1050*53ee8cc1Swenshuai.xi     }
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi     if(TRUE == bNeedReloadFW)
1053*53ee8cc1Swenshuai.xi     {
1054*53ee8cc1Swenshuai.xi         //If we need to reload fw, need to reset fw decoder type first.
1055*53ee8cc1Swenshuai.xi         HAL_RVD_SetFWDecoder(FALSE);
1056*53ee8cc1Swenshuai.xi 
1057*53ee8cc1Swenshuai.xi         u32TmpAddr = memCfg->u32FBAddr + memCfg->u32FBSize -RVD_VLC_TABLE_SIZE;
1058*53ee8cc1Swenshuai.xi         MDrv_RVD_LoadVLCTable(u32TmpAddr ,memCfg->eFWSourceType);
1059*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1060*53ee8cc1Swenshuai.xi         RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1061*53ee8cc1Swenshuai.xi #endif
1062*53ee8cc1Swenshuai.xi 
1063*53ee8cc1Swenshuai.xi #if (!RVD_ENABLE_BDMA_FW_FLASH_2_SDRAM)
1064*53ee8cc1Swenshuai.xi         HAL_RVD_LoadCode();
1065*53ee8cc1Swenshuai.xi #else
1066*53ee8cc1Swenshuai.xi         gRVDInfo.u32BDMAFlag = MDrv_RVD_BDMAFlag(gRVDInfo.bRVD_FWinMIU1,
1067*53ee8cc1Swenshuai.xi                                               gRVDInfo.bRVD_FWBinInMIU1,memCfg->eFWSourceType);
1068*53ee8cc1Swenshuai.xi         if (E_BDMA_OK != BDMAcpy( gRVDInfo.u32FW_DstAddr,
1069*53ee8cc1Swenshuai.xi                                   gRVDInfo.u32FW_ScrAddr,
1070*53ee8cc1Swenshuai.xi                                   gRVDInfo.u32FW_ScrSize,
1071*53ee8cc1Swenshuai.xi                                   (BDMA_CpyType)gRVDInfo.u32BDMAFlag) )
1072*53ee8cc1Swenshuai.xi         {
1073*53ee8cc1Swenshuai.xi             RVD_MSG_ERR("RVD ERR: BDMAcpy Flash 2 DRAM failed: dest:0x%lx src:0x%lx size:0x%lx flag:%lu\n" ,gRVDInfo.u32FW_DstAddr, gRVDInfo.u32FW_ScrAddr , gRVDInfo.u32FW_ScrSize , (MS_U32)gRVDInfo.u32BDMAFlag) ;
1074*53ee8cc1Swenshuai.xi         }
1075*53ee8cc1Swenshuai.xi #endif
1076*53ee8cc1Swenshuai.xi 
1077*53ee8cc1Swenshuai.xi         //When load successfully, set FW decoder to RVD
1078*53ee8cc1Swenshuai.xi         HAL_RVD_SetFWDecoder(TRUE);
1079*53ee8cc1Swenshuai.xi     }
1080*53ee8cc1Swenshuai.xi 
1081*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1082*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1083*53ee8cc1Swenshuai.xi #endif
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi     // get virtual bin addr
1086*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FW, &tmpAdr, &tmpLen, 1);
1087*53ee8cc1Swenshuai.xi     u32FWBinAddr = tmpAdr;
1088*53ee8cc1Swenshuai.xi     RVD_MSG_INF("u32FWBinAddr =0x%lx\n", u32FWBinAddr);
1089*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1090*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1091*53ee8cc1Swenshuai.xi #endif
1092*53ee8cc1Swenshuai.xi 
1093*53ee8cc1Swenshuai.xi     HAL_RVD_VerChiptop_Init();
1094*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1095*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1096*53ee8cc1Swenshuai.xi #endif
1097*53ee8cc1Swenshuai.xi 
1098*53ee8cc1Swenshuai.xi     HAL_RVD_Release_RVD_SVD();
1099*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1100*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1101*53ee8cc1Swenshuai.xi #endif
1102*53ee8cc1Swenshuai.xi 
1103*53ee8cc1Swenshuai.xi     u8Ret = E_RVD_RET_FAIL;
1104*53ee8cc1Swenshuai.xi     while (!u8Ret)
1105*53ee8cc1Swenshuai.xi     {
1106*53ee8cc1Swenshuai.xi        u8Ret = HAL_RVD_CheckSWRSTDone();
1107*53ee8cc1Swenshuai.xi     }
1108*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1109*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1110*53ee8cc1Swenshuai.xi #endif
1111*53ee8cc1Swenshuai.xi 
1112*53ee8cc1Swenshuai.xi     u8Ret = E_RVD_RET_FAIL;
1113*53ee8cc1Swenshuai.xi     while (!u8Ret)
1114*53ee8cc1Swenshuai.xi     {
1115*53ee8cc1Swenshuai.xi        u8Ret = HAL_RVD_CheckHKSWRSTDone();
1116*53ee8cc1Swenshuai.xi     }
1117*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1118*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1119*53ee8cc1Swenshuai.xi #endif
1120*53ee8cc1Swenshuai.xi 
1121*53ee8cc1Swenshuai.xi     HAL_RVD_BBU_SET_CPU();
1122*53ee8cc1Swenshuai.xi     HAL_RVD_CPUSetting(1);
1123*53ee8cc1Swenshuai.xi     HAL_RVD_MemoryProtect(0);
1124*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1125*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1126*53ee8cc1Swenshuai.xi #endif
1127*53ee8cc1Swenshuai.xi 
1128*53ee8cc1Swenshuai.xi     // get physical addr
1129*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FB, &tmpAdr, &tmpLen, 0);
1130*53ee8cc1Swenshuai.xi     pFileInfo->ulFBAddr = tmpAdr;
1131*53ee8cc1Swenshuai.xi     pFileInfo->ulFBSize = tmpLen - RVD_VLC_TABLE_SIZE;
1132*53ee8cc1Swenshuai.xi     pFileInfo->ulVLCAddr = tmpAdr + tmpLen - RVD_VLC_TABLE_SIZE;
1133*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1134*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1135*53ee8cc1Swenshuai.xi #endif
1136*53ee8cc1Swenshuai.xi 
1137*53ee8cc1Swenshuai.xi     MDrv_RVD_SetFileInfo( pFileInfo ); // write file info to DRAM
1138*53ee8cc1Swenshuai.xi     HAL_RVD_SetBufferAddr();
1139*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1140*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms()  -  u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1141*53ee8cc1Swenshuai.xi #endif
1142*53ee8cc1Swenshuai.xi 
1143*53ee8cc1Swenshuai.xi     while (1)
1144*53ee8cc1Swenshuai.xi     {
1145*53ee8cc1Swenshuai.xi         RVD_MSG_INF("Wait RM_HI_MBOX1 \n");
1146*53ee8cc1Swenshuai.xi         if (HAL_RVD_MBoxReady(RVD_HI_MBOX1))
1147*53ee8cc1Swenshuai.xi         {
1148*53ee8cc1Swenshuai.xi             break;
1149*53ee8cc1Swenshuai.xi         }
1150*53ee8cc1Swenshuai.xi     }
1151*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1152*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1153*53ee8cc1Swenshuai.xi #endif
1154*53ee8cc1Swenshuai.xi     RVD_MSG_INF("11 \n");
1155*53ee8cc1Swenshuai.xi 
1156*53ee8cc1Swenshuai.xi     // set physical bin addr
1157*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FW, &tmpAdr, &tmpLen, 0);
1158*53ee8cc1Swenshuai.xi     HAL_RVD_MBoxSet(RVD_HI_MBOX1, tmpAdr);//A0000000
1159*53ee8cc1Swenshuai.xi     RVD_MSG_INF("12 \n");
1160*53ee8cc1Swenshuai.xi 
1161*53ee8cc1Swenshuai.xi     while (1)
1162*53ee8cc1Swenshuai.xi     {
1163*53ee8cc1Swenshuai.xi         RVD_MSG_INF("Wait RM_HI_MBOX0 \n");
1164*53ee8cc1Swenshuai.xi         if (HAL_RVD_MBoxReady(RVD_HI_MBOX0))
1165*53ee8cc1Swenshuai.xi         {
1166*53ee8cc1Swenshuai.xi             break;
1167*53ee8cc1Swenshuai.xi         }
1168*53ee8cc1Swenshuai.xi     }
1169*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1170*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1171*53ee8cc1Swenshuai.xi #endif
1172*53ee8cc1Swenshuai.xi     RVD_MSG_INF("21 \n");
1173*53ee8cc1Swenshuai.xi 
1174*53ee8cc1Swenshuai.xi     HAL_RVD_WriteDimInfo2RVD();
1175*53ee8cc1Swenshuai.xi     RVD_MSG_INF("22 \n");
1176*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1177*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1178*53ee8cc1Swenshuai.xi #endif
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi     HAL_RVD_CPURstRelse();
1181*53ee8cc1Swenshuai.xi     RVD_MSG_INF("23 \n");
1182*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1183*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1184*53ee8cc1Swenshuai.xi #endif
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi     if ( HAL_RVD_Check_INIT_QMEM_SUCCEED1() == FALSE )
1187*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
1188*53ee8cc1Swenshuai.xi     RVD_MSG_INF("3 \n");
1189*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1190*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1191*53ee8cc1Swenshuai.xi #endif
1192*53ee8cc1Swenshuai.xi 
1193*53ee8cc1Swenshuai.xi     MDrv_RVD_GetQMEM_Info();
1194*53ee8cc1Swenshuai.xi     RVD_MSG_INF("4 \n");
1195*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1196*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure:%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1197*53ee8cc1Swenshuai.xi #endif
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi     //Set Picture info in Qmem
1200*53ee8cc1Swenshuai.xi     RVD_MSG_INF("SetPicInfo W=%d H=%d\n", pFileInfo->ulPicSizes_w[0], pFileInfo->ulPicSizes_h[0]);
1201*53ee8cc1Swenshuai.xi     MDrv_RVD_SetPictureSize(pFileInfo->ulPicSizes_w[0], pFileInfo->ulPicSizes_h[0]);
1202*53ee8cc1Swenshuai.xi     MDrv_RVD_GetFWInfo();
1203*53ee8cc1Swenshuai.xi     MDrv_RVD_SetPBInfo((memCfg->u32PBAddr - memCfg->u32BSAddr), memCfg->u32PBSize);
1204*53ee8cc1Swenshuai.xi     u32RVDCtrlMode |= RVD_CTRL_INIT_FINISHED;
1205*53ee8cc1Swenshuai.xi     bRVDIsInit = TRUE;
1206*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1207*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure(Init finish):%ld (%s %d) \n" , RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1208*53ee8cc1Swenshuai.xi #endif
1209*53ee8cc1Swenshuai.xi     return E_RVD_RET_SUCCESS;
1210*53ee8cc1Swenshuai.xi }
1211*53ee8cc1Swenshuai.xi 
1212*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1213*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_EnableDynamicScaling()
1214*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable Dynamic Scaling
1215*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN :  Enable Bit
1216*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_FAIL:Command Timeout
1217*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_SUCCESS:Ready
1218*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_EnableDynamicScaling(MS_BOOL bEnable)1219*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_EnableDynamicScaling(MS_BOOL bEnable)
1220*53ee8cc1Swenshuai.xi {
1221*53ee8cc1Swenshuai.xi     if (bEnable)
1222*53ee8cc1Swenshuai.xi         return MDrv_RVD_SetCmd(E_RVD_CMD_DYNAMIC_SCALE, RVD_DS_MIU_BIT);
1223*53ee8cc1Swenshuai.xi     else
1224*53ee8cc1Swenshuai.xi         return MDrv_RVD_SetCmd(E_RVD_CMD_DYNAMIC_SCALE, 0); // disable
1225*53ee8cc1Swenshuai.xi }
1226*53ee8cc1Swenshuai.xi 
1227*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1228*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetVirtualBox()
1229*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set DS width and Height to F/W
1230*53ee8cc1Swenshuai.xi /// @param -u16Width \b IN :  frame width
1231*53ee8cc1Swenshuai.xi /// @param -u16Height \b IN :  frame height
1232*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetVirtualBox(MS_U16 u16Width,MS_U16 u16Height)1233*53ee8cc1Swenshuai.xi void MDrv_RVD_SetVirtualBox(MS_U16 u16Width, MS_U16 u16Height)
1234*53ee8cc1Swenshuai.xi {
1235*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DS_VIRTUAL_BOX_W), u16Width);
1236*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite( (gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DS_VIRTUAL_BOX_H), u16Height);
1237*53ee8cc1Swenshuai.xi }
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1240*53ee8cc1Swenshuai.xi /// @brief Pass scalar parameters to f/w
1241*53ee8cc1Swenshuai.xi /// @return -The result of command.
1242*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetDynScalingParam(MS_U32 u32StAddr,MS_U32 u32Size)1243*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetDynScalingParam(MS_U32 u32StAddr, MS_U32 u32Size)
1244*53ee8cc1Swenshuai.xi {
1245*53ee8cc1Swenshuai.xi     MS_U32 tmpAdr, tmpLen;
1246*53ee8cc1Swenshuai.xi     MS_U32 u32ScalerInfoAddr;
1247*53ee8cc1Swenshuai.xi 
1248*53ee8cc1Swenshuai.xi     if ((u32StAddr==NULL) || (u32Size==0))
1249*53ee8cc1Swenshuai.xi     {
1250*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("%s invalid para u32StAddr=0x%lx, u32Size=0x%lx\n", __FUNCTION__, u32StAddr, u32Size);
1251*53ee8cc1Swenshuai.xi         return E_RVD_RET_INVALID_PARAM;
1252*53ee8cc1Swenshuai.xi     }
1253*53ee8cc1Swenshuai.xi 
1254*53ee8cc1Swenshuai.xi     HAL_RVD_MemGetMap(E_RVD_MMAP_FW, &tmpAdr, &tmpLen, 1); // get virtual bin addr
1255*53ee8cc1Swenshuai.xi     u32ScalerInfoAddr = tmpAdr + HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_SCALER_INFO_ADDR);
1256*53ee8cc1Swenshuai.xi 
1257*53ee8cc1Swenshuai.xi     //copy data
1258*53ee8cc1Swenshuai.xi     u32Size = ((u32Size + 3) >> 2) << 2;
1259*53ee8cc1Swenshuai.xi     RVD_MSG_INF("u32Size= 0x%lx, u32SrcAdd= 0x%lx\n", u32Size, u32StAddr);
1260*53ee8cc1Swenshuai.xi     RVD_memcpy((void*)u32ScalerInfoAddr, (void*) u32StAddr, u32Size);
1261*53ee8cc1Swenshuai.xi 
1262*53ee8cc1Swenshuai.xi     //notify f/w
1263*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_SCALER_INFO, NULL);
1264*53ee8cc1Swenshuai.xi }
1265*53ee8cc1Swenshuai.xi 
1266*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1267*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_FlushQueue()
1268*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Flush Queue and Reset Read/Write pointer
1269*53ee8cc1Swenshuai.xi /// @return - Flush Queue is done or not
1270*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_NOTREADY: f/w not ready for handle the pre cmd
1271*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_FAIL:Command Timeout
1272*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_SUCCESS:Ready
1273*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_FlushQueue(void)1274*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_FlushQueue(void)
1275*53ee8cc1Swenshuai.xi {
1276*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout = 0;
1277*53ee8cc1Swenshuai.xi 
1278*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1279*53ee8cc1Swenshuai.xi     u32RvdInitSysTimeBase = RVD_GetSysTime_ms();
1280*53ee8cc1Swenshuai.xi #endif
1281*53ee8cc1Swenshuai.xi     if(MDrv_RVD_Pause() == E_RVD_RET_FAIL)
1282*53ee8cc1Swenshuai.xi     {
1283*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("[RM]THe Pause Command not be deal !!\n");
1284*53ee8cc1Swenshuai.xi     }
1285*53ee8cc1Swenshuai.xi     RVD_MSG_INF("<gdbg>BBU Flush \n");
1286*53ee8cc1Swenshuai.xi     //MDrv_RVD_SetTrickRefInfo();
1287*53ee8cc1Swenshuai.xi     MDrv_RVD_SetCmd(E_RVD_CMD_FLUSH, NULL);
1288*53ee8cc1Swenshuai.xi 
1289*53ee8cc1Swenshuai.xi     u32Timeout = RVD_GetSystemTime() + 1000;
1290*53ee8cc1Swenshuai.xi     while(1)
1291*53ee8cc1Swenshuai.xi     {
1292*53ee8cc1Swenshuai.xi         RVD_MSG_HAL("<gdbg PC: 0x%lx>\n", HAL_RVD_ReadSVDProgramCounter());
1293*53ee8cc1Swenshuai.xi         if (MDrv_RVD_ChkCmdRdy()==E_RVD_RET_SUCCESS)
1294*53ee8cc1Swenshuai.xi         {
1295*53ee8cc1Swenshuai.xi             RVD_MSG_INF("<gdbg>Flush done now...\n");
1296*53ee8cc1Swenshuai.xi             break;
1297*53ee8cc1Swenshuai.xi         }
1298*53ee8cc1Swenshuai.xi         if (RVD_GetSystemTime() > u32Timeout)
1299*53ee8cc1Swenshuai.xi         {
1300*53ee8cc1Swenshuai.xi             RVD_MSG_ERR("[RM] Hal_RVD_FlushBuf timeout\n");
1301*53ee8cc1Swenshuai.xi             return E_RVD_RET_TIMEOUT;
1302*53ee8cc1Swenshuai.xi         }
1303*53ee8cc1Swenshuai.xi     }
1304*53ee8cc1Swenshuai.xi     u32BytePos = HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_BYTE_POS);
1305*53ee8cc1Swenshuai.xi     RVD_MSG_INF("u32BytePos =%ld\n", u32BytePos);
1306*53ee8cc1Swenshuai.xi     RVD_MSG_INF("<gdbg>hold here!!!\n");
1307*53ee8cc1Swenshuai.xi     HAL_RVD_ReadSVDProgramCounter();
1308*53ee8cc1Swenshuai.xi     u16QmemBbuWptr = 0;
1309*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBUReadPtr(0);
1310*53ee8cc1Swenshuai.xi     MDrv_RVD_SetBBUWritePtr(0);
1311*53ee8cc1Swenshuai.xi     MDrv_RVD_SetIDReadPtr(0);
1312*53ee8cc1Swenshuai.xi     MDrv_RVD_SetIDWritePtr(0);
1313*53ee8cc1Swenshuai.xi #if RVD_ENABLE_TIME_MEASURE
1314*53ee8cc1Swenshuai.xi     RVD_MSG_DRV( "RVD Time Measure(Init finish):%ld (%s %d)\n", RVD_GetSysTime_ms() - u32RvdInitSysTimeBase , __FUNCTION__, __LINE__ );
1315*53ee8cc1Swenshuai.xi #endif
1316*53ee8cc1Swenshuai.xi     return E_RVD_RET_SUCCESS;
1317*53ee8cc1Swenshuai.xi }
1318*53ee8cc1Swenshuai.xi 
1319*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1320*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetESReadPtr()
1321*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get BBU Read Adderess
1322*53ee8cc1Swenshuai.xi /// @return - The BBU Read address
1323*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetESReadPtr(void)1324*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetESReadPtr(void)
1325*53ee8cc1Swenshuai.xi {
1326*53ee8cc1Swenshuai.xi     return HAL_RVD_GetESBufferRptr();
1327*53ee8cc1Swenshuai.xi }
1328*53ee8cc1Swenshuai.xi 
1329*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1330*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_ReadSVDProgramCounter()
1331*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Read Program coUnter
1332*53ee8cc1Swenshuai.xi /// @return - Program counter
1333*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_ReadSVDProgramCounter(void)1334*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_ReadSVDProgramCounter(void)
1335*53ee8cc1Swenshuai.xi {
1336*53ee8cc1Swenshuai.xi     return HAL_RVD_ReadSVDProgramCounter();
1337*53ee8cc1Swenshuai.xi }
1338*53ee8cc1Swenshuai.xi 
1339*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1340*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetESWritePtr()
1341*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Elementary Stream buffer write point
1342*53ee8cc1Swenshuai.xi /// @return - ES buffer write point offset from bitstream buffer base
1343*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetESWritePtr(void)1344*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetESWritePtr(void)
1345*53ee8cc1Swenshuai.xi {
1346*53ee8cc1Swenshuai.xi     MS_U32 u32Wptr = 0;
1347*53ee8cc1Swenshuai.xi     MS_U32 u32Offset =0;
1348*53ee8cc1Swenshuai.xi     MS_U32 u32Length =0;
1349*53ee8cc1Swenshuai.xi 
1350*53ee8cc1Swenshuai.xi     //u32Wptr = MDrv_RVD_GetBBUWritePtr();
1351*53ee8cc1Swenshuai.xi     u32Wptr = (MS_U32)u16QmemBbuWptr;
1352*53ee8cc1Swenshuai.xi     if (u32Wptr)
1353*53ee8cc1Swenshuai.xi         u32Wptr = u32Wptr - 1;
1354*53ee8cc1Swenshuai.xi     else
1355*53ee8cc1Swenshuai.xi         u32Wptr = RVD_BBU_DEPTH - 1;
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi     u32Wptr = gu32QmemBbuAddr + (u32Wptr << 3);
1358*53ee8cc1Swenshuai.xi     u32Offset = HAL_RVD_MemRead(u32Wptr) & (~BROKEN_BY_US);
1359*53ee8cc1Swenshuai.xi     u32Length = HAL_RVD_MemRead(u32Wptr + 4);
1360*53ee8cc1Swenshuai.xi     RVD_MSG_INF("ES Write address = %ld\n",(u32Offset+u32Length));
1361*53ee8cc1Swenshuai.xi     return (u32Offset+u32Length);
1362*53ee8cc1Swenshuai.xi }
1363*53ee8cc1Swenshuai.xi 
1364*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1365*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsFrameShowed()
1366*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is RVD Frame showed after TriggerDisp(TRUE) or first frame showed
1367*53ee8cc1Swenshuai.xi /// @return - Is frame showed or not
1368*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): New Framed showed
1369*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Not showed
1370*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsFrameShowed(void)1371*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsFrameShowed(void)
1372*53ee8cc1Swenshuai.xi {
1373*53ee8cc1Swenshuai.xi     MS_U32 u32DisplayCnt = 0;
1374*53ee8cc1Swenshuai.xi 
1375*53ee8cc1Swenshuai.xi     u32DisplayCnt =  HAL_RVD_QMemRead( gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DISPLAYCNT);
1376*53ee8cc1Swenshuai.xi     RVD_MSG_INF("[RVD]Display Count = %ld \n",u32DisplayCnt);
1377*53ee8cc1Swenshuai.xi     if(u32DisplayCnt)
1378*53ee8cc1Swenshuai.xi         return TRUE;
1379*53ee8cc1Swenshuai.xi     else
1380*53ee8cc1Swenshuai.xi         return FALSE;
1381*53ee8cc1Swenshuai.xi }
1382*53ee8cc1Swenshuai.xi 
1383*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1384*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_CheckDispInfoRdy()
1385*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info ready and correct or not
1386*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
1387*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_CheckDispInfoRdy(void)1388*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_CheckDispInfoRdy(void)
1389*53ee8cc1Swenshuai.xi {
1390*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DECODECNT))
1391*53ee8cc1Swenshuai.xi     {
1392*53ee8cc1Swenshuai.xi         return TRUE;
1393*53ee8cc1Swenshuai.xi     }
1394*53ee8cc1Swenshuai.xi     else
1395*53ee8cc1Swenshuai.xi     {
1396*53ee8cc1Swenshuai.xi         return FALSE;
1397*53ee8cc1Swenshuai.xi     }
1398*53ee8cc1Swenshuai.xi }
1399*53ee8cc1Swenshuai.xi 
1400*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1401*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_CheckDispInfoRdy()
1402*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check display info ready and correct or not
1403*53ee8cc1Swenshuai.xi /// @return -The result of command check display infor ready or not
1404*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_DispSetupDone(void)1405*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_DispSetupDone(void)
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DECODECNT))
1408*53ee8cc1Swenshuai.xi         return TRUE;
1409*53ee8cc1Swenshuai.xi     else
1410*53ee8cc1Swenshuai.xi         return FALSE;
1411*53ee8cc1Swenshuai.xi }
1412*53ee8cc1Swenshuai.xi 
1413*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1414*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_CheckCaps()
1415*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if HW support this format
1416*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
1417*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): not supported by HW
1418*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): supported by HW
1419*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_CheckCaps(void)1420*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_CheckCaps(void)
1421*53ee8cc1Swenshuai.xi {
1422*53ee8cc1Swenshuai.xi     return TRUE;
1423*53ee8cc1Swenshuai.xi }
1424*53ee8cc1Swenshuai.xi 
1425*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1426*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsTSPlaying()
1427*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is Playing
1428*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
1429*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Stop
1430*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Playing
1431*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsTSPlaying(void)1432*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsTSPlaying(void)
1433*53ee8cc1Swenshuai.xi {
1434*53ee8cc1Swenshuai.xi     return TRUE;
1435*53ee8cc1Swenshuai.xi }
1436*53ee8cc1Swenshuai.xi 
1437*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1438*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_ChkCmdRdy()
1439*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Is pre Command had be process by F/W
1440*53ee8cc1Swenshuai.xi /// @return - Done or Not
1441*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_FAIL: Not yet
1442*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_SUCCESS: Could handle new command
1443*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_ChkCmdRdy(void)1444*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_ChkCmdRdy(void)
1445*53ee8cc1Swenshuai.xi {
1446*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_COMMAND_ID) == E_RVD_CMD_NULL)
1447*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
1448*53ee8cc1Swenshuai.xi     else
1449*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
1450*53ee8cc1Swenshuai.xi }
1451*53ee8cc1Swenshuai.xi 
1452*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1453*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetCmd()
1454*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Command and Argument to F/w
1455*53ee8cc1Swenshuai.xi /// @param  u32Command \b RVD Command ID
1456*53ee8cc1Swenshuai.xi /// @param  u32Argument \b The RVD Argument
1457*53ee8cc1Swenshuai.xi /// @return Status
1458*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
1459*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_FAIL, Failed
1460*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetCmd(RVD_User_Cmd u32Command,MS_U32 u32Argument)1461*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetCmd(RVD_User_Cmd u32Command, MS_U32 u32Argument)
1462*53ee8cc1Swenshuai.xi {
1463*53ee8cc1Swenshuai.xi     RVD_Result eRet;
1464*53ee8cc1Swenshuai.xi     MS_U32 u32Timeout = 0;
1465*53ee8cc1Swenshuai.xi 
1466*53ee8cc1Swenshuai.xi     _DRV_RVD_Entry();
1467*53ee8cc1Swenshuai.xi 
1468*53ee8cc1Swenshuai.xi     if (MDrv_RVD_ChkCmdRdy()==E_RVD_RET_FAIL)
1469*53ee8cc1Swenshuai.xi     {
1470*53ee8cc1Swenshuai.xi         RVD_MSG_INF("<gdbg>Warning: previous command will be overwritten!");
1471*53ee8cc1Swenshuai.xi     }
1472*53ee8cc1Swenshuai.xi 
1473*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite( gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_ARGUMENT, u32Argument);
1474*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite( gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_COMMAND_ID, u32Command);
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi     u32Timeout = RVD_GetSystemTime() + 33;
1477*53ee8cc1Swenshuai.xi     while (1)
1478*53ee8cc1Swenshuai.xi     {
1479*53ee8cc1Swenshuai.xi         if (MDrv_RVD_ChkCmdRdy())
1480*53ee8cc1Swenshuai.xi         {
1481*53ee8cc1Swenshuai.xi             RVD_MSG_INF("Cmd status :<ID> 0x%lx <Arg>0x%lx\n", (MS_U32)u32Command, u32Argument);
1482*53ee8cc1Swenshuai.xi             eRet = E_RVD_RET_SUCCESS;
1483*53ee8cc1Swenshuai.xi             break;
1484*53ee8cc1Swenshuai.xi         }
1485*53ee8cc1Swenshuai.xi         if (RVD_GetSystemTime() > u32Timeout)
1486*53ee8cc1Swenshuai.xi         {
1487*53ee8cc1Swenshuai.xi             RVD_MSG_ERR("<gdbg>Error: MDrv_RVD_SetCmd(0x%lx, 0x%lx) timeout!\n", (MS_U32)u32Command, u32Argument);
1488*53ee8cc1Swenshuai.xi             eRet = E_RVD_RET_TIMEOUT;
1489*53ee8cc1Swenshuai.xi             break;
1490*53ee8cc1Swenshuai.xi         }
1491*53ee8cc1Swenshuai.xi     }
1492*53ee8cc1Swenshuai.xi     _DRV_RVD_Return(eRet);
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi 
1495*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1496*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetSpeed()
1497*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the display speed type.
1498*53ee8cc1Swenshuai.xi /// @param -u32DispSpeed \b IN : display speed type
1499*53ee8cc1Swenshuai.xi /// @return Status
1500*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
1501*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_FAIL, Failed
1502*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetSpeed(RVD_Disp_Speed u32DispSpeed)1503*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetSpeed(RVD_Disp_Speed u32DispSpeed)
1504*53ee8cc1Swenshuai.xi {
1505*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_DISP_SPEED, u32DispSpeed);
1506*53ee8cc1Swenshuai.xi }
1507*53ee8cc1Swenshuai.xi 
1508*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1509*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_JumpToPTS()
1510*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Jump to PTS
1511*53ee8cc1Swenshuai.xi /// @param -u32time_ms \b IN : Jump to PTS position
1512*53ee8cc1Swenshuai.xi /// @return Status
1513*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
1514*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_FAIL, Failed
1515*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_JumpToPTS(MS_U32 u32time_ms)1516*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_JumpToPTS(MS_U32 u32time_ms)
1517*53ee8cc1Swenshuai.xi {
1518*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_JUMP_TO_PTS, u32time_ms);
1519*53ee8cc1Swenshuai.xi }
1520*53ee8cc1Swenshuai.xi 
1521*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1522*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SkipToPTS()
1523*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Skip to PTS
1524*53ee8cc1Swenshuai.xi /// @param -u32time_ms \b IN : Skip to PTS position
1525*53ee8cc1Swenshuai.xi /// @return Status
1526*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_SUCCESS, Success
1527*53ee8cc1Swenshuai.xi /// @retval      - E_RVD_RET_FAIL, Failed
1528*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SkipToPTS(MS_U32 u32time_ms)1529*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SkipToPTS(MS_U32 u32time_ms)
1530*53ee8cc1Swenshuai.xi {
1531*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_SKIP_TO_PTS, u32time_ms);
1532*53ee8cc1Swenshuai.xi }
1533*53ee8cc1Swenshuai.xi 
1534*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1535*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetTrickMode()
1536*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  specify the trick mode
1537*53ee8cc1Swenshuai.xi /// @param -u32TrickMode \b IN : trick mode  speed type
1538*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetTrickMode(RVD_TrickMode u32TrickMode)1539*53ee8cc1Swenshuai.xi void MDrv_RVD_SetTrickMode(RVD_TrickMode u32TrickMode)
1540*53ee8cc1Swenshuai.xi {
1541*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite(gu32QmemExchangeInfoAddr+RVD_QMEM_INFO_TRICK_MODE, u32TrickMode);
1542*53ee8cc1Swenshuai.xi }
1543*53ee8cc1Swenshuai.xi 
1544*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1545*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetAction()
1546*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get F/W action status
1547*53ee8cc1Swenshuai.xi /// @return - error count
1548*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetAction(void)1549*53ee8cc1Swenshuai.xi static MS_U32 MDrv_RVD_GetAction(void)
1550*53ee8cc1Swenshuai.xi {
1551*53ee8cc1Swenshuai.xi     return HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ACTION);
1552*53ee8cc1Swenshuai.xi }
1553*53ee8cc1Swenshuai.xi 
1554*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1555*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Play()
1556*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Play RVD
1557*53ee8cc1Swenshuai.xi /// @return -The result of command play
1558*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Play(void)1559*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Play(void)
1560*53ee8cc1Swenshuai.xi {
1561*53ee8cc1Swenshuai.xi     MDrv_RVD_SetDisplay(E_RVD_DISPLAYMODE_NULL);
1562*53ee8cc1Swenshuai.xi 
1563*53ee8cc1Swenshuai.xi     if (MDrv_RVD_GetAction()==E_RVD_ACTIONMODE_PLAY)
1564*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
1565*53ee8cc1Swenshuai.xi 
1566*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_PLAY, NULL);
1567*53ee8cc1Swenshuai.xi }
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1570*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_StepDecode()
1571*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step decode
1572*53ee8cc1Swenshuai.xi /// @return -The result of Step Decode
1573*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_StepDecode(void)1574*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_StepDecode(void)
1575*53ee8cc1Swenshuai.xi {
1576*53ee8cc1Swenshuai.xi      u32StepDecodeCnt = MDrv_RVD_GetDecodeCnt();
1577*53ee8cc1Swenshuai.xi      return MDrv_RVD_SetCmd(E_RVD_CMD_STEP_DECODE, NULL);
1578*53ee8cc1Swenshuai.xi }
1579*53ee8cc1Swenshuai.xi 
1580*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1581*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Rst()
1582*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Reset RVD decoder
1583*53ee8cc1Swenshuai.xi /// @return -The result of Step Decode
1584*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Rst(void)1585*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Rst(void)
1586*53ee8cc1Swenshuai.xi {
1587*53ee8cc1Swenshuai.xi     return MDrv_RVD_Exit();
1588*53ee8cc1Swenshuai.xi }
1589*53ee8cc1Swenshuai.xi 
1590*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1591*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsStepDecodeDone()
1592*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  IS Step decode done
1593*53ee8cc1Swenshuai.xi /// @return -The result of Step Decode
1594*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsStepDecodeDone(void)1595*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsStepDecodeDone(void)
1596*53ee8cc1Swenshuai.xi {
1597*53ee8cc1Swenshuai.xi     if (MDrv_RVD_GetDecodeCnt() > u32StepDecodeCnt)
1598*53ee8cc1Swenshuai.xi     {
1599*53ee8cc1Swenshuai.xi         u32StepDecodeCnt = 0;
1600*53ee8cc1Swenshuai.xi         return TRUE;
1601*53ee8cc1Swenshuai.xi     }
1602*53ee8cc1Swenshuai.xi     else
1603*53ee8cc1Swenshuai.xi     {
1604*53ee8cc1Swenshuai.xi         return FALSE;
1605*53ee8cc1Swenshuai.xi     }
1606*53ee8cc1Swenshuai.xi }
1607*53ee8cc1Swenshuai.xi 
1608*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1609*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_AVSyncOn()
1610*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Enable or Disbale AVSync mode
1611*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : enable or not
1612*53ee8cc1Swenshuai.xi /// @param -u16SyncDelay \b IN : Sync Delay time (unit ms)
1613*53ee8cc1Swenshuai.xi /// @param -u16SyncTolerance \b IN : Tolerance(unit ms)
1614*53ee8cc1Swenshuai.xi /// @return -The result of AVSync
1615*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_AVSyncOn(MS_BOOL bEnable,MS_U16 u16SyncDelay,MS_U16 u16SyncTolerance)1616*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_AVSyncOn(MS_BOOL  bEnable,MS_U16 u16SyncDelay, MS_U16 u16SyncTolerance)
1617*53ee8cc1Swenshuai.xi {
1618*53ee8cc1Swenshuai.xi     RVD_Result eRet;
1619*53ee8cc1Swenshuai.xi 
1620*53ee8cc1Swenshuai.xi     if (bEnable)
1621*53ee8cc1Swenshuai.xi     {
1622*53ee8cc1Swenshuai.xi         MDrv_RVD_SetCmd(E_RVD_CMD_SYNC_TOLERANCE, u16SyncTolerance);
1623*53ee8cc1Swenshuai.xi         MDrv_RVD_SetCmd(E_RVD_CMD_SYNC_VIDEO_DELAY, u16SyncDelay);
1624*53ee8cc1Swenshuai.xi         eRet = MDrv_RVD_SetCmd(E_RVD_CMD_SYNC_ACTIVE, 1);
1625*53ee8cc1Swenshuai.xi     }
1626*53ee8cc1Swenshuai.xi     else
1627*53ee8cc1Swenshuai.xi     {
1628*53ee8cc1Swenshuai.xi         eRet = MDrv_RVD_SetCmd(E_RVD_CMD_SYNC_ACTIVE, 0);
1629*53ee8cc1Swenshuai.xi     }
1630*53ee8cc1Swenshuai.xi     return eRet;
1631*53ee8cc1Swenshuai.xi }
1632*53ee8cc1Swenshuai.xi 
MDrv_RVD_IsFwStatusOn(RVD_StatusType type)1633*53ee8cc1Swenshuai.xi static MS_BOOL MDrv_RVD_IsFwStatusOn(RVD_StatusType type)
1634*53ee8cc1Swenshuai.xi {
1635*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_STATUS) & type)
1636*53ee8cc1Swenshuai.xi         return TRUE;
1637*53ee8cc1Swenshuai.xi     else
1638*53ee8cc1Swenshuai.xi         return FALSE;
1639*53ee8cc1Swenshuai.xi }
1640*53ee8cc1Swenshuai.xi 
1641*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1642*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsAVSyncOn()
1643*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  AV Sync mode had enable or not
1644*53ee8cc1Swenshuai.xi /// @return -The mode state of AVSync
1645*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsAVSyncOn(void)1646*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsAVSyncOn(void)
1647*53ee8cc1Swenshuai.xi {
1648*53ee8cc1Swenshuai.xi     return MDrv_RVD_IsFwStatusOn(E_RVD_STATUSTYPE_AVSYNCON);
1649*53ee8cc1Swenshuai.xi }
1650*53ee8cc1Swenshuai.xi 
1651*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1652*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Pause()
1653*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Pause RVD
1654*53ee8cc1Swenshuai.xi /// @return -The result of command pause
1655*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Pause(void)1656*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Pause(void)
1657*53ee8cc1Swenshuai.xi {
1658*53ee8cc1Swenshuai.xi     if (MDrv_RVD_GetAction()==E_RVD_ACTIONMODE_PAUSE)
1659*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
1660*53ee8cc1Swenshuai.xi 
1661*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_PAUSE, NULL);
1662*53ee8cc1Swenshuai.xi }
1663*53ee8cc1Swenshuai.xi 
1664*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1665*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Exit()
1666*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Stop RVD and release resource.
1667*53ee8cc1Swenshuai.xi /// @return -The result of command stop
1668*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Exit(void)1669*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Exit(void)
1670*53ee8cc1Swenshuai.xi {
1671*53ee8cc1Swenshuai.xi     _DRV_RVD_Entry();
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi     if (bRVDIsInit != TRUE)
1674*53ee8cc1Swenshuai.xi     {
1675*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("MDrv_RVD_Exit: not-init yet\n");
1676*53ee8cc1Swenshuai.xi         _DRV_RVD_Return(E_RVD_RET_FAIL);
1677*53ee8cc1Swenshuai.xi     }
1678*53ee8cc1Swenshuai.xi 
1679*53ee8cc1Swenshuai.xi     bRVDIsInit = FALSE;
1680*53ee8cc1Swenshuai.xi 
1681*53ee8cc1Swenshuai.xi #if RVD_ISR_ENABLE
1682*53ee8cc1Swenshuai.xi     HAL_RVD_Enable_ISR(FALSE);
1683*53ee8cc1Swenshuai.xi     OSAL_RVD_ISR_Disable();
1684*53ee8cc1Swenshuai.xi     if( gRVDISRCtrl.bRegISR )
1685*53ee8cc1Swenshuai.xi     {
1686*53ee8cc1Swenshuai.xi         OSAL_RVD_ISR_Detach();
1687*53ee8cc1Swenshuai.xi     }
1688*53ee8cc1Swenshuai.xi #endif
1689*53ee8cc1Swenshuai.xi     MDrv_RVD_ResetVariable();
1690*53ee8cc1Swenshuai.xi 
1691*53ee8cc1Swenshuai.xi     MDrv_RVD_SetCmd(E_RVD_CMD_STOP, NULL);
1692*53ee8cc1Swenshuai.xi     RVD_MSG_INF("[RM] RVD Decoder is Stop, then exit!!\n");
1693*53ee8cc1Swenshuai.xi     HAL_RVD_DeInit();
1694*53ee8cc1Swenshuai.xi     RVD_memset( (void*)&DrvRVDInfo  , 0 , sizeof(RVD_DrvInfo) );
1695*53ee8cc1Swenshuai.xi     _DRV_RVD_Return(E_RVD_RET_SUCCESS);
1696*53ee8cc1Swenshuai.xi }
1697*53ee8cc1Swenshuai.xi 
1698*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1699*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_Resume()
1700*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  RVD Resume
1701*53ee8cc1Swenshuai.xi /// @return -The result of command resume
1702*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Resume(void)1703*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_Resume(void)
1704*53ee8cc1Swenshuai.xi {
1705*53ee8cc1Swenshuai.xi     return MDrv_RVD_Play();
1706*53ee8cc1Swenshuai.xi }
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1709*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_EnableLastFrameShowed()
1710*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  MDrv_RVD_EnableLastFrameShowed
1711*53ee8cc1Swenshuai.xi /// @return -The result of command resume
1712*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_EnableLastFrameShowed(MS_BOOL bEnabled)1713*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_EnableLastFrameShowed(MS_BOOL bEnabled)
1714*53ee8cc1Swenshuai.xi {
1715*53ee8cc1Swenshuai.xi      return MDrv_RVD_SetCmd(E_RVD_CMD_ENABLE_LAST_FRAME_SHOW, bEnabled);
1716*53ee8cc1Swenshuai.xi }
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1719*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetTrickMode()
1720*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get current play mode status.
1721*53ee8cc1Swenshuai.xi /// @return - mode status
1722*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetTrickMode(void)1723*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetTrickMode(void)
1724*53ee8cc1Swenshuai.xi {
1725*53ee8cc1Swenshuai.xi     return HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_TRICK_MODE);
1726*53ee8cc1Swenshuai.xi }
1727*53ee8cc1Swenshuai.xi 
1728*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1729*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_StepPlay()
1730*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step display one frame
1731*53ee8cc1Swenshuai.xi /// @return - E_RVD_RET_SUCCESS :command ready
1732*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_StepPlay(void)1733*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_StepPlay(void)
1734*53ee8cc1Swenshuai.xi {
1735*53ee8cc1Swenshuai.xi     u32StepPlayCnt = MDrv_RVD_GetFrameCnt();
1736*53ee8cc1Swenshuai.xi 
1737*53ee8cc1Swenshuai.xi     MDrv_RVD_SetDisplay(E_RVD_DISPLAYMODE_SHOW);
1738*53ee8cc1Swenshuai.xi 
1739*53ee8cc1Swenshuai.xi     if (MDrv_RVD_GetAction()==E_RVD_ACTIONMODE_PLAY)
1740*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
1741*53ee8cc1Swenshuai.xi 
1742*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_PLAY, NULL);
1743*53ee8cc1Swenshuai.xi }
1744*53ee8cc1Swenshuai.xi 
1745*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1746*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_StepFreezeImg()
1747*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Step Disp in Freeze mode
1748*53ee8cc1Swenshuai.xi /// @param -bEnabled \b IN : enable or not
1749*53ee8cc1Swenshuai.xi /// @return -E_RVD_RET_SUCCESS :command ready
1750*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetFreezeImg(MS_BOOL bEnabled)1751*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetFreezeImg(MS_BOOL bEnabled)
1752*53ee8cc1Swenshuai.xi {
1753*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_FREEZE_IMG, bEnabled);
1754*53ee8cc1Swenshuai.xi }
1755*53ee8cc1Swenshuai.xi 
1756*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1757*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetBlueScreen()
1758*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Blue screen
1759*53ee8cc1Swenshuai.xi /// @param -bEnabled \b IN : enable or not
1760*53ee8cc1Swenshuai.xi /// @return -E_RVD_RET_SUCCESS :command ready
1761*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetBlueScreen(MS_BOOL bEnabled)1762*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetBlueScreen(MS_BOOL bEnabled)
1763*53ee8cc1Swenshuai.xi {
1764*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(E_RVD_CMD_BLUE_SCREEN, bEnabled);
1765*53ee8cc1Swenshuai.xi }
1766*53ee8cc1Swenshuai.xi 
1767*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1768*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsStepPlayDone()
1769*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  The frame had be showed(Only work after Step Play)
1770*53ee8cc1Swenshuai.xi /// @return - TRUE/ FALSE
1771*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not yet
1772*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Showed
1773*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsStepPlayDone(void)1774*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsStepPlayDone(void)
1775*53ee8cc1Swenshuai.xi {
1776*53ee8cc1Swenshuai.xi     if (MDrv_RVD_GetFrameCnt() > u32StepPlayCnt)
1777*53ee8cc1Swenshuai.xi         return TRUE;
1778*53ee8cc1Swenshuai.xi     else
1779*53ee8cc1Swenshuai.xi         return FALSE;
1780*53ee8cc1Swenshuai.xi }
1781*53ee8cc1Swenshuai.xi 
1782*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1783*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsIdle()
1784*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check decoder is idle or not
1785*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
1786*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): decoder is not idle
1787*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): decoder is idle
1788*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsIdle(void)1789*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsIdle(void)
1790*53ee8cc1Swenshuai.xi {
1791*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_IDLECNT) >= RVD_FW_IDLE_THRESHOLD )
1792*53ee8cc1Swenshuai.xi         return TRUE;
1793*53ee8cc1Swenshuai.xi     else
1794*53ee8cc1Swenshuai.xi         return FALSE;
1795*53ee8cc1Swenshuai.xi }
1796*53ee8cc1Swenshuai.xi 
1797*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1798*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsDispFinish()
1799*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check this file mode display is finish or not.
1800*53ee8cc1Swenshuai.xi /// @return - Is finish or not
1801*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Not finish or Not in file mode playback
1802*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Display Finished.
1803*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsDispFinish(void)1804*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsDispFinish(void)
1805*53ee8cc1Swenshuai.xi {
1806*53ee8cc1Swenshuai.xi     return MDrv_RVD_IsFwStatusOn(E_RVD_STATUSTYPE_PLAYBACK_FINISH);
1807*53ee8cc1Swenshuai.xi }
1808*53ee8cc1Swenshuai.xi 
1809*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1810*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_1stFrameRdy()
1811*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if I frame found after Init() or flush().
1812*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
1813*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): I frame is not found.
1814*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): I frame has been found.
1815*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_Is1stFrameRdy(void)1816*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_Is1stFrameRdy(void)
1817*53ee8cc1Swenshuai.xi {
1818*53ee8cc1Swenshuai.xi     return MDrv_RVD_IsFwStatusOn(E_RVD_STATUSTYPE_1ST_FRAMERDY);
1819*53ee8cc1Swenshuai.xi }
1820*53ee8cc1Swenshuai.xi 
1821*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1822*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsIFrameFound()
1823*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  check if I frame found after Init() or flush().
1824*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
1825*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): I frame is not found.
1826*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): I frame has been found.
1827*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsIFrameFound(void)1828*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsIFrameFound(void)
1829*53ee8cc1Swenshuai.xi {
1830*53ee8cc1Swenshuai.xi     return MDrv_RVD_IsFwStatusOn(E_RVD_STATUSTYPE_IFRAMEFOUND);
1831*53ee8cc1Swenshuai.xi }
1832*53ee8cc1Swenshuai.xi 
1833*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1834*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetErrCode()
1835*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  get error code
1836*53ee8cc1Swenshuai.xi /// @return - error code number
1837*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetErrCode(void)1838*53ee8cc1Swenshuai.xi MS_U32 MDrv_RVD_GetErrCode(void)
1839*53ee8cc1Swenshuai.xi {
1840*53ee8cc1Swenshuai.xi     MS_U32 errCode;
1841*53ee8cc1Swenshuai.xi 
1842*53ee8cc1Swenshuai.xi     errCode = HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_ERROR_CODE);
1843*53ee8cc1Swenshuai.xi 
1844*53ee8cc1Swenshuai.xi     if (errCode == E_ERROR_OUT_OF_MEMORY)
1845*53ee8cc1Swenshuai.xi         return errCode;
1846*53ee8cc1Swenshuai.xi     else
1847*53ee8cc1Swenshuai.xi         return E_ERROR_NONE;
1848*53ee8cc1Swenshuai.xi }
1849*53ee8cc1Swenshuai.xi 
1850*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1851*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetDbgLevel()
1852*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Dbg level
1853*53ee8cc1Swenshuai.xi /// @param -u8DbgLevel \b IN : enable level
1854*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetDbgLevel(MS_U8 u8DbgLevel)1855*53ee8cc1Swenshuai.xi void MDrv_RVD_SetDbgLevel(MS_U8 u8DbgLevel)
1856*53ee8cc1Swenshuai.xi {
1857*53ee8cc1Swenshuai.xi     u8RVD_DbgLevel = u8DbgLevel;
1858*53ee8cc1Swenshuai.xi }
1859*53ee8cc1Swenshuai.xi 
1860*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1861*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDbgLevel()
1862*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get Dbg level
1863*53ee8cc1Swenshuai.xi /// @return - u8RVD_DbgLevel
1864*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDbgLevel(VOID)1865*53ee8cc1Swenshuai.xi MS_U8 MDrv_RVD_GetDbgLevel(VOID)
1866*53ee8cc1Swenshuai.xi {
1867*53ee8cc1Swenshuai.xi     return u8RVD_DbgLevel;
1868*53ee8cc1Swenshuai.xi }
1869*53ee8cc1Swenshuai.xi 
1870*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1871*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_IsDbgEnable()
1872*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Check the Dbg mode enable or not
1873*53ee8cc1Swenshuai.xi /// @return - TRUE / FALSE
1874*53ee8cc1Swenshuai.xi /// @retval     -FALSE(0): Disable
1875*53ee8cc1Swenshuai.xi /// @retval     -TRUE(1): Enable
1876*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_IsDbgEnable(MS_U8 u8DbgLevel)1877*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_IsDbgEnable(MS_U8 u8DbgLevel)
1878*53ee8cc1Swenshuai.xi {
1879*53ee8cc1Swenshuai.xi     if (u8RVD_DbgLevel & u8DbgLevel)
1880*53ee8cc1Swenshuai.xi         return TRUE;
1881*53ee8cc1Swenshuai.xi     else
1882*53ee8cc1Swenshuai.xi         return FALSE;
1883*53ee8cc1Swenshuai.xi }
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1886*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetStatus()
1887*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get status of RVD driver
1888*53ee8cc1Swenshuai.xi /// @param -pstatus \b OUT : driver status
1889*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetStatus(RVD_DrvStatus * pstatus)1890*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_GetStatus(RVD_DrvStatus *pstatus)
1891*53ee8cc1Swenshuai.xi {
1892*53ee8cc1Swenshuai.xi     pstatus->bInit = u32RVDCtrlMode & RVD_CTRL_INIT_FINISHED;
1893*53ee8cc1Swenshuai.xi     pstatus->bBusy = u32RVDCtrlMode & RVD_CTRL_PROCESSING;
1894*53ee8cc1Swenshuai.xi     return TRUE;
1895*53ee8cc1Swenshuai.xi }
1896*53ee8cc1Swenshuai.xi 
1897*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
1898*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetDispInfo()
1899*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set Par and Crop Info to AP
1900*53ee8cc1Swenshuai.xi /// @param -pinfo \b IN : Display Infomation
1901*53ee8cc1Swenshuai.xi /// @return - E_RVD_RET_SUCCESS / E_RVD_RET_FAIL
1902*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_FAIL(0): FAIL
1903*53ee8cc1Swenshuai.xi /// @retval     -E_RVD_RET_SUCCESS(1): SUCCESS
1904*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetDispInfo(RVD_FrameInfo * pinfo)1905*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_GetDispInfo(RVD_FrameInfo *pinfo)
1906*53ee8cc1Swenshuai.xi {
1907*53ee8cc1Swenshuai.xi     #define PAR_FACTOR 20
1908*53ee8cc1Swenshuai.xi     #define SAR_FACTOR 1000
1909*53ee8cc1Swenshuai.xi 
1910*53ee8cc1Swenshuai.xi     if (HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DECODECNT))
1911*53ee8cc1Swenshuai.xi     {
1912*53ee8cc1Swenshuai.xi         MS_U16 u16PicWidth = 0, u16PicHeight = 0;
1913*53ee8cc1Swenshuai.xi         MS_U16 u16Frame0Width = 0, u16Frame0Height = 0;
1914*53ee8cc1Swenshuai.xi 
1915*53ee8cc1Swenshuai.xi         MDrv_RVD_GetPictureSize(&u16PicWidth ,&u16PicHeight);
1916*53ee8cc1Swenshuai.xi         MDrv_RVD_GetFrameSize(&u16Frame0Width ,&u16Frame0Height);
1917*53ee8cc1Swenshuai.xi         RVD_MSG_INF("Picture Width = %d Height =%d\n",u16PicWidth,u16PicHeight);
1918*53ee8cc1Swenshuai.xi         RVD_MSG_INF("Frame Width = %d Height =%d\n",u16Frame0Width,u16Frame0Height);
1919*53ee8cc1Swenshuai.xi 
1920*53ee8cc1Swenshuai.xi         // reset picture size as frame size
1921*53ee8cc1Swenshuai.xi         MDrv_RVD_SetPictureSize(u16Frame0Width ,u16Frame0Height);
1922*53ee8cc1Swenshuai.xi 
1923*53ee8cc1Swenshuai.xi         pinfo->u16FrameRate = 60000;
1924*53ee8cc1Swenshuai.xi         pinfo->u16HorSize = u16Frame0Width; //u16PicWidth;
1925*53ee8cc1Swenshuai.xi         pinfo->u16VerSize = u16Frame0Height; //u16PicHeight;
1926*53ee8cc1Swenshuai.xi         pinfo->u8par_width = u16PicWidth * PAR_FACTOR / u16Frame0Width;
1927*53ee8cc1Swenshuai.xi         pinfo->u8par_height = u16PicHeight* PAR_FACTOR / u16Frame0Height;
1928*53ee8cc1Swenshuai.xi         pinfo->u16Sar_width = u16PicWidth * SAR_FACTOR / u16Frame0Width;
1929*53ee8cc1Swenshuai.xi         pinfo->u16Sar_height = u16PicHeight* SAR_FACTOR / u16Frame0Height;
1930*53ee8cc1Swenshuai.xi         pinfo->u32AspectWidth = (MS_U32) u16PicWidth;
1931*53ee8cc1Swenshuai.xi         pinfo->u32AspectHeight = (MS_U32) u16PicHeight;
1932*53ee8cc1Swenshuai.xi         pinfo->u16CropBottom = 0;
1933*53ee8cc1Swenshuai.xi         pinfo->u16CropTop = 0;
1934*53ee8cc1Swenshuai.xi         pinfo->u16CropLeft = 0;
1935*53ee8cc1Swenshuai.xi         pinfo->bEnableMIUSel = gRVDInfo.bRVD_FWinMIU1;//(eRvdDynCfgByChip ==128)?TRUE:FALSE;
1936*53ee8cc1Swenshuai.xi         pinfo->u32DynScalingAddr = gRVDInfo.u32FW_PhyAddr | HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DS_ADDR);
1937*53ee8cc1Swenshuai.xi         pinfo->u8DynScalingDepth = (MS_U8)HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_DS_DEPTH);
1938*53ee8cc1Swenshuai.xi         RVD_MSG_INF("DynScalingAddr = 0x%lx DynScalingDepth =%x\n",pinfo->u32DynScalingAddr,pinfo->u8DynScalingDepth);
1939*53ee8cc1Swenshuai.xi         if (pinfo->u16HorSize & 0x07)
1940*53ee8cc1Swenshuai.xi         {
1941*53ee8cc1Swenshuai.xi             pinfo->u16CropRight = 8 - (pinfo->u16HorSize & 0x0007);
1942*53ee8cc1Swenshuai.xi             pinfo->u16HorSize = ((pinfo->u16HorSize >> 3) + 1) << 3;
1943*53ee8cc1Swenshuai.xi         }
1944*53ee8cc1Swenshuai.xi         else
1945*53ee8cc1Swenshuai.xi         {
1946*53ee8cc1Swenshuai.xi             pinfo->u16CropRight = 0;
1947*53ee8cc1Swenshuai.xi         }
1948*53ee8cc1Swenshuai.xi         return E_RVD_RET_SUCCESS;
1949*53ee8cc1Swenshuai.xi     }
1950*53ee8cc1Swenshuai.xi     else
1951*53ee8cc1Swenshuai.xi     {
1952*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("GetDispInfo fail!!!\n");
1953*53ee8cc1Swenshuai.xi         return E_RVD_RET_FAIL;
1954*53ee8cc1Swenshuai.xi     }
1955*53ee8cc1Swenshuai.xi }
1956*53ee8cc1Swenshuai.xi 
1957*53ee8cc1Swenshuai.xi // Fixme
MDrv_RVD_DbgSetCmd(RVD_User_Cmd u32Command,MS_U32 u32Argument)1958*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_DbgSetCmd(RVD_User_Cmd u32Command, MS_U32 u32Argument)
1959*53ee8cc1Swenshuai.xi {
1960*53ee8cc1Swenshuai.xi     return MDrv_RVD_SetCmd(u32Command, u32Argument);
1961*53ee8cc1Swenshuai.xi }
1962*53ee8cc1Swenshuai.xi 
MDrv_RVD_DbgSetData(MS_U32 u32Addr,MS_U32 data)1963*53ee8cc1Swenshuai.xi void MDrv_RVD_DbgSetData(MS_U32 u32Addr, MS_U32 data)
1964*53ee8cc1Swenshuai.xi {
1965*53ee8cc1Swenshuai.xi     HAL_RVD_QMemWrite(gu32QmemExchangeInfoAddr + u32Addr, data);
1966*53ee8cc1Swenshuai.xi }
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
1969*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_DbgGetData()
1970*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get DBG Data from Qmem
1971*53ee8cc1Swenshuai.xi /// @param -u32Addr \b IN : address of debug data
1972*53ee8cc1Swenshuai.xi /// @param -u32Data \b IN : pointer to the debug data
1973*53ee8cc1Swenshuai.xi /// @return -return RVD_Result success/fail to get debug data
1974*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
MDrv_RVD_DbgGetData(MS_U32 u32Addr,MS_U32 * u32Data)1975*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_DbgGetData(MS_U32 u32Addr, MS_U32 *u32Data)
1976*53ee8cc1Swenshuai.xi {
1977*53ee8cc1Swenshuai.xi     switch (u32Addr)
1978*53ee8cc1Swenshuai.xi     {
1979*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_PIC_WIDTH :
1980*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_PIC_HEIGHT :
1981*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_BBU_WPTR :
1982*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_BBU_RPTR :
1983*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_BBU_ADDR :
1984*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_OFFSET_BBU_DEPTH :
1985*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_PLAY_MODE :
1986*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_TRICK_MODE:
1987*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_DISP_FRAME_INFO_ADDR :
1988*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_IDLECNT :
1989*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_DISPLAYCNT :
1990*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_DECODECNT :
1991*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_MAX_BBU_DEPTH :
1992*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_DEC_FRAME_INFO_ADDR :
1993*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_FRAME0_WIDTH :
1994*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_FRAME0_HEIGHT :
1995*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_FRAME_RATE :
1996*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_ERROR_CODE :
1997*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_COMMAND_ID :
1998*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_ARGUMENT :
1999*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_ACTION :
2000*53ee8cc1Swenshuai.xi         case RVD_QMEM_INFO_STATUS :
2001*53ee8cc1Swenshuai.xi              *u32Data = HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr+u32Addr);
2002*53ee8cc1Swenshuai.xi              return E_RVD_RET_SUCCESS;
2003*53ee8cc1Swenshuai.xi         default:
2004*53ee8cc1Swenshuai.xi              return E_RVD_RET_FAIL;
2005*53ee8cc1Swenshuai.xi     }
2006*53ee8cc1Swenshuai.xi }
2007*53ee8cc1Swenshuai.xi 
2008*53ee8cc1Swenshuai.xi #if defined(REDLION_LINUX_KERNEL_ENVI)
_DRV_RVD_ISRHandler(void)2009*53ee8cc1Swenshuai.xi MS_S32 _DRV_RVD_ISRHandler(void)
2010*53ee8cc1Swenshuai.xi #else
2011*53ee8cc1Swenshuai.xi void _DRV_RVD_ISRHandler(void)
2012*53ee8cc1Swenshuai.xi #endif
2013*53ee8cc1Swenshuai.xi {
2014*53ee8cc1Swenshuai.xi     if (gRVDISRCtrl.pfnISRCallBack != NULL )
2015*53ee8cc1Swenshuai.xi     {
2016*53ee8cc1Swenshuai.xi         //FIXME LATE
2017*53ee8cc1Swenshuai.xi         //gRVDISRCtrl.u32ISRInfo = HAL_HVD_GetData( E_HVD_GDATA_HVD_ISR_STATUS );
2018*53ee8cc1Swenshuai.xi         HAL_RVD_Enable_ISR(FALSE);
2019*53ee8cc1Swenshuai.xi         gRVDISRCtrl.pfnISRCallBack();
2020*53ee8cc1Swenshuai.xi         HAL_RVD_Enable_ISR(TRUE);
2021*53ee8cc1Swenshuai.xi     }
2022*53ee8cc1Swenshuai.xi     else
2023*53ee8cc1Swenshuai.xi     {
2024*53ee8cc1Swenshuai.xi         RVD_MSG_ERR("DRV HRVD Err: ISR callback is NULL.\n");
2025*53ee8cc1Swenshuai.xi     }
2026*53ee8cc1Swenshuai.xi     HAL_RVD_SetClearISR();
2027*53ee8cc1Swenshuai.xi     OSAL_RVD_ISR_Enable();
2028*53ee8cc1Swenshuai.xi     #if defined(REDLION_LINUX_KERNEL_ENVI)
2029*53ee8cc1Swenshuai.xi     return 1;
2030*53ee8cc1Swenshuai.xi     #endif
2031*53ee8cc1Swenshuai.xi }
2032*53ee8cc1Swenshuai.xi 
2033*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2034*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetISREvent()
2035*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set the ISR event type sended by RVD fw.
2036*53ee8cc1Swenshuai.xi /// @param -eEvent \b IN : event types
2037*53ee8cc1Swenshuai.xi /// @param -fnISRHandler \b IN : function pointer to a interrupt handler.
2038*53ee8cc1Swenshuai.xi /// @return -The result of command set ISR event.
2039*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetISREvent(RVD_ISR_Event eEvent,RVD_InterruptCb fnISRHandler)2040*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetISREvent(RVD_ISR_Event eEvent, RVD_InterruptCb fnISRHandler)
2041*53ee8cc1Swenshuai.xi {
2042*53ee8cc1Swenshuai.xi     RVD_Result eRet = E_RVD_RET_ILLEGAL_ACCESS;
2043*53ee8cc1Swenshuai.xi 
2044*53ee8cc1Swenshuai.xi     //_DRV_HVD_Inited(eRet);
2045*53ee8cc1Swenshuai.xi     _DRV_RVD_Entry();
2046*53ee8cc1Swenshuai.xi     if ( eEvent == E_RVD_ISR_NONE )
2047*53ee8cc1Swenshuai.xi     {
2048*53ee8cc1Swenshuai.xi         HAL_RVD_Enable_ISR(FALSE);
2049*53ee8cc1Swenshuai.xi         OSAL_RVD_ISR_Disable();
2050*53ee8cc1Swenshuai.xi         OSAL_RVD_ISR_Detach();
2051*53ee8cc1Swenshuai.xi         gRVDISRCtrl.bRegISR=FALSE;
2052*53ee8cc1Swenshuai.xi         gRVDISRCtrl.pfnISRCallBack=NULL;
2053*53ee8cc1Swenshuai.xi         eRet = E_RVD_RET_SUCCESS;
2054*53ee8cc1Swenshuai.xi     }
2055*53ee8cc1Swenshuai.xi     else
2056*53ee8cc1Swenshuai.xi     {
2057*53ee8cc1Swenshuai.xi         if (fnISRHandler != NULL)
2058*53ee8cc1Swenshuai.xi         {
2059*53ee8cc1Swenshuai.xi             HAL_RVD_Enable_ISR(FALSE);
2060*53ee8cc1Swenshuai.xi             if ( gRVDISRCtrl.bRegISR )
2061*53ee8cc1Swenshuai.xi             {
2062*53ee8cc1Swenshuai.xi                 OSAL_RVD_ISR_Detach();
2063*53ee8cc1Swenshuai.xi                 gRVDISRCtrl.bRegISR=FALSE;
2064*53ee8cc1Swenshuai.xi             }
2065*53ee8cc1Swenshuai.xi             gRVDISRCtrl.pfnISRCallBack = (RVD_ISRCallBack)fnISRHandler;
2066*53ee8cc1Swenshuai.xi             OSAL_RVD_ISR_Attach( (void*)_DRV_RVD_ISRHandler );
2067*53ee8cc1Swenshuai.xi             OSAL_RVD_ISR_Enable();
2068*53ee8cc1Swenshuai.xi /*
2069*53ee8cc1Swenshuai.xi             {
2070*53ee8cc1Swenshuai.xi                 MS_U32 i=0;
2071*53ee8cc1Swenshuai.xi                 for (i=0; i<68; i++)
2072*53ee8cc1Swenshuai.xi                 {
2073*53ee8cc1Swenshuai.xi                     MsOS_AttachInterrupt(i, (void*)_DRV_HVD_ISRHandler);//(InterruptCb)fnISRHandler);
2074*53ee8cc1Swenshuai.xi                     MsOS_EnableInterrupt(i);
2075*53ee8cc1Swenshuai.xi                 }
2076*53ee8cc1Swenshuai.xi             }
2077*53ee8cc1Swenshuai.xi */
2078*53ee8cc1Swenshuai.xi             //FIXME LATE
2079*53ee8cc1Swenshuai.xi             //RVD_MSG_INF("attach ISR number:%d\n", RVD_ISR_VECTOR);
2080*53ee8cc1Swenshuai.xi 
2081*53ee8cc1Swenshuai.xi             // TODO: set ISR event and wait ACK
2082*53ee8cc1Swenshuai.xi             //HAL_RVD_Enable_ISR(TRUE);
2083*53ee8cc1Swenshuai.xi             gRVDISRCtrl.bRegISR = TRUE;
2084*53ee8cc1Swenshuai.xi             eRet = E_RVD_RET_SUCCESS;
2085*53ee8cc1Swenshuai.xi         }
2086*53ee8cc1Swenshuai.xi         else
2087*53ee8cc1Swenshuai.xi         {
2088*53ee8cc1Swenshuai.xi             RVD_MSG_ERR("HVD DrvErr: SetISREvent with NULL pointer. ISR type:%lu\n", (MS_U32)eEvent);
2089*53ee8cc1Swenshuai.xi             eRet = E_RVD_RET_INVALID_PARAM;
2090*53ee8cc1Swenshuai.xi         }
2091*53ee8cc1Swenshuai.xi     }
2092*53ee8cc1Swenshuai.xi     _DRV_RVD_Return(eRet);
2093*53ee8cc1Swenshuai.xi }
2094*53ee8cc1Swenshuai.xi 
2095*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2096*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetEnableISR()
2097*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable/Disable RVD interrupt.
2098*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2099*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Disable interrupt.
2100*53ee8cc1Swenshuai.xi ///                 -TRUE(1): Enable interrupt.
2101*53ee8cc1Swenshuai.xi /// @return -The result of command set enable ISR.
2102*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetEnableISR(MS_BOOL bEnable)2103*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_SetEnableISR(MS_BOOL bEnable)
2104*53ee8cc1Swenshuai.xi {
2105*53ee8cc1Swenshuai.xi     HAL_RVD_Enable_ISR(bEnable);
2106*53ee8cc1Swenshuai.xi     return TRUE;
2107*53ee8cc1Swenshuai.xi }
2108*53ee8cc1Swenshuai.xi 
2109*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2110*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetForceISR()
2111*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: test the HVD interrupt function. Force FW send one interrupt.
2112*53ee8cc1Swenshuai.xi /// @param -bEnable \b IN : Enable/Disable
2113*53ee8cc1Swenshuai.xi ///                 -FALSE(0): Clear force interrupt status from HK.
2114*53ee8cc1Swenshuai.xi ///                 -TRUE(1): force one interrupt from HK.
2115*53ee8cc1Swenshuai.xi /// @return -The result of command set force ISR.
2116*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetForceISR(MS_BOOL bEnable)2117*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_SetForceISR(MS_BOOL bEnable)
2118*53ee8cc1Swenshuai.xi {
2119*53ee8cc1Swenshuai.xi     HAL_RVD_SetForceISR(bEnable);
2120*53ee8cc1Swenshuai.xi     return TRUE;
2121*53ee8cc1Swenshuai.xi }
2122*53ee8cc1Swenshuai.xi 
2123*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2124*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_GetISRInfo()
2125*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Get information of HVD driver interrupt
2126*53ee8cc1Swenshuai.xi /// @param -eType \b OUT : ISR information
2127*53ee8cc1Swenshuai.xi /// @return -the result of get ISR information
2128*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_GetISRInfo(RVD_ISR_Event * eType)2129*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_GetISRInfo(RVD_ISR_Event* eType)
2130*53ee8cc1Swenshuai.xi {
2131*53ee8cc1Swenshuai.xi     //_DRV_HVD_Inited(FALSE);
2132*53ee8cc1Swenshuai.xi     *eType = (RVD_ISR_Event)gRVDISRCtrl.u32ISRInfo;
2133*53ee8cc1Swenshuai.xi     return TRUE;
2134*53ee8cc1Swenshuai.xi }
2135*53ee8cc1Swenshuai.xi 
MDrv_RVD_Dump_Status(void)2136*53ee8cc1Swenshuai.xi void MDrv_RVD_Dump_Status(void)
2137*53ee8cc1Swenshuai.xi {
2138*53ee8cc1Swenshuai.xi     RVD_MSG_DRV("Queue: DispQueNum:%ld Dec:%ld Disp:%ld ESR:%ld ESW:%ld\n" ,
2139*53ee8cc1Swenshuai.xi         MDrv_RVD_GetDispQueNum(), MDrv_RVD_GetDecodeCnt(), MDrv_RVD_GetFrameCnt(),
2140*53ee8cc1Swenshuai.xi         MDrv_RVD_GetESReadPtr(), MDrv_RVD_GetESWritePtr() );
2141*53ee8cc1Swenshuai.xi 
2142*53ee8cc1Swenshuai.xi     RVD_MSG_DRV("Counter: Dec:%ld Disp:%ld Err_Data:%ld Err_Dec:%ld Skip:%ld Drop:%ld Idle:%ld\n" ,
2143*53ee8cc1Swenshuai.xi         MDrv_RVD_GetDecodeCnt(), MDrv_RVD_GetFrameCnt(), MDrv_RVD_GetDataErrCnt(),
2144*53ee8cc1Swenshuai.xi         MDrv_RVD_GetDecErrCnt(), MDrv_RVD_GetSkipCnt(),MDrv_RVD_GetDropCnt(),
2145*53ee8cc1Swenshuai.xi         HAL_RVD_QMemRead(gu32QmemExchangeInfoAddr + RVD_QMEM_INFO_IDLECNT) );
2146*53ee8cc1Swenshuai.xi 
2147*53ee8cc1Swenshuai.xi     RVD_MSG_DRV("====================================\n");
2148*53ee8cc1Swenshuai.xi }
2149*53ee8cc1Swenshuai.xi 
2150*53ee8cc1Swenshuai.xi #if 0
2151*53ee8cc1Swenshuai.xi void MDrv_RVD_Dbg_TimeMode(MS_U32 u32Type, MS_U32 u32TimeCnt)
2152*53ee8cc1Swenshuai.xi {
2153*53ee8cc1Swenshuai.xi     if ((MsOS_GetSystemTime() - u32RvdInitSysTimeBase) >= u32TimeCnt)
2154*53ee8cc1Swenshuai.xi     {
2155*53ee8cc1Swenshuai.xi         u32RvdInitSysTimeBase = MsOS_GetSystemTime();
2156*53ee8cc1Swenshuai.xi         MDrv_RVD_Dump_FW_Status();
2157*53ee8cc1Swenshuai.xi     }
2158*53ee8cc1Swenshuai.xi }
2159*53ee8cc1Swenshuai.xi #endif
2160*53ee8cc1Swenshuai.xi 
MDrv_RVD_LinkWeakSymbolPatch(void)2161*53ee8cc1Swenshuai.xi MS_BOOL MDrv_RVD_LinkWeakSymbolPatch(void)
2162*53ee8cc1Swenshuai.xi {
2163*53ee8cc1Swenshuai.xi     return TRUE;
2164*53ee8cc1Swenshuai.xi }
2165*53ee8cc1Swenshuai.xi 
MDrv_RVD_EnableTurboFWMode(MS_BOOL bEnable)2166*53ee8cc1Swenshuai.xi void MDrv_RVD_EnableTurboFWMode(MS_BOOL bEnable)
2167*53ee8cc1Swenshuai.xi {
2168*53ee8cc1Swenshuai.xi     gbEnableRVTurboFWMode = bEnable;
2169*53ee8cc1Swenshuai.xi }
2170*53ee8cc1Swenshuai.xi 
2171*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
2172*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: MDrv_RVD_SetAVSyncFreerunThreshold()
2173*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description:  Set AV sync free run threshold.
2174*53ee8cc1Swenshuai.xi /// @param -u32Th \b IN : The value of threshold.
2175*53ee8cc1Swenshuai.xi /// @return -E_RVD_RET_SUCCESS :command ready
2176*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------
MDrv_RVD_SetAVSyncFreerunThreshold(MS_U32 u32Th)2177*53ee8cc1Swenshuai.xi RVD_Result MDrv_RVD_SetAVSyncFreerunThreshold(MS_U32 u32Th)
2178*53ee8cc1Swenshuai.xi {
2179*53ee8cc1Swenshuai.xi      return MDrv_RVD_SetCmd(E_RVD_CMD_FREERUN_THRESHOLD, u32Th);
2180*53ee8cc1Swenshuai.xi }
2181*53ee8cc1Swenshuai.xi 
2182*53ee8cc1Swenshuai.xi 
2183