1
2 #include <string.h>
3 #include "MsCommon.h"
4
5 #include "hdi_121.h"
6 #include "nsk_dbg.h"
7 #include "drvEMMFlt.h"
8 #include "drvNSK2Type.h"
9 #include "nsk2hdi_header.h"
10 #include "nsk2hdx_header.h"
11
12 /*****************************************************************************\
13 \ local defines
14 \*****************************************************************************/
15 #define HARMRetFrom8 8
16 #define EMMReturnStart HARMRetFrom8
17
18 //--------------------------------------------------------------------------------------------------
19 // Local Variables
20 //--------------------------------------------------------------------------------------------------
21 static void *pDstBuf;
22 static MS_BOOL _bStop = FALSE;
23 //--------------------------------------------------------------------------------------------------
24 // Global Variables
25 //--------------------------------------------------------------------------------------------------
26
27 /*****************************************************************************\
28 \ local functions
29 \*****************************************************************************/
30
NSK2_EMMFLT_Notify(MS_U32 conn,MS_U32 reason,void * pData)31 void NSK2_EMMFLT_Notify(MS_U32 conn, MS_U32 reason, void *pData)
32 {
33 NDS_UBYTE *pEMMBuf;
34 //printf("************************************NSK2_EMMFLT_Notify\n");
35
36 if(EMM_EVENT_ARRIVE == reason)
37 {
38 //printf("************************************EMM_EVENT_ARRIVE\n");
39 pEMMBuf = (NDS_UBYTE *)pData;
40 //MsOS_ReadMemory();
41 //printf("BYTE 29, 30 = %x, %x\n",pEMMBuf[28+EMMReturnStart],pEMMBuf[29+EMMReturnStart]);
42 //printf("pData = %x\n", (MS_U32)pData);
43 //printf("emm return buf = %x\n", (MS_U32)&pEMMBuf[EMMReturnStart]);
44 if(_bStop == FALSE)
45 {
46 NSK2HDX_EmmArrived(conn, &pEMMBuf[EMMReturnStart]/* RPC SIZECONST(256) */);
47 }
48 }
49 else if(EMM_EVENT_OVERFLOW == reason)
50 {
51 NSK_TRACE(("EMM_EVENT_OVERFLOW\n"));
52 NSK2HDX_EmmBufferOverflow(conn);
53 }
54 }
55
NSK2_EMMFLT_Init(EMM_Init_Paras_t * pInitPara)56 MS_U32 NSK2_EMMFLT_Init(EMM_Init_Paras_t *pInitPara)
57 {
58 EMMFLT_RESULT init_result, bufcnt_result;
59 EMMFLT_Require_t tRequre;
60 MS_PHY u64AlignAddr;
61 MS_U32 BufCnt;
62
63 MDrv_EMMFLT_SetDbgLevel(EMM_DBGLV_INFO);
64
65 memset(&tRequre,0x0,sizeof(tRequre));
66 init_result = MDrv_EMMFLT_Init(&tRequre);
67 NSK_TRACE(("test by Jeff, init_result = %x \n",init_result));
68
69 //MDrv_EMMFLT_SrcSelect(0, EMM_SRC_LIVEIN, EMM_SRC_INTERDEMOD_0);
70 MDrv_EMMFLT_SrcSelect(0, pInitPara->u32SrcFrom, pInitPara->u32SrcType);
71
72
73 //allocate one memory for EMM fliter hw use....
74 pDstBuf = MApi_NSK2_AllocateMemory((tRequre.u32DstBufSize + tRequre.u32AlignBytes), FALSE);
75 if(pDstBuf == NULL)
76 {
77 NSK_ERROR(("null pointer from allocate memory\n"));
78 return FALSE;
79 }
80
81 memset(pDstBuf,0x0,(tRequre.u32DstBufSize + tRequre.u32AlignBytes));
82
83 u64AlignAddr = MsOS_VA2PA((MS_VIRT)pDstBuf);
84
85 u64AlignAddr = ( (u64AlignAddr + tRequre.u32AlignBytes) & (~(tRequre.u32AlignBytes-1)) );
86 NSK_TRACE(("u64AlignAddr = 0x%llx, AllocBuf = %p\n",u64AlignAddr,pDstBuf));
87
88
89 MDrv_EMMFLT_SetDstBufInfo(0,(MS_U32)u64AlignAddr, tRequre.u32DstBufSize);
90
91 bufcnt_result = MDrv_EMMFLT_GetHwBufCnt(&BufCnt);
92 NSK2HDX_SetEmmHwInfo(BufCnt);
93 MDrv_EMMFLT_SetNotify(&NSK2_EMMFLT_Notify);
94 return TRUE;
95 }
96
NSK2HDX_RequestEmm(NDS_ULONG x_connection,NSK2HDX_EMM_FILTER * emmfl)97 NDS_STATUS32 NSK2HDX_RequestEmm(NDS_ULONG x_connection, NSK2HDX_EMM_FILTER *emmfl/* RPC IN OUT */)
98 {
99 MS_U16 i;
100
101 //printf("enxter NSK2HDX_RequestEmm\n");
102 NSK_INFO(("enxter x_connection = %x \n",x_connection));
103
104 //MDrv_EMMFLT_SrcSelect(0, EMM_SRC_LIVEIN, EMM_SRC_INTERDEMOD_0);
105
106 NSK_INFO(("pid = %x, num_of_filters = %x\n",emmfl->emm_pid,emmfl->num_of_filters));
107 for(i=0;i<16;i++)
108 {
109 NSK_INFO(("table_id[%x]=%x, table_id_flag[%x]=%x\n",i,emmfl->table_id[i],i,emmfl->table_id_flag[i]));
110 }
111
112 for(i=0;i<emmfl->num_of_filters;i++)
113 {
114 if(i>7)
115 {
116 break;
117 }
118 NSK_INFO(("Address[%x] = (%x, %x, %x, %x)\n",i, emmfl->filter_def[i].filter_address[0], \
119 emmfl->filter_def[i].filter_address[1],emmfl->filter_def[i].filter_address[2],emmfl->filter_def[i].filter_address[3]));
120
121 NSK_INFO(("Mask[%x] = (%x, %x, %x, %x)\n",i, emmfl->filter_def[i].filter_address_mask[0], \
122 emmfl->filter_def[i].filter_address_mask[1],emmfl->filter_def[i].filter_address_mask[2],emmfl->filter_def[i].filter_address_mask[3]));
123 NSK_INFO(("type = %x\n",emmfl->filter_def[i].filter_type));
124 }
125
126 #if 0
127 emmfl->filter_def[0].filter_address[3] = 0x8;
128 emmfl->filter_def[1].filter_address_mask[3] = 0x0;
129 emmfl->filter_def[2].filter_address_mask[0] = emmfl->filter_def[2].filter_address_mask[1] = 0x0;
130 emmfl->filter_def[2].filter_address_mask[2] = emmfl->filter_def[2].filter_address_mask[3] = 0x0;
131 emmfl->filter_def[2].filter_address[0] = 0x1;
132 emmfl->filter_def[2].filter_address[1] = 0x2;
133 emmfl->filter_def[2].filter_address[2] = 0x3;
134 emmfl->filter_def[2].filter_address[3] = 0x4;
135 #endif
136
137 emmfl->emm_pid |= 0x8000;
138
139 MS_U8 TID_Enable = FALSE;
140 MS_U8 num_of_flt,u8I;
141 EMM_FILTER_DEF_t tEMMFilter;
142 //check TID flag.....
143 for(i = 0; i< 16 ; i++)
144 {
145 if(emmfl->table_id[i] == 0)
146 {
147 MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_INGORE);
148 continue;
149 }
150
151 TID_Enable = TRUE;
152 //DRVEMM_DBG(EMM_DBGLV_DEBUG,"table_id(%d) = %x\n",u8I,pEmmFlt->table_id[u8I]);
153
154 if(emmfl->table_id_flag[i] == NSK2HDX_DISABLE_TID)
155 {
156 MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_INGORE);
157 }
158 else if(emmfl->table_id_flag[i] == NSK2HDX_ENABLE_TID)
159 {
160 MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_ACCEPT_ALL);
161 }
162 else if(emmfl->table_id_flag[i] == NSK2HDX_ENABLE_TID_NDS)
163 {
164 MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_ACCEPT_ADDRESS);
165 }
166 else
167 {
168 MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_RESERVED);
169 }
170 }
171
172 NSK_INFO(("Set PID\n"));
173 MDrv_EMMFLT_SetEmmPID(x_connection,emmfl->emm_pid);
174
175 NSK_INFO(("Enable TID\n"));
176 MDrv_EMMFLT_EnableEmmTID(x_connection,TID_Enable);
177
178 if(emmfl->num_of_filters > 8) //fixed bug 6th
179 {
180 NSK_ERROR(("num_of_filters > 8 !!!!!\n"));
181 return NSK2HDX_INVALID_REQUEST;
182 }
183 else
184 {
185 num_of_flt = (MS_U8) emmfl->num_of_filters;
186 }
187
188 NSK_INFO(("Set Filter CFG\n"));
189 for(u8I = 0; u8I< num_of_flt ; u8I++)
190 {
191 memset(&tEMMFilter,0x0,sizeof(EMM_FILTER_DEF_t));
192 memcpy(&tEMMFilter,&emmfl->filter_def[u8I],sizeof(EMM_FILTER_DEF_t));
193 MDrv_EMMFLT_SetFilterCfg(x_connection,u8I,&tEMMFilter);
194 }
195
196 _bStop = FALSE;
197 //fire EMM filter to wait stream...
198 MDrv_EMMFLT_Fire(x_connection);
199
200 NSK_INFO(("leave NSK2HDX_RequestEmm\n"));
201 return NSK2HDX_OK;
202 }
203
NSK2HDX_StopEmm(NDS_ULONG x_connection)204 NDS_STATUS32 NSK2HDX_StopEmm(NDS_ULONG x_connection)
205 {
206 NSK_TRACE(("enxter NSK2HDX_StopEmm\n"));
207 _bStop = TRUE;
208 MDrv_EMMFLT_StopEmm(x_connection);
209 NSK_TRACE(("leave NSK2HDX_StopEmm\n"));
210 return NSK2HDX_OK;
211 }
212
NSK2HDX_EmmProcessingFinished(NDS_UBYTE * emm_buf)213 NDS_STATUS32 NSK2HDX_EmmProcessingFinished(NDS_UBYTE *emm_buf/* RPC SIZECONST(256) */)
214 {
215 NSK_TRACE(("enxter NSK2HDX_EmmProcessingFinished\n"));
216 //MsOS_DelayTask(10);
217
218 //printf("enxter NSK2HDX_EmmProcessingFinished \n");
219 //return NSK2HDX_OK;
220 MDrv_EMMFLT_EmmProcessingFinished(emm_buf-EMMReturnStart);
221 //printf("leave NSK2HDX_EmmProcessingFinished \n");
222 //NSK_TRACE(("leave NSK2HDX_EmmProcessingFinished\n"));
223 return NSK2HDX_OK;
224 }
225
226
227