📄 ic_card.c
字号:
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 + -