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 // file halMultiPVR.c
97*53ee8cc1Swenshuai.xi // @brief Multi-PVR HAL
98*53ee8cc1Swenshuai.xi // @author MStar Semiconductor,Inc.
99*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////////////////////////
100*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
101*53ee8cc1Swenshuai.xi #include <linux/string.h>
102*53ee8cc1Swenshuai.xi #else
103*53ee8cc1Swenshuai.xi #include <string.h>
104*53ee8cc1Swenshuai.xi #endif
105*53ee8cc1Swenshuai.xi
106*53ee8cc1Swenshuai.xi #include "MsCommon.h"
107*53ee8cc1Swenshuai.xi #include "regMultiPVR.h"
108*53ee8cc1Swenshuai.xi #include "halMultiPVR.h"
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
111*53ee8cc1Swenshuai.xi // Driver Compiler Option
112*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
113*53ee8cc1Swenshuai.xi
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
116*53ee8cc1Swenshuai.xi // TSP Hardware Abstraction Layer
117*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
118*53ee8cc1Swenshuai.xi static REG_MULTI_PVR_ENG_Ctrl *_RegMultiPvrCtrl = NULL;
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
121*53ee8cc1Swenshuai.xi // Local Functions
122*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
REG32_R(REG32_MULTI_PVR * reg)123*53ee8cc1Swenshuai.xi static MS_U32 REG32_R(REG32_MULTI_PVR *reg)
124*53ee8cc1Swenshuai.xi {
125*53ee8cc1Swenshuai.xi MS_U32 value = 0;
126*53ee8cc1Swenshuai.xi value = (reg)->low;
127*53ee8cc1Swenshuai.xi value |= (reg)->high << 16;
128*53ee8cc1Swenshuai.xi return value;
129*53ee8cc1Swenshuai.xi }
130*53ee8cc1Swenshuai.xi
REG16_R(REG16_MULTI_PVR * reg)131*53ee8cc1Swenshuai.xi static MS_U16 REG16_R(REG16_MULTI_PVR *reg)
132*53ee8cc1Swenshuai.xi {
133*53ee8cc1Swenshuai.xi MS_U16 value = 0;
134*53ee8cc1Swenshuai.xi value = (reg)->data;
135*53ee8cc1Swenshuai.xi return value;
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi #define REG32_W(reg, value) { (reg)->low = ((value) & 0x0000FFFF); \
139*53ee8cc1Swenshuai.xi (reg)->high = ((value) >> 16); }
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi #define REG16_W(reg, value) { (reg)->data = ((value) & 0x0000FFFF); }
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi #define _AND_(flag, bit) ((flag) & (bit))
144*53ee8cc1Swenshuai.xi
145*53ee8cc1Swenshuai.xi #define _SET_(flag, bit) ((flag) | (bit))
146*53ee8cc1Swenshuai.xi #define _CLR_(flag, bit) ((flag) & (~(bit)))
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi #define REG16_SET(reg, value) REG16_W(reg, _SET_(REG16_R(reg), value))
149*53ee8cc1Swenshuai.xi #define REG32_SET(reg, value) REG32_W(reg, _SET_(REG32_R(reg), value))
150*53ee8cc1Swenshuai.xi #define REG16_CLR(reg, value) REG16_W(reg, _CLR_(REG16_R(reg), value))
151*53ee8cc1Swenshuai.xi #define REG32_CLR(reg, value) REG32_W(reg, _CLR_(REG32_R(reg), value))
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi #define REG16_MSK_W(reg, mask, value) REG16_W((reg), _CLR_(REG16_R(reg), (mask)) | _AND_((value), (mask)))
154*53ee8cc1Swenshuai.xi #define REG32_MSK_W(reg, mask, value) REG32_W((reg), _CLR_(REG32_R(reg), (mask)) | _AND_((value), (mask)))
155*53ee8cc1Swenshuai.xi
156*53ee8cc1Swenshuai.xi typedef struct
157*53ee8cc1Swenshuai.xi {
158*53ee8cc1Swenshuai.xi MS_U16 VCID : 8;
159*53ee8cc1Swenshuai.xi MS_U16 RdPos : 3;
160*53ee8cc1Swenshuai.xi MS_U16 Clr : 1;
161*53ee8cc1Swenshuai.xi MS_U16 RW : 1;
162*53ee8cc1Swenshuai.xi MS_U16 Active : 1;
163*53ee8cc1Swenshuai.xi MS_U16 RdAddrLsb : 1;
164*53ee8cc1Swenshuai.xi MS_U16 PingpongEn : 1;
165*53ee8cc1Swenshuai.xi } ST_ACPU_CMD;
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi typedef struct
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi MS_U16 AlignEn : 1;
170*53ee8cc1Swenshuai.xi MS_U16 MiuSel : 2;
171*53ee8cc1Swenshuai.xi MS_U16 IntEn : 1;
172*53ee8cc1Swenshuai.xi MS_U16 MOBF : 5;
173*53ee8cc1Swenshuai.xi MS_U16 SecureFlag : 1;
174*53ee8cc1Swenshuai.xi MS_U16 TimestampEn : 1;
175*53ee8cc1Swenshuai.xi MS_U16 Padding : 5;
176*53ee8cc1Swenshuai.xi } ST_ACPU_FLAG;
177*53ee8cc1Swenshuai.xi
_HAL_MultiPVR_IdrW(ST_ACPU_CMD stCmd,ST_ACPU_FLAG stFlag,MS_U32 u32Head,MS_U32 u32Tail)178*53ee8cc1Swenshuai.xi static void _HAL_MultiPVR_IdrW(ST_ACPU_CMD stCmd, ST_ACPU_FLAG stFlag, MS_U32 u32Head, MS_U32 u32Tail)
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi REG32_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_43_44, u32Head);
181*53ee8cc1Swenshuai.xi REG32_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_45_46, u32Tail);
182*53ee8cc1Swenshuai.xi REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_41, *((MS_U16*)&stCmd));
183*53ee8cc1Swenshuai.xi REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_42, *((MS_U16*)&stFlag));
184*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_40, CFG_MULTI_PVR_40_REG_ACPU_ACTIVE);
185*53ee8cc1Swenshuai.xi }
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi //acpu_rd_position = 0 (used size)
188*53ee8cc1Swenshuai.xi // = 1 (acpu_flag)
189*53ee8cc1Swenshuai.xi // = 4 (tail)
190*53ee8cc1Swenshuai.xi // = 5 (head)
_HAL_MultiPVR_IdrR(MS_U32 u32ChId,MS_U8 u8RdPos,MS_BOOL bRdAddrLsb)191*53ee8cc1Swenshuai.xi static MS_U32 _HAL_MultiPVR_IdrR(MS_U32 u32ChId, MS_U8 u8RdPos, MS_BOOL bRdAddrLsb)
192*53ee8cc1Swenshuai.xi {
193*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
194*53ee8cc1Swenshuai.xi
195*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
196*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
197*53ee8cc1Swenshuai.xi stCmd.RdPos = u8RdPos;
198*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = bRdAddrLsb;
199*53ee8cc1Swenshuai.xi REG16_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_41, *((MS_U16*)&stCmd));
200*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_40, CFG_MULTI_PVR_40_REG_ACPU_ACTIVE);
201*53ee8cc1Swenshuai.xi
202*53ee8cc1Swenshuai.xi return REG32_R(&_RegMultiPvrCtrl->CFG_MULTI_PVR_47_48);
203*53ee8cc1Swenshuai.xi }
204*53ee8cc1Swenshuai.xi
205*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_USED_SIZE0(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 0, 0); u32RetVal; })
206*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_USED_SIZE1(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 0, 1); u32RetVal; })
207*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_ACPU_FLAG(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 1, 0) >> 16; u32RetVal; })
208*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_HEAD0(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 5, 0); u32RetVal; })
209*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_TAIL0(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 4, 0); u32RetVal; })
210*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_HEAD1(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 5, 1); u32RetVal; })
211*53ee8cc1Swenshuai.xi #define MULTI_PVR_GET_TAIL1(ChId) ({ MS_U32 u32RetVal = _HAL_MultiPVR_IdrR(ChId, 4, 1); u32RetVal; })
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi #define MULTI_PVR_ENG_CHK(PvrEng, RetVal) if(PvrEng >= TSP_MULTI_PVR_ENG_NUM) \
214*53ee8cc1Swenshuai.xi { \
215*53ee8cc1Swenshuai.xi HAL_MULTI_PVR_DBGMSG(E_HAL_MULTI_PVR_DBG_LEVEL_ERR, \
216*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_MODEL_ALL, \
217*53ee8cc1Swenshuai.xi printf("[MULTI_PVR_ERR][%s][%d] Wrong PVR Engine : 0x%x !!\n", \
218*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, PvrEng) \
219*53ee8cc1Swenshuai.xi ); \
220*53ee8cc1Swenshuai.xi return RetVal; \
221*53ee8cc1Swenshuai.xi }
222*53ee8cc1Swenshuai.xi
223*53ee8cc1Swenshuai.xi #define MULTI_PVR_CHID_CHK(PvrChId, RetVal) if(PvrChId >= TSP_MULTI_PVR_CH_NUM) \
224*53ee8cc1Swenshuai.xi { \
225*53ee8cc1Swenshuai.xi HAL_MULTI_PVR_DBGMSG(E_HAL_MULTI_PVR_DBG_LEVEL_ERR, \
226*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_MODEL_ALL, \
227*53ee8cc1Swenshuai.xi printf("[MULTI_PVR_ERR][%s][%d] Wrong PVR ChId : 0x%x !!\n", \
228*53ee8cc1Swenshuai.xi __FUNCTION__, __LINE__, PvrChId) \
229*53ee8cc1Swenshuai.xi ); \
230*53ee8cc1Swenshuai.xi return RetVal; \
231*53ee8cc1Swenshuai.xi }
232*53ee8cc1Swenshuai.xi
233*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
234*53ee8cc1Swenshuai.xi // Debug Message
235*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
236*53ee8cc1Swenshuai.xi typedef enum
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_NONE, // no debug message shown
239*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_ERR, // only shows error message that can't be recover
240*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_WARN, // error case can be recover, like retry
241*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_EVENT, // event that is okay but better known, ex: timestamp ring, file circular, etc.
242*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_INFO, // information for internal parameter
243*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_FUNC, // Function trace and input parameter trace
244*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_LEVEL_TRACE, // debug trace
245*53ee8cc1Swenshuai.xi } EN_HAL_MULTI_PVR_DBGMSG_LEVEL;
246*53ee8cc1Swenshuai.xi
247*53ee8cc1Swenshuai.xi typedef enum
248*53ee8cc1Swenshuai.xi {
249*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_MODEL_NONE, // @temporarily , need to refine
250*53ee8cc1Swenshuai.xi E_HAL_MULTI_PVR_DBG_MODEL_ALL,
251*53ee8cc1Swenshuai.xi } EN_HAL_MULTI_PVR_DBGMSG_MODEL;
252*53ee8cc1Swenshuai.xi
253*53ee8cc1Swenshuai.xi #define HAL_MULTI_PVR_DBGMSG(_level,_model,_f) do {if(_u32MultiPvrDbgLevel >= (_level)&&((_u32MultiPvrDbgModel&_model)!=0)) (_f);} while(0)
254*53ee8cc1Swenshuai.xi static MS_U32 _u32MultiPvrDbgLevel = E_HAL_MULTI_PVR_DBG_LEVEL_ERR;
255*53ee8cc1Swenshuai.xi static MS_U32 _u32MultiPvrDbgModel = E_HAL_MULTI_PVR_DBG_MODEL_ALL;
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi
HAL_MultiPVR_SetBank(MS_VIRT u32BankAddr)258*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetBank(MS_VIRT u32BankAddr)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi _RegMultiPvrCtrl = (REG_MULTI_PVR_ENG_Ctrl*)(u32BankAddr + 0xC1400); //MultiPVR: 0x160A
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Init(MS_U32 u32PVREng,MS_U32 pktDmxId)263*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Init(MS_U32 u32PVREng, MS_U32 pktDmxId)
264*53ee8cc1Swenshuai.xi {
265*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi // input src
268*53ee8cc1Swenshuai.xi REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_71, CFG_MULTI_PVR_71_REG_INPUT_SRC_MASK, (((MS_U16)pktDmxId) << CFG_MULTI_PVR_71_REG_INPUT_SRC_SHIFT));
269*53ee8cc1Swenshuai.xi
270*53ee8cc1Swenshuai.xi // record ts
271*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_TS);
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi // record null
274*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
275*53ee8cc1Swenshuai.xi
276*53ee8cc1Swenshuai.xi // enbale Multi-PVR
277*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_EN);
278*53ee8cc1Swenshuai.xi }
279*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Exit(MS_U32 u32PVREng)280*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Exit(MS_U32 u32PVREng)
281*53ee8cc1Swenshuai.xi {
282*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
283*53ee8cc1Swenshuai.xi
284*53ee8cc1Swenshuai.xi // disable Multi-PVR
285*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_EN);
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi // clear input src
288*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_71, CFG_MULTI_PVR_71_REG_INPUT_SRC_MASK);
289*53ee8cc1Swenshuai.xi
290*53ee8cc1Swenshuai.xi // reset record ts
291*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_TS);
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi // reset record null
294*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi
HAL_MultiPVR_FlushData(MS_U32 u32PVREng)297*53ee8cc1Swenshuai.xi void HAL_MultiPVR_FlushData(MS_U32 u32PVREng)
298*53ee8cc1Swenshuai.xi {
299*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
300*53ee8cc1Swenshuai.xi
301*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_DMA_FLUSH_EN);
302*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_DMA_FLUSH_EN);
303*53ee8cc1Swenshuai.xi }
304*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Skip_Scrmb(MS_U32 u32PVREng,MS_BOOL bSkip)305*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Skip_Scrmb(MS_U32 u32PVREng, MS_BOOL bSkip)
306*53ee8cc1Swenshuai.xi {
307*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi if(bSkip)
310*53ee8cc1Swenshuai.xi {
311*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_MASK_SCR_PVR_EN);
312*53ee8cc1Swenshuai.xi }
313*53ee8cc1Swenshuai.xi else
314*53ee8cc1Swenshuai.xi {
315*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_MASK_SCR_PVR_EN);
316*53ee8cc1Swenshuai.xi }
317*53ee8cc1Swenshuai.xi }
318*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Block_Dis(MS_U32 u32PVREng,MS_BOOL bDisable)319*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Block_Dis(MS_U32 u32PVREng, MS_BOOL bDisable)
320*53ee8cc1Swenshuai.xi {
321*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.xi if(bDisable)
324*53ee8cc1Swenshuai.xi {
325*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_PVR_BLOCK_DISABLE);
326*53ee8cc1Swenshuai.xi }
327*53ee8cc1Swenshuai.xi else
328*53ee8cc1Swenshuai.xi {
329*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_PVR_BLOCK_DISABLE);
330*53ee8cc1Swenshuai.xi }
331*53ee8cc1Swenshuai.xi }
332*53ee8cc1Swenshuai.xi
HAL_MultiPVR_BurstLen(MS_U32 u32PVREng,MS_U16 u16BurstMode)333*53ee8cc1Swenshuai.xi void HAL_MultiPVR_BurstLen(MS_U32 u32PVREng, MS_U16 u16BurstMode)
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
336*53ee8cc1Swenshuai.xi
337*53ee8cc1Swenshuai.xi REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_BURST_LEN_MASK, (u16BurstMode << CFG_MULTI_PVR_00_REG_PVR_BURST_LEN_SHIFT));
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Start(MS_U32 u32PVREng,MS_U32 u32ChId)340*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Start(MS_U32 u32PVREng, MS_U32 u32ChId)
341*53ee8cc1Swenshuai.xi {
342*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
343*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId,);
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
346*53ee8cc1Swenshuai.xi ST_ACPU_FLAG stFlag;
347*53ee8cc1Swenshuai.xi
348*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
349*53ee8cc1Swenshuai.xi memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi // read head , tail
352*53ee8cc1Swenshuai.xi MS_U32 u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
353*53ee8cc1Swenshuai.xi MS_U32 u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
354*53ee8cc1Swenshuai.xi MS_U32 u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
355*53ee8cc1Swenshuai.xi MS_U32 u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
356*53ee8cc1Swenshuai.xi
357*53ee8cc1Swenshuai.xi // read acpu_flag
358*53ee8cc1Swenshuai.xi *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
359*53ee8cc1Swenshuai.xi
360*53ee8cc1Swenshuai.xi // write pingpong buf #0
361*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
362*53ee8cc1Swenshuai.xi stCmd.Clr = 1;
363*53ee8cc1Swenshuai.xi stCmd.RW = 1;
364*53ee8cc1Swenshuai.xi stCmd.Active = 1; // PVR
365*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 0;
366*53ee8cc1Swenshuai.xi stCmd.PingpongEn = 1;
367*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
368*53ee8cc1Swenshuai.xi
369*53ee8cc1Swenshuai.xi // write pingpong buf #1
370*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 1;
371*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
372*53ee8cc1Swenshuai.xi }
373*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Stop(MS_U32 u32PVREng,MS_U32 u32ChId)374*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Stop(MS_U32 u32PVREng, MS_U32 u32ChId)
375*53ee8cc1Swenshuai.xi {
376*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
377*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId,);
378*53ee8cc1Swenshuai.xi
379*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
380*53ee8cc1Swenshuai.xi ST_ACPU_FLAG stFlag;
381*53ee8cc1Swenshuai.xi
382*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
383*53ee8cc1Swenshuai.xi memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
384*53ee8cc1Swenshuai.xi
385*53ee8cc1Swenshuai.xi // read head , tail
386*53ee8cc1Swenshuai.xi MS_U32 u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
387*53ee8cc1Swenshuai.xi MS_U32 u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
388*53ee8cc1Swenshuai.xi MS_U32 u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
389*53ee8cc1Swenshuai.xi MS_U32 u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi // read acpu_flag
392*53ee8cc1Swenshuai.xi *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi // write pingpong buf #0
395*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
396*53ee8cc1Swenshuai.xi stCmd.Clr = 1;
397*53ee8cc1Swenshuai.xi stCmd.RW = 1;
398*53ee8cc1Swenshuai.xi stCmd.Active = 0; // drop pkt
399*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 0;
400*53ee8cc1Swenshuai.xi stCmd.PingpongEn = 1;
401*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi // write pingpong buf #1
404*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 1;
405*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
406*53ee8cc1Swenshuai.xi }
407*53ee8cc1Swenshuai.xi
HAL_MultiPVR_Pause(MS_U32 u32PVREng,MS_BOOL bPause)408*53ee8cc1Swenshuai.xi void HAL_MultiPVR_Pause(MS_U32 u32PVREng, MS_BOOL bPause)
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
411*53ee8cc1Swenshuai.xi
412*53ee8cc1Swenshuai.xi if(bPause)
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_PAUSE);
415*53ee8cc1Swenshuai.xi }
416*53ee8cc1Swenshuai.xi else
417*53ee8cc1Swenshuai.xi {
418*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_00, CFG_MULTI_PVR_00_REG_PVR_STR2MI_PAUSE);
419*53ee8cc1Swenshuai.xi }
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi
HAL_MultiPVR_RecPid(MS_U32 u32PVREng,MS_BOOL bSet)422*53ee8cc1Swenshuai.xi void HAL_MultiPVR_RecPid(MS_U32 u32PVREng, MS_BOOL bSet)
423*53ee8cc1Swenshuai.xi {
424*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
425*53ee8cc1Swenshuai.xi
426*53ee8cc1Swenshuai.xi if(bSet)
427*53ee8cc1Swenshuai.xi {
428*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_ALL);
429*53ee8cc1Swenshuai.xi }
430*53ee8cc1Swenshuai.xi else
431*53ee8cc1Swenshuai.xi {
432*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_RECORD_ALL);
433*53ee8cc1Swenshuai.xi }
434*53ee8cc1Swenshuai.xi }
435*53ee8cc1Swenshuai.xi
HAL_MultiPVR_RecNull(MS_U32 u32PVREng,MS_BOOL bSet)436*53ee8cc1Swenshuai.xi void HAL_MultiPVR_RecNull(MS_U32 u32PVREng, MS_BOOL bSet)
437*53ee8cc1Swenshuai.xi {
438*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi if(bSet)
441*53ee8cc1Swenshuai.xi {
442*53ee8cc1Swenshuai.xi REG16_CLR(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
443*53ee8cc1Swenshuai.xi }
444*53ee8cc1Swenshuai.xi else
445*53ee8cc1Swenshuai.xi {
446*53ee8cc1Swenshuai.xi REG16_SET(&_RegMultiPvrCtrl->CFG_MULTI_PVR_70, CFG_MULTI_PVR_70_REG_DIS_NULL_PKT);
447*53ee8cc1Swenshuai.xi }
448*53ee8cc1Swenshuai.xi }
449*53ee8cc1Swenshuai.xi
HAL_MultiPVR_SetStr2Miu_StartAddr(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32StartAddr0,MS_U32 u32StartAddr1)450*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStr2Miu_StartAddr(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32StartAddr0, MS_U32 u32StartAddr1)
451*53ee8cc1Swenshuai.xi {
452*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
453*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId,);
454*53ee8cc1Swenshuai.xi
455*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
456*53ee8cc1Swenshuai.xi ST_ACPU_FLAG stFlag;
457*53ee8cc1Swenshuai.xi
458*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
459*53ee8cc1Swenshuai.xi memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi // read tail
462*53ee8cc1Swenshuai.xi MS_U32 u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
463*53ee8cc1Swenshuai.xi MS_U32 u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi // read acpu_flag
466*53ee8cc1Swenshuai.xi *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi // write pingpong buf #0
469*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
470*53ee8cc1Swenshuai.xi stCmd.Clr = 1;
471*53ee8cc1Swenshuai.xi stCmd.RW = 1;
472*53ee8cc1Swenshuai.xi stCmd.Active = 0; // drop pkt
473*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 0;
474*53ee8cc1Swenshuai.xi stCmd.PingpongEn = 1;
475*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32StartAddr0, u32Tail0);
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi // write pingpong buf #1
478*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 1;
479*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32StartAddr1, u32Tail1);
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi
HAL_MultiPVR_SetStr2Miu_EndAddr(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32EndAddr0,MS_U32 u32EndAddr1)482*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStr2Miu_EndAddr(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32EndAddr0, MS_U32 u32EndAddr1)
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
485*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId,);
486*53ee8cc1Swenshuai.xi
487*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
488*53ee8cc1Swenshuai.xi ST_ACPU_FLAG stFlag;
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
491*53ee8cc1Swenshuai.xi memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
492*53ee8cc1Swenshuai.xi
493*53ee8cc1Swenshuai.xi // read head
494*53ee8cc1Swenshuai.xi MS_U32 u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
495*53ee8cc1Swenshuai.xi MS_U32 u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
496*53ee8cc1Swenshuai.xi
497*53ee8cc1Swenshuai.xi // read acpu_flag
498*53ee8cc1Swenshuai.xi *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
499*53ee8cc1Swenshuai.xi
500*53ee8cc1Swenshuai.xi // write pingpong buf #0
501*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
502*53ee8cc1Swenshuai.xi stCmd.Clr = 1;
503*53ee8cc1Swenshuai.xi stCmd.RW = 1;
504*53ee8cc1Swenshuai.xi stCmd.Active = 0; // drop pkt
505*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 0;
506*53ee8cc1Swenshuai.xi stCmd.PingpongEn = 1;
507*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32EndAddr0);
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi // write pingpong buf #1
510*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 1;
511*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32EndAddr1);
512*53ee8cc1Swenshuai.xi }
513*53ee8cc1Swenshuai.xi
HAL_MultiPVR_GetWritePtr(MS_U32 u32PVREng,MS_U32 u32ChId)514*53ee8cc1Swenshuai.xi MS_U32 HAL_MultiPVR_GetWritePtr(MS_U32 u32PVREng, MS_U32 u32ChId)
515*53ee8cc1Swenshuai.xi {
516*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng, 0);
517*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId, 0);
518*53ee8cc1Swenshuai.xi
519*53ee8cc1Swenshuai.xi MS_U32 u32UsedSize0 = MULTI_PVR_GET_USED_SIZE0(u32ChId);
520*53ee8cc1Swenshuai.xi
521*53ee8cc1Swenshuai.xi if(u32UsedSize0 == 0)
522*53ee8cc1Swenshuai.xi {
523*53ee8cc1Swenshuai.xi MS_U32 u32UsedSize1 = MULTI_PVR_GET_USED_SIZE1(u32ChId);
524*53ee8cc1Swenshuai.xi
525*53ee8cc1Swenshuai.xi if(u32UsedSize1 == 0)
526*53ee8cc1Swenshuai.xi {
527*53ee8cc1Swenshuai.xi REG16_MSK_W(&_RegMultiPvrCtrl->CFG_MULTI_PVR_50, CFG_MULTI_PVR_50_REG_SGDMA_OUT_VC_STATUS_SEL_MASK, ((MS_U16)u32ChId << CFG_MULTI_PVR_50_REG_SGDMA_OUT_VC_STATUS_SEL_SHIFT));
528*53ee8cc1Swenshuai.xi MS_BOOL bPingpongPtr = (REG16_R(&_RegMultiPvrCtrl->CFG_MULTI_PVR_51) & CFG_MULTI_PVR_51_REG_SGDMA_OUT_VC_STATUS_PINGPONG_PTR);
529*53ee8cc1Swenshuai.xi
530*53ee8cc1Swenshuai.xi if(bPingpongPtr)
531*53ee8cc1Swenshuai.xi {
532*53ee8cc1Swenshuai.xi return MULTI_PVR_GET_HEAD1(u32ChId);
533*53ee8cc1Swenshuai.xi }
534*53ee8cc1Swenshuai.xi else
535*53ee8cc1Swenshuai.xi {
536*53ee8cc1Swenshuai.xi return MULTI_PVR_GET_HEAD0(u32ChId);
537*53ee8cc1Swenshuai.xi }
538*53ee8cc1Swenshuai.xi }
539*53ee8cc1Swenshuai.xi else
540*53ee8cc1Swenshuai.xi {
541*53ee8cc1Swenshuai.xi return (MULTI_PVR_GET_HEAD1(u32ChId) + u32UsedSize1);
542*53ee8cc1Swenshuai.xi }
543*53ee8cc1Swenshuai.xi }
544*53ee8cc1Swenshuai.xi else
545*53ee8cc1Swenshuai.xi {
546*53ee8cc1Swenshuai.xi return (MULTI_PVR_GET_HEAD0(u32ChId) + u32UsedSize0);
547*53ee8cc1Swenshuai.xi }
548*53ee8cc1Swenshuai.xi }
549*53ee8cc1Swenshuai.xi
HAL_MultiPVR_SetStrPacketMode(MS_U32 u32PVREng,MS_U32 u32ChId,MS_BOOL bSet)550*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetStrPacketMode(MS_U32 u32PVREng, MS_U32 u32ChId, MS_BOOL bSet)
551*53ee8cc1Swenshuai.xi {
552*53ee8cc1Swenshuai.xi MULTI_PVR_ENG_CHK(u32PVREng,);
553*53ee8cc1Swenshuai.xi MULTI_PVR_CHID_CHK(u32ChId,);
554*53ee8cc1Swenshuai.xi
555*53ee8cc1Swenshuai.xi ST_ACPU_CMD stCmd;
556*53ee8cc1Swenshuai.xi ST_ACPU_FLAG stFlag;
557*53ee8cc1Swenshuai.xi
558*53ee8cc1Swenshuai.xi memset(&stCmd, 0, sizeof(ST_ACPU_CMD));
559*53ee8cc1Swenshuai.xi memset(&stFlag, 0, sizeof(ST_ACPU_FLAG));
560*53ee8cc1Swenshuai.xi
561*53ee8cc1Swenshuai.xi // read head , tail
562*53ee8cc1Swenshuai.xi MS_U32 u32Head0 = MULTI_PVR_GET_HEAD0(u32ChId);
563*53ee8cc1Swenshuai.xi MS_U32 u32Head1 = MULTI_PVR_GET_HEAD1(u32ChId);
564*53ee8cc1Swenshuai.xi MS_U32 u32Tail0 = MULTI_PVR_GET_TAIL0(u32ChId);
565*53ee8cc1Swenshuai.xi MS_U32 u32Tail1 = MULTI_PVR_GET_TAIL1(u32ChId);
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi // read acpu_flag
568*53ee8cc1Swenshuai.xi *((MS_U16*)&stFlag) = MULTI_PVR_GET_ACPU_FLAG(u32ChId);
569*53ee8cc1Swenshuai.xi
570*53ee8cc1Swenshuai.xi stFlag.TimestampEn = !!bSet; // 188 or 192
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi // write pingpong buf #0
573*53ee8cc1Swenshuai.xi stCmd.VCID = u32ChId & 0xFF;
574*53ee8cc1Swenshuai.xi stCmd.Clr = 1;
575*53ee8cc1Swenshuai.xi stCmd.RW = 1;
576*53ee8cc1Swenshuai.xi stCmd.Active = 0; // drop pkt
577*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 0;
578*53ee8cc1Swenshuai.xi stCmd.PingpongEn = 1;
579*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head0, u32Tail0);
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi // write pingpong buf #1
582*53ee8cc1Swenshuai.xi stCmd.RdAddrLsb = 1;
583*53ee8cc1Swenshuai.xi _HAL_MultiPVR_IdrW(stCmd, stFlag, u32Head1, u32Tail1);
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi
HAL_MultiPVR_SetPVRTimeStamp(MS_U32 u32PVREng,MS_U32 u32ChId,MS_U32 u32Stamp)586*53ee8cc1Swenshuai.xi void HAL_MultiPVR_SetPVRTimeStamp(MS_U32 u32PVREng, MS_U32 u32ChId, MS_U32 u32Stamp)
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi // Not support...
589*53ee8cc1Swenshuai.xi // (1) live-in: use FIQ timestamp
590*53ee8cc1Swenshuai.xi // (2) file-in: can't write to PVR
591*53ee8cc1Swenshuai.xi }
592*53ee8cc1Swenshuai.xi
HAL_MultiPVR_GetPVRTimeStamp(MS_U32 u32PVREng,MS_U32 u32ChId)593*53ee8cc1Swenshuai.xi MS_U32 HAL_MultiPVR_GetPVRTimeStamp(MS_U32 u32PVREng, MS_U32 u32ChId)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi // Not support...
596*53ee8cc1Swenshuai.xi // (1) live-in: use FIQ timestamp
597*53ee8cc1Swenshuai.xi // (2) file-in: can't write to PVR
598*53ee8cc1Swenshuai.xi return 0;
599*53ee8cc1Swenshuai.xi }
600