xref: /utopia/UTPA2-700.0.x/modules/dscmb/api/nsk2hdi/nsk2hdx_ecmflt.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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