1*53ee8cc1Swenshuai.xi
2*53ee8cc1Swenshuai.xi #include <string.h>
3*53ee8cc1Swenshuai.xi #include "MsCommon.h"
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi #include "drvNDSSC.h"
6*53ee8cc1Swenshuai.xi #include "drvGPIO.h"
7*53ee8cc1Swenshuai.xi
8*53ee8cc1Swenshuai.xi #include "hdi_121.h"
9*53ee8cc1Swenshuai.xi #include "nsk_dbg.h"
10*53ee8cc1Swenshuai.xi #include "nsk2hdx_header.h"
11*53ee8cc1Swenshuai.xi
12*53ee8cc1Swenshuai.xi /*****************************************************************************\
13*53ee8cc1Swenshuai.xi \ local defines
14*53ee8cc1Swenshuai.xi \*****************************************************************************/
15*53ee8cc1Swenshuai.xi #define SC_0 0
16*53ee8cc1Swenshuai.xi #define SC_1 1
17*53ee8cc1Swenshuai.xi
18*53ee8cc1Swenshuai.xi #define Default_SC_DEV SC_0
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_MASK0 0x0000000F
21*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_MASK1 0x000000F0
22*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_IN0 0x00000001
23*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_OUT0 0x00000002
24*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_IN1 0x00000010
25*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_OUT1 0x00000020
26*53ee8cc1Swenshuai.xi #define NSK2_SC_EVT_STOP 0x00000100
27*53ee8cc1Swenshuai.xi
28*53ee8cc1Swenshuai.xi #define Default_SC_PARAM _T0_InitParam
29*53ee8cc1Swenshuai.xi #define HDX_SC_TASK_STACK_SIZE 16*1024
30*53ee8cc1Swenshuai.xi
31*53ee8cc1Swenshuai.xi #define SMC_PPS 0
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xi
34*53ee8cc1Swenshuai.xi static MS_U32 SCTimeOut = 0;
35*53ee8cc1Swenshuai.xi static MS_U32 SCHWTimeOut = 0;
36*53ee8cc1Swenshuai.xi #define SCTimeOutOffset SCTimeOut
37*53ee8cc1Swenshuai.xi #define SCHWTimeOutOffset SCHWTimeOut
38*53ee8cc1Swenshuai.xi
39*53ee8cc1Swenshuai.xi #define INITIAL_WAITING_TIME 960 //SPEC 7816-3
40*53ee8cc1Swenshuai.xi #define LEAST_TC2_VALUE 0xA //least WWT value NDS stated
41*53ee8cc1Swenshuai.xi
42*53ee8cc1Swenshuai.xi /*****************************************************************************\
43*53ee8cc1Swenshuai.xi \ global variables
44*53ee8cc1Swenshuai.xi \*****************************************************************************/
45*53ee8cc1Swenshuai.xi NSK2HDX_UARTCONFIGURATION gSC_conf[2] = {
46*53ee8cc1Swenshuai.xi {
47*53ee8cc1Swenshuai.xi .card_clock = NSK2HDX_SC_CLOCK_1,
48*53ee8cc1Swenshuai.xi .card_baud_rate = NSK2HDX_SC_BR_3,
49*53ee8cc1Swenshuai.xi .protocol = NSK2HDX_SC_PROTOCOL_T_0,
50*53ee8cc1Swenshuai.xi },
51*53ee8cc1Swenshuai.xi {
52*53ee8cc1Swenshuai.xi .card_clock = NSK2HDX_SC_CLOCK_1,
53*53ee8cc1Swenshuai.xi .card_baud_rate = NSK2HDX_SC_BR_3,
54*53ee8cc1Swenshuai.xi .protocol = NSK2HDX_SC_PROTOCOL_T_0,
55*53ee8cc1Swenshuai.xi }
56*53ee8cc1Swenshuai.xi };
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xi SC_Param gSCInitParams[2];
59*53ee8cc1Swenshuai.xi NDS_UBYTE gbPin_Mask = NSK2HDX_UART_COMMAND_IO_C7_ON;
60*53ee8cc1Swenshuai.xi /*****************************************************************************\
61*53ee8cc1Swenshuai.xi \ local variables
62*53ee8cc1Swenshuai.xi \*****************************************************************************/
63*53ee8cc1Swenshuai.xi
64*53ee8cc1Swenshuai.xi //NDS_ULONG sc_reader_id[] = {SC_0, SC_1};
65*53ee8cc1Swenshuai.xi NDS_ULONG sc_reader_id[] = {SC_0};
66*53ee8cc1Swenshuai.xi
67*53ee8cc1Swenshuai.xi static MS_U8 _atrbuf[SC_ATR_LEN_MAX];
68*53ee8cc1Swenshuai.xi static MS_U8 _historybuf[SC_HIST_LEN_MAX];
69*53ee8cc1Swenshuai.xi static MS_U16 _atrlen = 0;
70*53ee8cc1Swenshuai.xi static MS_U16 _historylen = 0;
71*53ee8cc1Swenshuai.xi
72*53ee8cc1Swenshuai.xi static MS_U8 _u8HDX_SCIsInit = FALSE;
73*53ee8cc1Swenshuai.xi static MS_S32 _s32HDX_SCEventId = -1;
74*53ee8cc1Swenshuai.xi static MS_S32 _s32HDX_SCTaskId = -1;
75*53ee8cc1Swenshuai.xi
76*53ee8cc1Swenshuai.xi static void* _pHDX_SCTaskStack;
77*53ee8cc1Swenshuai.xi static MS_U8 _u8HDX_SC_StackBuffer[HDX_SC_TASK_STACK_SIZE];
78*53ee8cc1Swenshuai.xi
79*53ee8cc1Swenshuai.xi static MS_U8 u8GT_record =0;
80*53ee8cc1Swenshuai.xi static MS_U8 u8Baudrate_record = 0;
81*53ee8cc1Swenshuai.xi
82*53ee8cc1Swenshuai.xi
83*53ee8cc1Swenshuai.xi static NDS_UBYTE _gSC_Vcc_Level = NSK2HDX_VCC_5V;
84*53ee8cc1Swenshuai.xi static MS_U32 _bSC_log = FALSE;
85*53ee8cc1Swenshuai.xi static NDS_UBYTE gGuardTime = 0;
86*53ee8cc1Swenshuai.xi
87*53ee8cc1Swenshuai.xi static MS_BOOL isDefaultUART=TRUE;
88*53ee8cc1Swenshuai.xi
89*53ee8cc1Swenshuai.xi extern void _NDS_T0_CmdTest(MS_U32 u8SCID);
90*53ee8cc1Swenshuai.xi
91*53ee8cc1Swenshuai.xi
92*53ee8cc1Swenshuai.xi typedef struct
93*53ee8cc1Swenshuai.xi {
94*53ee8cc1Swenshuai.xi MS_U8 TA1byte;
95*53ee8cc1Swenshuai.xi MS_U32 clock_rate;
96*53ee8cc1Swenshuai.xi MS_U32 clock_rate_conversion;
97*53ee8cc1Swenshuai.xi } SC_rate_conversion;
98*53ee8cc1Swenshuai.xi
99*53ee8cc1Swenshuai.xi static SC_rate_conversion SC_Rate_Table[] =
100*53ee8cc1Swenshuai.xi {
101*53ee8cc1Swenshuai.xi {0x11, 72/*4.5*16*/, 372*16},
102*53ee8cc1Swenshuai.xi {0x12, 72/*4.5*16*/, 372*16},
103*53ee8cc1Swenshuai.xi {0x13, 72/*4.5*16*/, 372*16},
104*53ee8cc1Swenshuai.xi {0x14, 72/*4.5*16*/, 372*16},
105*53ee8cc1Swenshuai.xi {0x15, 72/*4.5*16*/, 372*16},
106*53ee8cc1Swenshuai.xi {0x36, 108/*6.75*16*/, 744*16},
107*53ee8cc1Swenshuai.xi {0x5f, 216/*13.5*16*/, 1488*16},
108*53ee8cc1Swenshuai.xi {0x6f, 216/*13.5*16*/, 1860*16},
109*53ee8cc1Swenshuai.xi {0x96, 72/*4.5*16*/, 512*16},
110*53ee8cc1Swenshuai.xi };
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi
113*53ee8cc1Swenshuai.xi /*****************************************************************************\
114*53ee8cc1Swenshuai.xi \ local functions
115*53ee8cc1Swenshuai.xi \*****************************************************************************/
116*53ee8cc1Swenshuai.xi
_debug_param_print(MS_U8 u8SCID)117*53ee8cc1Swenshuai.xi static void _debug_param_print(MS_U8 u8SCID)
118*53ee8cc1Swenshuai.xi {
119*53ee8cc1Swenshuai.xi NSK_TRACE(("u8SCID = %d\n",u8SCID));
120*53ee8cc1Swenshuai.xi NSK_TRACE(("u8Protocal = %x\n",gSCInitParams[u8SCID].u8Protocal));
121*53ee8cc1Swenshuai.xi NSK_TRACE(("eCardClk = %d\n",gSCInitParams[u8SCID].eCardClk));
122*53ee8cc1Swenshuai.xi NSK_TRACE(("u8UartMode = %d\n",gSCInitParams[u8SCID].u8UartMode));
123*53ee8cc1Swenshuai.xi NSK_TRACE(("u16ClkDiv = %d\n",gSCInitParams[u8SCID].u16ClkDiv));
124*53ee8cc1Swenshuai.xi NSK_TRACE(("eVccCtrl = %d\n",gSCInitParams[u8SCID].eVccCtrl));
125*53ee8cc1Swenshuai.xi NSK_TRACE(("u16Bonding = %d\n",gSCInitParams[u8SCID].u16Bonding));
126*53ee8cc1Swenshuai.xi NSK_TRACE(("u8Convention = %d\n",gSCInitParams[u8SCID].u8Convention));
127*53ee8cc1Swenshuai.xi }
128*53ee8cc1Swenshuai.xi
_T0_InitParam(SC_Param * pParam)129*53ee8cc1Swenshuai.xi void _T0_InitParam(SC_Param *pParam)
130*53ee8cc1Swenshuai.xi {
131*53ee8cc1Swenshuai.xi pParam->eCardClk = E_SC_CLK_4P5M;
132*53ee8cc1Swenshuai.xi pParam->u8UartMode = SC_UART_CHAR_8 | SC_UART_STOP_2 | SC_UART_PARITY_ODD;
133*53ee8cc1Swenshuai.xi pParam->u16ClkDiv = (372 << 4);
134*53ee8cc1Swenshuai.xi }
135*53ee8cc1Swenshuai.xi
136*53ee8cc1Swenshuai.xi
_NSK2_verSC_Reset(MS_U8 u8SCID,SC_ResetType RstType)137*53ee8cc1Swenshuai.xi MS_BOOL _NSK2_verSC_Reset(MS_U8 u8SCID,SC_ResetType RstType)
138*53ee8cc1Swenshuai.xi {
139*53ee8cc1Swenshuai.xi MS_U8 _u8AtrBuf[SC_ATR_LEN_MAX];
140*53ee8cc1Swenshuai.xi MS_U16 _u16AtrLen = 255;
141*53ee8cc1Swenshuai.xi MS_U8 history[SC_HIST_LEN_MAX];
142*53ee8cc1Swenshuai.xi MS_U16 history_len = 200;
143*53ee8cc1Swenshuai.xi MS_U8 u8Protocol = 0xff;
144*53ee8cc1Swenshuai.xi SC_Param *pInitParams;
145*53ee8cc1Swenshuai.xi MS_U8 sc_clock;
146*53ee8cc1Swenshuai.xi // MS_U16 i;
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi NSK_TRACE(("Come to _NSK2_verSC_Reset\n"));
149*53ee8cc1Swenshuai.xi
150*53ee8cc1Swenshuai.xi MDrv_SC_T0_SetTimeOut( 150 * 10 );
151*53ee8cc1Swenshuai.xi memset(_u8AtrBuf, 0x00, sizeof(_u8AtrBuf));
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi pInitParams = &gSCInitParams[u8SCID];
154*53ee8cc1Swenshuai.xi _debug_param_print(u8SCID);
155*53ee8cc1Swenshuai.xi
156*53ee8cc1Swenshuai.xi #if 0
157*53ee8cc1Swenshuai.xi if (MDrv_SC_Reset(u8SCID, pInitParams) != E_SC_OK)
158*53ee8cc1Swenshuai.xi {
159*53ee8cc1Swenshuai.xi printf("[%s][%d] \n",__FUNCTION__,__LINE__);
160*53ee8cc1Swenshuai.xi return FALSE;
161*53ee8cc1Swenshuai.xi }
162*53ee8cc1Swenshuai.xi MDrv_SC_ClearState(u8SCID);
163*53ee8cc1Swenshuai.xi #endif
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi NSK_TRACE(("Start to Reset and Get ATR\n"));
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi //if (MDrv_SC_GetATR(u8SCID, 100*5, _u8AtrBuf, &_u16AtrLen, history, &history_len) == E_SC_OK)
168*53ee8cc1Swenshuai.xi if (MDrv_SC_Reset_ATR(u8SCID, pInitParams, _u8AtrBuf, &_u16AtrLen, history, &history_len) == E_SC_OK)
169*53ee8cc1Swenshuai.xi {
170*53ee8cc1Swenshuai.xi if (_u8AtrBuf[1] & 0x80)
171*53ee8cc1Swenshuai.xi {
172*53ee8cc1Swenshuai.xi u8Protocol = _u8AtrBuf[3] & 0xF;
173*53ee8cc1Swenshuai.xi }
174*53ee8cc1Swenshuai.xi else
175*53ee8cc1Swenshuai.xi {
176*53ee8cc1Swenshuai.xi u8Protocol = 0;
177*53ee8cc1Swenshuai.xi }
178*53ee8cc1Swenshuai.xi pInitParams->u8Protocal = u8Protocol;
179*53ee8cc1Swenshuai.xi
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi u8GT_record = _u8AtrBuf[4]; //Save GT
182*53ee8cc1Swenshuai.xi u8Baudrate_record = _u8AtrBuf[2] & 0xf; //Save TA1
183*53ee8cc1Swenshuai.xi
184*53ee8cc1Swenshuai.xi _atrlen = _u16AtrLen;
185*53ee8cc1Swenshuai.xi memcpy(_atrbuf,_u8AtrBuf,SC_ATR_LEN_MAX);
186*53ee8cc1Swenshuai.xi _historylen = history_len;
187*53ee8cc1Swenshuai.xi memcpy(_historybuf,history,SC_HIST_LEN_MAX);
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi //For setting SMC clock rate
190*53ee8cc1Swenshuai.xi sc_clock = (_atrbuf[2]>>4)&0xf;
191*53ee8cc1Swenshuai.xi if (3 == sc_clock ) //6.75MHz
192*53ee8cc1Swenshuai.xi {
193*53ee8cc1Swenshuai.xi pInitParams->eCardClk = E_SC_CLK_6M;
194*53ee8cc1Swenshuai.xi NSK_TRACE(("Change to 6.75MHz\n"));
195*53ee8cc1Swenshuai.xi }
196*53ee8cc1Swenshuai.xi else if( (5 == sc_clock ) || (6 == sc_clock ) )//13.5MHz
197*53ee8cc1Swenshuai.xi {
198*53ee8cc1Swenshuai.xi pInitParams->eCardClk = E_SC_CLK_13M;
199*53ee8cc1Swenshuai.xi NSK_TRACE(("Change to 13.5MHz\n"));
200*53ee8cc1Swenshuai.xi }
201*53ee8cc1Swenshuai.xi else if( (1 == sc_clock ) || (9 == sc_clock ) )//4.5MHz
202*53ee8cc1Swenshuai.xi {
203*53ee8cc1Swenshuai.xi pInitParams->eCardClk = E_SC_CLK_4P5M;
204*53ee8cc1Swenshuai.xi NSK_TRACE(("Change to 4.5MHz\n"));
205*53ee8cc1Swenshuai.xi }
206*53ee8cc1Swenshuai.xi else
207*53ee8cc1Swenshuai.xi {
208*53ee8cc1Swenshuai.xi ;
209*53ee8cc1Swenshuai.xi }
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi if (MDrv_SC_Config(u8SCID, pInitParams) != E_SC_OK)
212*53ee8cc1Swenshuai.xi {
213*53ee8cc1Swenshuai.xi printf("[%s][%d] \n",__FUNCTION__,__LINE__);
214*53ee8cc1Swenshuai.xi return FALSE;
215*53ee8cc1Swenshuai.xi }
216*53ee8cc1Swenshuai.xi MDrv_SC_SetGuardTime(u8SCID,_atrbuf[4]);
217*53ee8cc1Swenshuai.xi return TRUE;
218*53ee8cc1Swenshuai.xi }
219*53ee8cc1Swenshuai.xi else //For Card is not exist when initial
220*53ee8cc1Swenshuai.xi {
221*53ee8cc1Swenshuai.xi NSK_TRACE(("Get ATR Fail\n"));
222*53ee8cc1Swenshuai.xi pInitParams->eCardClk = E_SC_CLK_4P5M;
223*53ee8cc1Swenshuai.xi MDrv_SC_Config(u8SCID,pInitParams);
224*53ee8cc1Swenshuai.xi MDrv_SC_SetGuardTime(u8SCID,_atrbuf[4]);
225*53ee8cc1Swenshuai.xi }
226*53ee8cc1Swenshuai.xi MsOS_DelayTask(120);
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi return FALSE;
229*53ee8cc1Swenshuai.xi
230*53ee8cc1Swenshuai.xi }
231*53ee8cc1Swenshuai.xi
232*53ee8cc1Swenshuai.xi
233*53ee8cc1Swenshuai.xi
_SC_Notify(MS_U8 u8SCID,SC_Event eEvent)234*53ee8cc1Swenshuai.xi static void _SC_Notify(MS_U8 u8SCID, SC_Event eEvent)
235*53ee8cc1Swenshuai.xi {
236*53ee8cc1Swenshuai.xi
237*53ee8cc1Swenshuai.xi NSK_TRACE(("eEvent = %d, u8SCID = %x\n",eEvent,u8SCID));
238*53ee8cc1Swenshuai.xi switch (eEvent)
239*53ee8cc1Swenshuai.xi {
240*53ee8cc1Swenshuai.xi case E_SC_EVENT_IN:
241*53ee8cc1Swenshuai.xi NSK_TRACE(("SC_EVENT_IN, u8SCID = %x\n",u8SCID));
242*53ee8cc1Swenshuai.xi //MDrv_SC_Activate(0);
243*53ee8cc1Swenshuai.xi MsOS_SetEvent(_s32HDX_SCEventId, ( E_SC_EVENT_IN | (u8SCID<<8) ) );
244*53ee8cc1Swenshuai.xi break;
245*53ee8cc1Swenshuai.xi
246*53ee8cc1Swenshuai.xi case E_SC_EVENT_OUT:
247*53ee8cc1Swenshuai.xi NSK_TRACE(("SC_EVENT_OUT, u8SCID = %x\n",u8SCID));
248*53ee8cc1Swenshuai.xi #if 1
249*53ee8cc1Swenshuai.xi //MDrv_SC_DeactiveSeq();
250*53ee8cc1Swenshuai.xi MsOS_SetEvent(_s32HDX_SCEventId, ( E_SC_EVENT_OUT | (u8SCID<<8) ) );
251*53ee8cc1Swenshuai.xi #else
252*53ee8cc1Swenshuai.xi NSK2HDX_CardRemoved((NDS_ULONG)u8SCID); // inform the verifier
253*53ee8cc1Swenshuai.xi #endif
254*53ee8cc1Swenshuai.xi break;
255*53ee8cc1Swenshuai.xi case E_SC_EVENT_DATA:
256*53ee8cc1Swenshuai.xi NSK_TRACE(("SC_EVENT_DATA\n"));
257*53ee8cc1Swenshuai.xi break;
258*53ee8cc1Swenshuai.xi default:
259*53ee8cc1Swenshuai.xi break;
260*53ee8cc1Swenshuai.xi }
261*53ee8cc1Swenshuai.xi
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi }
264*53ee8cc1Swenshuai.xi
_HDX_SC_Notify_Proc(void)265*53ee8cc1Swenshuai.xi static void _HDX_SC_Notify_Proc(void)
266*53ee8cc1Swenshuai.xi {
267*53ee8cc1Swenshuai.xi MS_U32 u32Events;
268*53ee8cc1Swenshuai.xi MS_U8 u8SCID = 0;
269*53ee8cc1Swenshuai.xi while (1)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi NSK_TRACE(("_HDX_SC_Notify_Proc wait Event\n"));
272*53ee8cc1Swenshuai.xi MsOS_WaitEvent(_s32HDX_SCEventId, 0xFFFFFFFF /*ECMFLT_STATES_GROUP*/, &u32Events, E_OR_CLEAR, MSOS_WAIT_FOREVER /*1000*/ );
273*53ee8cc1Swenshuai.xi
274*53ee8cc1Swenshuai.xi u8SCID = (MS_U8)((u32Events>>8)&0xff);
275*53ee8cc1Swenshuai.xi NSK_TRACE(("u8SCID = %x\n",u8SCID));
276*53ee8cc1Swenshuai.xi
277*53ee8cc1Swenshuai.xi if( (u32Events&0xff) == E_SC_EVENT_IN)
278*53ee8cc1Swenshuai.xi {
279*53ee8cc1Swenshuai.xi //_NSK2_SC_Reset(u8SCID,&gSCInitParams[u8SCID]);
280*53ee8cc1Swenshuai.xi NSK2HDX_CardInserted((NDS_ULONG)u8SCID); // inform the verifier
281*53ee8cc1Swenshuai.xi }
282*53ee8cc1Swenshuai.xi else if( (u32Events&0xff) == E_SC_EVENT_OUT)
283*53ee8cc1Swenshuai.xi {
284*53ee8cc1Swenshuai.xi printf("card out notify\n");
285*53ee8cc1Swenshuai.xi MDrv_SC_Deactivate(u8SCID);
286*53ee8cc1Swenshuai.xi NSK2HDX_SetVcc(u8SCID,NSK2HDX_VCC_OFF);
287*53ee8cc1Swenshuai.xi NSK2HDX_CardRemoved((NDS_ULONG)u8SCID); // inform the verifier
288*53ee8cc1Swenshuai.xi }
289*53ee8cc1Swenshuai.xi
290*53ee8cc1Swenshuai.xi }
291*53ee8cc1Swenshuai.xi }
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi
NSK2_SC_Init(SC_Init_Paras_t * pInitPara)294*53ee8cc1Swenshuai.xi MS_BOOL NSK2_SC_Init(SC_Init_Paras_t *pInitPara)
295*53ee8cc1Swenshuai.xi {
296*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
297*53ee8cc1Swenshuai.xi
298*53ee8cc1Swenshuai.xi SC_Result errCode;
299*53ee8cc1Swenshuai.xi MS_U8 u8SCID = Default_SC_DEV;
300*53ee8cc1Swenshuai.xi SC_Param *pInitParams;
301*53ee8cc1Swenshuai.xi SC_Result eSCResult;
302*53ee8cc1Swenshuai.xi
303*53ee8cc1Swenshuai.xi if(_u8HDX_SCIsInit == FALSE)
304*53ee8cc1Swenshuai.xi {
305*53ee8cc1Swenshuai.xi NSK_TRACE(("CreateEventGroup\n"));
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi _s32HDX_SCEventId = MsOS_CreateEventGroup("HDX_SC_Event");
308*53ee8cc1Swenshuai.xi if (_s32HDX_SCEventId < 0)
309*53ee8cc1Swenshuai.xi {
310*53ee8cc1Swenshuai.xi NSK_ERROR(("CreateEvent fail\n"));
311*53ee8cc1Swenshuai.xi return FALSE;
312*53ee8cc1Swenshuai.xi }
313*53ee8cc1Swenshuai.xi
314*53ee8cc1Swenshuai.xi NSK_TRACE(("_s32ECMFLTEventId = %d\n",_s32HDX_SCEventId));
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi _pHDX_SCTaskStack = _u8HDX_SC_StackBuffer;
317*53ee8cc1Swenshuai.xi _s32HDX_SCTaskId = MsOS_CreateTask((TaskEntry)_HDX_SC_Notify_Proc,
318*53ee8cc1Swenshuai.xi (MS_U32)NULL,
319*53ee8cc1Swenshuai.xi E_TASK_PRI_MEDIUM,
320*53ee8cc1Swenshuai.xi TRUE,
321*53ee8cc1Swenshuai.xi _pHDX_SCTaskStack,
322*53ee8cc1Swenshuai.xi HDX_SC_TASK_STACK_SIZE,
323*53ee8cc1Swenshuai.xi "xxx");
324*53ee8cc1Swenshuai.xi if (_s32HDX_SCTaskId < 0)
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi NSK_ERROR(("CreateTask fail\n"));
327*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32HDX_SCEventId);
328*53ee8cc1Swenshuai.xi return FALSE;
329*53ee8cc1Swenshuai.xi }
330*53ee8cc1Swenshuai.xi
331*53ee8cc1Swenshuai.xi _u8HDX_SCIsInit = TRUE;
332*53ee8cc1Swenshuai.xi }
333*53ee8cc1Swenshuai.xi
334*53ee8cc1Swenshuai.xi if ( (errCode = MDrv_SC_Init(u8SCID)) != E_SC_OK )
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi NSK_ERROR(("Error code=%d\n", errCode));
337*53ee8cc1Swenshuai.xi return FALSE;
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi
340*53ee8cc1Swenshuai.xi pInitParams = &gSCInitParams[u8SCID];
341*53ee8cc1Swenshuai.xi memset(pInitParams,0x0,sizeof(SC_Param));
342*53ee8cc1Swenshuai.xi
343*53ee8cc1Swenshuai.xi SCTimeOut = pInitPara->DelayTime;
344*53ee8cc1Swenshuai.xi SCHWTimeOut = pInitPara->DelayTime;
345*53ee8cc1Swenshuai.xi if(pInitPara->b8024OnChip == TRUE)
346*53ee8cc1Swenshuai.xi {
347*53ee8cc1Swenshuai.xi pInitParams->eVccCtrl = E_SC_VCC_VCC_ONCHIP_8024;
348*53ee8cc1Swenshuai.xi printf(">>>>>>>>>Onchip 8024<<<<<<<<<<<\n");
349*53ee8cc1Swenshuai.xi }
350*53ee8cc1Swenshuai.xi else
351*53ee8cc1Swenshuai.xi {
352*53ee8cc1Swenshuai.xi pInitParams->eVccCtrl = E_SC_VCC_CTRL_8024_ON;
353*53ee8cc1Swenshuai.xi printf(">>>>>>>>>External 8024<<<<<<<<<<<\n");
354*53ee8cc1Swenshuai.xi }
355*53ee8cc1Swenshuai.xi
356*53ee8cc1Swenshuai.xi // Init params
357*53ee8cc1Swenshuai.xi pInitParams->eCardClk = E_SC_CLK_4P5M;
358*53ee8cc1Swenshuai.xi pInitParams->u16ClkDiv = (372<<4);
359*53ee8cc1Swenshuai.xi pInitParams->u8Protocal = 0;
360*53ee8cc1Swenshuai.xi pInitParams->pfOCPControl = NULL;
361*53ee8cc1Swenshuai.xi pInitParams->eResetType = E_SC_WARM_RESET;
362*53ee8cc1Swenshuai.xi pInitParams->u8UartMode = SC_UART_CHAR_8 | SC_UART_STOP_2 | SC_UART_PARITY_ODD;
363*53ee8cc1Swenshuai.xi pInitParams->eVoltage = E_SC_VOLTAGE_5V;
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi // Open
366*53ee8cc1Swenshuai.xi if ( (eSCResult = MDrv_SC_Open(u8SCID, pInitParams->u8Protocal, pInitParams, _SC_Notify)) != E_SC_OK)
367*53ee8cc1Swenshuai.xi {
368*53ee8cc1Swenshuai.xi NSK_ERROR(("MDrv_SC_Open fail code=%d \n", eSCResult));
369*53ee8cc1Swenshuai.xi return FALSE;
370*53ee8cc1Swenshuai.xi }
371*53ee8cc1Swenshuai.xi
372*53ee8cc1Swenshuai.xi NSK2HDX_SetScreaderHwInfo( &sc_reader_id[0],
373*53ee8cc1Swenshuai.xi sizeof(sc_reader_id)/sizeof(NDS_ULONG)); // inform verifier
374*53ee8cc1Swenshuai.xi
375*53ee8cc1Swenshuai.xi _debug_param_print(u8SCID);
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
378*53ee8cc1Swenshuai.xi return TRUE;
379*53ee8cc1Swenshuai.xi }
380*53ee8cc1Swenshuai.xi
NSK2HDX_CheckCardPresence(NDS_ULONG screader_id,NDS_ULONG * card_presence)381*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_CheckCardPresence(NDS_ULONG screader_id, NDS_ULONG *card_presence)
382*53ee8cc1Swenshuai.xi {
383*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
384*53ee8cc1Swenshuai.xi
385*53ee8cc1Swenshuai.xi SC_Status sc_status;
386*53ee8cc1Swenshuai.xi
387*53ee8cc1Swenshuai.xi NSK_PRINT(("Card ID:%d\n", screader_id));
388*53ee8cc1Swenshuai.xi if ( MDrv_SC_GetStatus((MS_U8)screader_id, &sc_status) != E_SC_OK )
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi NSK_ERROR(("Get Status fail\n"));
391*53ee8cc1Swenshuai.xi return NSK2HDX_FAIL;
392*53ee8cc1Swenshuai.xi }
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi NSK_TRACE(("bCardIn = %x\n",sc_status.bCardIn));
395*53ee8cc1Swenshuai.xi *card_presence = (sc_status.bCardIn) ? NSK2HDX_CARD_INSERTED : NSK2HDX_CARD_REMOVED;
396*53ee8cc1Swenshuai.xi
397*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
400*53ee8cc1Swenshuai.xi }
401*53ee8cc1Swenshuai.xi
NSK2HDX_SetVccLevel(NDS_ULONG screader_id,NDS_UBYTE vcc_level)402*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_SetVccLevel(NDS_ULONG screader_id, NDS_UBYTE vcc_level)
403*53ee8cc1Swenshuai.xi {
404*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi NSK_PRINT(("Vcc Level:%s\n", (vcc_level==NSK2HDX_VCC_5V)? "5V" : "3V"));
407*53ee8cc1Swenshuai.xi
408*53ee8cc1Swenshuai.xi if(_gSC_Vcc_Level == vcc_level)
409*53ee8cc1Swenshuai.xi {
410*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
411*53ee8cc1Swenshuai.xi }
412*53ee8cc1Swenshuai.xi else
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi _gSC_Vcc_Level = vcc_level;
415*53ee8cc1Swenshuai.xi }
416*53ee8cc1Swenshuai.xi
417*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
418*53ee8cc1Swenshuai.xi
419*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
420*53ee8cc1Swenshuai.xi }
421*53ee8cc1Swenshuai.xi
NSK2HDX_SetVcc(NDS_ULONG screader_id,NDS_UBYTE vcc_switch)422*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_SetVcc(NDS_ULONG screader_id, NDS_UBYTE vcc_switch)
423*53ee8cc1Swenshuai.xi {
424*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
425*53ee8cc1Swenshuai.xi
426*53ee8cc1Swenshuai.xi NSK_PRINT(("_Vcc switch:%s\n", (vcc_switch==NSK2HDX_VCC_ON)?"ON":"OFF"));
427*53ee8cc1Swenshuai.xi
428*53ee8cc1Swenshuai.xi if(vcc_switch==NSK2HDX_VCC_ON)
429*53ee8cc1Swenshuai.xi {
430*53ee8cc1Swenshuai.xi if(_gSC_Vcc_Level==NSK2HDX_VCC_5V)
431*53ee8cc1Swenshuai.xi {
432*53ee8cc1Swenshuai.xi MDrv_SC_CardVoltage_Config(screader_id,E_SC_VOLTAGE_5V);
433*53ee8cc1Swenshuai.xi }
434*53ee8cc1Swenshuai.xi else if(_gSC_Vcc_Level==NSK2HDX_VCC_3V)
435*53ee8cc1Swenshuai.xi {
436*53ee8cc1Swenshuai.xi MDrv_SC_CardVoltage_Config(screader_id,E_SC_VOLTAGE_3_POINT_3V);
437*53ee8cc1Swenshuai.xi }
438*53ee8cc1Swenshuai.xi else
439*53ee8cc1Swenshuai.xi {
440*53ee8cc1Swenshuai.xi NSK_PRINT(("Error VCC\n"));
441*53ee8cc1Swenshuai.xi }
442*53ee8cc1Swenshuai.xi }
443*53ee8cc1Swenshuai.xi else
444*53ee8cc1Swenshuai.xi {
445*53ee8cc1Swenshuai.xi MDrv_SC_CardVoltage_Config(screader_id,E_SC_VOLTAGE_OFF);
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
449*53ee8cc1Swenshuai.xi
450*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
451*53ee8cc1Swenshuai.xi }
452*53ee8cc1Swenshuai.xi
453*53ee8cc1Swenshuai.xi /*
454*53ee8cc1Swenshuai.xi * Calculate WWT value based on TC2 byte and TA1 byte
455*53ee8cc1Swenshuai.xi * TA1 value gives information of Clock-rate and Clock-rate-conversion
456*53ee8cc1Swenshuai.xi * which is seeding to WWT calculation formula here
457*53ee8cc1Swenshuai.xi */
_SC_Calc_WWT(MS_U8 u8Ta1Byte,MS_U8 u8Tc2Byte)458*53ee8cc1Swenshuai.xi MS_U32 _SC_Calc_WWT(MS_U8 u8Ta1Byte, MS_U8 u8Tc2Byte)
459*53ee8cc1Swenshuai.xi {
460*53ee8cc1Swenshuai.xi MS_U32 u32WWT=0;
461*53ee8cc1Swenshuai.xi MS_U32 wwt;
462*53ee8cc1Swenshuai.xi MS_U32 u32ConvTabSize;
463*53ee8cc1Swenshuai.xi MS_U32 i;
464*53ee8cc1Swenshuai.xi
465*53ee8cc1Swenshuai.xi u32ConvTabSize = sizeof(SC_Rate_Table)/sizeof(SC_rate_conversion);
466*53ee8cc1Swenshuai.xi NSK_TRACE(("u32ConvTabSize=0x%x\n", u32ConvTabSize));
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi for(i=0; i<u32ConvTabSize; ++i)
469*53ee8cc1Swenshuai.xi {
470*53ee8cc1Swenshuai.xi if ( SC_Rate_Table[i].TA1byte == u8Ta1Byte )
471*53ee8cc1Swenshuai.xi {
472*53ee8cc1Swenshuai.xi NSK_TRACE(("clock_rate_conversion=%x, clock_rate=%x\n",
473*53ee8cc1Swenshuai.xi SC_Rate_Table[i].clock_rate_conversion, SC_Rate_Table[i].clock_rate));
474*53ee8cc1Swenshuai.xi wwt = INITIAL_WAITING_TIME * (MS_U32)u8Tc2Byte * (SC_Rate_Table[i].clock_rate_conversion / SC_Rate_Table[i].clock_rate);
475*53ee8cc1Swenshuai.xi wwt /= 1000; //convert to mSec
476*53ee8cc1Swenshuai.xi u32WWT = (MS_U32)wwt;
477*53ee8cc1Swenshuai.xi NSK_TRACE(("work waiting time, [%x]\n", u32WWT));
478*53ee8cc1Swenshuai.xi return u32WWT;
479*53ee8cc1Swenshuai.xi }
480*53ee8cc1Swenshuai.xi }
481*53ee8cc1Swenshuai.xi return u32WWT;
482*53ee8cc1Swenshuai.xi }
483*53ee8cc1Swenshuai.xi
484*53ee8cc1Swenshuai.xi
485*53ee8cc1Swenshuai.xi /*
486*53ee8cc1Swenshuai.xi * performs a single smart card reset pulse, receives the answer-to-reset data and
487*53ee8cc1Swenshuai.xi * parses the parameters of this ATR data
488*53ee8cc1Swenshuai.xi */
NSK2HDX_WarmResetCard(NDS_ULONG screader_id,NDS_UBYTE * atr_data,NDS_UBYTE * atr_len,NDS_UBYTE * first_history_byte)489*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_WarmResetCard(NDS_ULONG screader_id, NDS_UBYTE *atr_data,
490*53ee8cc1Swenshuai.xi NDS_UBYTE *atr_len, NDS_UBYTE *first_history_byte)
491*53ee8cc1Swenshuai.xi {
492*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter, screader_id = %x\n",screader_id));
493*53ee8cc1Swenshuai.xi //printf("Come to NSK2HDX_WarmResetCard\n");
494*53ee8cc1Swenshuai.xi MS_U16 u16historylen=200;
495*53ee8cc1Swenshuai.xi MS_U16 u16atrlen=0, i;
496*53ee8cc1Swenshuai.xi MS_U8 history[SC_HIST_LEN_MAX];
497*53ee8cc1Swenshuai.xi MS_U32 u32waiting_time;
498*53ee8cc1Swenshuai.xi
499*53ee8cc1Swenshuai.xi //MsOS_DelayTask(50);
500*53ee8cc1Swenshuai.xi _atrlen = 0;
501*53ee8cc1Swenshuai.xi isDefaultUART=TRUE;
502*53ee8cc1Swenshuai.xi
503*53ee8cc1Swenshuai.xi #if 0
504*53ee8cc1Swenshuai.xi _verSC_Reset(screader_id);
505*53ee8cc1Swenshuai.xi #else
506*53ee8cc1Swenshuai.xi _NSK2_verSC_Reset(screader_id,0);
507*53ee8cc1Swenshuai.xi #endif
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi
510*53ee8cc1Swenshuai.xi memcpy(atr_data,_atrbuf,_atrlen);
511*53ee8cc1Swenshuai.xi u16atrlen = _atrlen;
512*53ee8cc1Swenshuai.xi
513*53ee8cc1Swenshuai.xi NSK_TRACE(("u16atrlen = %d, u16historylen = %d\n",u16atrlen, u16historylen));
514*53ee8cc1Swenshuai.xi
515*53ee8cc1Swenshuai.xi if(u16atrlen == 0)
516*53ee8cc1Swenshuai.xi {
517*53ee8cc1Swenshuai.xi NSK_ERROR(("atrlen = 0\n"));
518*53ee8cc1Swenshuai.xi return NSK2HDX_FAIL;
519*53ee8cc1Swenshuai.xi }
520*53ee8cc1Swenshuai.xi
521*53ee8cc1Swenshuai.xi NSK_TRACE(("ATR log\n"));
522*53ee8cc1Swenshuai.xi for(i = 0; i< u16atrlen; i++)
523*53ee8cc1Swenshuai.xi {
524*53ee8cc1Swenshuai.xi NSK_TRACE(("( %d, %x )\n",i,atr_data[i]));
525*53ee8cc1Swenshuai.xi }
526*53ee8cc1Swenshuai.xi
527*53ee8cc1Swenshuai.xi memcpy(history,_historybuf,_historylen);
528*53ee8cc1Swenshuai.xi u16historylen = _historylen;
529*53ee8cc1Swenshuai.xi
530*53ee8cc1Swenshuai.xi NSK_TRACE(("history log\n"));
531*53ee8cc1Swenshuai.xi for(i = 0; i< u16historylen; i++)
532*53ee8cc1Swenshuai.xi {
533*53ee8cc1Swenshuai.xi NSK_TRACE(("( %d, %x )\n",i,history[i]));
534*53ee8cc1Swenshuai.xi }
535*53ee8cc1Swenshuai.xi
536*53ee8cc1Swenshuai.xi if(u16atrlen > u16historylen)
537*53ee8cc1Swenshuai.xi {
538*53ee8cc1Swenshuai.xi *first_history_byte = u16atrlen - u16historylen; //history[0];
539*53ee8cc1Swenshuai.xi }
540*53ee8cc1Swenshuai.xi else
541*53ee8cc1Swenshuai.xi {
542*53ee8cc1Swenshuai.xi *first_history_byte = 0;
543*53ee8cc1Swenshuai.xi }
544*53ee8cc1Swenshuai.xi *atr_len = u16atrlen;
545*53ee8cc1Swenshuai.xi
546*53ee8cc1Swenshuai.xi //WWT set
547*53ee8cc1Swenshuai.xi if ( atr_data[7] < LEAST_TC2_VALUE ) //least WWT value
548*53ee8cc1Swenshuai.xi {
549*53ee8cc1Swenshuai.xi u32waiting_time = _SC_Calc_WWT(atr_data[2], LEAST_TC2_VALUE);
550*53ee8cc1Swenshuai.xi }
551*53ee8cc1Swenshuai.xi else
552*53ee8cc1Swenshuai.xi {
553*53ee8cc1Swenshuai.xi u32waiting_time = _SC_Calc_WWT(atr_data[2], atr_data[7]);
554*53ee8cc1Swenshuai.xi }
555*53ee8cc1Swenshuai.xi MDrv_SC_SetBlockWaitingTime(screader_id, u32waiting_time - SCHWTimeOutOffset);
556*53ee8cc1Swenshuai.xi MDrv_SC_SetWaitingTime(screader_id, u32waiting_time - SCTimeOutOffset);
557*53ee8cc1Swenshuai.xi
558*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
561*53ee8cc1Swenshuai.xi }
562*53ee8cc1Swenshuai.xi
NSK2HDX_SetUartParams(NDS_ULONG screader_id,NSK2HDX_UARTCONFIGURATION * conf)563*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_SetUartParams(NDS_ULONG screader_id,
564*53ee8cc1Swenshuai.xi NSK2HDX_UARTCONFIGURATION *conf)
565*53ee8cc1Swenshuai.xi {
566*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
567*53ee8cc1Swenshuai.xi
568*53ee8cc1Swenshuai.xi
569*53ee8cc1Swenshuai.xi NSK_TRACE(("card_clock = %x, card_baud_rate = %x, nak_retries = %x\n",conf->card_clock,conf->card_baud_rate,conf->nak_retries));
570*53ee8cc1Swenshuai.xi NSK_TRACE(("parity_retries = %x, work_wait_time = %x, guard_time = %x\n",conf->parity_retries,conf->work_wait_time,conf->guard_time));
571*53ee8cc1Swenshuai.xi NSK_TRACE(("protocol = %x\n",conf->protocol));
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi //UART by verifier
574*53ee8cc1Swenshuai.xi isDefaultUART=FALSE;
575*53ee8cc1Swenshuai.xi
576*53ee8cc1Swenshuai.xi if(gGuardTime != conf->guard_time)
577*53ee8cc1Swenshuai.xi {
578*53ee8cc1Swenshuai.xi MDrv_SC_SetGuardTime(screader_id, conf->guard_time);
579*53ee8cc1Swenshuai.xi gGuardTime = conf->guard_time;
580*53ee8cc1Swenshuai.xi }
581*53ee8cc1Swenshuai.xi
582*53ee8cc1Swenshuai.xi conf->guard_time = u8GT_record;
583*53ee8cc1Swenshuai.xi conf->card_baud_rate = u8Baudrate_record;
584*53ee8cc1Swenshuai.xi //conf->work_wait_time = 60;
585*53ee8cc1Swenshuai.xi
586*53ee8cc1Swenshuai.xi //if there is WWT set by verifier
587*53ee8cc1Swenshuai.xi if(conf->work_wait_time != 0)
588*53ee8cc1Swenshuai.xi {
589*53ee8cc1Swenshuai.xi NSK_TRACE(("Manual WWT = [%d]\n", conf->work_wait_time*10 ));
590*53ee8cc1Swenshuai.xi MDrv_SC_SetBlockWaitingTime(screader_id, conf->work_wait_time*10 - SCHWTimeOutOffset);
591*53ee8cc1Swenshuai.xi MDrv_SC_SetWaitingTime(screader_id, conf->work_wait_time*10 - SCTimeOutOffset);
592*53ee8cc1Swenshuai.xi }
593*53ee8cc1Swenshuai.xi
594*53ee8cc1Swenshuai.xi memcpy(&gSC_conf[screader_id], conf, sizeof(NSK2HDX_UARTCONFIGURATION));
595*53ee8cc1Swenshuai.xi
596*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
597*53ee8cc1Swenshuai.xi }
598*53ee8cc1Swenshuai.xi
NSK2HDX_GetUartParams(NDS_ULONG screader_id,NSK2HDX_UARTCONFIGURATION * conf)599*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_GetUartParams(NDS_ULONG screader_id,
600*53ee8cc1Swenshuai.xi NSK2HDX_UARTCONFIGURATION *conf)
601*53ee8cc1Swenshuai.xi {
602*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
603*53ee8cc1Swenshuai.xi MS_U16 wait_time;
604*53ee8cc1Swenshuai.xi //NSK_TRACE(("NSK2HDX_GetUartParams:%x\n",screader_id));
605*53ee8cc1Swenshuai.xi memcpy(conf, &gSC_conf[screader_id], sizeof(NSK2HDX_UARTCONFIGURATION));
606*53ee8cc1Swenshuai.xi
607*53ee8cc1Swenshuai.xi conf->guard_time = u8GT_record;
608*53ee8cc1Swenshuai.xi conf->card_baud_rate = u8Baudrate_record;
609*53ee8cc1Swenshuai.xi
610*53ee8cc1Swenshuai.xi //20150811, default work wait time depending on TC2 byte
611*53ee8cc1Swenshuai.xi if (TRUE == isDefaultUART)
612*53ee8cc1Swenshuai.xi {
613*53ee8cc1Swenshuai.xi wait_time = MDrv_SC_GetWaitingTime(screader_id);
614*53ee8cc1Swenshuai.xi NSK_TRACE(("NSK2HDX_GetUartParams: default wait_time = %x\n", wait_time));
615*53ee8cc1Swenshuai.xi conf->work_wait_time = wait_time /10;
616*53ee8cc1Swenshuai.xi }
617*53ee8cc1Swenshuai.xi else
618*53ee8cc1Swenshuai.xi {
619*53ee8cc1Swenshuai.xi //this case just return value set by verifier
620*53ee8cc1Swenshuai.xi }
621*53ee8cc1Swenshuai.xi
622*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
623*53ee8cc1Swenshuai.xi
624*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
625*53ee8cc1Swenshuai.xi }
626*53ee8cc1Swenshuai.xi
627*53ee8cc1Swenshuai.xi
628*53ee8cc1Swenshuai.xi
NSK2HDX_SetSCLog(MS_U32 * bEn)629*53ee8cc1Swenshuai.xi MS_U32 NSK2HDX_SetSCLog(MS_U32 *bEn)
630*53ee8cc1Swenshuai.xi {
631*53ee8cc1Swenshuai.xi _bSC_log = *bEn;
632*53ee8cc1Swenshuai.xi return TRUE;
633*53ee8cc1Swenshuai.xi }
634*53ee8cc1Swenshuai.xi
635*53ee8cc1Swenshuai.xi extern void MApi_SC_T0_SetTimeOut(MS_U32 u32TimeOut);
636*53ee8cc1Swenshuai.xi //extern void MDrv_SC_T0_SetTimeOut(MS_U32 u32TimeOut);
637*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------//
638*53ee8cc1Swenshuai.xi //--The buffers represented by the parameters to_card and from_card will hold ---//
639*53ee8cc1Swenshuai.xi //--only the data payload, not any additional bytes that are related to the -----//
640*53ee8cc1Swenshuai.xi //--protocol (for example PB/ACK, null bytes, etc.) -----------------------------//
641*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------//
642*53ee8cc1Swenshuai.xi
NSK2HDX_CardIoCommand(NDS_ULONG screader_id,NDS_UBYTE * to_card,NDS_ULONG to_card_len,NDS_UBYTE * from_card,NDS_ULONG * from_card_len,NDS_UBYTE direction,NDS_USHORT timeout)643*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_CardIoCommand( NDS_ULONG screader_id,
644*53ee8cc1Swenshuai.xi NDS_UBYTE *to_card,
645*53ee8cc1Swenshuai.xi NDS_ULONG to_card_len,
646*53ee8cc1Swenshuai.xi NDS_UBYTE *from_card,
647*53ee8cc1Swenshuai.xi NDS_ULONG *from_card_len,
648*53ee8cc1Swenshuai.xi NDS_UBYTE direction,
649*53ee8cc1Swenshuai.xi NDS_USHORT timeout)
650*53ee8cc1Swenshuai.xi {
651*53ee8cc1Swenshuai.xi MS_U32 u32CardIOTime = MsOS_GetSystemTime();
652*53ee8cc1Swenshuai.xi SC_Result sc_result = E_SC_OK;
653*53ee8cc1Swenshuai.xi
654*53ee8cc1Swenshuai.xi NSK_TRACE(("start time is %d\n",MsOS_GetSystemTime()));
655*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter, screader_id = %d, direction = %d\n",screader_id,direction));
656*53ee8cc1Swenshuai.xi NSK_TRACE(("to_card_len = %d, timeout = %d\n",to_card_len,timeout));
657*53ee8cc1Swenshuai.xi MS_U32 i;
658*53ee8cc1Swenshuai.xi
659*53ee8cc1Swenshuai.xi //for( i=0; i<to_card_len ; i++)
660*53ee8cc1Swenshuai.xi //{
661*53ee8cc1Swenshuai.xi // NSK_TRACE(("(%d, %x)\n",i,to_card[i]));
662*53ee8cc1Swenshuai.xi //}
663*53ee8cc1Swenshuai.xi
664*53ee8cc1Swenshuai.xi if(_bSC_log == TRUE)
665*53ee8cc1Swenshuai.xi {
666*53ee8cc1Swenshuai.xi printf(" \n");
667*53ee8cc1Swenshuai.xi for( i=0; i<to_card_len ; i++)
668*53ee8cc1Swenshuai.xi {
669*53ee8cc1Swenshuai.xi printf("0x%x, ",to_card[i]);
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi printf(" \n");
672*53ee8cc1Swenshuai.xi }
673*53ee8cc1Swenshuai.xi
674*53ee8cc1Swenshuai.xi switch (direction)
675*53ee8cc1Swenshuai.xi {
676*53ee8cc1Swenshuai.xi case NSK2HDX_DIRECTION_FROM_CARD:
677*53ee8cc1Swenshuai.xi MDrv_SC_T0_SetTimeOut( timeout * 10 - SCTimeOutOffset);
678*53ee8cc1Swenshuai.xi sc_result = MDrv_SC_T0_SendRecv((MS_U8)screader_id, to_card, (MS_U16)to_card_len,from_card, (MS_U16*)from_card_len);
679*53ee8cc1Swenshuai.xi break;
680*53ee8cc1Swenshuai.xi
681*53ee8cc1Swenshuai.xi case NSK2HDX_DIRECTION_TO_CARD:
682*53ee8cc1Swenshuai.xi MDrv_SC_T0_SetTimeOut( timeout * 10 - SCTimeOutOffset);
683*53ee8cc1Swenshuai.xi sc_result = MDrv_SC_T0_SendRecv((MS_U8)screader_id, to_card, (MS_U16)to_card_len, from_card, (MS_U16*)from_card_len);
684*53ee8cc1Swenshuai.xi break;
685*53ee8cc1Swenshuai.xi
686*53ee8cc1Swenshuai.xi default:
687*53ee8cc1Swenshuai.xi break;
688*53ee8cc1Swenshuai.xi }
689*53ee8cc1Swenshuai.xi
690*53ee8cc1Swenshuai.xi
691*53ee8cc1Swenshuai.xi NSK_TRACE(("Time of Card IO Time = %d\n", (MsOS_GetSystemTime() - u32CardIOTime)));
692*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
693*53ee8cc1Swenshuai.xi
694*53ee8cc1Swenshuai.xi if(E_SC_OK != sc_result)
695*53ee8cc1Swenshuai.xi {
696*53ee8cc1Swenshuai.xi NSK_ERROR(("sc_result = %d\n",sc_result));
697*53ee8cc1Swenshuai.xi NSK_ERROR(("now time is %d\n",MsOS_GetSystemTime()));
698*53ee8cc1Swenshuai.xi NSK_ERROR(("Time of Card IO Time = %d\n", (MsOS_GetSystemTime() - u32CardIOTime) ));
699*53ee8cc1Swenshuai.xi return NSK2HDX_FAIL;
700*53ee8cc1Swenshuai.xi }
701*53ee8cc1Swenshuai.xi
702*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
703*53ee8cc1Swenshuai.xi }
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------------//
706*53ee8cc1Swenshuai.xi //-- In each call to this routine, exactly one of C4, C7 and C8 must be indicated ---//
707*53ee8cc1Swenshuai.xi //-- as the I/O line. The state of the other 2 (GPIO) lines must bothe be specified -//
708*53ee8cc1Swenshuai.xi //-- Before setting a pin for use as I/O, the pin must first be in state H. ---------//
709*53ee8cc1Swenshuai.xi //-----------------------------------------------------------------------------------//
710*53ee8cc1Swenshuai.xi
711*53ee8cc1Swenshuai.xi //controls C7, C4, C8 pin setting in the smart card interface.
NSK2HDX_SetUartCommand(NDS_ULONG screader_id,NDS_UBYTE pin_mask)712*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_SetUartCommand(NDS_ULONG screader_id, NDS_UBYTE pin_mask)
713*53ee8cc1Swenshuai.xi {
714*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
715*53ee8cc1Swenshuai.xi
716*53ee8cc1Swenshuai.xi printf("pin_mask:%x \n",pin_mask);
717*53ee8cc1Swenshuai.xi
718*53ee8cc1Swenshuai.xi NDS_UBYTE IOLine = NSK2HDX_UART_COMMAND_IO_C7_ON;
719*53ee8cc1Swenshuai.xi if(gbPin_Mask == pin_mask)
720*53ee8cc1Swenshuai.xi {
721*53ee8cc1Swenshuai.xi NSK_TRACE(("pin mask is the same, return\n"));
722*53ee8cc1Swenshuai.xi }
723*53ee8cc1Swenshuai.xi gbPin_Mask = pin_mask;
724*53ee8cc1Swenshuai.xi
725*53ee8cc1Swenshuai.xi if( pin_mask & NSK2HDX_UART_COMMAND_IO_C7_ON ) //case 1, C7 as I/O line...
726*53ee8cc1Swenshuai.xi {
727*53ee8cc1Swenshuai.xi NSK_TRACE(("C7 as I/O line...\n"));
728*53ee8cc1Swenshuai.xi
729*53ee8cc1Swenshuai.xi //check C4,C8 pin configs....
730*53ee8cc1Swenshuai.xi if( pin_mask & NSK2HDX_UART_COMMAND_IO_C4_ON)
731*53ee8cc1Swenshuai.xi {
732*53ee8cc1Swenshuai.xi NSK_ERROR(("C7 is already the IO line, C4 \n"));
733*53ee8cc1Swenshuai.xi return NSK2HDX_INVALID_REQUEST;
734*53ee8cc1Swenshuai.xi }
735*53ee8cc1Swenshuai.xi
736*53ee8cc1Swenshuai.xi if( pin_mask & NSK2HDX_UART_COMMAND_IO_C8_ON)
737*53ee8cc1Swenshuai.xi {
738*53ee8cc1Swenshuai.xi NSK_ERROR(("C7 is already the IO line, C8 \n"));
739*53ee8cc1Swenshuai.xi }
740*53ee8cc1Swenshuai.xi
741*53ee8cc1Swenshuai.xi //config C7 as I/O line
742*53ee8cc1Swenshuai.xi MDrv_SC_IOC4C8Switch(E_SC_IO_USE_SMIO);
743*53ee8cc1Swenshuai.xi
744*53ee8cc1Swenshuai.xi IOLine = NSK2HDX_UART_COMMAND_IO_C7_ON;
745*53ee8cc1Swenshuai.xi }
746*53ee8cc1Swenshuai.xi else if( pin_mask & NSK2HDX_UART_COMMAND_IO_C4_ON ) //case 2, C4 as I/O line...
747*53ee8cc1Swenshuai.xi {
748*53ee8cc1Swenshuai.xi NSK_TRACE(("C4 as I/O line...\n"));
749*53ee8cc1Swenshuai.xi //check C8 pin configs....
750*53ee8cc1Swenshuai.xi if( pin_mask & NSK2HDX_UART_COMMAND_IO_C8_ON)
751*53ee8cc1Swenshuai.xi {
752*53ee8cc1Swenshuai.xi NSK_ERROR(("C4 is already the IO line, C8 \n"));
753*53ee8cc1Swenshuai.xi }
754*53ee8cc1Swenshuai.xi
755*53ee8cc1Swenshuai.xi //config C4 as I/O line
756*53ee8cc1Swenshuai.xi MDrv_SC_IOC4C8Switch(E_SC_IO_USE_C4);
757*53ee8cc1Swenshuai.xi IOLine = NSK2HDX_UART_COMMAND_IO_C4_ON;
758*53ee8cc1Swenshuai.xi }
759*53ee8cc1Swenshuai.xi else if( pin_mask & NSK2HDX_UART_COMMAND_IO_C8_ON ) //case 3, C8 as I/O line...
760*53ee8cc1Swenshuai.xi {
761*53ee8cc1Swenshuai.xi NSK_TRACE(("C8 as I/O line...\n"));
762*53ee8cc1Swenshuai.xi //config C8 as I/O line
763*53ee8cc1Swenshuai.xi MDrv_SC_IOC4C8Switch(E_SC_IO_USE_C8);
764*53ee8cc1Swenshuai.xi IOLine = NSK2HDX_UART_COMMAND_IO_C8_ON;
765*53ee8cc1Swenshuai.xi }
766*53ee8cc1Swenshuai.xi else
767*53ee8cc1Swenshuai.xi {
768*53ee8cc1Swenshuai.xi NSK_ERROR(("error pin config\n"));
769*53ee8cc1Swenshuai.xi MDrv_SC_IOC4C8Switch(E_SC_IO_USE_SMIO);
770*53ee8cc1Swenshuai.xi }
771*53ee8cc1Swenshuai.xi
772*53ee8cc1Swenshuai.xi if(IOLine != NSK2HDX_UART_COMMAND_IO_C4_ON)
773*53ee8cc1Swenshuai.xi {
774*53ee8cc1Swenshuai.xi if( pin_mask & NSK2HDX_UART_COMMAND_C4_ON )
775*53ee8cc1Swenshuai.xi {
776*53ee8cc1Swenshuai.xi MDrv_SC_C4_SignalLevel(1);
777*53ee8cc1Swenshuai.xi }
778*53ee8cc1Swenshuai.xi else
779*53ee8cc1Swenshuai.xi {
780*53ee8cc1Swenshuai.xi MDrv_SC_C4_SignalLevel(0);
781*53ee8cc1Swenshuai.xi }
782*53ee8cc1Swenshuai.xi }
783*53ee8cc1Swenshuai.xi
784*53ee8cc1Swenshuai.xi
785*53ee8cc1Swenshuai.xi if(IOLine != NSK2HDX_UART_COMMAND_IO_C8_ON)
786*53ee8cc1Swenshuai.xi {
787*53ee8cc1Swenshuai.xi if(pin_mask & NSK2HDX_UART_COMMAND_C8_ON )
788*53ee8cc1Swenshuai.xi {
789*53ee8cc1Swenshuai.xi MDrv_SC_C8_SignalLevel(1);
790*53ee8cc1Swenshuai.xi }
791*53ee8cc1Swenshuai.xi else
792*53ee8cc1Swenshuai.xi {
793*53ee8cc1Swenshuai.xi MDrv_SC_C8_SignalLevel(0);
794*53ee8cc1Swenshuai.xi }
795*53ee8cc1Swenshuai.xi }
796*53ee8cc1Swenshuai.xi
797*53ee8cc1Swenshuai.xi if(IOLine != NSK2HDX_UART_COMMAND_IO_C7_ON)
798*53ee8cc1Swenshuai.xi {
799*53ee8cc1Swenshuai.xi if(pin_mask & NSK2HDX_UART_COMMAND_C7_ON )
800*53ee8cc1Swenshuai.xi {
801*53ee8cc1Swenshuai.xi MDrv_SC_C7_SignalLevel(1);
802*53ee8cc1Swenshuai.xi }
803*53ee8cc1Swenshuai.xi else
804*53ee8cc1Swenshuai.xi {
805*53ee8cc1Swenshuai.xi MDrv_SC_C7_SignalLevel(0);
806*53ee8cc1Swenshuai.xi }
807*53ee8cc1Swenshuai.xi }
808*53ee8cc1Swenshuai.xi
809*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
810*53ee8cc1Swenshuai.xi
811*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
812*53ee8cc1Swenshuai.xi }
813*53ee8cc1Swenshuai.xi
NSK2HDX_GetUartCommand(NDS_ULONG screader_id,NDS_UBYTE * pin_mask)814*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_GetUartCommand(NDS_ULONG screader_id, NDS_UBYTE *pin_mask)
815*53ee8cc1Swenshuai.xi {
816*53ee8cc1Swenshuai.xi NSK_TRACE(("Enter\n"));
817*53ee8cc1Swenshuai.xi
818*53ee8cc1Swenshuai.xi if((gbPin_Mask & 0xF) != 0x8)
819*53ee8cc1Swenshuai.xi {
820*53ee8cc1Swenshuai.xi *pin_mask = gbPin_Mask & 0x7F;
821*53ee8cc1Swenshuai.xi }
822*53ee8cc1Swenshuai.xi else
823*53ee8cc1Swenshuai.xi {
824*53ee8cc1Swenshuai.xi *pin_mask = gbPin_Mask;
825*53ee8cc1Swenshuai.xi }
826*53ee8cc1Swenshuai.xi
827*53ee8cc1Swenshuai.xi NSK_TRACE(("Exit\n"));
828*53ee8cc1Swenshuai.xi
829*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
830*53ee8cc1Swenshuai.xi }
831*53ee8cc1Swenshuai.xi
832