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