xref: /utopia/UTPA2-700.0.x/modules/dscmb/drv/nds/nds_rasp.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi 
2*53ee8cc1Swenshuai.xi 
3*53ee8cc1Swenshuai.xi #include "MsCommon.h"
4*53ee8cc1Swenshuai.xi 
5*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
6*53ee8cc1Swenshuai.xi #include "string.h"
7*53ee8cc1Swenshuai.xi #endif
8*53ee8cc1Swenshuai.xi 
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi #if 0
11*53ee8cc1Swenshuai.xi 
12*53ee8cc1Swenshuai.xi #include "asmCPU.h"
13*53ee8cc1Swenshuai.xi #include "regNDS.h"
14*53ee8cc1Swenshuai.xi #include "drvNDS.h"
15*53ee8cc1Swenshuai.xi #include "halNDS.h"
16*53ee8cc1Swenshuai.xi #include "../rasp/regRASP.h"
17*53ee8cc1Swenshuai.xi #include "../rasp/halRASP.h"
18*53ee8cc1Swenshuai.xi #include "../tsp2/drvTSP2.h"
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi #include "ddiNDS_HDI.h"
21*53ee8cc1Swenshuai.xi 
22*53ee8cc1Swenshuai.xi #include "nds.h"
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
25*53ee8cc1Swenshuai.xi //       Macro Definition
26*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi #define RASP_INT_EVENT_ALL (RASP_INT_EFRAME_RD_OVF | RASP_INT_EFRAME_WT_OVF| \
29*53ee8cc1Swenshuai.xi                             /*RASP_INT_STR2MIU|*/RASP_INT_PAYLD2MIU | RASP_INT_ECM2MIU|\
30*53ee8cc1Swenshuai.xi                             RASP_INT_TIME_WATER_MARK|RASP_INT_EVENT_WATER_MARK |\
31*53ee8cc1Swenshuai.xi                             RASP_INT_ECM_PKT_RDY )
32*53ee8cc1Swenshuai.xi 
33*53ee8cc1Swenshuai.xi 
34*53ee8cc1Swenshuai.xi #define NDS_RASP_TASK_STACK_SIZE  (1024 * 4 )
35*53ee8cc1Swenshuai.xi 
36*53ee8cc1Swenshuai.xi 
37*53ee8cc1Swenshuai.xi 
38*53ee8cc1Swenshuai.xi 
39*53ee8cc1Swenshuai.xi #define NDS_RASP_ECM_OVERFLOW_SHIFT   0x00000016
40*53ee8cc1Swenshuai.xi 
41*53ee8cc1Swenshuai.xi #define NDS_RASP_EVENT_ALL            0xFFFFFFFF
42*53ee8cc1Swenshuai.xi 
43*53ee8cc1Swenshuai.xi 
44*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
45*53ee8cc1Swenshuai.xi //       Local Structure definition
46*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi typedef struct
49*53ee8cc1Swenshuai.xi {
50*53ee8cc1Swenshuai.xi 
51*53ee8cc1Swenshuai.xi     MS_U16 pid ;
52*53ee8cc1Swenshuai.xi     MS_U16 ecmid;
53*53ee8cc1Swenshuai.xi     MS_U8  ecm_ctrl;
54*53ee8cc1Swenshuai.xi     MS_U32 Xconn;
55*53ee8cc1Swenshuai.xi     MS_BOOL b_defined;
56*53ee8cc1Swenshuai.xi 
57*53ee8cc1Swenshuai.xi } NDS_RASP_ECM_FLT;
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
60*53ee8cc1Swenshuai.xi //       Variable declaration
61*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------//
62*53ee8cc1Swenshuai.xi 
63*53ee8cc1Swenshuai.xi 
64*53ee8cc1Swenshuai.xi static MS_U8 *_rasp_ecm_addr[RASP_NUM] ;//{[0 ... (RASP_NUM)] = NULL } ;
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi static MS_U32 _nds_rasp_eventid = -1 , _nds_rasp_taskid  = -1 ;
67*53ee8cc1Swenshuai.xi 
68*53ee8cc1Swenshuai.xi MS_U8    _u8RaspEcmBuf[RASP_NUM][NDS_CAM_ECM_FLT_NUM][2][NDS_CAM_FLT_BUF_SIZE];
69*53ee8cc1Swenshuai.xi 
70*53ee8cc1Swenshuai.xi NDS_RASP_ECM_FLT _rasp_ecm_flt[RASP_NUM][NDS_CAM_ECM_FLT_NUM];
71*53ee8cc1Swenshuai.xi 
72*53ee8cc1Swenshuai.xi static MS_U32  _nds_rasp_stack[NDS_RASP_TASK_STACK_SIZE/sizeof(MS_U32)];
73*53ee8cc1Swenshuai.xi 
74*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
75*53ee8cc1Swenshuai.xi static irqreturn_t _NDS_RASP_Isr(int irq, void *dev_id);
76*53ee8cc1Swenshuai.xi #else
77*53ee8cc1Swenshuai.xi static void _NDS_RASP_Isr(InterruptNum eIntNum);
78*53ee8cc1Swenshuai.xi #endif
79*53ee8cc1Swenshuai.xi 
80*53ee8cc1Swenshuai.xi static void _NDS_RASP_IsrTask(void);
81*53ee8cc1Swenshuai.xi 
82*53ee8cc1Swenshuai.xi // -----------------------------------------------------------------------//
83*53ee8cc1Swenshuai.xi //
84*53ee8cc1Swenshuai.xi //       RASP LDI Driver IMPLEMENTATION
85*53ee8cc1Swenshuai.xi //
86*53ee8cc1Swenshuai.xi // -----------------------------------------------------------------------//
87*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_GetCapabilities(RASP_CAPS *RaspCaps)
88*53ee8cc1Swenshuai.xi {
89*53ee8cc1Swenshuai.xi 
90*53ee8cc1Swenshuai.xi     // [FIXME]
91*53ee8cc1Swenshuai.xi     RaspCaps->Supported_Event = 0x800001FF ;
92*53ee8cc1Swenshuai.xi     RaspCaps->Event_Timer_Rate = 0x200; //[FIXME]
93*53ee8cc1Swenshuai.xi     RaspCaps->Num_Rasps = RASP_NUM ;
94*53ee8cc1Swenshuai.xi     RaspCaps->Max_Event_Num_In_Fifo   = RASP_EVENT_FIFO_DEPTH ;
95*53ee8cc1Swenshuai.xi     RaspCaps->Num_of_Payloaad_Buffers = 1; // ?
96*53ee8cc1Swenshuai.xi     RaspCaps->Num_of_Filters     = RASP_EVENT_NUM ;
97*53ee8cc1Swenshuai.xi     RaspCaps->Event_Generation_Every_Slot_Time = TRUE ;
98*53ee8cc1Swenshuai.xi     RaspCaps->PCR_Stamp          = TRUE ;
99*53ee8cc1Swenshuai.xi     RaspCaps->Local_Clock_Stamp  = TRUE ;
100*53ee8cc1Swenshuai.xi     RaspCaps->Trigger_by_Evnet   = TRUE ;
101*53ee8cc1Swenshuai.xi     RaspCaps->Trigger_by_Time    = TRUE ;
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi     return X_OK ;
105*53ee8cc1Swenshuai.xi 
106*53ee8cc1Swenshuai.xi }
107*53ee8cc1Swenshuai.xi 
108*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_GetEventMask
109*53ee8cc1Swenshuai.xi (
110*53ee8cc1Swenshuai.xi     XCONNECTION        Xconn,
111*53ee8cc1Swenshuai.xi     XUCHAR             FilterNum,
112*53ee8cc1Swenshuai.xi     XUSHORT           *Pid,
113*53ee8cc1Swenshuai.xi     F_RASP_EV_MASK    *EventMask,
114*53ee8cc1Swenshuai.xi     F_RASP_EV_MASK    *PayLoadMask
115*53ee8cc1Swenshuai.xi ) ;
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_GetTimerAndPacketNumber
118*53ee8cc1Swenshuai.xi (
119*53ee8cc1Swenshuai.xi     XCONNECTION     Xconn,
120*53ee8cc1Swenshuai.xi     XULONG          *Time,
121*53ee8cc1Swenshuai.xi     XULONG          *PacketNumber
122*53ee8cc1Swenshuai.xi ) ;
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_GetTSPayload
125*53ee8cc1Swenshuai.xi (
126*53ee8cc1Swenshuai.xi     XCONNECTION     Xconn,
127*53ee8cc1Swenshuai.xi     XULONG          PacketNum,
128*53ee8cc1Swenshuai.xi     XUCHAR          Buffer[188]
129*53ee8cc1Swenshuai.xi );
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_Reset(XCONNECTION Xconn) ;
132*53ee8cc1Swenshuai.xi 
133*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_SetEventNotifyFunction
134*53ee8cc1Swenshuai.xi (
135*53ee8cc1Swenshuai.xi     XCONNECTION     Xconn,
136*53ee8cc1Swenshuai.xi     RASP_EVENT_NOTIFY_FOUNCTION     *RaspEventCB
137*53ee8cc1Swenshuai.xi );
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_SetOverflowNotifyFunction
140*53ee8cc1Swenshuai.xi (
141*53ee8cc1Swenshuai.xi     XCONNECTION    Xconn,
142*53ee8cc1Swenshuai.xi     RASP_OVERFLOW_NOTIFY_FUNCTION      *RaspOvfCB
143*53ee8cc1Swenshuai.xi ) ;
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_Configure
147*53ee8cc1Swenshuai.xi (
148*53ee8cc1Swenshuai.xi     XCONNECTION          Xconn,
149*53ee8cc1Swenshuai.xi     TRIGGER_EXECUTOR     TriggerExecutor,
150*53ee8cc1Swenshuai.xi     XUSHORT              EventHighMark,
151*53ee8cc1Swenshuai.xi     XUSHORT              TimeHighMark,
152*53ee8cc1Swenshuai.xi     F_RASP_EV_MASK       PidIndEvent
153*53ee8cc1Swenshuai.xi );
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi 
156*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_SetEventMask
157*53ee8cc1Swenshuai.xi (
158*53ee8cc1Swenshuai.xi     XCONNECTION       Xconn,
159*53ee8cc1Swenshuai.xi     XUCHAR            FilterNum,
160*53ee8cc1Swenshuai.xi     XUSHORT           Pid,
161*53ee8cc1Swenshuai.xi     F_RASP_EV_MASK    EventMask,
162*53ee8cc1Swenshuai.xi     F_RASP_EV_MASK    PayloadMask
163*53ee8cc1Swenshuai.xi );
164*53ee8cc1Swenshuai.xi 
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_ReplacePackets(XCONNECTION Xconn, XUSHORT Pid, XUCHAR FromByte, XUCHAR NumBytes, XUCHAR *ReplaceData)
167*53ee8cc1Swenshuai.xi {
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi     MS_U32 EngId = 0, i ;
170*53ee8cc1Swenshuai.xi     MS_U16 FltPid = 0  ;
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi 
173*53ee8cc1Swenshuai.xi     for( i = 0 ; i < RASP_EVENT_NUM ; i++)
174*53ee8cc1Swenshuai.xi     {
175*53ee8cc1Swenshuai.xi         HAL_RASP_GetPidflt(EngId, i , &FltPid);
176*53ee8cc1Swenshuai.xi         if (FltPid == Pid) break ;
177*53ee8cc1Swenshuai.xi     }
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi     if (RASP_EVENT_NUM  == i) return FALSE ;
180*53ee8cc1Swenshuai.xi 
181*53ee8cc1Swenshuai.xi     HAL_RASP_SetCorptData(EngId ,FromByte  ,FromByte+NumBytes ,*ReplaceData);
182*53ee8cc1Swenshuai.xi 
183*53ee8cc1Swenshuai.xi     HAL_RASP_SetCorptFlt(EngId,i,TRUE);
184*53ee8cc1Swenshuai.xi 
185*53ee8cc1Swenshuai.xi     return X_OK;
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi }
188*53ee8cc1Swenshuai.xi 
189*53ee8cc1Swenshuai.xi 
190*53ee8cc1Swenshuai.xi XSTATUS RASPLDI_Start(XCONNECTION Xconn);
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi //------------------------------------------------------------------//
195*53ee8cc1Swenshuai.xi //
196*53ee8cc1Swenshuai.xi //        Mstar Driver Implementation
197*53ee8cc1Swenshuai.xi //
198*53ee8cc1Swenshuai.xi //------------------------------------------------------------------//
199*53ee8cc1Swenshuai.xi 
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi 
202*53ee8cc1Swenshuai.xi NDS_Result NDS_RASP_Init(NDS_RASP_Param *Param)
203*53ee8cc1Swenshuai.xi {
204*53ee8cc1Swenshuai.xi 
205*53ee8cc1Swenshuai.xi     //MS_U32 regstatus=0;
206*53ee8cc1Swenshuai.xi 
207*53ee8cc1Swenshuai.xi     if (Param->ecm_size < RASP_NUM*(NDS_CAM_FLT_BUF_SIZE*NDS_CAM_ECM_FLT_NUM) )
208*53ee8cc1Swenshuai.xi     {
209*53ee8cc1Swenshuai.xi         NDS_ERR("RASP ECM buffer size is less than FLT_BUF_SIZE*ECM_FLT_NUM\n");
210*53ee8cc1Swenshuai.xi     }
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi     HAL_RASP_SetECM_StartAddr( 0 ,Param->ecm_addr);
213*53ee8cc1Swenshuai.xi     HAL_RASP_SetECM_MidAddr( 0 ,Param->ecm_addr);
214*53ee8cc1Swenshuai.xi     HAL_RASP_SetECM_EndAddr( 0 ,Param->ecm_addr +NDS_CAM_FLT_BUF_SIZE*NDS_CAM_ECM_FLT_NUM );
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi     _rasp_ecm_addr[0] = (MS_U8*)Param->ecm_addr;
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi     memset((MS_U8*)MS_PA2KSEG1(Param->ecm_addr),0x0,NDS_CAM_FLT_BUF_SIZE*NDS_CAM_ECM_FLT_NUM);
219*53ee8cc1Swenshuai.xi     memset(_u8RaspEcmBuf ,0x0, sizeof(_u8RaspEcmBuf));
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi 
222*53ee8cc1Swenshuai.xi     HAL_RASP_ECM_Enable(0 , TRUE);
223*53ee8cc1Swenshuai.xi 
224*53ee8cc1Swenshuai.xi     //Param->ecm_size ;
225*53ee8cc1Swenshuai.xi     //Param->payload_addr;
226*53ee8cc1Swenshuai.xi     //Param->pu8payload_buf;
227*53ee8cc1Swenshuai.xi     //Param->payload_size;
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi     MsOS_AttachInterrupt(E_INT_IRQ_RASP, _NDS_RASP_Isr); //
230*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_RASP);
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_CA_INT)= RASP_CA_INT_ECM | RASP_CA_INT_MASK_RESET_MODE ;
233*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_CA_INT)= RASP_CA_INT_ECM ;
234*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_INT_STAT) = RASP_ECM_INT_FLT_MASK ;
235*53ee8cc1Swenshuai.xi 
236*53ee8cc1Swenshuai.xi 
237*53ee8cc1Swenshuai.xi     //HAL_RASP_INT_Enable(0,(MS_U16)RASP_INT_EVENT_ALL);
238*53ee8cc1Swenshuai.xi     HAL_RASP_INT_Enable(0,0xffff);
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi     if (-1 == _nds_rasp_eventid)
242*53ee8cc1Swenshuai.xi     {
243*53ee8cc1Swenshuai.xi        _nds_rasp_eventid =  MsOS_CreateEventGroup("NDS_RASP_Event");
244*53ee8cc1Swenshuai.xi     }
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi     if (-1 == _nds_rasp_taskid)
247*53ee8cc1Swenshuai.xi     {
248*53ee8cc1Swenshuai.xi        _nds_rasp_taskid = MsOS_CreateTask(  (TaskEntry) _NDS_RASP_IsrTask,
249*53ee8cc1Swenshuai.xi                                             (MS_U32)NULL,
250*53ee8cc1Swenshuai.xi                                             (TaskPriority) (E_TASK_PRI_SYS+1),
251*53ee8cc1Swenshuai.xi                                             TRUE,
252*53ee8cc1Swenshuai.xi                                             _nds_rasp_stack,
253*53ee8cc1Swenshuai.xi                                             NDS_RASP_TASK_STACK_SIZE,
254*53ee8cc1Swenshuai.xi                                             "NDS_RASP_IsrTask");
255*53ee8cc1Swenshuai.xi     }
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi     return  E_NDS_OK ;
259*53ee8cc1Swenshuai.xi }
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi 
262*53ee8cc1Swenshuai.xi NDS_Result NDS_RASP_DefineEcmFilter
263*53ee8cc1Swenshuai.xi            (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num , NDS_BYTE ecm_filter_control)
264*53ee8cc1Swenshuai.xi {
265*53ee8cc1Swenshuai.xi     MS_U16 ecm_pid , i ;
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi 
268*53ee8cc1Swenshuai.xi     //NDS_FUNC("[%s]-[%d] -- ecm_filter_num[%d]\n", __FUNCTION__, __LINE__, ecm_filter_num);
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi     //printf("[%s]-[%d] --xconn = %ld ,  ecm_filter_num[%d]\n", __FUNCTION__, __LINE__,Xconn, ecm_filter_num);
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi     if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
273*53ee8cc1Swenshuai.xi     {
274*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
275*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
276*53ee8cc1Swenshuai.xi     }
277*53ee8cc1Swenshuai.xi     for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++) // 8.2.2 Note
278*53ee8cc1Swenshuai.xi     {
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi         if(
281*53ee8cc1Swenshuai.xi            (i != ecm_filter_num)&& //[FIXME]
282*53ee8cc1Swenshuai.xi            (_rasp_ecm_flt[0][i].pid == _rasp_ecm_flt[0][ecm_filter_num].pid )&&
283*53ee8cc1Swenshuai.xi            (_rasp_ecm_flt[0][i].Xconn == _rasp_ecm_flt[0][ecm_filter_num].Xconn)&&
284*53ee8cc1Swenshuai.xi            (_rasp_ecm_flt[0][i].b_defined = TRUE )
285*53ee8cc1Swenshuai.xi           )
286*53ee8cc1Swenshuai.xi         {
287*53ee8cc1Swenshuai.xi             return CA_ECM_PID_FILTER_ALREADY_DEFINED;
288*53ee8cc1Swenshuai.xi         }
289*53ee8cc1Swenshuai.xi     }
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi     //-------//
292*53ee8cc1Swenshuai.xi     if ((_rasp_ecm_flt[0][ecm_filter_num].pid < 0x2 || _rasp_ecm_flt[0][ecm_filter_num].pid > 0x1FFE))
293*53ee8cc1Swenshuai.xi     {
294*53ee8cc1Swenshuai.xi         return CA_OK ;
295*53ee8cc1Swenshuai.xi     }
296*53ee8cc1Swenshuai.xi 
297*53ee8cc1Swenshuai.xi     ecm_pid = _rasp_ecm_flt[0][ecm_filter_num].pid;
298*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_ODD_RECEPTION)
299*53ee8cc1Swenshuai.xi     {
300*53ee8cc1Swenshuai.xi         ecm_pid |=RASP_ECM_PID_TID_ODD;
301*53ee8cc1Swenshuai.xi     }
302*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_FILTER_CONTROL_ENABLE_EVEN_RECEPTION)
303*53ee8cc1Swenshuai.xi     {
304*53ee8cc1Swenshuai.xi         ecm_pid |= RASP_ECM_PID_TID_EVEN;
305*53ee8cc1Swenshuai.xi     }
306*53ee8cc1Swenshuai.xi     if (ecm_filter_control & HDICA_ECM_ENABLE_RECEPTION)
307*53ee8cc1Swenshuai.xi     {
308*53ee8cc1Swenshuai.xi         ecm_pid |= RASP_ECM_PID_ENABLE;
309*53ee8cc1Swenshuai.xi         _rasp_ecm_flt[0][ecm_filter_num].b_defined = TRUE;
310*53ee8cc1Swenshuai.xi     }
311*53ee8cc1Swenshuai.xi     else
312*53ee8cc1Swenshuai.xi     {
313*53ee8cc1Swenshuai.xi         _rasp_ecm_flt[0][ecm_filter_num].b_defined = FALSE;
314*53ee8cc1Swenshuai.xi     }
315*53ee8cc1Swenshuai.xi 
316*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_PID(ecm_filter_num)) = 0;
317*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_LOCK(ecm_filter_num)) |= RASP_ECM_LOCK_AUTO(ecm_filter_num) ;
318*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_PID(ecm_filter_num)) = ecm_pid;
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi     return CA_OK;
321*53ee8cc1Swenshuai.xi 
322*53ee8cc1Swenshuai.xi }
323*53ee8cc1Swenshuai.xi 
324*53ee8cc1Swenshuai.xi 
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi NDS_Result NDS_RASP_DefineEcmPid (NDS_ULONG Xconn , NDS_BYTE ecm_filter_num ,
327*53ee8cc1Swenshuai.xi            NDS_USHORT Pid, NDS_BYTE odd_ecm_table_id , NDS_BYTE even_ecm_table_id )
328*53ee8cc1Swenshuai.xi {
329*53ee8cc1Swenshuai.xi     MS_U16  u16EcmTid = 0;
330*53ee8cc1Swenshuai.xi 
331*53ee8cc1Swenshuai.xi     //NDS_FUNC("[%s]-[%d]--ecm_filter_num[%d]\n", __FUNCTION__, __LINE__, ecm_filter_num);
332*53ee8cc1Swenshuai.xi     //printf("[%s]-[%d]-- xconn = %ld , ecm_filter_num[%d]\n", __FUNCTION__, __LINE__,Xconn ,ecm_filter_num);
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi     if (ecm_filter_num >= NDS_CAM_ECM_FLT_NUM)
335*53ee8cc1Swenshuai.xi     {
336*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
337*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
338*53ee8cc1Swenshuai.xi     }
339*53ee8cc1Swenshuai.xi 
340*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_PID(ecm_filter_num)) = Pid & RASP_ECM_PID_MASK;
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi     u16EcmTid |= ( even_ecm_table_id    & RASP_ECM_TID_EVEN_MASK);
343*53ee8cc1Swenshuai.xi     u16EcmTid |= ((odd_ecm_table_id<<8) & RASP_ECM_TID_ODD_MASK );
344*53ee8cc1Swenshuai.xi 
345*53ee8cc1Swenshuai.xi     RASP_REG(REG_RASP_ECM_TID) = u16EcmTid;
346*53ee8cc1Swenshuai.xi 
347*53ee8cc1Swenshuai.xi     _rasp_ecm_flt[0][ecm_filter_num].pid = Pid ;
348*53ee8cc1Swenshuai.xi     _rasp_ecm_flt[0][ecm_filter_num].Xconn = Xconn ;
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi     if (Pid == 0xFFFF)
351*53ee8cc1Swenshuai.xi     {
352*53ee8cc1Swenshuai.xi         return CA_OK;
353*53ee8cc1Swenshuai.xi     }
354*53ee8cc1Swenshuai.xi 
355*53ee8cc1Swenshuai.xi     if ((Pid < 0x2 || Pid > 0x1FFE))
356*53ee8cc1Swenshuai.xi     {
357*53ee8cc1Swenshuai.xi         NDS_DBG("[%s]-[%d]\n", __FUNCTION__, __LINE__);
358*53ee8cc1Swenshuai.xi         return CA_REQUEST_NOT_SUPPORTED_BY_DRIVER;
359*53ee8cc1Swenshuai.xi     }
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi     return CA_OK;
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi }
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi 
367*53ee8cc1Swenshuai.xi 
368*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
369*53ee8cc1Swenshuai.xi static irqreturn_t _NDS_RASP_Isr(int irq, void *dev_id)
370*53ee8cc1Swenshuai.xi #else
371*53ee8cc1Swenshuai.xi static void _NDS_RASP_Isr(InterruptNum eIntNum)
372*53ee8cc1Swenshuai.xi #endif
373*53ee8cc1Swenshuai.xi {
374*53ee8cc1Swenshuai.xi 
375*53ee8cc1Swenshuai.xi     MS_U8               u8EcmReg;
376*53ee8cc1Swenshuai.xi     MS_U8               ecm_polarity;
377*53ee8cc1Swenshuai.xi     MS_U16              IntStatus;
378*53ee8cc1Swenshuai.xi     MS_U32              i,EngId = 0 ;
379*53ee8cc1Swenshuai.xi 
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi     //E_INT_IRQ_RASP
382*53ee8cc1Swenshuai.xi     IntStatus = HAL_RASP_INT_GetHW(0);
383*53ee8cc1Swenshuai.xi     //printf("[RASP]Interrupt!!----- eIntNum = %d / Status = %04X \n",eIntNum,IntStatus);
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi     if (IntStatus & RASP_INT_ECM_PKT_RDY) // ECM Packet Ready
386*53ee8cc1Swenshuai.xi     {
387*53ee8cc1Swenshuai.xi         RASP_REG(REG_RASP_CA_INT) = (RASP_CA_INT_ECM );
388*53ee8cc1Swenshuai.xi 
389*53ee8cc1Swenshuai.xi         u8EcmReg = RASP_REG(REG_RASP_ECM_INT_STAT);
390*53ee8cc1Swenshuai.xi         //printf("== Ecm Reg Int = %08X == \n",u8EcmReg);
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi         for (i = 0; i < NDS_CAM_ECM_FLT_NUM; i++)
393*53ee8cc1Swenshuai.xi         {
394*53ee8cc1Swenshuai.xi             if (u8EcmReg & (0x1 << i))
395*53ee8cc1Swenshuai.xi             {
396*53ee8cc1Swenshuai.xi                 MS_U8   *pEcmData;
397*53ee8cc1Swenshuai.xi 
398*53ee8cc1Swenshuai.xi                 RASP_REG(REG_RASP_ECM_INT_STAT) = (0x1 << i);
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi                 //if (_EcmFlt[i].u8Drop == 1)
401*53ee8cc1Swenshuai.xi                 //    continue;
402*53ee8cc1Swenshuai.xi                 pEcmData = (void *)MS_PA2KSEG1((MS_U32)_rasp_ecm_addr[0] + (NDS_CAM_FLT_BUF_SIZE*i));
403*53ee8cc1Swenshuai.xi                 MsOS_ReadMemory();
404*53ee8cc1Swenshuai.xi 
405*53ee8cc1Swenshuai.xi                 if (pEcmData[4] != 0x47)
406*53ee8cc1Swenshuai.xi                 {
407*53ee8cc1Swenshuai.xi                     continue; //_NDS_ASSERT_;
408*53ee8cc1Swenshuai.xi                 }
409*53ee8cc1Swenshuai.xi 
410*53ee8cc1Swenshuai.xi                 if (pEcmData[9] == 0x80)
411*53ee8cc1Swenshuai.xi                 {
412*53ee8cc1Swenshuai.xi                     ecm_polarity = 0; // EVEN
413*53ee8cc1Swenshuai.xi                 }
414*53ee8cc1Swenshuai.xi                 else if (pEcmData[9] == 0x81)
415*53ee8cc1Swenshuai.xi                 {
416*53ee8cc1Swenshuai.xi                     ecm_polarity = 1; // ODD
417*53ee8cc1Swenshuai.xi                 }
418*53ee8cc1Swenshuai.xi                 else
419*53ee8cc1Swenshuai.xi                 {
420*53ee8cc1Swenshuai.xi                     NDS_ASSERT(FALSE, , "[%s]-[%d]\n", __FUNCTION__, __LINE__);
421*53ee8cc1Swenshuai.xi                 }
422*53ee8cc1Swenshuai.xi 
423*53ee8cc1Swenshuai.xi                 if (_u8RaspEcmBuf[EngId][i][ecm_polarity][0] == 0) // if buffer empty , copy pkt from hw buffer to sw buffer.
424*53ee8cc1Swenshuai.xi                 {
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi                     MsOS_ReadMemory();
427*53ee8cc1Swenshuai.xi                     memcpy(_u8RaspEcmBuf[EngId][i][ecm_polarity], pEcmData+4, 188);
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi 
430*53ee8cc1Swenshuai.xi                     if (RASP_REG(REG_RASP_ECM_INT_STAT) & ( 0x1 << i))
431*53ee8cc1Swenshuai.xi                     {
432*53ee8cc1Swenshuai.xi                         MsOS_SetEvent(_nds_rasp_eventid, 0x1 << (i + NDS_RASP_ECM_OVERFLOW_SHIFT ) );
433*53ee8cc1Swenshuai.xi                         continue;
434*53ee8cc1Swenshuai.xi                     }
435*53ee8cc1Swenshuai.xi 
436*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_nds_rasp_eventid, (0x1 << (i*2 )) << ecm_polarity);
437*53ee8cc1Swenshuai.xi                 }
438*53ee8cc1Swenshuai.xi                 else
439*53ee8cc1Swenshuai.xi                 {
440*53ee8cc1Swenshuai.xi                     // set overflow event
441*53ee8cc1Swenshuai.xi                     MsOS_SetEvent(_nds_rasp_eventid, 0x1 << (i + NDS_RASP_ECM_OVERFLOW_SHIFT));
442*53ee8cc1Swenshuai.xi                     break;
443*53ee8cc1Swenshuai.xi                 }
444*53ee8cc1Swenshuai.xi             }
445*53ee8cc1Swenshuai.xi         }
446*53ee8cc1Swenshuai.xi     }
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi     if(IntStatus & RASP_INT_PAYLD2MIU)
449*53ee8cc1Swenshuai.xi     {
450*53ee8cc1Swenshuai.xi         //[FIXME] WAIT FOR IMEPLEMENTATAION
451*53ee8cc1Swenshuai.xi 
452*53ee8cc1Swenshuai.xi     }
453*53ee8cc1Swenshuai.xi 
454*53ee8cc1Swenshuai.xi     if(IntStatus & RASP_INT_EVENT_WATER_MARK)
455*53ee8cc1Swenshuai.xi     {
456*53ee8cc1Swenshuai.xi         //[FIXME] not imeplemted
457*53ee8cc1Swenshuai.xi     }
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     if(IntStatus & RASP_INT_TIME_WATER_MARK)
460*53ee8cc1Swenshuai.xi     {
461*53ee8cc1Swenshuai.xi         //[FIXME] not imeplemted
462*53ee8cc1Swenshuai.xi     }
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi     if(IntStatus & RASP_INT_EFRAME_RD_OVF)
465*53ee8cc1Swenshuai.xi     {
466*53ee8cc1Swenshuai.xi         //[FIXME] not imeplemted
467*53ee8cc1Swenshuai.xi     }
468*53ee8cc1Swenshuai.xi 
469*53ee8cc1Swenshuai.xi     if(IntStatus & RASP_INT_EFRAME_WT_OVF)
470*53ee8cc1Swenshuai.xi     {
471*53ee8cc1Swenshuai.xi         //[FIXME] not imeplemted
472*53ee8cc1Swenshuai.xi     }
473*53ee8cc1Swenshuai.xi 
474*53ee8cc1Swenshuai.xi 
475*53ee8cc1Swenshuai.xi     HAL_RASP_INT_ClrHW(EngId , 0xFFFF);
476*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(E_INT_IRQ_RASP);
477*53ee8cc1Swenshuai.xi 
478*53ee8cc1Swenshuai.xi     //MsOS_EnableInterrupt(NDS_INT_EMM_ECM );
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi 
482*53ee8cc1Swenshuai.xi 
483*53ee8cc1Swenshuai.xi 
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi static void _NDS_RASP_IsrTask(void)
486*53ee8cc1Swenshuai.xi {
487*53ee8cc1Swenshuai.xi 
488*53ee8cc1Swenshuai.xi     MS_U32 u32Events ,i ,p ,hi_count ,lo_count;;
489*53ee8cc1Swenshuai.xi     XECM_MSG            ecm_msg;
490*53ee8cc1Swenshuai.xi     MS_U32              EngId = 0;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi     while(1)
493*53ee8cc1Swenshuai.xi     {
494*53ee8cc1Swenshuai.xi         MsOS_WaitEvent(_nds_rasp_eventid, NDS_RASP_EVENT_ALL, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER);
495*53ee8cc1Swenshuai.xi 
496*53ee8cc1Swenshuai.xi         //printf("Rasp Task Get Event = %08lX\n",u32Events);
497*53ee8cc1Swenshuai.xi 
498*53ee8cc1Swenshuai.xi         for( i = 0 ; i < NDS_CAM_ECM_FLT_NUM ; i ++ )
499*53ee8cc1Swenshuai.xi         {
500*53ee8cc1Swenshuai.xi             if(u32Events & (0x1 << (i + NDS_RASP_ECM_OVERFLOW_SHIFT)))
501*53ee8cc1Swenshuai.xi             {
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi                 //memset(_u8RaspEcmBuf[EngId][i][0], 0x0 , 188 );
504*53ee8cc1Swenshuai.xi                 //memset(_u8RaspEcmBuf[EngId][i][1], 0x0 , 188 );
505*53ee8cc1Swenshuai.xi 
506*53ee8cc1Swenshuai.xi                 ecm_msg.ecm_buf_ptr = _u8RaspEcmBuf[EngId][i][0]; //NULL;
507*53ee8cc1Swenshuai.xi                 ecm_msg.rcv_status  = ECM_OVERFLOW;
508*53ee8cc1Swenshuai.xi 
509*53ee8cc1Swenshuai.xi                 XCORECA_EcmReceived(_rasp_ecm_flt[EngId][i].Xconn , &ecm_msg , hi_count, lo_count);
510*53ee8cc1Swenshuai.xi             }
511*53ee8cc1Swenshuai.xi             else
512*53ee8cc1Swenshuai.xi             {
513*53ee8cc1Swenshuai.xi                 MS_U8 valid = (u32Events >> (i*2)) & 0x3;
514*53ee8cc1Swenshuai.xi 
515*53ee8cc1Swenshuai.xi                 if(valid)
516*53ee8cc1Swenshuai.xi                 {
517*53ee8cc1Swenshuai.xi                     for (p = 0; p < 2; p++)
518*53ee8cc1Swenshuai.xi                     {
519*53ee8cc1Swenshuai.xi                         if ( (valid & (0x1<<p)) && _u8RaspEcmBuf[EngId][i][p][0] == 0x47 && _u8RaspEcmBuf[EngId][i][p][5] == (0x80|p))
520*53ee8cc1Swenshuai.xi                         {
521*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_filter_num = i;
522*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_buf_ptr    = _u8RaspEcmBuf[EngId][i][p]+8;
523*53ee8cc1Swenshuai.xi                             ecm_msg.ecm_polarity   = ((p==0) ? HDICA_EVEN_BUFFER : HDICA_ODD_BUFFER);
524*53ee8cc1Swenshuai.xi                             ecm_msg.rcv_status     = ECM_OK;
525*53ee8cc1Swenshuai.xi                             //_NDS_REC_GetPktCount(_EcmFlt[i].x_connect, &hi_count, &lo_count);
526*53ee8cc1Swenshuai.xi                             if (XCORECA_EcmReceived(_rasp_ecm_flt[EngId][i].Xconn , &ecm_msg , hi_count, lo_count) != CA_OK)
527*53ee8cc1Swenshuai.xi                             {
528*53ee8cc1Swenshuai.xi                                 XHDICA_ReleaseEcmBuffer(_rasp_ecm_flt[EngId][i].Xconn , ecm_msg.ecm_filter_num, ecm_msg.ecm_polarity, ecm_msg.ecm_buf_ptr);
529*53ee8cc1Swenshuai.xi                             }
530*53ee8cc1Swenshuai.xi                         }
531*53ee8cc1Swenshuai.xi                     }
532*53ee8cc1Swenshuai.xi                 }
533*53ee8cc1Swenshuai.xi 
534*53ee8cc1Swenshuai.xi             } //end if overflow
535*53ee8cc1Swenshuai.xi         } // end for
536*53ee8cc1Swenshuai.xi 
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi         RASP_REG(REG_RASP_CA_INT) = (RASP_CA_INT_ECM);
539*53ee8cc1Swenshuai.xi     }// while(1)
540*53ee8cc1Swenshuai.xi }
541*53ee8cc1Swenshuai.xi 
542*53ee8cc1Swenshuai.xi 
543*53ee8cc1Swenshuai.xi #endif
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi 
547