1*53ee8cc1Swenshuai.xi
2*53ee8cc1Swenshuai.xi #include <string.h>
3*53ee8cc1Swenshuai.xi #include "MsCommon.h"
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi
6*53ee8cc1Swenshuai.xi #include "hdi_121.h"
7*53ee8cc1Swenshuai.xi #include "nsk_dbg.h"
8*53ee8cc1Swenshuai.xi #include "apiDMX.h"
9*53ee8cc1Swenshuai.xi #include "nsk2hdi_header.h"
10*53ee8cc1Swenshuai.xi
11*53ee8cc1Swenshuai.xi
12*53ee8cc1Swenshuai.xi /*****************************************************************************\
13*53ee8cc1Swenshuai.xi \Definitions
14*53ee8cc1Swenshuai.xi \*****************************************************************************/
15*53ee8cc1Swenshuai.xi #define MDL_ECMFLT_OK 1
16*53ee8cc1Swenshuai.xi #define MDL_ECMFLT_FAIL 2
17*53ee8cc1Swenshuai.xi #define MDL_ECMFLT_INVALID_REQUEST 3
18*53ee8cc1Swenshuai.xi #define ECMFLT_TASK_STACK_SIZE 16*1024
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi #define ECMBufferSize 188
21*53ee8cc1Swenshuai.xi
22*53ee8cc1Swenshuai.xi #define ECMDMX_BufferSize ECMBufferSize*100
23*53ee8cc1Swenshuai.xi
24*53ee8cc1Swenshuai.xi #define ECMPacketArrive 0x10000
25*53ee8cc1Swenshuai.xi #define ECMBufOverFlow 0x100000
26*53ee8cc1Swenshuai.xi
27*53ee8cc1Swenshuai.xi #define ECMRecvieBuf 10
28*53ee8cc1Swenshuai.xi
29*53ee8cc1Swenshuai.xi #define MaximumConnection 2
30*53ee8cc1Swenshuai.xi
31*53ee8cc1Swenshuai.xi #define MaximumDmxId 128
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xi #define ECMStopFlag 0xFF
34*53ee8cc1Swenshuai.xi
35*53ee8cc1Swenshuai.xi #define EcmTmpBufSize 10*1024
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xi
38*53ee8cc1Swenshuai.xi /*****************************************************************************\
39*53ee8cc1Swenshuai.xi \ local variables
40*53ee8cc1Swenshuai.xi \*****************************************************************************/
41*53ee8cc1Swenshuai.xi static MS_U8 _u8EcmFltIsInit = FALSE;
42*53ee8cc1Swenshuai.xi
43*53ee8cc1Swenshuai.xi static MS_S32 _s32ECMFLTMutexId = -1;
44*53ee8cc1Swenshuai.xi static MS_S32 _s32ECMFLTEventId = -1;
45*53ee8cc1Swenshuai.xi static MS_S32 _s32ECMDFLTTaskId = -1;
46*53ee8cc1Swenshuai.xi
47*53ee8cc1Swenshuai.xi static void* _pECMDFLTTaskStack;
48*53ee8cc1Swenshuai.xi //static MS_U8 _u8ECMDFLT_StackBuffer[ECMFLT_TASK_STACK_SIZE];
49*53ee8cc1Swenshuai.xi
50*53ee8cc1Swenshuai.xi static MS_U16 Pids[MaximumDmxId];
51*53ee8cc1Swenshuai.xi static MS_U8 *ECMAllocBuf[MaximumDmxId];
52*53ee8cc1Swenshuai.xi static MS_U16 ECM_Connection[MaximumDmxId];
53*53ee8cc1Swenshuai.xi static MS_U8 ECMBufCnt[MaximumDmxId];
54*53ee8cc1Swenshuai.xi static MS_U8 *pECMBufBack[MaximumDmxId][ECMRecvieBuf];
55*53ee8cc1Swenshuai.xi static MS_U8 ECMFlags[MaximumDmxId][2];
56*53ee8cc1Swenshuai.xi
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xi //prepare larger buffer first...
59*53ee8cc1Swenshuai.xi static MS_U8 TmpBuf[EcmTmpBufSize];
60*53ee8cc1Swenshuai.xi static MS_U8 last_ecm_polarity[2] = {2,2};
61*53ee8cc1Swenshuai.xi
62*53ee8cc1Swenshuai.xi static MS_BOOL XConnFileInFlag[2] = {FALSE,FALSE};
63*53ee8cc1Swenshuai.xi static NDS_USHORT _gecm_pid[2] = {0x0,0x0};
64*53ee8cc1Swenshuai.xi
65*53ee8cc1Swenshuai.xi static MS_U32 _bEcm_log = FALSE;
66*53ee8cc1Swenshuai.xi
67*53ee8cc1Swenshuai.xi static NDS_UBYTE *plastECM;
68*53ee8cc1Swenshuai.xi
69*53ee8cc1Swenshuai.xi
70*53ee8cc1Swenshuai.xi /*****************************************************************************\
71*53ee8cc1Swenshuai.xi \ global variables
72*53ee8cc1Swenshuai.xi \*****************************************************************************/
73*53ee8cc1Swenshuai.xi
74*53ee8cc1Swenshuai.xi
75*53ee8cc1Swenshuai.xi /*****************************************************************************\
76*53ee8cc1Swenshuai.xi \ local functions
77*53ee8cc1Swenshuai.xi \*****************************************************************************/
data_dump(MS_U8 * pu8Buf,MS_U32 BufSize)78*53ee8cc1Swenshuai.xi void data_dump(MS_U8* pu8Buf, MS_U32 BufSize)
79*53ee8cc1Swenshuai.xi {
80*53ee8cc1Swenshuai.xi MS_U32 i ;
81*53ee8cc1Swenshuai.xi
82*53ee8cc1Swenshuai.xi for( i = 0 ; i < BufSize ; i ++ ){
83*53ee8cc1Swenshuai.xi if((i%16) == 0 ) printf("\n");
84*53ee8cc1Swenshuai.xi printf("%02X ",*(pu8Buf + i));
85*53ee8cc1Swenshuai.xi }
86*53ee8cc1Swenshuai.xi }
87*53ee8cc1Swenshuai.xi
_NSK2_ECMDFLT_Isr_Proc(void)88*53ee8cc1Swenshuai.xi static void _NSK2_ECMDFLT_Isr_Proc(void)
89*53ee8cc1Swenshuai.xi {
90*53ee8cc1Swenshuai.xi
91*53ee8cc1Swenshuai.xi MS_U32 u32Events;
92*53ee8cc1Swenshuai.xi MS_U8 DmxIdSect;
93*53ee8cc1Swenshuai.xi MS_U8* pu8Read;
94*53ee8cc1Swenshuai.xi MS_U8* pu8Write;
95*53ee8cc1Swenshuai.xi MS_U8 ecm_polarity;
96*53ee8cc1Swenshuai.xi MS_U8* pu8VARead;
97*53ee8cc1Swenshuai.xi MS_U32 DataLen, DataRmn;
98*53ee8cc1Swenshuai.xi MS_U8* pu8Ptr;
99*53ee8cc1Swenshuai.xi MS_U16 connection;
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi while (1)
102*53ee8cc1Swenshuai.xi {
103*53ee8cc1Swenshuai.xi //NSK_TRACE(("ECMDFLT_Isr_Proc wait Event\n"));
104*53ee8cc1Swenshuai.xi MsOS_WaitEvent(_s32ECMFLTEventId, 0xFFFFFFFF /*ECMFLT_STATES_GROUP*/, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER /*1000*/ );
105*53ee8cc1Swenshuai.xi
106*53ee8cc1Swenshuai.xi //NSK_TRACE(("u32Event = %x\n",u32Events));
107*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_s32ECMFLTMutexId,MSOS_WAIT_FOREVER);
108*53ee8cc1Swenshuai.xi
109*53ee8cc1Swenshuai.xi
110*53ee8cc1Swenshuai.xi DmxIdSect = (u32Events & 0xff);
111*53ee8cc1Swenshuai.xi connection = ((u32Events>>8) & 0xff);
112*53ee8cc1Swenshuai.xi //NSK_TRACE(("DmxIdSect:%x, connection = %x\n",DmxIdSect,connection));
113*53ee8cc1Swenshuai.xi
114*53ee8cc1Swenshuai.xi if( ECMFlags[DmxIdSect][0] == ECMStopFlag )
115*53ee8cc1Swenshuai.xi {
116*53ee8cc1Swenshuai.xi NSK_TRACE(("ECM already stop\n"));
117*53ee8cc1Swenshuai.xi goto ProcEnd;
118*53ee8cc1Swenshuai.xi }
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.xi // Get Buffer Read Pointer.
121*53ee8cc1Swenshuai.xi MApi_DMX_SectReadGet(DmxIdSect, (MS_PHY*)(&pu8Read));
122*53ee8cc1Swenshuai.xi //NSK_TRACE(("Read pointer = 0x%08lx\n", (MS_U32)pu8Read));
123*53ee8cc1Swenshuai.xi
124*53ee8cc1Swenshuai.xi // Get Buffer Write Pointer.
125*53ee8cc1Swenshuai.xi MApi_DMX_SectWriteGet(DmxIdSect, (MS_PHY*)(&pu8Write));
126*53ee8cc1Swenshuai.xi //NSK_TRACE(("Write pointer = 0x%08lx\n", (MS_U32)pu8Write));
127*53ee8cc1Swenshuai.xi
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi if ((pu8Write- pu8Read) == 0 )
130*53ee8cc1Swenshuai.xi {
131*53ee8cc1Swenshuai.xi NSK_TRACE(("\n !! No Section Get - Wait timeout \n" ));
132*53ee8cc1Swenshuai.xi }
133*53ee8cc1Swenshuai.xi else
134*53ee8cc1Swenshuai.xi {
135*53ee8cc1Swenshuai.xi //NSK_TRACE(("bytes need to be readed = %x\n",((MS_U32)pu8Write- (MS_U32)pu8Read)));
136*53ee8cc1Swenshuai.xi //memcpy(_u8ECMBuf, (void *)MsOS_PA2KSEG1((MS_U32)pu8Read), 188);
137*53ee8cc1Swenshuai.xi
138*53ee8cc1Swenshuai.xi #if 1 // temp, Jeff
139*53ee8cc1Swenshuai.xi MsOS_ReadMemory();
140*53ee8cc1Swenshuai.xi //DMA_Api for user to Copy data from HW section Buffer into user data Buffer.
141*53ee8cc1Swenshuai.xi MApi_DMX_CopyData(DmxIdSect,TmpBuf,EcmTmpBufSize,&DataLen,&DataRmn,NULL);
142*53ee8cc1Swenshuai.xi #endif
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi //NSK_TRACE(("copy data length = %x, data remain = %x\n",DataLen,DataRmn));
145*53ee8cc1Swenshuai.xi
146*53ee8cc1Swenshuai.xi if(DataRmn!=0)
147*53ee8cc1Swenshuai.xi {
148*53ee8cc1Swenshuai.xi MApi_DMX_CopyData(DmxIdSect,&TmpBuf[DataLen],EcmTmpBufSize,&DataLen,&DataRmn,NULL);
149*53ee8cc1Swenshuai.xi //NSK_TRACE(("2. copy data length = %x, data remain = %x\n",DataLen,DataRmn));
150*53ee8cc1Swenshuai.xi }
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi pu8VARead = (MS_U8 *)TmpBuf;
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi //NSK_TRACE(("first six bytes are (%x,%x,%x,%x,%x,%x)\n",pu8VARead[0],pu8VARead[1],pu8VARead[2],pu8VARead[3],pu8VARead[4],pu8VARead[5]));
155*53ee8cc1Swenshuai.xi ecm_polarity = 0;
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi //printf("Read[5]=%x,len=%d\n",pu8VARead[5],((MS_U32)pu8Write- (MS_U32)pu8Read) );
158*53ee8cc1Swenshuai.xi if (pu8VARead[5] == 0x80)
159*53ee8cc1Swenshuai.xi {
160*53ee8cc1Swenshuai.xi ecm_polarity = NSK2HDX_EVEN_ECM; // EVEN
161*53ee8cc1Swenshuai.xi }
162*53ee8cc1Swenshuai.xi else if (pu8VARead[5] == 0x81)
163*53ee8cc1Swenshuai.xi {
164*53ee8cc1Swenshuai.xi ecm_polarity = NSK2HDX_ODD_ECM; // ODD
165*53ee8cc1Swenshuai.xi }
166*53ee8cc1Swenshuai.xi else
167*53ee8cc1Swenshuai.xi {
168*53ee8cc1Swenshuai.xi printf("there is error at packet data,%x\n",DmxIdSect);
169*53ee8cc1Swenshuai.xi goto ProcEnd;
170*53ee8cc1Swenshuai.xi //NDS_ASSERT(FALSE, , "[%s]-[%d]\n", __FUNCTION__, __LINE__);
171*53ee8cc1Swenshuai.xi }
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi
174*53ee8cc1Swenshuai.xi if( ECMFlags[DmxIdSect][ecm_polarity] == 0 )
175*53ee8cc1Swenshuai.xi {
176*53ee8cc1Swenshuai.xi if(last_ecm_polarity[DmxIdSect] != ecm_polarity)
177*53ee8cc1Swenshuai.xi {
178*53ee8cc1Swenshuai.xi ECMFlags[DmxIdSect][ecm_polarity] = 1;
179*53ee8cc1Swenshuai.xi last_ecm_polarity[DmxIdSect] = ecm_polarity;
180*53ee8cc1Swenshuai.xi ECMBufCnt[DmxIdSect] ++;
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi pu8Ptr = MApi_NSK2_AllocateMemory(180*2, TRUE /*CACHED*/);
183*53ee8cc1Swenshuai.xi if(pu8Ptr == NULL)
184*53ee8cc1Swenshuai.xi {
185*53ee8cc1Swenshuai.xi NSK_ERROR(("null pointer from allocate memory\n"));
186*53ee8cc1Swenshuai.xi continue;
187*53ee8cc1Swenshuai.xi }
188*53ee8cc1Swenshuai.xi pECMBufBack[DmxIdSect][ECMBufCnt[DmxIdSect]] = pu8Ptr;
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi memcpy(pu8Ptr,&pu8VARead[8],180);
191*53ee8cc1Swenshuai.xi
192*53ee8cc1Swenshuai.xi //printf("call NSK2HDX_EcmArrived, conn = %x, polarity = %x, DmxIdSect = %x\n",connection,ecm_polarity,DmxIdSect);
193*53ee8cc1Swenshuai.xi //printf("call NSK2HDX_EcmArrived, conn = %x, polarity = %x, DmxIdSect = %x\n",connection,ecm_polarity,DmxIdSect);
194*53ee8cc1Swenshuai.xi //printf("polarity=%x, ",ecm_polarity);
195*53ee8cc1Swenshuai.xi //printf("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",pu8Ptr[0],pu8Ptr[1],pu8Ptr[2],pu8Ptr[3],pu8Ptr[4],pu8Ptr[5],pu8Ptr[6],pu8Ptr[7],pu8Ptr[8],pu8Ptr[9]);
196*53ee8cc1Swenshuai.xi //printf("before calling ecm arrive = %d\n",MsOS_GetSystemTime());
197*53ee8cc1Swenshuai.xi //connection needs to modify....
198*53ee8cc1Swenshuai.xi NSK2HDX_EcmArrived(connection, Pids[DmxIdSect], (NDS_UBYTE *)pu8Ptr/* RPC SIZECONST(256) */, ecm_polarity /*polarity*/);
199*53ee8cc1Swenshuai.xi //printf("end of NSK2HDX_EcmArrived\n");
200*53ee8cc1Swenshuai.xi //printf("end of calling ecm arrive = %d\n",MsOS_GetSystemTime());
201*53ee8cc1Swenshuai.xi //NSK2Util_PrintPacket(&pu8VARead[0],188);
202*53ee8cc1Swenshuai.xi }
203*53ee8cc1Swenshuai.xi }
204*53ee8cc1Swenshuai.xi }
205*53ee8cc1Swenshuai.xi
206*53ee8cc1Swenshuai.xi ProcEnd:
207*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_s32ECMFLTMutexId);
208*53ee8cc1Swenshuai.xi
209*53ee8cc1Swenshuai.xi } // Task while loop
210*53ee8cc1Swenshuai.xi }
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi
214*53ee8cc1Swenshuai.xi // Data callback function for event setting.
215*53ee8cc1Swenshuai.xi // Callback function inform user thread the section status.
216*53ee8cc1Swenshuai.xi // If in Polling mode, user thread need to polling filter status by themselves.
_NSK2_ECMDFLT_DataCb(MS_U8 u8DmxId,DMX_EVENT enFilterStatus)217*53ee8cc1Swenshuai.xi static void _NSK2_ECMDFLT_DataCb(MS_U8 u8DmxId, DMX_EVENT enFilterStatus)
218*53ee8cc1Swenshuai.xi {
219*53ee8cc1Swenshuai.xi MS_U8 connection;
220*53ee8cc1Swenshuai.xi
221*53ee8cc1Swenshuai.xi if(enFilterStatus == DMX_EVENT_DATA_READY)
222*53ee8cc1Swenshuai.xi {
223*53ee8cc1Swenshuai.xi //MsOS_DelayTaskUs(1000);
224*53ee8cc1Swenshuai.xi connection = ECM_Connection[u8DmxId];
225*53ee8cc1Swenshuai.xi //printf("ecm buffer DATA_READY, u8DmxId = %x, connection = %x\n",u8DmxId,connection);
226*53ee8cc1Swenshuai.xi MsOS_SetEvent(_s32ECMFLTEventId, ( (u8DmxId) | (connection<<8) | ECMPacketArrive) );
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi //this delay is to separate the same ID cause the event error....
229*53ee8cc1Swenshuai.xi MsOS_DelayTask(1);
230*53ee8cc1Swenshuai.xi }
231*53ee8cc1Swenshuai.xi else if(enFilterStatus == DMX_EVENT_BUF_OVERFLOW)
232*53ee8cc1Swenshuai.xi {
233*53ee8cc1Swenshuai.xi printf("ecm buffer overflow\n");
234*53ee8cc1Swenshuai.xi MApi_DMX_Stop(u8DmxId);
235*53ee8cc1Swenshuai.xi MApi_DMX_Start(u8DmxId);
236*53ee8cc1Swenshuai.xi }
237*53ee8cc1Swenshuai.xi }
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi /*****************************************************************************\
240*53ee8cc1Swenshuai.xi \ global functions
241*53ee8cc1Swenshuai.xi \*****************************************************************************/
242*53ee8cc1Swenshuai.xi
243*53ee8cc1Swenshuai.xi
NSK2HDX_SetEcmLog(MS_U32 * bEn)244*53ee8cc1Swenshuai.xi MS_U32 NSK2HDX_SetEcmLog(MS_U32 *bEn)
245*53ee8cc1Swenshuai.xi {
246*53ee8cc1Swenshuai.xi _bEcm_log = *bEn;
247*53ee8cc1Swenshuai.xi return TRUE;
248*53ee8cc1Swenshuai.xi }
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi //use our tsp to do ecm filter...
251*53ee8cc1Swenshuai.xi //so, the function body is porting on middleware directly...
252*53ee8cc1Swenshuai.xi
NSK2_ECMFLT_Init(void)253*53ee8cc1Swenshuai.xi MS_U32 NSK2_ECMFLT_Init(void)
254*53ee8cc1Swenshuai.xi {
255*53ee8cc1Swenshuai.xi //NSK_TRACE(("enter NSK2_ECMFLT_Init\n"));
256*53ee8cc1Swenshuai.xi if(_u8EcmFltIsInit == FALSE)
257*53ee8cc1Swenshuai.xi {
258*53ee8cc1Swenshuai.xi //NSK_TRACE(("CreateEventGroup\n"));
259*53ee8cc1Swenshuai.xi _s32ECMFLTEventId = MsOS_CreateEventGroup("ECMFLT_Event");
260*53ee8cc1Swenshuai.xi if (_s32ECMFLTEventId < 0)
261*53ee8cc1Swenshuai.xi {
262*53ee8cc1Swenshuai.xi NSK_ERROR(("CreateEvent fail\n"));
263*53ee8cc1Swenshuai.xi return MDL_ECMFLT_FAIL;
264*53ee8cc1Swenshuai.xi }
265*53ee8cc1Swenshuai.xi //NSK_TRACE(("_s32ECMFLTEventId = %d\n",_s32ECMFLTEventId));
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi _s32ECMFLTMutexId = MsOS_CreateMutex(E_MSOS_FIFO, "ECMFLT_Mutex", MSOS_PROCESS_SHARED);
268*53ee8cc1Swenshuai.xi if (_s32ECMFLTMutexId < 0)
269*53ee8cc1Swenshuai.xi {
270*53ee8cc1Swenshuai.xi NSK_ERROR(("CreateMutex fail\n"));
271*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32ECMFLTEventId);
272*53ee8cc1Swenshuai.xi return MDL_ECMFLT_FAIL;
273*53ee8cc1Swenshuai.xi }
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi _pECMDFLTTaskStack = MApi_NSK2_AllocateMemory(ECMFLT_TASK_STACK_SIZE, TRUE); //_u8ECMDFLT_StackBuffer;
276*53ee8cc1Swenshuai.xi if(_pECMDFLTTaskStack == NULL)
277*53ee8cc1Swenshuai.xi {
278*53ee8cc1Swenshuai.xi NSK_ERROR(("null pointer from allocate memory\n"));
279*53ee8cc1Swenshuai.xi
280*53ee8cc1Swenshuai.xi return FALSE;
281*53ee8cc1Swenshuai.xi }
282*53ee8cc1Swenshuai.xi _s32ECMDFLTTaskId = MsOS_CreateTask((TaskEntry)_NSK2_ECMDFLT_Isr_Proc,
283*53ee8cc1Swenshuai.xi (MS_U32)NULL,
284*53ee8cc1Swenshuai.xi E_TASK_PRI_HIGH/*E_TASK_PRI_HIGH*/,
285*53ee8cc1Swenshuai.xi TRUE,
286*53ee8cc1Swenshuai.xi NULL,
287*53ee8cc1Swenshuai.xi ECMFLT_TASK_STACK_SIZE,
288*53ee8cc1Swenshuai.xi "ECMFLT_ISR_Task");
289*53ee8cc1Swenshuai.xi if (_s32ECMDFLTTaskId < 0)
290*53ee8cc1Swenshuai.xi {
291*53ee8cc1Swenshuai.xi NSK_ERROR(("CreateTask fail\n"));
292*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32ECMFLTEventId);
293*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(_s32ECMFLTMutexId);
294*53ee8cc1Swenshuai.xi return MDL_ECMFLT_FAIL;
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi _u8EcmFltIsInit = TRUE;
297*53ee8cc1Swenshuai.xi }
298*53ee8cc1Swenshuai.xi else
299*53ee8cc1Swenshuai.xi {
300*53ee8cc1Swenshuai.xi //NSK_TRACE(("EMMFlt had been initialed\n"));
301*53ee8cc1Swenshuai.xi }
302*53ee8cc1Swenshuai.xi
303*53ee8cc1Swenshuai.xi
304*53ee8cc1Swenshuai.xi MS_U16 i;
305*53ee8cc1Swenshuai.xi
306*53ee8cc1Swenshuai.xi for(i=0;i<MaximumDmxId;i++)
307*53ee8cc1Swenshuai.xi {
308*53ee8cc1Swenshuai.xi ECM_Connection[i]=0xff;
309*53ee8cc1Swenshuai.xi }
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi NSK2HDX_SetEcmHwInfo(ECMRecvieBuf);
312*53ee8cc1Swenshuai.xi return MDL_ECMFLT_OK;
313*53ee8cc1Swenshuai.xi }
314*53ee8cc1Swenshuai.xi
315*53ee8cc1Swenshuai.xi
NSK2HDX_RequestEcm(NDS_ULONG x_connection,NDS_USHORT ecm_pid)316*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_RequestEcm(NDS_ULONG x_connection, NDS_USHORT ecm_pid)
317*53ee8cc1Swenshuai.xi {
318*53ee8cc1Swenshuai.xi NSK_TRACE(("enxter NSK2HDX_RequestEcm\n"));
319*53ee8cc1Swenshuai.xi NSK_TRACE(("x_connection = %x, ecm_pid = %x\n",x_connection,ecm_pid));
320*53ee8cc1Swenshuai.xi
321*53ee8cc1Swenshuai.xi MS_U8 pattern[16], mask[16], nmask[16];
322*53ee8cc1Swenshuai.xi MS_U8 DmxIdSect;
323*53ee8cc1Swenshuai.xi DMX_FILTER_TYPE FilterType;
324*53ee8cc1Swenshuai.xi MS_U8* pu8BufAddr;
325*53ee8cc1Swenshuai.xi DMX_Flt_info FltInfo;
326*53ee8cc1Swenshuai.xi MS_U16 u16Pid = ecm_pid;
327*53ee8cc1Swenshuai.xi
328*53ee8cc1Swenshuai.xi memset(pattern,0x0,16);
329*53ee8cc1Swenshuai.xi memset(mask,0x0,16);
330*53ee8cc1Swenshuai.xi memset(nmask,0x0,16);
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi
333*53ee8cc1Swenshuai.xi if(x_connection == 1) //file In
334*53ee8cc1Swenshuai.xi {
335*53ee8cc1Swenshuai.xi //char FileName[50]="NSK2_D_EcmFilter.mpg";
336*53ee8cc1Swenshuai.xi if(XConnFileInFlag[x_connection] == FALSE)
337*53ee8cc1Swenshuai.xi {
338*53ee8cc1Swenshuai.xi XConnFileInFlag[x_connection] = TRUE;
339*53ee8cc1Swenshuai.xi _gecm_pid[x_connection] = ecm_pid;
340*53ee8cc1Swenshuai.xi }
341*53ee8cc1Swenshuai.xi else
342*53ee8cc1Swenshuai.xi {
343*53ee8cc1Swenshuai.xi if(ecm_pid == _gecm_pid[x_connection])
344*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
345*53ee8cc1Swenshuai.xi }
346*53ee8cc1Swenshuai.xi
347*53ee8cc1Swenshuai.xi //FilterType = DMX_FILTER_TYPE_PACKET | DMX_FILTER_SOURCE_TYPE_FILE;
348*53ee8cc1Swenshuai.xi FilterType = MApi_NSK2_EcmGetFilterType(x_connection);
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi //MS_U32 pPktSize = 188;
351*53ee8cc1Swenshuai.xi //appDemo_DmxFileIn_Start(FileName,&pPktSize);
352*53ee8cc1Swenshuai.xi }
353*53ee8cc1Swenshuai.xi else //Live In if x_connection==0
354*53ee8cc1Swenshuai.xi {
355*53ee8cc1Swenshuai.xi if(XConnFileInFlag[x_connection] == FALSE)
356*53ee8cc1Swenshuai.xi {
357*53ee8cc1Swenshuai.xi XConnFileInFlag[x_connection] = TRUE;
358*53ee8cc1Swenshuai.xi _gecm_pid[x_connection] = ecm_pid;
359*53ee8cc1Swenshuai.xi }
360*53ee8cc1Swenshuai.xi else
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi if(ecm_pid == _gecm_pid[x_connection])
363*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
364*53ee8cc1Swenshuai.xi }
365*53ee8cc1Swenshuai.xi
366*53ee8cc1Swenshuai.xi //FilterType = DMX_FILTER_TYPE_PACKET | DMX_FILTER_SOURCE_TYPE_LIVE;
367*53ee8cc1Swenshuai.xi FilterType = MApi_NSK2_EcmGetFilterType(x_connection);
368*53ee8cc1Swenshuai.xi }
369*53ee8cc1Swenshuai.xi
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi // Allocate a Filter and set Filter Basic Type
372*53ee8cc1Swenshuai.xi if (DMX_FILTER_STATUS_OK != MApi_DMX_Open(FilterType, &DmxIdSect))
373*53ee8cc1Swenshuai.xi {
374*53ee8cc1Swenshuai.xi NSK_ERROR(("[%s] Allocate filter fail \n",__FUNCTION__));
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi NSK_TRACE(("Req DmxIdSect = %x \n",DmxIdSect));
378*53ee8cc1Swenshuai.xi
379*53ee8cc1Swenshuai.xi // Here we use pre-defined physical address of reserved section buffer.
380*53ee8cc1Swenshuai.xi // [Note] The section buffe MUST be continus in physical address space.(for DMA usage)
381*53ee8cc1Swenshuai.xi
382*53ee8cc1Swenshuai.xi pu8BufAddr = (MS_U8*)MApi_NSK2_AllocateMemory(ECMDMX_BufferSize, FALSE);
383*53ee8cc1Swenshuai.xi if(pu8BufAddr == NULL)
384*53ee8cc1Swenshuai.xi {
385*53ee8cc1Swenshuai.xi NSK_ERROR(("null pointer from allocate memory\n"));
386*53ee8cc1Swenshuai.xi return NSK2HDX_FAIL;
387*53ee8cc1Swenshuai.xi }
388*53ee8cc1Swenshuai.xi memset(pu8BufAddr, 0 , ECMDMX_BufferSize);
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi // Transfer Virtual Address to Phisical Hardware Address
391*53ee8cc1Swenshuai.xi // Section buffer is structed as ring buffer, keep 4 pointer of start,end ,read and write.
392*53ee8cc1Swenshuai.xi FltInfo.Info.SectInfo.SectBufAddr = MsOS_VA2PA((MS_VIRT)pu8BufAddr);
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi //NSK_TRACE(("Physical Address = %08lx\n" ,FltInfo.Info.SectInfo.SectBufAddr));
395*53ee8cc1Swenshuai.xi // Set buffer size
396*53ee8cc1Swenshuai.xi FltInfo.Info.SectInfo.SectBufSize = ECMDMX_BufferSize;
397*53ee8cc1Swenshuai.xi //NSK_TRACE(("Size = %08lx\n" ,FltInfo.Info.SectInfo.SectBufSize));
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi FltInfo.Info.SectInfo.SectMode = DMX_SECT_MODE_CONTI;
401*53ee8cc1Swenshuai.xi
402*53ee8cc1Swenshuai.xi // <DMX_EVENT_DATA_READY/DMX_EVENT_BUF_OVERFLOW>
403*53ee8cc1Swenshuai.xi // Event trigger condition for driver, Driver will call ap's callback < CallBack Mode Type2 >
404*53ee8cc1Swenshuai.xi FltInfo.Info.SectInfo.Event = DMX_EVENT_DATA_READY | DMX_EVENT_BUF_OVERFLOW | DMX_EVENT_CB_SELF ;
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi // Set the pointer of the event CB function into Demux driver
407*53ee8cc1Swenshuai.xi FltInfo.Info.SectInfo.pNotify = &_NSK2_ECMDFLT_DataCb;
408*53ee8cc1Swenshuai.xi
409*53ee8cc1Swenshuai.xi // Set Advanced Filter infomation
410*53ee8cc1Swenshuai.xi if (DMX_FILTER_STATUS_OK != MApi_DMX_Info( DmxIdSect, &FltInfo, &FilterType, TRUE))
411*53ee8cc1Swenshuai.xi {
412*53ee8cc1Swenshuai.xi NSK_ERROR(("[%s] MApi_DMX_Info fail \n",__FUNCTION__));
413*53ee8cc1Swenshuai.xi }
414*53ee8cc1Swenshuai.xi
415*53ee8cc1Swenshuai.xi // Set Filter PID --> Section PID
416*53ee8cc1Swenshuai.xi if (DMX_FILTER_STATUS_OK != MApi_DMX_Pid( DmxIdSect , &u16Pid , TRUE))
417*53ee8cc1Swenshuai.xi {
418*53ee8cc1Swenshuai.xi NSK_ERROR(("[%s] MApi_DMX_Pid fail \n",__FUNCTION__));
419*53ee8cc1Swenshuai.xi }
420*53ee8cc1Swenshuai.xi
421*53ee8cc1Swenshuai.xi //keep PIDs, buffer.
422*53ee8cc1Swenshuai.xi Pids[DmxIdSect] = u16Pid;
423*53ee8cc1Swenshuai.xi ECMAllocBuf[DmxIdSect] = pu8BufAddr;
424*53ee8cc1Swenshuai.xi
425*53ee8cc1Swenshuai.xi //printf("Alloc ECM BUF:%x \n",ECMAllocBuf[DmxIdSect]);
426*53ee8cc1Swenshuai.xi ECM_Connection[DmxIdSect] = x_connection;
427*53ee8cc1Swenshuai.xi
428*53ee8cc1Swenshuai.xi
429*53ee8cc1Swenshuai.xi ECMBufCnt[DmxIdSect] = 0;
430*53ee8cc1Swenshuai.xi ECMFlags[DmxIdSect][0] = ECMFlags[DmxIdSect][1] = 0;
431*53ee8cc1Swenshuai.xi last_ecm_polarity[DmxIdSect] = 2;
432*53ee8cc1Swenshuai.xi
433*53ee8cc1Swenshuai.xi
434*53ee8cc1Swenshuai.xi
435*53ee8cc1Swenshuai.xi // Reset Section filter and section Buffer status;
436*53ee8cc1Swenshuai.xi MApi_DMX_SectReset(DmxIdSect);
437*53ee8cc1Swenshuai.xi
438*53ee8cc1Swenshuai.xi
439*53ee8cc1Swenshuai.xi // Set Section Match pattern
440*53ee8cc1Swenshuai.xi // The Match pattern is used for Getting specific section
441*53ee8cc1Swenshuai.xi // Pattern[16] = Pattern for match
442*53ee8cc1Swenshuai.xi // Mask[16] = Match Mask : set 1 for match / 0 for ignore
443*53ee8cc1Swenshuai.xi MApi_DMX_SectPatternSet(DmxIdSect, pattern, mask, nmask, 16);
444*53ee8cc1Swenshuai.xi
445*53ee8cc1Swenshuai.xi
446*53ee8cc1Swenshuai.xi // Start Filter and record section into Section Buffer.
447*53ee8cc1Swenshuai.xi if (DMX_FILTER_STATUS_OK!= MApi_DMX_Start(DmxIdSect))
448*53ee8cc1Swenshuai.xi {
449*53ee8cc1Swenshuai.xi NSK_ERROR(("enable section filter fail\n"));
450*53ee8cc1Swenshuai.xi }
451*53ee8cc1Swenshuai.xi
452*53ee8cc1Swenshuai.xi NSK_TRACE(("leave NSK2HDX_RequestEcm\n"));
453*53ee8cc1Swenshuai.xi
454*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
455*53ee8cc1Swenshuai.xi }
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi
NSK2HDX_StopEcm(NDS_ULONG x_connection,NDS_USHORT ecm_pid)458*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_StopEcm(NDS_ULONG x_connection, NDS_USHORT ecm_pid)
459*53ee8cc1Swenshuai.xi {
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi MsOS_ObtainMutex(_s32ECMFLTMutexId,MSOS_WAIT_FOREVER);
462*53ee8cc1Swenshuai.xi
463*53ee8cc1Swenshuai.xi //NSK_TRACE(("enxter NSK2HDX_StopEcm\n"));
464*53ee8cc1Swenshuai.xi NSK_TRACE(("x_connection = %x, ecm_pid = %x\n",x_connection,ecm_pid));
465*53ee8cc1Swenshuai.xi
466*53ee8cc1Swenshuai.xi MS_U16 DmxIdSect = 0;
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi MS_U16 FoundInList[0xff]={0};
469*53ee8cc1Swenshuai.xi MS_U8 Founded = 0;
470*53ee8cc1Swenshuai.xi
471*53ee8cc1Swenshuai.xi XConnFileInFlag[x_connection] = FALSE;
472*53ee8cc1Swenshuai.xi
473*53ee8cc1Swenshuai.xi #if 0
474*53ee8cc1Swenshuai.xi if(x_connection == 1)
475*53ee8cc1Swenshuai.xi {
476*53ee8cc1Swenshuai.xi appDemo_DmxFileIn_Stop();
477*53ee8cc1Swenshuai.xi }
478*53ee8cc1Swenshuai.xi #endif
479*53ee8cc1Swenshuai.xi //it needs to free DMX filter.......
480*53ee8cc1Swenshuai.xi
481*53ee8cc1Swenshuai.xi for(DmxIdSect = 0 ; DmxIdSect<MaximumDmxId; DmxIdSect++)
482*53ee8cc1Swenshuai.xi {
483*53ee8cc1Swenshuai.xi //printf("Q_DmxIdSect:%x\n",ECM_Connection[DmxIdSect]);
484*53ee8cc1Swenshuai.xi }
485*53ee8cc1Swenshuai.xi
486*53ee8cc1Swenshuai.xi for(DmxIdSect = 0 ; DmxIdSect<MaximumDmxId; DmxIdSect++)
487*53ee8cc1Swenshuai.xi {
488*53ee8cc1Swenshuai.xi //printf("Q_Pids[DmxIdSect]:%x\n",Pids[DmxIdSect]);
489*53ee8cc1Swenshuai.xi }
490*53ee8cc1Swenshuai.xi
491*53ee8cc1Swenshuai.xi for(DmxIdSect = 0 ; DmxIdSect<MaximumDmxId; DmxIdSect++)
492*53ee8cc1Swenshuai.xi {
493*53ee8cc1Swenshuai.xi if ((ECM_Connection[DmxIdSect] == x_connection) && (ecm_pid == Pids[DmxIdSect]))
494*53ee8cc1Swenshuai.xi {
495*53ee8cc1Swenshuai.xi ECM_Connection[DmxIdSect] = 0xff;
496*53ee8cc1Swenshuai.xi FoundInList[DmxIdSect] = 1;
497*53ee8cc1Swenshuai.xi Founded = 1;
498*53ee8cc1Swenshuai.xi NSK_TRACE(("DmxIdSect found is = %d\n",DmxIdSect));
499*53ee8cc1Swenshuai.xi break;
500*53ee8cc1Swenshuai.xi }
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi
503*53ee8cc1Swenshuai.xi
504*53ee8cc1Swenshuai.xi if(Founded == 0)
505*53ee8cc1Swenshuai.xi {
506*53ee8cc1Swenshuai.xi NSK_ERROR(("can't find pid to stop\n"));
507*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_s32ECMFLTMutexId);
508*53ee8cc1Swenshuai.xi return NSK2HDX_INVALID_REQUEST;
509*53ee8cc1Swenshuai.xi }
510*53ee8cc1Swenshuai.xi else
511*53ee8cc1Swenshuai.xi {
512*53ee8cc1Swenshuai.xi NSK_TRACE(("DmxIdSect = %x\n",DmxIdSect));
513*53ee8cc1Swenshuai.xi }
514*53ee8cc1Swenshuai.xi
515*53ee8cc1Swenshuai.xi
516*53ee8cc1Swenshuai.xi for(DmxIdSect = 0 ; DmxIdSect<MaximumDmxId; DmxIdSect++)
517*53ee8cc1Swenshuai.xi {
518*53ee8cc1Swenshuai.xi if( FoundInList[DmxIdSect] == 1)
519*53ee8cc1Swenshuai.xi {
520*53ee8cc1Swenshuai.xi // Stop Filter
521*53ee8cc1Swenshuai.xi MApi_DMX_Stop(DmxIdSect);
522*53ee8cc1Swenshuai.xi MApi_DMX_Close(DmxIdSect);
523*53ee8cc1Swenshuai.xi
524*53ee8cc1Swenshuai.xi Pids[DmxIdSect] = 0xffff;
525*53ee8cc1Swenshuai.xi
526*53ee8cc1Swenshuai.xi // Free Filter.
527*53ee8cc1Swenshuai.xi //MApi_DMX_Close(DmxIdSect);
528*53ee8cc1Swenshuai.xi
529*53ee8cc1Swenshuai.xi Pids[DmxIdSect] = 0xffff;
530*53ee8cc1Swenshuai.xi ECMBufCnt[DmxIdSect] = 0;
531*53ee8cc1Swenshuai.xi ECMFlags[DmxIdSect][0] = ECMFlags[DmxIdSect][1] = ECMStopFlag;
532*53ee8cc1Swenshuai.xi
533*53ee8cc1Swenshuai.xi //free allocate buffer...Jeff, need to implement
534*53ee8cc1Swenshuai.xi //MsOS_FreeMemory((MS_U8*)ECMAllocBuf[DmxIdSect], gs32NonCachedPoolID);
535*53ee8cc1Swenshuai.xi }
536*53ee8cc1Swenshuai.xi
537*53ee8cc1Swenshuai.xi }
538*53ee8cc1Swenshuai.xi NSK_TRACE(("leave NSK2HDX_StopEcm\n"));
539*53ee8cc1Swenshuai.xi
540*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(_s32ECMFLTMutexId);
541*53ee8cc1Swenshuai.xi
542*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
543*53ee8cc1Swenshuai.xi }
NSK2HDX_EcmProcessingFinished(NDS_USHORT ecm_pid,NDS_UBYTE * ecm_buf,NDS_UBYTE polarity)544*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_EcmProcessingFinished(NDS_USHORT ecm_pid, NDS_UBYTE *ecm_buf/* RPC SIZECONST(256) */, NDS_UBYTE polarity)
545*53ee8cc1Swenshuai.xi {
546*53ee8cc1Swenshuai.xi NSK_TRACE(("ecm_buf = 0x%p, ecm_pid = 0x%x, polarity = 0x%x\n",ecm_buf,ecm_pid,polarity));
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi MS_U8 DmxIdSect = 0;
549*53ee8cc1Swenshuai.xi MS_U8 i,found_in_list;
550*53ee8cc1Swenshuai.xi
551*53ee8cc1Swenshuai.xi found_in_list=0;
552*53ee8cc1Swenshuai.xi //it needs to free DMX filter.......
553*53ee8cc1Swenshuai.xi
554*53ee8cc1Swenshuai.xi for(DmxIdSect = 0 ; DmxIdSect<MaximumDmxId; DmxIdSect++)
555*53ee8cc1Swenshuai.xi {
556*53ee8cc1Swenshuai.xi for(i=0;i<ECMRecvieBuf;i++)
557*53ee8cc1Swenshuai.xi {
558*53ee8cc1Swenshuai.xi if(ecm_buf == pECMBufBack[DmxIdSect][i])
559*53ee8cc1Swenshuai.xi {
560*53ee8cc1Swenshuai.xi pECMBufBack[DmxIdSect][i] = 0;
561*53ee8cc1Swenshuai.xi found_in_list = 1;
562*53ee8cc1Swenshuai.xi break;
563*53ee8cc1Swenshuai.xi }
564*53ee8cc1Swenshuai.xi }
565*53ee8cc1Swenshuai.xi if(found_in_list == 1)
566*53ee8cc1Swenshuai.xi {
567*53ee8cc1Swenshuai.xi break;
568*53ee8cc1Swenshuai.xi }
569*53ee8cc1Swenshuai.xi }
570*53ee8cc1Swenshuai.xi
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi //printf("Free DmxIdSect:%x\n",DmxIdSect);
573*53ee8cc1Swenshuai.xi
574*53ee8cc1Swenshuai.xi ECMBufCnt[DmxIdSect] --;
575*53ee8cc1Swenshuai.xi ECMFlags[DmxIdSect][polarity] = 0;
576*53ee8cc1Swenshuai.xi
577*53ee8cc1Swenshuai.xi if(plastECM != ecm_buf) //patch double release bug of verifier lib, 2014Dec15
578*53ee8cc1Swenshuai.xi MApi_NSK2_FreeMemory(ecm_buf, TRUE);
579*53ee8cc1Swenshuai.xi
580*53ee8cc1Swenshuai.xi plastECM = ecm_buf;
581*53ee8cc1Swenshuai.xi
582*53ee8cc1Swenshuai.xi NSK_TRACE(("leave NSK2HDX_EcmProcessingFinished\n"));
583*53ee8cc1Swenshuai.xi
584*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
585*53ee8cc1Swenshuai.xi }
586