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 drvNDS.c
98*53ee8cc1Swenshuai.xi /// @brief NDS 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 #include "MsCommon.h"
106*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
107*53ee8cc1Swenshuai.xi #include "string.h"
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi #include "asmCPU.h"
111*53ee8cc1Swenshuai.xi #include "regNDS.h"
112*53ee8cc1Swenshuai.xi #include "drvNDS.h"
113*53ee8cc1Swenshuai.xi #include "halNDS.h"
114*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
115*53ee8cc1Swenshuai.xi #include "../tsp/drvTSP.h"
116*53ee8cc1Swenshuai.xi // TSP2 to TSP wrapper
117*53ee8cc1Swenshuai.xi #define E_TSP_OK DRVTSP_OK
118*53ee8cc1Swenshuai.xi #define E_TSP_FAIL DRVTSP_FAIL
119*53ee8cc1Swenshuai.xi #define E_TSP_FLT_SRC_TSIF0 E_DRVTSP_FLT_SOURCE_TYPE_LIVE
120*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_SEC E_DRVTSP_FLT_TYPE_SECTION
121*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_PKT E_DRVTSP_FLT_TYPE_PACKET
122*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_EMM E_DRVTSP_FLT_TYPE_EMM
123*53ee8cc1Swenshuai.xi #define E_TSP_FLT_USER_ECM E_DRVTSP_FLT_TYPE_ECM
124*53ee8cc1Swenshuai.xi #define TSP_FltState DrvTSP_FltState
125*53ee8cc1Swenshuai.xi #define E_TSP_FLT_STATE_FREE E_DRVTSP_FLT_STATE_FREE
126*53ee8cc1Swenshuai.xi #define TSP_PID_NULL DRVTSP_PID_NULL
127*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Alloc(i, p...) MDrv_TSP_PidFlt_Alloc(0, p)
128*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_SetPID(p...) MDrv_TSP_PidFlt_SetPid(0, p)
129*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Enable(p...) MDrv_TSP_PidFlt_Enable(0, p)
130*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_Free(p...) MDrv_TSP_PidFlt_Free(0, p)
131*53ee8cc1Swenshuai.xi #define MDrv_TSP_FLT_GetState(p...) MDrv_TSP_PidFlt_GetState(0, p)
132*53ee8cc1Swenshuai.xi #else
133*53ee8cc1Swenshuai.xi #include "../tsp2/drvTSP2.h"
134*53ee8cc1Swenshuai.xi #endif
135*53ee8cc1Swenshuai.xi
136*53ee8cc1Swenshuai.xi #include "ddiNDS_HDI.h"
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi #include "nds.h"
139*53ee8cc1Swenshuai.xi
140*53ee8cc1Swenshuai.xi #define NDS_FLT_DBG(_fmt, _args...) { } // printf(_fmt, ##_args)
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
144*53ee8cc1Swenshuai.xi // Driver Compiler Options
145*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
146*53ee8cc1Swenshuai.xi #define NDS_EMM_PASSIVE 1
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
149*53ee8cc1Swenshuai.xi // Local Defines
150*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi //FIXME: it's no use?
153*53ee8cc1Swenshuai.xi #define NDS_FLT_ENTRY() MsOS_ObtainMutex(_nds_flt_mutexid, MSOS_WAIT_FOREVER)
154*53ee8cc1Swenshuai.xi #define NDS_FLT_RETURN(_ret) { MsOS_ReleaseMutex(_nds_flt_mutexid); return _ret; }
155*53ee8cc1Swenshuai.xi #define NDS_FLT_LOCK() MsOS_ObtainMutex(_nds_flt_mutexid, MSOS_WAIT_FOREVER)
156*53ee8cc1Swenshuai.xi #define NDS_FLT_UNLOCK() MsOS_ReleaseMutex(_nds_flt_mutexid)
157*53ee8cc1Swenshuai.xi // -jerry
158*53ee8cc1Swenshuai.xi
159*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_BUFFER 0x00000010 // 0x00000010-0x00000019
160*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_BUFFER_MASK 0x0000000F
161*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_OVERFLOW_HW 0x00000020
162*53ee8cc1Swenshuai.xi #define NDS_EMM_EVENT_OVERFLOW_SW 0x00000040
163*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_FILTER 0x00FFFF00
164*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_FILTER_SHFT 8
165*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_OVERFLOW 0xFF000000
166*53ee8cc1Swenshuai.xi #define NDS_ECM_EVENT_OVERFLOW_SHFT 24
167*53ee8cc1Swenshuai.xi #define NDS_ALL_EVENT 0xFFFFFFFF
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_AttachInterrupt(isr) MsOS_AttachInterrupt(NDS_INT_EMM_ECM, isr)
170*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_EnableInterrupt() MsOS_EnableInterrupt(NDS_INT_EMM_ECM );
171*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_DisableInterrupt() MsOS_DisableInterrupt(NDS_INT_EMM_ECM );
172*53ee8cc1Swenshuai.xi #define NDS_FLT_OS_DetachInterrupt() MsOS_DetachInterrupt(NDS_INT_EMM_ECM);
173*53ee8cc1Swenshuai.xi
174*53ee8cc1Swenshuai.xi
175*53ee8cc1Swenshuai.xi #define GET_4BYTE( cp ) ( ( ( (MS_U32)(*cp) )<< 24 ) | ( ( (MS_U32)(*(cp+1)) ) << 16 ) | ( ( (MS_U32)(*(cp+2)) ) << 8 ) | ( (MS_U32)(*(cp+3)) ) )
176*53ee8cc1Swenshuai.xi
177*53ee8cc1Swenshuai.xi #define NDS_FLT_NULL 0xFFFFFFFF
178*53ee8cc1Swenshuai.xi
179*53ee8cc1Swenshuai.xi #define NDS_FLT_TASK_STACK_SIZE 4096
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------------------
183*53ee8cc1Swenshuai.xi
184*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
185*53ee8cc1Swenshuai.xi // Local Structurs
186*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
187*53ee8cc1Swenshuai.xi typedef struct _NDS_FLT_Dev
188*53ee8cc1Swenshuai.xi {
189*53ee8cc1Swenshuai.xi NDS_FLT_Param param;
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi } NDS_FLT_Dev;
192*53ee8cc1Swenshuai.xi
193*53ee8cc1Swenshuai.xi
194*53ee8cc1Swenshuai.xi typedef struct
195*53ee8cc1Swenshuai.xi {
196*53ee8cc1Swenshuai.xi MS_U16 pid; // PID status for REG_CAM_ECM_PID (W_ONLY)
197*53ee8cc1Swenshuai.xi MS_U32 flt_id;
198*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
199*53ee8cc1Swenshuai.xi MS_U32 buf_id;
200*53ee8cc1Swenshuai.xi #endif
201*53ee8cc1Swenshuai.xi
202*53ee8cc1Swenshuai.xi MS_U32 x_connect;
203*53ee8cc1Swenshuai.xi MS_U8 ecm_id;
204*53ee8cc1Swenshuai.xi MS_BOOL b_defined;
205*53ee8cc1Swenshuai.xi
206*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
207*53ee8cc1Swenshuai.xi MS_U8 u8Drop;
208*53ee8cc1Swenshuai.xi MS_U8 u8Ctrl;
209*53ee8cc1Swenshuai.xi #endif
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi } NDS_ECM_Flt;
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi
214*53ee8cc1Swenshuai.xi typedef struct
215*53ee8cc1Swenshuai.xi {
216*53ee8cc1Swenshuai.xi MS_U16 pid; // PID status for REG_CAM_EMM_PID (W_ONLY)
217*53ee8cc1Swenshuai.xi MS_U32 flt_id;
218*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
219*53ee8cc1Swenshuai.xi MS_U32 buf_id;
220*53ee8cc1Swenshuai.xi #endif
221*53ee8cc1Swenshuai.xi
222*53ee8cc1Swenshuai.xi MS_U32 x_connect;
223*53ee8cc1Swenshuai.xi MS_U8 flt_ctrl;
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi } NDS_EMM_Flt;
226*53ee8cc1Swenshuai.xi
227*53ee8cc1Swenshuai.xi //[NEW] Refine?
228*53ee8cc1Swenshuai.xi #define MAX_EMM_LIST_NUM 11 //(NDS_CAM_EMM_BUF_NUM+1) // N for N-1 slots
229*53ee8cc1Swenshuai.xi
230*53ee8cc1Swenshuai.xi MS_U8 _u8EmmRead = 0;
231*53ee8cc1Swenshuai.xi MS_U8 _u8EmmWrite = 0;
232*53ee8cc1Swenshuai.xi MS_U8 _u8EmmCur = 0;
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi #define emmQueueInc() \
235*53ee8cc1Swenshuai.xi { \
236*53ee8cc1Swenshuai.xi _u8EmmWrite++; \
237*53ee8cc1Swenshuai.xi if (MAX_EMM_LIST_NUM <= _u8EmmWrite) \
238*53ee8cc1Swenshuai.xi { \
239*53ee8cc1Swenshuai.xi _u8EmmWrite = 0; \
240*53ee8cc1Swenshuai.xi } \
241*53ee8cc1Swenshuai.xi }
242*53ee8cc1Swenshuai.xi
243*53ee8cc1Swenshuai.xi #define emmQueueDec() \
244*53ee8cc1Swenshuai.xi { \
245*53ee8cc1Swenshuai.xi _u8EmmRead++; \
246*53ee8cc1Swenshuai.xi if (MAX_EMM_LIST_NUM <= _u8EmmRead) \
247*53ee8cc1Swenshuai.xi { \
248*53ee8cc1Swenshuai.xi _u8EmmRead = 0; \
249*53ee8cc1Swenshuai.xi } \
250*53ee8cc1Swenshuai.xi }
251*53ee8cc1Swenshuai.xi
252*53ee8cc1Swenshuai.xi #define emmQueueIsEmpty() (_u8EmmRead == _u8EmmWrite)
253*53ee8cc1Swenshuai.xi #define emmQueueIsFull() (0 == emmQueueFreeSize())
254*53ee8cc1Swenshuai.xi #define emmQueueUsedSize() ((_u8EmmWrite >= _u8EmmRead) ? (_u8EmmWrite - _u8EmmRead) : (MAX_EMM_LIST_NUM - _u8EmmRead + _u8EmmWrite))
255*53ee8cc1Swenshuai.xi #define emmQueueFreeSize() (MAX_EMM_LIST_NUM - emmQueueUsedSize() - 1)
256*53ee8cc1Swenshuai.xi #define emmQueueReset() { _u8EmmRead = _u8EmmWrite = _u8EmmCur = 0 }
257*53ee8cc1Swenshuai.xi // -Jerry
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi
260*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
261*53ee8cc1Swenshuai.xi // Global Variables
262*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
265*53ee8cc1Swenshuai.xi // Local Variables
266*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
267*53ee8cc1Swenshuai.xi
268*53ee8cc1Swenshuai.xi static NDS_FLT_Dev _nds_flt_dev = {
269*53ee8cc1Swenshuai.xi .param.ecm_emm_addr = (MS_PHYADDR)NULL,
270*53ee8cc1Swenshuai.xi .param.pu8ecm_emm_buf = (MS_U8*)NULL,
271*53ee8cc1Swenshuai.xi };
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi #if !defined(MSOS_TYPE_LINUX_KERNEL)
274*53ee8cc1Swenshuai.xi static MS_U32 _nds_flt_stack[NDS_FLT_TASK_STACK_SIZE/sizeof(MS_U32)];
275*53ee8cc1Swenshuai.xi #endif
276*53ee8cc1Swenshuai.xi static MS_S32 _nds_flt_eventid = -1, _nds_flt_mutexid = -1, _nds_flt_taskid = -1;
277*53ee8cc1Swenshuai.xi
278*53ee8cc1Swenshuai.xi static NDS_ECM_Flt _EcmFlt[NDS_CAM_ECM_FLT_NUM];
279*53ee8cc1Swenshuai.xi static NDS_EMM_Flt _EmmFlt;
280*53ee8cc1Swenshuai.xi
281*53ee8cc1Swenshuai.xi MS_U8 _u8EmmBuf[MAX_EMM_LIST_NUM][NDS_CAM_FLT_BUF_SIZE];
282*53ee8cc1Swenshuai.xi MS_U8 _u8EcmBuf[NDS_CAM_ECM_FLT_NUM][2][NDS_CAM_FLT_BUF_SIZE];
283*53ee8cc1Swenshuai.xi
284*53ee8cc1Swenshuai.xi extern void _verSC_PrintData(MS_U8 *pu8Data, MS_U16 u16DataLen);
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi #if 0
287*53ee8cc1Swenshuai.xi extern NDS_Result NDS_RASP_DefineEcmFilter (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num , NDS_BYTE ecm_filter_control);
288*53ee8cc1Swenshuai.xi extern NDS_Result NDS_RASP_DefineEcmPid (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num ,NDS_USHORT Pid,NDS_BYTE odd_ecm_table_id,NDS_BYTE even_ecm_table_id );
289*53ee8cc1Swenshuai.xi #endif
290*53ee8cc1Swenshuai.xi
291*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
292*53ee8cc1Swenshuai.xi // Debug Functions
293*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi
296*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
297*53ee8cc1Swenshuai.xi // Local Functions
298*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
299*53ee8cc1Swenshuai.xi
300*53ee8cc1Swenshuai.xi
301*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
302*53ee8cc1Swenshuai.xi // Global Functions
303*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
304*53ee8cc1Swenshuai.xi
305*53ee8cc1Swenshuai.xi //[NEW] refine? is it necessary to reduce OVERFLOW?
306*53ee8cc1Swenshuai.xi MS_BOOL bEmmOverflow = TRUE;
307*53ee8cc1Swenshuai.xi // -Jerry
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi
_EMM_FreeFilter(void)310*53ee8cc1Swenshuai.xi void _EMM_FreeFilter(void)
311*53ee8cc1Swenshuai.xi {
312*53ee8cc1Swenshuai.xi int i;
313*53ee8cc1Swenshuai.xi
314*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, FALSE);
315*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
316*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_Free(0, _EmmFlt.buf_id);
317*53ee8cc1Swenshuai.xi #endif
318*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Free(_EmmFlt.flt_id);
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_EMM_BUF_NUM; i++)
321*53ee8cc1Swenshuai.xi {
322*53ee8cc1Swenshuai.xi memset(_u8EmmBuf[i], 0, NDS_CAM_FLT_BUF_SIZE);
323*53ee8cc1Swenshuai.xi }
324*53ee8cc1Swenshuai.xi memset((void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+NDS_CAM_ECM_BUFS_SIZE), 0, NDS_CAM_FLT_BUF_SIZE * NDS_CAM_EMM_BUF_NUM);
325*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
326*53ee8cc1Swenshuai.xi
327*53ee8cc1Swenshuai.xi _EmmFlt.flt_id = NDS_FLT_NULL;
328*53ee8cc1Swenshuai.xi _EmmFlt.pid = TSP_PID_NULL;
329*53ee8cc1Swenshuai.xi
330*53ee8cc1Swenshuai.xi bEmmOverflow = TRUE;
331*53ee8cc1Swenshuai.xi }
332*53ee8cc1Swenshuai.xi
333*53ee8cc1Swenshuai.xi
_EMM_AllocFilter(MS_U32 x_connection,MS_U16 pid,MS_U8 emm_filter_control)334*53ee8cc1Swenshuai.xi MS_BOOL _EMM_AllocFilter(MS_U32 x_connection, MS_U16 pid, MS_U8 emm_filter_control)
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi if (NDS_FLT_NULL != _EmmFlt.flt_id)
337*53ee8cc1Swenshuai.xi {
338*53ee8cc1Swenshuai.xi TSP_FltState eTspState;
339*53ee8cc1Swenshuai.xi TSP_Result eTspRet = E_TSP_FAIL;
340*53ee8cc1Swenshuai.xi eTspRet = MDrv_TSP_FLT_GetState(_EmmFlt.flt_id, &eTspState);
341*53ee8cc1Swenshuai.xi if (eTspRet == E_TSP_OK && eTspState != E_TSP_FLT_STATE_FREE)
342*53ee8cc1Swenshuai.xi {
343*53ee8cc1Swenshuai.xi _EMM_FreeFilter();
344*53ee8cc1Swenshuai.xi }
345*53ee8cc1Swenshuai.xi }
346*53ee8cc1Swenshuai.xi
347*53ee8cc1Swenshuai.xi #if 0 // debugging
348*53ee8cc1Swenshuai.xi MS_U32 secbuf = 0x0, bufsize = 0x0;
349*53ee8cc1Swenshuai.xi MS_U32 secid;
350*53ee8cc1Swenshuai.xi if (secbuf != 0)
351*53ee8cc1Swenshuai.xi {
352*53ee8cc1Swenshuai.xi printf("[%s]-[%d] EMM debugging buffer enable\n", __FUNCTION__, __LINE__);
353*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_SEC, &_EmmFlt.flt_id);
354*53ee8cc1Swenshuai.xi // MDrv_TSP_FLT_SetMode(_EmmFlt.flt_id, E_TSP_FLT_MODE_CONTI);
355*53ee8cc1Swenshuai.xi MDrv_TSP_SEC_Alloc(0, &secid);
356*53ee8cc1Swenshuai.xi MDrv_TSP_SEC_SetBuffer(secid, secbuf, bufsize);
357*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_SelSEC(_EmmFlt.flt_id, secid);
358*53ee8cc1Swenshuai.xi }
359*53ee8cc1Swenshuai.xi else
360*53ee8cc1Swenshuai.xi #endif // debugging
361*53ee8cc1Swenshuai.xi if (E_TSP_OK != MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_EMM, &_EmmFlt.flt_id))
362*53ee8cc1Swenshuai.xi {
363*53ee8cc1Swenshuai.xi return FALSE;
364*53ee8cc1Swenshuai.xi }
365*53ee8cc1Swenshuai.xi
366*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
367*53ee8cc1Swenshuai.xi if (E_TSP_OK != MDrv_TSP_SecFlt_Alloc(0, &_EmmFlt.buf_id))
368*53ee8cc1Swenshuai.xi {
369*53ee8cc1Swenshuai.xi return FALSE;
370*53ee8cc1Swenshuai.xi }
371*53ee8cc1Swenshuai.xi MDrv_TSP_PidFlt_SelSecFlt(0, _EmmFlt.flt_id, _EmmFlt.buf_id);
372*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_SetMode(0, _EmmFlt.buf_id, E_DRVTSP_FLT_MODE_CONTI);
373*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_SetBuffer(0, _EmmFlt.buf_id, (_nds_flt_dev.param.ecm_emm_addr + NDS_CAM_ECM_BUFS_SIZE), NDS_CAM_FLT_BUF_SIZE * NDS_CAM_EMM_BUF_NUM);
374*53ee8cc1Swenshuai.xi #endif
375*53ee8cc1Swenshuai.xi
376*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_SetPID(_EmmFlt.flt_id, pid);
377*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, TRUE);
378*53ee8cc1Swenshuai.xi
379*53ee8cc1Swenshuai.xi _EmmFlt.pid = pid;
380*53ee8cc1Swenshuai.xi _EmmFlt.flt_ctrl = emm_filter_control;
381*53ee8cc1Swenshuai.xi _EmmFlt.x_connect = x_connection;
382*53ee8cc1Swenshuai.xi
383*53ee8cc1Swenshuai.xi return TRUE;
384*53ee8cc1Swenshuai.xi }
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi
387*53ee8cc1Swenshuai.xi // Enable at EMM SetPid
_EMM_EnableFilter(MS_BOOL bEnable)388*53ee8cc1Swenshuai.xi void _EMM_EnableFilter(MS_BOOL bEnable)
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi MS_U16 emm_pid;
391*53ee8cc1Swenshuai.xi
392*53ee8cc1Swenshuai.xi if (bEnable)
393*53ee8cc1Swenshuai.xi {
394*53ee8cc1Swenshuai.xi emm_pid = _EmmFlt.pid & CAM_EMM_PID_MASK;
395*53ee8cc1Swenshuai.xi if (_EmmFlt.flt_ctrl & HDICA_EMM_RECEPTION_ENABLE)
396*53ee8cc1Swenshuai.xi {
397*53ee8cc1Swenshuai.xi emm_pid = emm_pid | CAM_EMM_PID_ENABLE;
398*53ee8cc1Swenshuai.xi }
399*53ee8cc1Swenshuai.xi if (_EmmFlt.flt_ctrl & HDICA_TABLE_ID_FILTERING_USE)
400*53ee8cc1Swenshuai.xi {
401*53ee8cc1Swenshuai.xi emm_pid = emm_pid | CAM_EMM_PID_TID_ENABLE;
402*53ee8cc1Swenshuai.xi }
403*53ee8cc1Swenshuai.xi
404*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_PID) = emm_pid;
405*53ee8cc1Swenshuai.xi }
406*53ee8cc1Swenshuai.xi else
407*53ee8cc1Swenshuai.xi {
408*53ee8cc1Swenshuai.xi // disable EMM filtering
409*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_PID) = _EmmFlt.pid; // Clear [15:14]
410*53ee8cc1Swenshuai.xi }
411*53ee8cc1Swenshuai.xi }
412*53ee8cc1Swenshuai.xi
413*53ee8cc1Swenshuai.xi
_ECM_FreeFilter(MS_U8 ecm_id)414*53ee8cc1Swenshuai.xi void _ECM_FreeFilter(MS_U8 ecm_id)
415*53ee8cc1Swenshuai.xi {
416*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Enable(_EcmFlt[ecm_id].flt_id, FALSE);
417*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
418*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_Free(0, _EcmFlt[ecm_id].buf_id);
419*53ee8cc1Swenshuai.xi #endif
420*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Free(_EcmFlt[ecm_id].flt_id);
421*53ee8cc1Swenshuai.xi
422*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[ecm_id][0], 0, NDS_CAM_FLT_BUF_SIZE);
423*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[ecm_id][1], 0, NDS_CAM_FLT_BUF_SIZE);
424*53ee8cc1Swenshuai.xi memset((void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr + NDS_CAM_FLT_BUF_SIZE*ecm_id), 0, NDS_CAM_FLT_BUF_SIZE);
425*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi _EcmFlt[ecm_id].flt_id = NDS_FLT_NULL;
428*53ee8cc1Swenshuai.xi _EcmFlt[ecm_id].pid = TSP_PID_NULL;
429*53ee8cc1Swenshuai.xi _EcmFlt[ecm_id].b_defined = FALSE;
430*53ee8cc1Swenshuai.xi }
431*53ee8cc1Swenshuai.xi
432*53ee8cc1Swenshuai.xi
_ECM_AllocFilter(MS_U32 x_connection,MS_U8 ecm_filter_num,MS_U16 pid)433*53ee8cc1Swenshuai.xi MS_BOOL _ECM_AllocFilter(MS_U32 x_connection, MS_U8 ecm_filter_num, MS_U16 pid)
434*53ee8cc1Swenshuai.xi {
435*53ee8cc1Swenshuai.xi if (NDS_FLT_NULL != _EcmFlt[ecm_filter_num].flt_id)
436*53ee8cc1Swenshuai.xi {
437*53ee8cc1Swenshuai.xi TSP_FltState eTspState;
438*53ee8cc1Swenshuai.xi TSP_Result eTspRet = E_TSP_OK;
439*53ee8cc1Swenshuai.xi eTspRet = MDrv_TSP_FLT_GetState(_EcmFlt[ecm_filter_num].flt_id, &eTspState);
440*53ee8cc1Swenshuai.xi if (eTspState != E_TSP_FLT_STATE_FREE && eTspRet == E_TSP_OK)
441*53ee8cc1Swenshuai.xi {
442*53ee8cc1Swenshuai.xi _ECM_FreeFilter(ecm_filter_num);
443*53ee8cc1Swenshuai.xi }
444*53ee8cc1Swenshuai.xi }
445*53ee8cc1Swenshuai.xi
446*53ee8cc1Swenshuai.xi if (E_TSP_OK != MDrv_TSP_FLT_Alloc(0, E_TSP_FLT_SRC_TSIF0 | E_TSP_FLT_USER_ECM, &_EcmFlt[ecm_filter_num].flt_id))
447*53ee8cc1Swenshuai.xi {
448*53ee8cc1Swenshuai.xi return FALSE;
449*53ee8cc1Swenshuai.xi }
450*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
451*53ee8cc1Swenshuai.xi if (E_TSP_OK != MDrv_TSP_SecFlt_Alloc(0, &_EcmFlt[ecm_filter_num].buf_id))
452*53ee8cc1Swenshuai.xi {
453*53ee8cc1Swenshuai.xi return FALSE;
454*53ee8cc1Swenshuai.xi }
455*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_SetEcmIdx(0, _EcmFlt[ecm_filter_num].buf_id, _EcmFlt[ecm_filter_num].ecm_id);
456*53ee8cc1Swenshuai.xi MDrv_TSP_PidFlt_SelSecFlt(0, _EcmFlt[ecm_filter_num].flt_id, _EcmFlt[ecm_filter_num].buf_id);
457*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_SetMode(0, _EcmFlt[ecm_filter_num].buf_id, E_DRVTSP_FLT_MODE_ONESHOT | E_DRVTSP_FLT_MODE_CRCCHK);
458*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_SetBuffer(0, _EcmFlt[ecm_filter_num].buf_id, (_nds_flt_dev.param.ecm_emm_addr + (NDS_CAM_FLT_BUF_SIZE*ecm_filter_num)), NDS_CAM_FLT_BUF_SIZE);
459*53ee8cc1Swenshuai.xi #endif
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi _EcmFlt[ecm_filter_num].pid = pid;
462*53ee8cc1Swenshuai.xi _EcmFlt[ecm_filter_num].ecm_id = ecm_filter_num;
463*53ee8cc1Swenshuai.xi _EcmFlt[ecm_filter_num].x_connect = x_connection;
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi return TRUE;
466*53ee8cc1Swenshuai.xi }
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi
469*53ee8cc1Swenshuai.xi // Enable at ECM Define
_ECM_EnableFilter(MS_U32 x_connection,MS_U8 u8Filter_num,MS_BOOL bEnable,MS_U8 u8Ctrl)470*53ee8cc1Swenshuai.xi void _ECM_EnableFilter(MS_U32 x_connection, MS_U8 u8Filter_num, MS_BOOL bEnable, MS_U8 u8Ctrl)
471*53ee8cc1Swenshuai.xi {
472*53ee8cc1Swenshuai.xi MS_BOOL bFristSet = FALSE;
473*53ee8cc1Swenshuai.xi MS_U16 u16Pid = _EcmFlt[u8Filter_num].pid;
474*53ee8cc1Swenshuai.xi int i;
475*53ee8cc1Swenshuai.xi
476*53ee8cc1Swenshuai.xi if (_EcmFlt[u8Filter_num].flt_id != NDS_FLT_NULL)
477*53ee8cc1Swenshuai.xi {
478*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
479*53ee8cc1Swenshuai.xi if (bEnable)
480*53ee8cc1Swenshuai.xi {
481*53ee8cc1Swenshuai.xi _EcmFlt[u8Filter_num].u8Ctrl = u8Ctrl;
482*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
483*53ee8cc1Swenshuai.xi {
484*53ee8cc1Swenshuai.xi if (_EcmFlt[i].pid == u16Pid)
485*53ee8cc1Swenshuai.xi {
486*53ee8cc1Swenshuai.xi if (_EcmFlt[i].u8Ctrl > 0 && bFristSet == FALSE)
487*53ee8cc1Swenshuai.xi {
488*53ee8cc1Swenshuai.xi bFristSet = TRUE;
489*53ee8cc1Swenshuai.xi _EcmFlt[i].u8Drop = 0;
490*53ee8cc1Swenshuai.xi }
491*53ee8cc1Swenshuai.xi else
492*53ee8cc1Swenshuai.xi {
493*53ee8cc1Swenshuai.xi _EcmFlt[i].u8Drop = 1;
494*53ee8cc1Swenshuai.xi }
495*53ee8cc1Swenshuai.xi }
496*53ee8cc1Swenshuai.xi }
497*53ee8cc1Swenshuai.xi }
498*53ee8cc1Swenshuai.xi else
499*53ee8cc1Swenshuai.xi {
500*53ee8cc1Swenshuai.xi _EcmFlt[u8Filter_num].u8Ctrl = 0;
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi #endif
503*53ee8cc1Swenshuai.xi if (bEnable)
504*53ee8cc1Swenshuai.xi {
505*53ee8cc1Swenshuai.xi // non-NULL PID to enable filter
506*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_SetPID(_EcmFlt[u8Filter_num].flt_id, _EcmFlt[u8Filter_num].pid);
507*53ee8cc1Swenshuai.xi }
508*53ee8cc1Swenshuai.xi else
509*53ee8cc1Swenshuai.xi {
510*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_SetPID(_EcmFlt[u8Filter_num].flt_id, TSP_PID_NULL);
511*53ee8cc1Swenshuai.xi }
512*53ee8cc1Swenshuai.xi
513*53ee8cc1Swenshuai.xi MDrv_TSP_FLT_Enable(_EcmFlt[u8Filter_num].flt_id, bEnable);
514*53ee8cc1Swenshuai.xi }
515*53ee8cc1Swenshuai.xi }
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi
_NDS_REC_GetPktCount(MS_U32 x_connection,MS_U32 * hi_count,MS_U32 * lo_count)518*53ee8cc1Swenshuai.xi void _NDS_REC_GetPktCount(MS_U32 x_connection, MS_U32 *hi_count, MS_U32 *lo_count)
519*53ee8cc1Swenshuai.xi {
520*53ee8cc1Swenshuai.xi *hi_count = 0xFFFFFFFF;
521*53ee8cc1Swenshuai.xi *lo_count = 0xFFFFFFFF;
522*53ee8cc1Swenshuai.xi
523*53ee8cc1Swenshuai.xi return;
524*53ee8cc1Swenshuai.xi }
525*53ee8cc1Swenshuai.xi
526*53ee8cc1Swenshuai.xi
527*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
_NDS_FLT_Isr(int irq,void * dev_id)528*53ee8cc1Swenshuai.xi static irqreturn_t _NDS_FLT_Isr(int irq, void *dev_id)
529*53ee8cc1Swenshuai.xi #else
530*53ee8cc1Swenshuai.xi static void _NDS_FLT_Isr(InterruptNum eIntNum)
531*53ee8cc1Swenshuai.xi #endif
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi MS_U8 u8IntReg, emm_idx, u8EcmReg;
534*53ee8cc1Swenshuai.xi MS_U8 ecm_polarity;
535*53ee8cc1Swenshuai.xi int i;
536*53ee8cc1Swenshuai.xi
537*53ee8cc1Swenshuai.xi u8IntReg = CAM_REG(REG_CAM_CA_INT);
538*53ee8cc1Swenshuai.xi
539*53ee8cc1Swenshuai.xi // EMM
540*53ee8cc1Swenshuai.xi if (u8IntReg & (CAM_CA_INT_EMM_OVERFLOW))
541*53ee8cc1Swenshuai.xi {
542*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_MASK_RESET_MODE | CAM_CA_INT_EMM_OVERFLOW); // clear EMM overflow
543*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW); // enable interrupt
544*53ee8cc1Swenshuai.xi
545*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
546*53ee8cc1Swenshuai.xi if (bEmmOverflow == FALSE)
547*53ee8cc1Swenshuai.xi {
548*53ee8cc1Swenshuai.xi bEmmOverflow = TRUE;
549*53ee8cc1Swenshuai.xi }
550*53ee8cc1Swenshuai.xi #endif
551*53ee8cc1Swenshuai.xi
552*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER | NDS_EMM_EVENT_OVERFLOW_HW);
553*53ee8cc1Swenshuai.xi }
554*53ee8cc1Swenshuai.xi else if (u8IntReg & (CAM_CA_INT_EMM))
555*53ee8cc1Swenshuai.xi {
556*53ee8cc1Swenshuai.xi // @TODO: add R/W pointer of _u8EmmBuf
557*53ee8cc1Swenshuai.xi // Make sure no event lost at IPC
558*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi // u8EmmReg is Emm index 0~9, 0x1000 is ack.
561*53ee8cc1Swenshuai.xi emm_idx = CAM_REG(REG_CAM_EMM_INT_STAT) & CAM_EMM_INT_BUF_MASK;
562*53ee8cc1Swenshuai.xi
563*53ee8cc1Swenshuai.xi //[NEW] EMM queue management
564*53ee8cc1Swenshuai.xi // it's the only way to handle no-sync index for ACT at overflow
565*53ee8cc1Swenshuai.xi
566*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
567*53ee8cc1Swenshuai.xi if (bEmmOverflow == FALSE)
568*53ee8cc1Swenshuai.xi {
569*53ee8cc1Swenshuai.xi #endif
570*53ee8cc1Swenshuai.xi if (emmQueueIsFull())
571*53ee8cc1Swenshuai.xi {
572*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
573*53ee8cc1Swenshuai.xi bEmmOverflow = TRUE;
574*53ee8cc1Swenshuai.xi #endif
575*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER | NDS_EMM_EVENT_OVERFLOW_SW);
576*53ee8cc1Swenshuai.xi }
577*53ee8cc1Swenshuai.xi else
578*53ee8cc1Swenshuai.xi {
579*53ee8cc1Swenshuai.xi MsOS_ReadMemory();
580*53ee8cc1Swenshuai.xi memcpy(_u8EmmBuf[_u8EmmWrite], (void*)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+NDS_CAM_ECM_BUFS_SIZE+(NDS_CAM_FLT_BUF_SIZE*emm_idx)), 188);
581*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER+emm_idx);
582*53ee8cc1Swenshuai.xi emmQueueInc();
583*53ee8cc1Swenshuai.xi }
584*53ee8cc1Swenshuai.xi #if NDS_EMM_PASSIVE
585*53ee8cc1Swenshuai.xi }
586*53ee8cc1Swenshuai.xi else
587*53ee8cc1Swenshuai.xi {
588*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, NDS_EMM_EVENT_BUFFER);
589*53ee8cc1Swenshuai.xi }
590*53ee8cc1Swenshuai.xi #endif
591*53ee8cc1Swenshuai.xi // -jerry
592*53ee8cc1Swenshuai.xi
593*53ee8cc1Swenshuai.xi // Ack and Clear EMM interrupt
594*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_INT_STAT) = CAM_EMM_INT_ACK;
595*53ee8cc1Swenshuai.xi }
596*53ee8cc1Swenshuai.xi
597*53ee8cc1Swenshuai.xi // ECM
598*53ee8cc1Swenshuai.xi if (u8IntReg & (CAM_CA_INT_ECM))
599*53ee8cc1Swenshuai.xi {
600*53ee8cc1Swenshuai.xi u8EcmReg = CAM_REG(REG_CAM_ECM_INT_STAT);
601*53ee8cc1Swenshuai.xi
602*53ee8cc1Swenshuai.xi // bit0~5 to indicate six slot
603*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
604*53ee8cc1Swenshuai.xi {
605*53ee8cc1Swenshuai.xi if (u8EcmReg & (0x1 << i))
606*53ee8cc1Swenshuai.xi {
607*53ee8cc1Swenshuai.xi MS_U8 *pEcmData;
608*53ee8cc1Swenshuai.xi
609*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_INT_STAT) = (0x1 << i);
610*53ee8cc1Swenshuai.xi
611*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
612*53ee8cc1Swenshuai.xi if (_EcmFlt[i].u8Drop == 1)
613*53ee8cc1Swenshuai.xi continue;
614*53ee8cc1Swenshuai.xi #endif
615*53ee8cc1Swenshuai.xi
616*53ee8cc1Swenshuai.xi pEcmData = (void *)MS_PA2KSEG1(_nds_flt_dev.param.ecm_emm_addr+(NDS_CAM_FLT_BUF_SIZE*i));
617*53ee8cc1Swenshuai.xi MsOS_ReadMemory();
618*53ee8cc1Swenshuai.xi if (pEcmData[0] != 0x47)
619*53ee8cc1Swenshuai.xi {
620*53ee8cc1Swenshuai.xi continue; //_NDS_ASSERT_;
621*53ee8cc1Swenshuai.xi }
622*53ee8cc1Swenshuai.xi if (pEcmData[5] == 0x80)
623*53ee8cc1Swenshuai.xi {
624*53ee8cc1Swenshuai.xi ecm_polarity = 0; // EVEN
625*53ee8cc1Swenshuai.xi }
626*53ee8cc1Swenshuai.xi else if (pEcmData[5] == 0x81)
627*53ee8cc1Swenshuai.xi {
628*53ee8cc1Swenshuai.xi ecm_polarity = 1; // ODD
629*53ee8cc1Swenshuai.xi }
630*53ee8cc1Swenshuai.xi else
631*53ee8cc1Swenshuai.xi {
632*53ee8cc1Swenshuai.xi NDS_ASSERT(FALSE, , "[%s]-[%d]\n", __FUNCTION__, __LINE__);
633*53ee8cc1Swenshuai.xi }
634*53ee8cc1Swenshuai.xi
635*53ee8cc1Swenshuai.xi if (_u8EcmBuf[i][ecm_polarity][0] == 0) // if buffer empty
636*53ee8cc1Swenshuai.xi {
637*53ee8cc1Swenshuai.xi // @TODO: Manual Lock
638*53ee8cc1Swenshuai.xi // Check auto/manual mode
639*53ee8cc1Swenshuai.xi // Set correspondant setting
640*53ee8cc1Swenshuai.xi
641*53ee8cc1Swenshuai.xi MsOS_ReadMemory();
642*53ee8cc1Swenshuai.xi memcpy(_u8EcmBuf[i][ecm_polarity], pEcmData, 188);
643*53ee8cc1Swenshuai.xi
644*53ee8cc1Swenshuai.xi // if ECM incomming at this time, the buffer could be dirty
645*53ee8cc1Swenshuai.xi if (CAM_REG(REG_CAM_ECM_INT_STAT) & (0x1 << i))
646*53ee8cc1Swenshuai.xi {
647*53ee8cc1Swenshuai.xi // ECM overfolw
648*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, 0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT));
649*53ee8cc1Swenshuai.xi continue;
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi
652*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, (0x1 << (i*2 + NDS_ECM_EVENT_FILTER_SHFT)) << ecm_polarity);
653*53ee8cc1Swenshuai.xi }
654*53ee8cc1Swenshuai.xi else
655*53ee8cc1Swenshuai.xi {
656*53ee8cc1Swenshuai.xi //_NDS_ASSERT_;
657*53ee8cc1Swenshuai.xi // ECM overfolw
658*53ee8cc1Swenshuai.xi MsOS_SetEvent(_nds_flt_eventid, 0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT));
659*53ee8cc1Swenshuai.xi break;
660*53ee8cc1Swenshuai.xi }
661*53ee8cc1Swenshuai.xi }
662*53ee8cc1Swenshuai.xi }
663*53ee8cc1Swenshuai.xi }
664*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
665*53ee8cc1Swenshuai.xi return IRQ_HANDLED;
666*53ee8cc1Swenshuai.xi #else
667*53ee8cc1Swenshuai.xi // IRQ handled
668*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
669*53ee8cc1Swenshuai.xi #endif
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi
672*53ee8cc1Swenshuai.xi
673*53ee8cc1Swenshuai.xi //[NEW]
674*53ee8cc1Swenshuai.xi MS_U32 emm_overflow_time = 0;
675*53ee8cc1Swenshuai.xi // -jerry
676*53ee8cc1Swenshuai.xi
677*53ee8cc1Swenshuai.xi
_NDS_FLT_IsrTask(void)678*53ee8cc1Swenshuai.xi static void _NDS_FLT_IsrTask(void)
679*53ee8cc1Swenshuai.xi {
680*53ee8cc1Swenshuai.xi MS_U32 u32Events, hi_count, lo_count;
681*53ee8cc1Swenshuai.xi XECM_MSG ecm_msg;
682*53ee8cc1Swenshuai.xi XEMM_MSG emm_msg;
683*53ee8cc1Swenshuai.xi int i, p;
684*53ee8cc1Swenshuai.xi
685*53ee8cc1Swenshuai.xi while(1)
686*53ee8cc1Swenshuai.xi {
687*53ee8cc1Swenshuai.xi MsOS_WaitEvent(_nds_flt_eventid, NDS_ALL_EVENT, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
688*53ee8cc1Swenshuai.xi
689*53ee8cc1Swenshuai.xi //u8EmmReg = CAM_REG(REG_CAM_EMM_INT_STAT);
690*53ee8cc1Swenshuai.xi //MsOS_DisableInterrupt(NDS_EMMECM_IRQ);
691*53ee8cc1Swenshuai.xi
692*53ee8cc1Swenshuai.xi #if (NDS_EMM_PASSIVE==0)
693*53ee8cc1Swenshuai.xi if (u32Events & (NDS_EMM_EVENT_OVERFLOW_HW | NDS_EMM_EVENT_OVERFLOW_SW))
694*53ee8cc1Swenshuai.xi {
695*53ee8cc1Swenshuai.xi NDS_FLT_LOCK(); // for disable interrupt protection
696*53ee8cc1Swenshuai.xi if (bEmmOverflow == FALSE)
697*53ee8cc1Swenshuai.xi {
698*53ee8cc1Swenshuai.xi _EMM_EnableFilter(FALSE);
699*53ee8cc1Swenshuai.xi bEmmOverflow = TRUE;
700*53ee8cc1Swenshuai.xi }
701*53ee8cc1Swenshuai.xi NDS_FLT_UNLOCK();
702*53ee8cc1Swenshuai.xi }
703*53ee8cc1Swenshuai.xi #endif
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
706*53ee8cc1Swenshuai.xi {
707*53ee8cc1Swenshuai.xi if (u32Events & (0x1 << (i + NDS_ECM_EVENT_OVERFLOW_SHFT)))
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi printf("\n\nECM_OVERFLOW\n\n");
710*53ee8cc1Swenshuai.xi //[FIXME] for ecm test , reset buffer at XCORECA_EcmReceived
711*53ee8cc1Swenshuai.xi //memset(_u8EcmBuf[i][0], 0, 188);
712*53ee8cc1Swenshuai.xi //memset(_u8EcmBuf[i][1], 0, 188);
713*53ee8cc1Swenshuai.xi
714*53ee8cc1Swenshuai.xi ecm_msg.ecm_buf_ptr = _u8EcmBuf[i][0];
715*53ee8cc1Swenshuai.xi ecm_msg.rcv_status = ECM_OVERFLOW;
716*53ee8cc1Swenshuai.xi _NDS_REC_GetPktCount(_EcmFlt[i].x_connect, &hi_count, &lo_count);
717*53ee8cc1Swenshuai.xi
718*53ee8cc1Swenshuai.xi // if USER return fail, it will release the buffer
719*53ee8cc1Swenshuai.xi //XCORECA_EcmReceived(0, &ecm_msg , hi_count, lo_count);
720*53ee8cc1Swenshuai.xi XCORECA_EcmReceived(_EcmFlt[i].x_connect, &ecm_msg , hi_count, lo_count);
721*53ee8cc1Swenshuai.xi //_NDS_ASSERT_;
722*53ee8cc1Swenshuai.xi }
723*53ee8cc1Swenshuai.xi else // if (u32Events & (0x1 << (i + NDS_ECM_EVENT_ODD_SHFT)))
724*53ee8cc1Swenshuai.xi {
725*53ee8cc1Swenshuai.xi MS_U8 valid = (u32Events >> (i*2 + NDS_ECM_EVENT_FILTER_SHFT)) & 0x3;
726*53ee8cc1Swenshuai.xi if (valid) // any ODD/EVEN buffer arrival
727*53ee8cc1Swenshuai.xi {
728*53ee8cc1Swenshuai.xi for (p = 0; p < 2; p++)
729*53ee8cc1Swenshuai.xi {
730*53ee8cc1Swenshuai.xi if ( (valid & (0x1<<p)) && _u8EcmBuf[i][p][0] == 0x47 && _u8EcmBuf[i][p][5] == (0x80|p)) // 0x80, 0x81
731*53ee8cc1Swenshuai.xi {
732*53ee8cc1Swenshuai.xi ecm_msg.ecm_filter_num = i;
733*53ee8cc1Swenshuai.xi ecm_msg.ecm_buf_ptr = _u8EcmBuf[i][p]+8;
734*53ee8cc1Swenshuai.xi ecm_msg.ecm_polarity = ((p==0) ? HDICA_EVEN_BUFFER : HDICA_ODD_BUFFER);
735*53ee8cc1Swenshuai.xi ecm_msg.rcv_status = ECM_OK;
736*53ee8cc1Swenshuai.xi _NDS_REC_GetPktCount(_EcmFlt[i].x_connect, &hi_count, &lo_count);
737*53ee8cc1Swenshuai.xi
738*53ee8cc1Swenshuai.xi // if USER return fail, it will release the buffer
739*53ee8cc1Swenshuai.xi NDS_FLT_DBG("\n\nECM_RECV %d %d %ld\n\n", i, ecm_msg.ecm_polarity, MsOS_GetSystemTime());
740*53ee8cc1Swenshuai.xi if (XCORECA_EcmReceived(_EcmFlt[i].x_connect, &ecm_msg , hi_count, lo_count) != CA_OK)
741*53ee8cc1Swenshuai.xi {
742*53ee8cc1Swenshuai.xi XHDICA_ReleaseEcmBuffer(_EcmFlt[i].x_connect, ecm_msg.ecm_filter_num, ecm_msg.ecm_polarity, ecm_msg.ecm_buf_ptr);
743*53ee8cc1Swenshuai.xi }
744*53ee8cc1Swenshuai.xi }
745*53ee8cc1Swenshuai.xi }
746*53ee8cc1Swenshuai.xi }
747*53ee8cc1Swenshuai.xi
748*53ee8cc1Swenshuai.xi }
749*53ee8cc1Swenshuai.xi }
750*53ee8cc1Swenshuai.xi
751*53ee8cc1Swenshuai.xi // Issue all EMM received
752*53ee8cc1Swenshuai.xi if (u32Events & NDS_EMM_EVENT_BUFFER)
753*53ee8cc1Swenshuai.xi {
754*53ee8cc1Swenshuai.xi NDS_FLT_DBG("[%s][%d] ======> evt r c w s = %08x %02d %02d %02d %02d\n", __FUNCTION__, __LINE__, u32Events, _u8EmmRead, _u8EmmCur, _u8EmmWrite, u32UsedSize);
755*53ee8cc1Swenshuai.xi // #if NDS_EMM_PASSIVE
756*53ee8cc1Swenshuai.xi #if 0
757*53ee8cc1Swenshuai.xi if (_u8EmmCur != _u8EmmWrite)
758*53ee8cc1Swenshuai.xi #else // NDS_EMM_PASSIVE==0
759*53ee8cc1Swenshuai.xi MS_U32 u32UsedSize = ((_u8EmmWrite >= _u8EmmCur) ? (_u8EmmWrite - _u8EmmCur) : (MAX_EMM_LIST_NUM - _u8EmmCur + _u8EmmWrite));
760*53ee8cc1Swenshuai.xi for (; u32UsedSize > 0; u32UsedSize--)
761*53ee8cc1Swenshuai.xi #endif
762*53ee8cc1Swenshuai.xi // while (!emmQueueIsEmpty())
763*53ee8cc1Swenshuai.xi {
764*53ee8cc1Swenshuai.xi if (_u8EmmBuf[_u8EmmCur][0] != 0x47)
765*53ee8cc1Swenshuai.xi {
766*53ee8cc1Swenshuai.xi NDS_FLT_DBG("[%s] %d is NULL\n", __FUNCTION__, _u8EmmCur);
767*53ee8cc1Swenshuai.xi goto jump_next_emm;
768*53ee8cc1Swenshuai.xi // MY_ASSERT(0);
769*53ee8cc1Swenshuai.xi }
770*53ee8cc1Swenshuai.xi emm_msg.emm_buf = &_u8EmmBuf[_u8EmmCur][8]; // emm payload
771*53ee8cc1Swenshuai.xi emm_msg.receive_status = EMM_OK;
772*53ee8cc1Swenshuai.xi NDS_FLT_DBG("\n\nEMM_RECV %ld\n\n", MsOS_GetSystemTime());
773*53ee8cc1Swenshuai.xi if (XCORECA_EmmReceived( _EmmFlt.x_connect, &emm_msg ) != CA_OK)
774*53ee8cc1Swenshuai.xi {
775*53ee8cc1Swenshuai.xi XHDICA_ReleaseEmmBuffer(_EmmFlt.x_connect, emm_msg.emm_buf);
776*53ee8cc1Swenshuai.xi }
777*53ee8cc1Swenshuai.xi jump_next_emm:
778*53ee8cc1Swenshuai.xi _u8EmmCur++;
779*53ee8cc1Swenshuai.xi if (MAX_EMM_LIST_NUM <= _u8EmmCur)
780*53ee8cc1Swenshuai.xi {
781*53ee8cc1Swenshuai.xi _u8EmmCur = 0;
782*53ee8cc1Swenshuai.xi }
783*53ee8cc1Swenshuai.xi //emmQueueDec();
784*53ee8cc1Swenshuai.xi }
785*53ee8cc1Swenshuai.xi }
786*53ee8cc1Swenshuai.xi
787*53ee8cc1Swenshuai.xi if ( (u32Events & (NDS_EMM_EVENT_OVERFLOW_HW | NDS_EMM_EVENT_OVERFLOW_SW)) )
788*53ee8cc1Swenshuai.xi {
789*53ee8cc1Swenshuai.xi //MDrv_TSP_FLT_Enable(_EmmFlt.flt_id, FALSE);
790*53ee8cc1Swenshuai.xi //FIXME: remove it emmQueueReset();
791*53ee8cc1Swenshuai.xi
792*53ee8cc1Swenshuai.xi NDS_FLT_DBG("[%s][%d] ======> evt r c w = %08x %02d %02d %02d\n", __FUNCTION__, __LINE__, u32Events, _u8EmmRead, _u8EmmCur, _u8EmmWrite);
793*53ee8cc1Swenshuai.xi
794*53ee8cc1Swenshuai.xi if (u32Events & NDS_EMM_EVENT_OVERFLOW_HW)
795*53ee8cc1Swenshuai.xi {
796*53ee8cc1Swenshuai.xi printf("\n\nEMM_OVERFLOW(HW)\n\n");
797*53ee8cc1Swenshuai.xi #if defined(CHIP_U3)
798*53ee8cc1Swenshuai.xi MDrv_TSP_SecFlt_ResetBuffer(0, _EmmFlt.buf_id);
799*53ee8cc1Swenshuai.xi #endif
800*53ee8cc1Swenshuai.xi }
801*53ee8cc1Swenshuai.xi if (u32Events & NDS_EMM_EVENT_OVERFLOW_SW)
802*53ee8cc1Swenshuai.xi {
803*53ee8cc1Swenshuai.xi printf("\n\n\nEMM_OVERFLOW(SW)\n\n");
804*53ee8cc1Swenshuai.xi }
805*53ee8cc1Swenshuai.xi emm_msg.emm_buf = NULL;
806*53ee8cc1Swenshuai.xi emm_msg.receive_status = EMM_OVERFLOW;
807*53ee8cc1Swenshuai.xi
808*53ee8cc1Swenshuai.xi XCORECA_EmmReceived(_EmmFlt.x_connect, &emm_msg);
809*53ee8cc1Swenshuai.xi
810*53ee8cc1Swenshuai.xi emm_overflow_time = MsOS_GetSystemTime();
811*53ee8cc1Swenshuai.xi /*
812*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_EMM_BUF_NUM; i++)
813*53ee8cc1Swenshuai.xi {
814*53ee8cc1Swenshuai.xi memset(_u8EmmBuf[i], 0, 188); // release all emm buf
815*53ee8cc1Swenshuai.xi }
816*53ee8cc1Swenshuai.xi */
817*53ee8cc1Swenshuai.xi
818*53ee8cc1Swenshuai.xi //FIXME: enable after all release!!
819*53ee8cc1Swenshuai.xi // _EnableFilter(TRUE);
820*53ee8cc1Swenshuai.xi }
821*53ee8cc1Swenshuai.xi
822*53ee8cc1Swenshuai.xi u32Events = 0;
823*53ee8cc1Swenshuai.xi
824*53ee8cc1Swenshuai.xi // enable all interrupt
825*53ee8cc1Swenshuai.xi // @TODO: add R/W pointer of _u8EmmBuf to make sure no EMM lost.
826*53ee8cc1Swenshuai.xi // @NOTE: only effective for EMM now
827*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
828*53ee8cc1Swenshuai.xi
829*53ee8cc1Swenshuai.xi //MsOS_DelayTask(5);
830*53ee8cc1Swenshuai.xi }
831*53ee8cc1Swenshuai.xi }
832*53ee8cc1Swenshuai.xi
833*53ee8cc1Swenshuai.xi
NDS_FLT_Init(NDS_FLT_Param * param)834*53ee8cc1Swenshuai.xi NDS_Result NDS_FLT_Init(NDS_FLT_Param *param)
835*53ee8cc1Swenshuai.xi {
836*53ee8cc1Swenshuai.xi int i;
837*53ee8cc1Swenshuai.xi
838*53ee8cc1Swenshuai.xi if ( ((MS_PHYADDR)NULL == param->ecm_emm_addr) ||
839*53ee8cc1Swenshuai.xi (param->ecm_emm_size < NDS_CAM_FLT_BUFS_SIZE) )
840*53ee8cc1Swenshuai.xi {
841*53ee8cc1Swenshuai.xi return E_NDS_FAIL;
842*53ee8cc1Swenshuai.xi }
843*53ee8cc1Swenshuai.xi
844*53ee8cc1Swenshuai.xi HAL_NDS_FLT_Init(param);
845*53ee8cc1Swenshuai.xi _nds_flt_dev.param.ecm_emm_addr = param->ecm_emm_addr;
846*53ee8cc1Swenshuai.xi _nds_flt_dev.param.pu8ecm_emm_buf = param->pu8ecm_emm_buf;
847*53ee8cc1Swenshuai.xi _nds_flt_dev.param.ecm_emm_size = param->ecm_emm_size;
848*53ee8cc1Swenshuai.xi
849*53ee8cc1Swenshuai.xi _EmmFlt.pid = TSP_PID_NULL;
850*53ee8cc1Swenshuai.xi _EmmFlt.flt_id = NDS_FLT_NULL;
851*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
852*53ee8cc1Swenshuai.xi {
853*53ee8cc1Swenshuai.xi _EcmFlt[i].pid = TSP_PID_NULL;
854*53ee8cc1Swenshuai.xi _EcmFlt[i].flt_id = NDS_FLT_NULL;
855*53ee8cc1Swenshuai.xi _EcmFlt[i].b_defined = FALSE;
856*53ee8cc1Swenshuai.xi #if NDS_ECM_SAME_PID_DROP_EN
857*53ee8cc1Swenshuai.xi _EcmFlt[i].u8Ctrl = 0;
858*53ee8cc1Swenshuai.xi _EcmFlt[i].u8Drop = 0;
859*53ee8cc1Swenshuai.xi #endif
860*53ee8cc1Swenshuai.xi }
861*53ee8cc1Swenshuai.xi
862*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
863*53ee8cc1Swenshuai.xi {
864*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[i][0], 0, NDS_CAM_FLT_BUF_SIZE);
865*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[i][1], 0, NDS_CAM_FLT_BUF_SIZE);
866*53ee8cc1Swenshuai.xi }
867*53ee8cc1Swenshuai.xi for (i = 0; i < MAX_EMM_LIST_NUM; i++)
868*53ee8cc1Swenshuai.xi {
869*53ee8cc1Swenshuai.xi memset(_u8EmmBuf[i], 0, NDS_CAM_FLT_BUF_SIZE);
870*53ee8cc1Swenshuai.xi }
871*53ee8cc1Swenshuai.xi
872*53ee8cc1Swenshuai.xi #if 1
873*53ee8cc1Swenshuai.xi //*((volatile unsigned int*)( 0xbf202d00 )) = 0x11;// allow TS packet to flow through CA module
874*53ee8cc1Swenshuai.xi //*((volatile unsigned int*)( 0xbf202d00 )) = 0x59;// 49:pvr, 59: live in+pvr
875*53ee8cc1Swenshuai.xi
876*53ee8cc1Swenshuai.xi //*((volatile unsigned int*)( 0xBF2216CC )) = 0x0080;//olny for FPGA of NSK ignored , set to 0 = disable all
877*53ee8cc1Swenshuai.xi //*((volatile unsigned int*)( 0xBF2018b0 )) = 0x0080;//accept_en
878*53ee8cc1Swenshuai.xi //*((volatile unsigned int*)( 0xBF203c50)) = 0x1022;//tsp clk
879*53ee8cc1Swenshuai.xi *((volatile unsigned int*)( 0xBF221840)) = 0x0010; // Descambler bank 2 enable reg_latch_even_odd for ca_value
880*53ee8cc1Swenshuai.xi #endif
881*53ee8cc1Swenshuai.xi
882*53ee8cc1Swenshuai.xi #if 0 //------ for FPGA TSO ----
883*53ee8cc1Swenshuai.xi
884*53ee8cc1Swenshuai.xi *((volatile MS_U32*)0xbf202d78) = 0x027;//TS0 config only for ts out , 0x021:only video, clk/2 ,,, 0x27:all ts, clk/2
885*53ee8cc1Swenshuai.xi *((volatile MS_U32*)0xBF202AB0) = 0xbb32; //bypass VPID
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi _nds_flt_eventid = MsOS_CreateEventGroup("NDS_FLT_Event");
889*53ee8cc1Swenshuai.xi MS_ASSERT(_nds_flt_eventid >= 0);
890*53ee8cc1Swenshuai.xi
891*53ee8cc1Swenshuai.xi _nds_flt_mutexid = MsOS_CreateMutex(E_MSOS_FIFO, "NDS_FLT_Mutex", MSOS_PROCESS_SHARED);
892*53ee8cc1Swenshuai.xi MS_ASSERT(_nds_flt_mutexid >= 0);
893*53ee8cc1Swenshuai.xi
894*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX_KERNEL)
895*53ee8cc1Swenshuai.xi _nds_flt_taskid = MsOS_CreateTask( (TaskEntry) _NDS_FLT_IsrTask,
896*53ee8cc1Swenshuai.xi (MS_U32)NULL,
897*53ee8cc1Swenshuai.xi (TaskPriority) (E_TASK_PRI_SYS+1),
898*53ee8cc1Swenshuai.xi TRUE,
899*53ee8cc1Swenshuai.xi NULL,
900*53ee8cc1Swenshuai.xi 0,
901*53ee8cc1Swenshuai.xi "NDS_FLT_IsrTask");
902*53ee8cc1Swenshuai.xi #else
903*53ee8cc1Swenshuai.xi _nds_flt_taskid = MsOS_CreateTask( (TaskEntry) _NDS_FLT_IsrTask,
904*53ee8cc1Swenshuai.xi (MS_U32)NULL,
905*53ee8cc1Swenshuai.xi (TaskPriority) (E_TASK_PRI_SYS+1),
906*53ee8cc1Swenshuai.xi TRUE,
907*53ee8cc1Swenshuai.xi _nds_flt_stack,
908*53ee8cc1Swenshuai.xi NDS_FLT_TASK_STACK_SIZE,
909*53ee8cc1Swenshuai.xi "NDS_FLT_IsrTask");
910*53ee8cc1Swenshuai.xi #endif
911*53ee8cc1Swenshuai.xi MS_ASSERT(_nds_flt_taskid >= 0);
912*53ee8cc1Swenshuai.xi
913*53ee8cc1Swenshuai.xi NDS_FLT_OS_AttachInterrupt(_NDS_FLT_Isr);
914*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
915*53ee8cc1Swenshuai.xi
916*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_INT_STAT) = CAM_REG(REG_CAM_ECM_INT_STAT);
917*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = CAM_CA_INT_EMM;
918*53ee8cc1Swenshuai.xi while (CAM_REG(REG_CAM_CA_INT) & CAM_CA_INT_EMM)
919*53ee8cc1Swenshuai.xi {
920*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_INT_STAT) = CAM_EMM_INT_ACK;
921*53ee8cc1Swenshuai.xi }
922*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = 0;
923*53ee8cc1Swenshuai.xi
924*53ee8cc1Swenshuai.xi // Enable (unmask) all interrupts
925*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = (CAM_CA_INT_ECM | CAM_CA_INT_EMM | CAM_CA_INT_EMM_OVERFLOW);
926*53ee8cc1Swenshuai.xi
927*53ee8cc1Swenshuai.xi return E_NDS_OK;
928*53ee8cc1Swenshuai.xi }
929*53ee8cc1Swenshuai.xi
930*53ee8cc1Swenshuai.xi
NDS_FLT_Exit(void)931*53ee8cc1Swenshuai.xi NDS_Result NDS_FLT_Exit(void)
932*53ee8cc1Swenshuai.xi {
933*53ee8cc1Swenshuai.xi // Disable (mask) all interrupts
934*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_CA_INT) = 0;
935*53ee8cc1Swenshuai.xi
936*53ee8cc1Swenshuai.xi NDS_FLT_OS_DisableInterrupt();
937*53ee8cc1Swenshuai.xi NDS_FLT_OS_DetachInterrupt();
938*53ee8cc1Swenshuai.xi
939*53ee8cc1Swenshuai.xi MsOS_DeleteTask(_nds_flt_taskid);
940*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_nds_flt_mutexid);
941*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_nds_flt_eventid);
942*53ee8cc1Swenshuai.xi
943*53ee8cc1Swenshuai.xi HAL_NDS_FLT_Exit();
944*53ee8cc1Swenshuai.xi
945*53ee8cc1Swenshuai.xi return E_NDS_OK;
946*53ee8cc1Swenshuai.xi }
947*53ee8cc1Swenshuai.xi
948*53ee8cc1Swenshuai.xi
949*53ee8cc1Swenshuai.xi // 7.2.1
XHDICA_SetEmmPid(NDS_ULONG x_connection,NDS_USHORT pid,NDS_BYTE emm_filter_control)950*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetEmmPid (NDS_ULONG x_connection,
951*53ee8cc1Swenshuai.xi NDS_USHORT pid,
952*53ee8cc1Swenshuai.xi NDS_BYTE emm_filter_control)
953*53ee8cc1Swenshuai.xi {
954*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] pid[0x%x]\n", __FUNCTION__, __LINE__, pid);
955*53ee8cc1Swenshuai.xi
956*53ee8cc1Swenshuai.xi NDS_FLT_ENTRY(); // for disable interrupt protection
957*53ee8cc1Swenshuai.xi
958*53ee8cc1Swenshuai.xi if ((pid < 2) || (pid > 0x1FFE))
959*53ee8cc1Swenshuai.xi {
960*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
961*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_REQUEST_NOT_SUPPORTED_BY_DRIVER);
962*53ee8cc1Swenshuai.xi }
963*53ee8cc1Swenshuai.xi
964*53ee8cc1Swenshuai.xi _EMM_EnableFilter(FALSE);
965*53ee8cc1Swenshuai.xi
966*53ee8cc1Swenshuai.xi #if 0
967*53ee8cc1Swenshuai.xi if (_EmmFlt.pid != TSP_PID_NULL)
968*53ee8cc1Swenshuai.xi {
969*53ee8cc1Swenshuai.xi NDS_ASSERT((_EmmFlt.pid == pid), CA_REQUEST_NOT_SUPPORTED_BY_DRIVER, "[%s]-[%d]\n", __FUNCTION__, __LINE__);
970*53ee8cc1Swenshuai.xi }
971*53ee8cc1Swenshuai.xi #endif
972*53ee8cc1Swenshuai.xi // @TODO:
973*53ee8cc1Swenshuai.xi // should filter and PID be disable and set to NULL for disabling EMM filter?
974*53ee8cc1Swenshuai.xi
975*53ee8cc1Swenshuai.xi // Save pid and allocate fitler
976*53ee8cc1Swenshuai.xi //_EmmFlt.pid = pid & CAM_EMM_PID_MASK; // Get new pid
977*53ee8cc1Swenshuai.xi _EMM_AllocFilter(x_connection, pid, emm_filter_control);
978*53ee8cc1Swenshuai.xi
979*53ee8cc1Swenshuai.xi // Enable EMM Filter
980*53ee8cc1Swenshuai.xi NDS_FLT_OS_DisableInterrupt();
981*53ee8cc1Swenshuai.xi bEmmOverflow = FALSE;
982*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
983*53ee8cc1Swenshuai.xi
984*53ee8cc1Swenshuai.xi _EMM_EnableFilter(TRUE);
985*53ee8cc1Swenshuai.xi
986*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_OK);
987*53ee8cc1Swenshuai.xi }
988*53ee8cc1Swenshuai.xi
989*53ee8cc1Swenshuai.xi
990*53ee8cc1Swenshuai.xi // 7.2.2
991*53ee8cc1Swenshuai.xi /*-----------------
992*53ee8cc1Swenshuai.xi source byte --------------- byte 0 --------------- --------------- byte 1 --------------- ... 2,
993*53ee8cc1Swenshuai.xi msb lsb msb lsb
994*53ee8cc1Swenshuai.xi source bit 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, ... 25, 24, <= bit index
995*53ee8cc1Swenshuai.xi TID(lsn) x x 2 3 4 5 6 7 ... F <= tid index
996*53ee8cc1Swenshuai.xi
997*53ee8cc1Swenshuai.xi --------------- byte 0 --------------- --------------- byte 1 ---------------
998*53ee8cc1Swenshuai.xi TID(lsn) 7 6 5 4 3 2 x x 15 14 13 12 11 10 9 8 <= tid index
999*53ee8cc1Swenshuai.xi lsb 8 10 12 14 0 2 4 6 24 26 28 30 16 18 20 22 <= new position with old index
1000*53ee8cc1Swenshuai.xi msb 10 11 13 15 1 3 5 7 25 27 29 31 17 19 21 23 <= new position with old index
1001*53ee8cc1Swenshuai.xi ------------------*/
XHDICA_EmmSetTableIdFilter(NDS_ULONG x_connection,NDS_BYTE table_id[4])1002*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_EmmSetTableIdFilter (NDS_ULONG x_connection,
1003*53ee8cc1Swenshuai.xi NDS_BYTE table_id[4])
1004*53ee8cc1Swenshuai.xi {
1005*53ee8cc1Swenshuai.xi MS_U32 u32TMode;
1006*53ee8cc1Swenshuai.xi MS_U16 lsb = 0, msb = 0;
1007*53ee8cc1Swenshuai.xi int i;
1008*53ee8cc1Swenshuai.xi
1009*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1010*53ee8cc1Swenshuai.xi
1011*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_TID_MODE_L) = lsb;
1012*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_TID_MODE_H) = msb;
1013*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_TID) = 0x80; // EMM TID
1014*53ee8cc1Swenshuai.xi
1015*53ee8cc1Swenshuai.xi u32TMode = (table_id[0]<<24) | (table_id[1]<<16) | (table_id[2]<<8) | (table_id[3]);
1016*53ee8cc1Swenshuai.xi for (i = 2; i <= 0xF; i++) // 0x82-0x8F
1017*53ee8cc1Swenshuai.xi {
1018*53ee8cc1Swenshuai.xi lsb |= ( (u32TMode >> ((0xF-i)*2) ) & 0x1 ) << i;
1019*53ee8cc1Swenshuai.xi msb |= ( (u32TMode >> (((0xF-i)*2)+1) ) & 0x1 ) << i;
1020*53ee8cc1Swenshuai.xi }
1021*53ee8cc1Swenshuai.xi
1022*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_TID_MODE_L) = lsb;
1023*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_TID_MODE_H) = msb;
1024*53ee8cc1Swenshuai.xi
1025*53ee8cc1Swenshuai.xi
1026*53ee8cc1Swenshuai.xi return CA_OK;
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi
1029*53ee8cc1Swenshuai.xi
1030*53ee8cc1Swenshuai.xi // 7.2.3
1031*53ee8cc1Swenshuai.xi /*
1032*53ee8cc1Swenshuai.xi data byte 0x01 0x23 0x45 0x67
1033*53ee8cc1Swenshuai.xi nds reg_mem 0x01 0x23 0x45 0x67
1034*53ee8cc1Swenshuai.xi nds reg_word 0x01234567
1035*53ee8cc1Swenshuai.xi mstar reg_word 0x01234567
1036*53ee8cc1Swenshuai.xi mstar_reg16 0x4567(L) 0x0123(H)
1037*53ee8cc1Swenshuai.xi */
XHDICA_SetPrivateEmmFilter(NDS_ULONG x_connection,EMM_REG * emm_reg)1038*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_SetPrivateEmmFilter (NDS_ULONG x_connection,
1039*53ee8cc1Swenshuai.xi EMM_REG * emm_reg)
1040*53ee8cc1Swenshuai.xi {
1041*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1042*53ee8cc1Swenshuai.xi
1043*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_H(1)) = *(MS_U8*)(emm_reg->reg1_address+1) + (*(MS_U8*)(emm_reg->reg1_address)<<8);
1044*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_L(1)) = *(MS_U8*)(emm_reg->reg1_address+3) + (*(MS_U8*)(emm_reg->reg1_address+2)<<8);
1045*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_H(1)) = *(MS_U8*)(emm_reg->reg1_mask+1) + (*(MS_U8*)(emm_reg->reg1_mask)<<8);
1046*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_L(1)) = *(MS_U8*)(emm_reg->reg1_mask+3) + (*(MS_U8*)(emm_reg->reg1_mask+2)<<8);
1047*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_H(2)) = *(MS_U8*)(emm_reg->reg2_address+1) + (*(MS_U8*)(emm_reg->reg2_address)<<8);
1048*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_L(2)) = *(MS_U8*)(emm_reg->reg2_address+3) + (*(MS_U8*)(emm_reg->reg2_address+2)<<8);
1049*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_H(2)) = *(MS_U8*)(emm_reg->reg2_mask+1) + (*(MS_U8*)(emm_reg->reg2_mask)<<8);
1050*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_L(2)) = *(MS_U8*)(emm_reg->reg2_mask+3) + (*(MS_U8*)(emm_reg->reg2_mask+2)<<8);
1051*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_H(3)) = *(MS_U8*)(emm_reg->reg3_address+1) + (*(MS_U8*)(emm_reg->reg3_address)<<8);
1052*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_DATA_ID_L(3)) = *(MS_U8*)(emm_reg->reg3_address+3) + (*(MS_U8*)(emm_reg->reg3_address+2)<<8);
1053*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_H(3)) = *(MS_U8*)(emm_reg->reg3_mask+1) + (*(MS_U8*)(emm_reg->reg3_mask)<<8);
1054*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_EMM_MASK_ID_L(3)) = *(MS_U8*)(emm_reg->reg3_mask+3) + (*(MS_U8*)(emm_reg->reg3_mask+2)<<8);
1055*53ee8cc1Swenshuai.xi
1056*53ee8cc1Swenshuai.xi return CA_OK;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi
1059*53ee8cc1Swenshuai.xi
1060*53ee8cc1Swenshuai.xi // 7.2.5
XHDICA_ReleaseEmmBuffer(NDS_ULONG x_connection,NDS_BYTE * emm_buf)1061*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseEmmBuffer (NDS_ULONG x_connection,
1062*53ee8cc1Swenshuai.xi NDS_BYTE * emm_buf)
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1065*53ee8cc1Swenshuai.xi
1066*53ee8cc1Swenshuai.xi NDS_FLT_DBG("free EMM %x\n", emm_buf);
1067*53ee8cc1Swenshuai.xi
1068*53ee8cc1Swenshuai.xi NDS_FLT_ENTRY(); // for disable interrupt protection
1069*53ee8cc1Swenshuai.xi
1070*53ee8cc1Swenshuai.xi if (emm_buf != NULL)
1071*53ee8cc1Swenshuai.xi {
1072*53ee8cc1Swenshuai.xi //_verSC_PrintData(emm_buf-8, 32);
1073*53ee8cc1Swenshuai.xi //[NEW]
1074*53ee8cc1Swenshuai.xi if (bEmmOverflow == TRUE)
1075*53ee8cc1Swenshuai.xi {
1076*53ee8cc1Swenshuai.xi NDS_FLT_DBG("(read, cur, write) = (%02d %02d %02d)\n", _u8EmmRead, _u8EmmCur, _u8EmmWrite);
1077*53ee8cc1Swenshuai.xi NDS_FLT_DBG("free Emm %d %02x %02x\n", MsOS_GetSystemTime() - emm_overflow_time, *(emm_buf), *(emm_buf-8));
1078*53ee8cc1Swenshuai.xi }
1079*53ee8cc1Swenshuai.xi // -jerry
1080*53ee8cc1Swenshuai.xi
1081*53ee8cc1Swenshuai.xi NDS_FLT_OS_DisableInterrupt();
1082*53ee8cc1Swenshuai.xi *(emm_buf) = 0;
1083*53ee8cc1Swenshuai.xi *(emm_buf-8) = 0;
1084*53ee8cc1Swenshuai.xi emmQueueDec();
1085*53ee8cc1Swenshuai.xi
1086*53ee8cc1Swenshuai.xi //[NEW]
1087*53ee8cc1Swenshuai.xi if ( (bEmmOverflow == TRUE) && (emmQueueIsEmpty()) )
1088*53ee8cc1Swenshuai.xi {
1089*53ee8cc1Swenshuai.xi #if (NDS_EMM_PASSIVE==0)
1090*53ee8cc1Swenshuai.xi _EMM_EnableFilter(TRUE);
1091*53ee8cc1Swenshuai.xi #endif
1092*53ee8cc1Swenshuai.xi bEmmOverflow = FALSE;
1093*53ee8cc1Swenshuai.xi }
1094*53ee8cc1Swenshuai.xi // -jerry
1095*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
1096*53ee8cc1Swenshuai.xi }
1097*53ee8cc1Swenshuai.xi else
1098*53ee8cc1Swenshuai.xi {
1099*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_DRIVER_CAN_NOT_PERFORM_FUNCTION_NOW);
1100*53ee8cc1Swenshuai.xi }
1101*53ee8cc1Swenshuai.xi
1102*53ee8cc1Swenshuai.xi // MsOS_DelayTask(5);
1103*53ee8cc1Swenshuai.xi
1104*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_OK);
1105*53ee8cc1Swenshuai.xi }
1106*53ee8cc1Swenshuai.xi
1107*53ee8cc1Swenshuai.xi
1108*53ee8cc1Swenshuai.xi // 8.2.1
XHDICA_DefineEcmPid(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_USHORT pid,NDS_BYTE odd_ecm_table_id,NDS_BYTE even_ecm_table_id)1109*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineEcmPid (NDS_ULONG x_connection,
1110*53ee8cc1Swenshuai.xi NDS_BYTE ecm_filter_num,
1111*53ee8cc1Swenshuai.xi NDS_USHORT pid,
1112*53ee8cc1Swenshuai.xi NDS_BYTE odd_ecm_table_id,
1113*53ee8cc1Swenshuai.xi NDS_BYTE even_ecm_table_id)
1114*53ee8cc1Swenshuai.xi {
1115*53ee8cc1Swenshuai.xi //MS_U16 ecm_pid;
1116*53ee8cc1Swenshuai.xi MS_U16 u16EcmTid = 0;
1117*53ee8cc1Swenshuai.xi
1118*53ee8cc1Swenshuai.xi #if 0
1119*53ee8cc1Swenshuai.xi if(x_connection == 1 )
1120*53ee8cc1Swenshuai.xi {
1121*53ee8cc1Swenshuai.xi NDS_RASP_DefineEcmPid(x_connection,ecm_filter_num,pid,odd_ecm_table_id,even_ecm_table_id);
1122*53ee8cc1Swenshuai.xi return CA_OK ;
1123*53ee8cc1Swenshuai.xi }
1124*53ee8cc1Swenshuai.xi #endif
1125*53ee8cc1Swenshuai.xi
1126*53ee8cc1Swenshuai.xi
1127*53ee8cc1Swenshuai.xi NDS_FUNC("(%ld)-[%s]-[%d] pid [0x%x]\n", MsOS_GetSystemTime(), __FUNCTION__, __LINE__, pid);
1128*53ee8cc1Swenshuai.xi
1129*53ee8cc1Swenshuai.xi if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
1130*53ee8cc1Swenshuai.xi {
1131*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1132*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1133*53ee8cc1Swenshuai.xi }
1134*53ee8cc1Swenshuai.xi
1135*53ee8cc1Swenshuai.xi // disable filter before setting
1136*53ee8cc1Swenshuai.xi _ECM_EnableFilter(x_connection, ecm_filter_num, FALSE, 0);
1137*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = pid & CAM_ECM_PID_MASK; // clear [15:13] for later DefineEcmPid
1138*53ee8cc1Swenshuai.xi
1139*53ee8cc1Swenshuai.xi u16EcmTid |= (even_ecm_table_id & CAM_ECM_TID_EVEN_MASK);
1140*53ee8cc1Swenshuai.xi u16EcmTid |= ((odd_ecm_table_id<<8) & CAM_ECM_TID_ODD_MASK);
1141*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_TID) = u16EcmTid;
1142*53ee8cc1Swenshuai.xi
1143*53ee8cc1Swenshuai.xi if (pid == 0xFFFF)
1144*53ee8cc1Swenshuai.xi {
1145*53ee8cc1Swenshuai.xi // disable the filter
1146*53ee8cc1Swenshuai.xi return CA_OK;
1147*53ee8cc1Swenshuai.xi }
1148*53ee8cc1Swenshuai.xi
1149*53ee8cc1Swenshuai.xi if ((pid < 0x2 || pid > 0x1FFE))
1150*53ee8cc1Swenshuai.xi {
1151*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1152*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1153*53ee8cc1Swenshuai.xi }
1154*53ee8cc1Swenshuai.xi
1155*53ee8cc1Swenshuai.xi // Save pid and allocate fitler
1156*53ee8cc1Swenshuai.xi //_EcmFlt[ecm_filter_num].pid = pid & CAM_ECM_PID_MASK;
1157*53ee8cc1Swenshuai.xi _ECM_AllocFilter(x_connection, ecm_filter_num, pid);
1158*53ee8cc1Swenshuai.xi
1159*53ee8cc1Swenshuai.xi return CA_OK;
1160*53ee8cc1Swenshuai.xi }
1161*53ee8cc1Swenshuai.xi
1162*53ee8cc1Swenshuai.xi
1163*53ee8cc1Swenshuai.xi //8.2.2
XHDICA_DefineEcmFilter(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_BYTE ecm_filter_control)1164*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_DefineEcmFilter (NDS_ULONG x_connection,
1165*53ee8cc1Swenshuai.xi NDS_BYTE ecm_filter_num,
1166*53ee8cc1Swenshuai.xi NDS_BYTE ecm_filter_control)
1167*53ee8cc1Swenshuai.xi {
1168*53ee8cc1Swenshuai.xi MS_U16 ecm_pid = 0;
1169*53ee8cc1Swenshuai.xi int i;
1170*53ee8cc1Swenshuai.xi
1171*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] -- ecm_filter_num[%d]\n", __FUNCTION__, __LINE__, ecm_filter_num);
1172*53ee8cc1Swenshuai.xi
1173*53ee8cc1Swenshuai.xi #if 0
1174*53ee8cc1Swenshuai.xi if(x_connection == 1 )
1175*53ee8cc1Swenshuai.xi {
1176*53ee8cc1Swenshuai.xi NDS_RASP_DefineEcmFilter(x_connection,ecm_filter_num,ecm_filter_control);
1177*53ee8cc1Swenshuai.xi return CA_OK ;
1178*53ee8cc1Swenshuai.xi }
1179*53ee8cc1Swenshuai.xi #endif
1180*53ee8cc1Swenshuai.xi
1181*53ee8cc1Swenshuai.xi
1182*53ee8cc1Swenshuai.xi if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
1183*53ee8cc1Swenshuai.xi {
1184*53ee8cc1Swenshuai.xi NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
1185*53ee8cc1Swenshuai.xi return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
1186*53ee8cc1Swenshuai.xi }
1187*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++) // 8.2.2 Note
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi if ( (i != ecm_filter_num) &&
1190*53ee8cc1Swenshuai.xi (_EcmFlt[i].pid == _EcmFlt[ecm_filter_num].pid) &&
1191*53ee8cc1Swenshuai.xi (_EcmFlt[i].x_connect == _EcmFlt[ecm_filter_num].x_connect) &&
1192*53ee8cc1Swenshuai.xi (_EcmFlt[i].b_defined == TRUE) )
1193*53ee8cc1Swenshuai.xi {
1194*53ee8cc1Swenshuai.xi return CA_ECM_PID_FILTER_ALREADY_DEFINED;
1195*53ee8cc1Swenshuai.xi }
1196*53ee8cc1Swenshuai.xi }
1197*53ee8cc1Swenshuai.xi
1198*53ee8cc1Swenshuai.xi // @FIXME: is it possible and return CA_OK?
1199*53ee8cc1Swenshuai.xi if ((_EcmFlt[ecm_filter_num].pid < 0x2 || _EcmFlt[ecm_filter_num].pid > 0x1FFE))
1200*53ee8cc1Swenshuai.xi {
1201*53ee8cc1Swenshuai.xi // Invaliad PID
1202*53ee8cc1Swenshuai.xi return CA_OK;
1203*53ee8cc1Swenshuai.xi }
1204*53ee8cc1Swenshuai.xi
1205*53ee8cc1Swenshuai.xi ecm_pid = _EcmFlt[ecm_filter_num].pid;
1206*53ee8cc1Swenshuai.xi if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_ODD_RECEPTION)
1207*53ee8cc1Swenshuai.xi {
1208*53ee8cc1Swenshuai.xi ecm_pid |= CAM_ECM_PID_TID_ODD;
1209*53ee8cc1Swenshuai.xi }
1210*53ee8cc1Swenshuai.xi if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_EVEN_RECEPTION)
1211*53ee8cc1Swenshuai.xi {
1212*53ee8cc1Swenshuai.xi ecm_pid |= CAM_ECM_PID_TID_EVEN;
1213*53ee8cc1Swenshuai.xi }
1214*53ee8cc1Swenshuai.xi if (ecm_filter_control & HDICA_ECM_ENABLE_RECEPTION)
1215*53ee8cc1Swenshuai.xi {
1216*53ee8cc1Swenshuai.xi ecm_pid |= CAM_ECM_PID_ENABLE;
1217*53ee8cc1Swenshuai.xi _EcmFlt[ecm_filter_num].b_defined = TRUE;
1218*53ee8cc1Swenshuai.xi }
1219*53ee8cc1Swenshuai.xi else
1220*53ee8cc1Swenshuai.xi {
1221*53ee8cc1Swenshuai.xi _EcmFlt[ecm_filter_num].b_defined = FALSE;
1222*53ee8cc1Swenshuai.xi }
1223*53ee8cc1Swenshuai.xi
1224*53ee8cc1Swenshuai.xi // Enable
1225*53ee8cc1Swenshuai.xi // NOTE: It's always AUTO for current NDS implementation
1226*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = 0; // disable filter & reset LOCK
1227*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_LOCK(ecm_filter_num)) |= CAM_ECM_LOCK_AUTO(ecm_filter_num);
1228*53ee8cc1Swenshuai.xi CAM_REG(REG_CAM_ECM_PID(ecm_filter_num)) = ecm_pid;
1229*53ee8cc1Swenshuai.xi
1230*53ee8cc1Swenshuai.xi _ECM_EnableFilter(x_connection, ecm_filter_num, (ecm_filter_control & HDICA_ECM_ENABLE_RECEPTION) ? TRUE : FALSE, ecm_filter_control);
1231*53ee8cc1Swenshuai.xi
1232*53ee8cc1Swenshuai.xi return CA_OK;
1233*53ee8cc1Swenshuai.xi }
1234*53ee8cc1Swenshuai.xi
1235*53ee8cc1Swenshuai.xi
1236*53ee8cc1Swenshuai.xi // 8.2.4
XHDICA_ReleaseEcmBuffer(NDS_ULONG x_connection,NDS_BYTE ecm_filter_num,NDS_BYTE ecm_polarity,NDS_BYTE * ecm_buf)1237*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseEcmBuffer (NDS_ULONG x_connection,
1238*53ee8cc1Swenshuai.xi NDS_BYTE ecm_filter_num,
1239*53ee8cc1Swenshuai.xi NDS_BYTE ecm_polarity,
1240*53ee8cc1Swenshuai.xi NDS_BYTE * ecm_buf)
1241*53ee8cc1Swenshuai.xi {
1242*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1243*53ee8cc1Swenshuai.xi
1244*53ee8cc1Swenshuai.xi NDS_FLT_DBG("free ECM %d %d\n", ecm_filter_num, ecm_polarity);
1245*53ee8cc1Swenshuai.xi
1246*53ee8cc1Swenshuai.xi NDS_FLT_ENTRY(); // for disable interrupt protection
1247*53ee8cc1Swenshuai.xi
1248*53ee8cc1Swenshuai.xi if (ecm_buf != NULL)
1249*53ee8cc1Swenshuai.xi {
1250*53ee8cc1Swenshuai.xi NDS_FLT_OS_DisableInterrupt();
1251*53ee8cc1Swenshuai.xi memset(ecm_buf-8, 0, 188);
1252*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
1253*53ee8cc1Swenshuai.xi
1254*53ee8cc1Swenshuai.xi // @TODO: Manual UnLock
1255*53ee8cc1Swenshuai.xi // Check auto/manual mode
1256*53ee8cc1Swenshuai.xi // Set correspondant setting
1257*53ee8cc1Swenshuai.xi }
1258*53ee8cc1Swenshuai.xi else
1259*53ee8cc1Swenshuai.xi {
1260*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_DRIVER_CAN_NOT_PERFORM_FUNCTION_NOW);
1261*53ee8cc1Swenshuai.xi }
1262*53ee8cc1Swenshuai.xi
1263*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_OK);
1264*53ee8cc1Swenshuai.xi }
1265*53ee8cc1Swenshuai.xi
1266*53ee8cc1Swenshuai.xi
1267*53ee8cc1Swenshuai.xi // 8.2.5
XHDICA_ReleaseAllEcmBuffers(NDS_ULONG x_connection)1268*53ee8cc1Swenshuai.xi NDS_STATUS XHDICA_ReleaseAllEcmBuffers (NDS_ULONG x_connection)
1269*53ee8cc1Swenshuai.xi {
1270*53ee8cc1Swenshuai.xi int i = 0;
1271*53ee8cc1Swenshuai.xi
1272*53ee8cc1Swenshuai.xi NDS_FUNC("[%s]-[%d] \n", __FUNCTION__, __LINE__);
1273*53ee8cc1Swenshuai.xi
1274*53ee8cc1Swenshuai.xi NDS_FLT_ENTRY(); // for disable interrupt protection
1275*53ee8cc1Swenshuai.xi
1276*53ee8cc1Swenshuai.xi for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
1277*53ee8cc1Swenshuai.xi {
1278*53ee8cc1Swenshuai.xi NDS_FLT_OS_DisableInterrupt();
1279*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[i][0], 0, 188);
1280*53ee8cc1Swenshuai.xi memset(_u8EcmBuf[i][1], 0, 188);
1281*53ee8cc1Swenshuai.xi NDS_FLT_OS_EnableInterrupt();
1282*53ee8cc1Swenshuai.xi }
1283*53ee8cc1Swenshuai.xi
1284*53ee8cc1Swenshuai.xi NDS_FLT_RETURN(CA_OK);
1285*53ee8cc1Swenshuai.xi }
1286*53ee8cc1Swenshuai.xi
1287