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