📄 scddrv.c
字号:
/* * Smart Card Device Driver module *//* * CHANGELOG: * 02-09-2003 created by Stanley.zhu<zhu.shan@zte.com.cn> *-------------------------------------------------------------------------*/ #include<instructions.h>#include<bsp.h>#include<scd.h>#include<types.h>//#define DEBUG#ifdef DEBUG#define DPRINTS(x) print_string(x)#define DPRINTL(x) print_long(x)#else#define DPRINTS(x)#define DPRINTL(x)#endif#define ATR_LEN 5/*7816 T=0 ATR*/unsigned char scd_atr_0[ATR_LEN]={0xD0,0x11,0x00,0x40,0x00,}; int recvcount=0;/*F/D*/unsigned char scd_f_d=0x11;/*T=0 or T=1*/unsigned char scd_tp=0,scd_atr_end=0;/*TS Byte*/unsigned char scd_conv=0;/* Send data via 7816 (query mode)INPUT: * buf : buffer to send; * len : send length;OUTPUT: * none;RETURN: length :send out length; */void delayETU(unsigned char netu){ clr_scdsr_ecnto(); REG32(SCDECR)=netu; while(!get_scdsr_ecnto()); }void sendchar(unsigned char v){ disable_scd_receive(); while(!get_scdsr_femp()); delayETU(2); REG8(SCDDR)=v; while(!get_scdsr_femp()); enable_scd_receive();}unsigned char recvchar(){ unsigned char ch,tmp; unsigned short status; while(!get_scdsr_fftrg()); while(get_scdsr_femp()); ch=REG8(SCDDR); return ch;}int send_data0(BYTE *buf, USHORT len) { USHORT i=0; for(i=0;i<len;i++) sendchar(*buf++); return len; }/* receive data via 7816 (query mode) INPUT: * len : receive length; OUTPUT: * buf : buffer output; RETURN: * length :received length; */int receive_data0(BYTE *buf) { USHORT i=0,len=0,length=0; BYTE temp[5]; memset(temp,0,5); //receive mode for(i=0;i<5;i++) buf[i]=recvchar(); delayETU(14); temp[0]=buf[1]; send_data0(temp,1); if((buf[1]==0xd6)||(buf[1]==0xf2)||(buf[1]==0x35)||(buf[1]==0x33)||(buf[1]==0x34)||(buf[1]==0xa4)) { //get length to receive length=buf[4]; //receive left data for(i=5;i<length+5;i++) buf[i]=recvchar(); } return length+5; }/* Send ATR via 7816 after resetINPUT: * none;OUTPUT: * none;RETURN: * none;*/void send_atr(){ send_data0(scd_atr_0,ATR_LEN);}/* reset interrupt handlerINPUT: * none;OUTPUT: * none;RETURN: * none;*/void scd_rstint_handler() { scd_atr_end=0; //wait 7816 reset signal while(!get_scdsr_vrst()); //clear scd status register set_scdsr(0); //enable 7816 device enable_scd(); //set trigger number =1 set_scdcr(SCDCR_TRIG_1); //if TS=0x3B clr_scdcr_conv(); set_scdcr_tp_to_0(); //clear valid reset flag clr_scdsr_vrst(); // flush fifo flush_scd_fifo(); //we do not use auto t2r clr_scdcr_t2r(); //set_scdcr_t2r(); //turn to transmit mode enable_scd_transmit(); //wait while TS sent out while(!get_scdsr_tsend()); //send user define ATR out send_atr(); //delay some ETUs delayETU(12); scd_atr_end=1; //turn to receive mode //print_string("7816 reset finished..\n"); }/* Reset interrupt initializeINPUT: * none;OUTPUT: * none;RETURN: * none;*/void scd_rst_h(){ //_jumptoentry(); scd_rstint_handler();}void scd_rstint_initialize(){ set_scdsr(0); enable_scd(); //clear scd status register //install scd reset interrupt handler install_irq_handler(INTC_SCDRST, scd_rst_h); // enable int enable_int(INTC_SCDRST);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -