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

📄 ic_card.c

📁 智能卡的驱动程序,兼容iso-7817标准
💻 C
📖 第 1 页 / 共 3 页
字号:
	    return_value = Check_Icard_Exist(IC1_CARD);	    return return_value;}BYTE IC_Init_Fun(BYTE ic_unit){	      DWORD temp_gpio;	      DWORD pri_mask,sec_mask;	            if(ic_unit>0x1)                return ERROR;                    if(ic_unit == IC0_CARD)                                      //Initialize  IC CARD 0          {                        _Get_Reg_Value(pri_mask,INT_MASK_REG);                                 _Get_Reg_Value(sec_mask,SEC_INT_MASK_REG);                                         _Set_Reg_Value(INT_MASK_REG ,DISABLE);                    //Close first level interrupt             _Set_Reg_Value(SEC_INT_MASK_REG ,DISABLE);                //Close second level interrupt                                              _Set_Reg_Value(IC0_ENABLE_REG ,DISABLE);;;;;             //Close IC card 0 controller                                        _Set_Reg_Value(IC0_STATE_MASK_REG,0x000);                //Close IC card 0 state register              _Set_Reg_Value(IC0_CPS_PRSCL_REG,0x103);                 //Set PIV value              _Set_Reg_Value(IC0_CTP_RXSCL_REG,0x1173);                //Set card type 0x1:T = 0 ; rx scaler 0x173              _Set_Reg_Value(IC0_ENABLE_REG ,ENABLE);                  //Open IC card controller                                  _Set_Reg_Value(INT_MASK_REG ,pri_mask);                  // first level interrupt              _Set_Reg_Value(SEC_INT_MASK_REG ,sec_mask);              // second level interrupt                                                    Set_Interrupt_Bit(PRI_INT_MASK,INT_VECTOR_10,ENABLE);    //Enable first level Interrupt Vector 10              Set_Interrupt_Bit(SEC_INT_MASK,IC_CARD_0_INT,ENABLE);    //Enable second Interrupt Vector 30                               _Set_Reg_Value(IC0_ATR_REG , ENABLE);                            Set_Gpio_Direct_Reg(GPI0_DIRECT,IC_CARD0_OUT,DISABLE);   //control IC card system              Set_Gpio_Data_Reg(GPI0_DATA,IC_CARD0_OUT,DISABLE);       //control IC card system                                                                                                                                 Set_Gpio_Direct_Reg(GPI0_DIRECT,IC_CARD0_OUT,ENABLE);    //add circurt to IC card system              Set_Gpio_Data_Reg(GPI0_DATA,IC_CARD0_OUT,ENABLE);        //add circurt to IC card system              }                    if(ic_unit == IC1_CARD)                                      //Initialize  IC CARD 1          {                           _Get_Reg_Value(pri_mask,INT_MASK_REG);                                 _Get_Reg_Value(sec_mask,SEC_INT_MASK_REG);              _Set_Reg_Value(INT_MASK_REG ,DISABLE);              _Set_Reg_Value(SEC_INT_MASK_REG ,DISABLE);                                      _Set_Reg_Value(IC1_ENABLE_REG ,DISABLE);;;;;                            _Set_Reg_Value(IC1_STATE_MASK_REG,0x000);              _Set_Reg_Value(IC1_CPS_PRSCL_REG,0x103);                 //set PIV default value              _Set_Reg_Value(IC1_CTP_RXSCL_REG,0x1173);                //set card type 0x1:T = 0 ; rx scaler 0x173                        _Set_Reg_Value(IC1_ENABLE_REG ,ENABLE);                                      _Set_Reg_Value(INT_MASK_REG ,pri_mask);                   //Close first level interrupt              _Set_Reg_Value(SEC_INT_MASK_REG ,sec_mask);               //Close second level interrupt                                                    Set_Interrupt_Bit(PRI_INT_MASK,INT_VECTOR_10,ENABLE);              Set_Interrupt_Bit(SEC_INT_MASK,IC_CARD_1_INT,ENABLE);                                          _Set_Reg_Value(IC1_ATR_REG , ENABLE);                        Set_Gpio_Direct_Reg(GPI0_DIRECT,IC_CARD1_OUT,DISABLE);   //Add circuit to IC card system              Set_Gpio_Data_Reg(GPI0_DATA,IC_CARD1_OUT,DISABLE);       //Add circuit to IC card system                                                         Set_Gpio_Direct_Reg(GPI0_DIRECT,IC_CARD1_OUT,ENABLE);    //Add circuit to IC card system              Set_Gpio_Data_Reg(GPI0_DATA,IC_CARD1_OUT,ENABLE);        //Add circuit to IC card system                                               }                return OK;}void IC_Card_System_Init_Fun(BYTE ic_unit){        catch_interrupt(Second_IntSrv_Fun, TEN_INT_VEC);                            IC_Init_Fun(ic_unit);        Check_Icard_Exist(ic_unit);        card_release(ic_unit);}BYTE IC_Cold_Reset(BYTE ic_unit){                    if(Check_Ic_Card()==OK)                        _Set_Reg_Value(ic_unit?IC1_ENABLE_REG:IC0_ENABLE_REG ,ENABLE);;;;;                    Delay(1000);     	if(ic_NATR_flag)     	{     	    ic_NATR_flag = FALSE;      	    return ERROR;     	}     	return OK;}BYTE IC_Reset_Fun(BYTE ic_unit){     BYTE i=0,j=0,temp_gpio;         _Set_Reg_Value((ic_unit ?IC1_WARM_RST_REG :IC0_WARM_RST_REG ),ENABLE);                 //Warm Reset;               while(i<15)     {     	    if(ic_NATR_flag)break;            if(ic_RF_flag)            {                  temp_data[i++] = (ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG);                         //Receive 14 answer characters from IC card                  if(i==15)                  {                      printf("\nIC Card %d Reset:",ic_unit);                      for(j=0;j<15;j++)  printf("%x ", temp_data[j]);                      _Set_Reg_Value((ic_unit ?IC1_ATR_REG :IC0_ATR_REG ),DISABLE);               //Finished receive ic card ACK info                  }                  ic_RF_flag = 0;            }     }     if(ic_NATR_flag)     {     	ic_NATR_flag = FALSE;      	return ERROR;     }     return OK;}/************************************************************//*	When We send a Byte data to IC Card rx register;		*//*	We must waiting for the answer information from			*//*	ic card system;											*//************************************************************/BYTE IC_StrReg_Srv_Fun(void){            BYTE return_value,count = 0,i=0;                                    while(ic_TE_flag ==FALSE);                                        //Waiting for transfer finish.                         ic_TE_flag = FALSE;              return OK;}BYTE IC_Apdu_Fun(BYTE ic_unit,APDU_STRUCT apdu){        BYTE return_value,count = 0,i=0;        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.CLA);       //Write command type to IC card                        return_value = IC_StrReg_Srv_Fun();        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.INS);       //Write instruction  to IC card        return_value = IC_StrReg_Srv_Fun();        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.P1);        //Write parameter p1 to IC card        return_value = IC_StrReg_Srv_Fun();        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.P2);        //Write parameter p2 to IC card        return_value = IC_StrReg_Srv_Fun();        if(apdu.LC != 0)        {              _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.LC);  //Write send data lengh to IC card              return_value = IC_StrReg_Srv_Fun();                 for(count=0x0;count<apdu.LC;count++)              {                  _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.DATA_WRITE[count]);  //Write data to IC card                                return_value = IC_StrReg_Srv_Fun();                  }        }              count=0x0;                  if(apdu.LE)        {          //printf("\n write apdu le");          _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),apdu.LE);      //Write the lengh of data you hope to receive from IC card          return_value = IC_StrReg_Srv_Fun();                                           while(count<apdu.LE)                                                //Receive data from IC Card          {              if(ic_RF_flag)              {                 apdu.DATA_READ[count++] = (ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG);                                     ic_RF_flag = 0;              }          }           }        count=0x0;        while(count<2)                                                       //Receive data from IC Card        {              if(ic_RF_flag)              {                 apdu.DATA_READ[count++] = (ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG);                 ic_RF_flag = 0;              }        }                            for(count=0;count<2 ;count++)              {printf("%x ",apdu.DATA_READ[count]);}                                   return return_value;}BYTE 	send_card(void){	    BYTE i;	    BYTE create_MF_data[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x11,0x22,0x33,0x44,0x55};        BYTE create_DF_data[16]={0x2f,0x02,0x0f,0x00,0x54,0x49,0x44,0x30,0x31};	// 2f02        BYTE Select_File_Name[16]={0x2f,0x02};									// 2f 02        BYTE create_KEY_data[16]={0x2f,0x01,0x05,0x01,0x00,0x10,0x17};			// 2f01         apdu.CLA = 0x80;            apdu.INS = 0xE0;														//create file         apdu.P1 = 0x00;															//create MF file         apdu.P2 = 0x00;															//are doing create MF file        apdu.LC = 0x0F;        for(i=0;i<apdu.LC;i++)             apdu.DATA_WRITE[i]= create_MF_data[i];        apdu.LE = 0x0;                IC_Apdu_Fun(IC1_CARD,apdu) ;											//do instruction:Create MF file        		/****************************************************************/        apdu.CLA = 0x80;            apdu.INS = 0xE0;														//create MF file         apdu.P1 = 0x01;															//create MF file         apdu.P2 = 0x00;															//are doing create MF file        apdu.LC = 0x09;        for(i=0;i<apdu.LC;i++)             apdu.DATA_WRITE[i]= create_DF_data[i];        apdu.LE = 0x0;                IC_Apdu_Fun(IC1_CARD,apdu) ;											//do instruction:Create MF file                        /****************************************************************/        apdu.CLA = 0x00;            apdu.INS = 0xA4;														//Select file         apdu.P1 = 0x00;              apdu.P2 = 0x00;             apdu.LC = 0x02;        for(i=0;i<apdu.LC;i++)             apdu.DATA_WRITE[i]= Select_File_Name[i];        apdu.LE = 0x0;                IC_Apdu_Fun(IC1_CARD,apdu) ;											//do instruction:Create MF file                        /****************************************************************/	    /***  80 e0 02 00 07 2f01 05 01 00 10 17                      ***/        apdu.CLA = 0x80;            apdu.INS = 0xe0;														//create file         apdu.P1 = 0x02;															//create EF file         apdu.P2 = 0x00;															//are doing create EF file        apdu.LC = 0x07;        for(i=0;i<apdu.LC;i++)             apdu.DATA_WRITE[i]= create_KEY_data[i];        apdu.LE = 0x0;        IC_Apdu_Fun(IC1_CARD,apdu) ;											//do instruction:Create MF file   }void select_file(BYTE ic_unit,BYTE p1,BYTE p2,BYTE *filename){        BYTE return_value,count = 0,i=0,waiting=1,code=0;        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),0x00);      //Write command type to IC card        return_value = IC_StrReg_Srv_Fun();                _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),0xA4);      //Write instruction  to IC card        return_value = IC_StrReg_Srv_Fun();        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),p1);        //Write parameter p1 to IC card        return_value = IC_StrReg_Srv_Fun();        _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),p2);			//Write parameter p2 to IC card        return_value = IC_StrReg_Srv_Fun();                _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),0x02);			//Write the lengh of data you hope to receive from IC card        return_value = IC_StrReg_Srv_Fun();        while(waiting)														//When You select file. you must waiting code																			//and before you send file name you must waiting for 16 ETU        {                 if(ic_RF_flag)                 {                         code =(ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG) ;                         if(code == 0xa4)                            waiting = 0;                         ic_RF_flag = 0;                 }        }        //printf("\ncode = %x",code);        for(i=0;i<200;i++);                _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),filename[0]);    //Write the lengh of data you hope to receive from IC card        return_value = IC_StrReg_Srv_Fun();                  _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),filename[1]);   //Write the lengh of data you hope to receive from IC card        return_value = IC_StrReg_Srv_Fun();                 count = 0;         while(count<2)                                                       //Receive data from IC Card         {                 if(ic_RF_flag)                 {                        apdu.DATA_READ[count++] = (ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG);                        ic_RF_flag = 0;                 }         }         //printf("\nSelect:");         //for(i=0;i<2;i++) printf("%x ",apdu.DATA_READ[i]);}void read_file(BYTE ic_unit,BYTE ins,BYTE p1,BYTE p2,BYTE len){        BYTE return_value,count = 0,i=0,waiting=1,code;                _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),0x00);          //Write command type to IC card                                                                                     return_value = IC_StrReg_Srv_Fun();                                                                                                                       _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),ins);           //Write instruction  to IC card        return_value = IC_StrReg_Srv_Fun();                                                                                                                       _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),p1);            //Write parameter p1 to IC card        return_value = IC_StrReg_Srv_Fun();                                                                                                                       _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),p2);            //Write parameter p2 to IC card        return_value = IC_StrReg_Srv_Fun();                                                                                                                       _Set_Reg_Value((ic_unit ? IC1_TXDB_REG:IC0_TXDB_REG),len);           //Write the lengh of data you hope to receive from IC card        return_value = IC_StrReg_Srv_Fun();                                                                                                                        while(count<(len+3))                                                //Receive data from IC Card         {                 if(ic_RF_flag)                 {                         apdu.DATA_READ[count++] = (ic_unit ? IC1_RXDB_REG:IC0_RXDB_REG);                         ic_RF_flag = 0;                 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -