⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scddrv.c

📁 中兴单片机COS系统
💻 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 + -