#include "MIFARE.h" #include "READER.h" #include "string.h" #include "READER_REG.h" #include "xt_main.h" unsigned char SECTOR,BLOCK,BLOCK_NUM; unsigned char BLOCK_DATA[16]; unsigned char KEY_A[16][6]= {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//0 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//1 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//2 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//3 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//4 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//5 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//6 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//7 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//8 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//9 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//10 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//11 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//12 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//13 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//14 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};//15 unsigned char KEY_B[16][6]= {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//0 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//1 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//2 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//3 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//4 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//5 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//6 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//7 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//8 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//9 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//10 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//11 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//12 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//13 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//14 {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};//15 /*****************************************************************************************/ /*���ƣ�Mifare_Clear_Crypto */ /*���ܣ�Mifare_Clear_Crypto�����֤��־ */ /*���룺 */ /* */ /*���: */ /* */ /* */ /*****************************************************************************************/ void Mifare_Clear_Crypto(void) { ModifyReg(REG_STATUS,BIT_CRYPTO1ON,RESET); return; } unsigned char MIFARE_CARD_EVENTAAAAAAA(void) { unsigned char result; Mifare_Clear_Crypto(); SECTOR = 1; //for(SECTOR = 0;SECTOR < 16; SECTOR++) { BLOCK_NUM = (SECTOR * 4) + BLOCK; result = Mifare_Auth(KEY_A_M1,SECTOR,KEY_A[SECTOR],PICC_A.UID); if(result != SUCCESS) { SetCW(DISABLE); printf("-> AUTH ERROR!\r\n"); return result; } printf("-> AUTH SUCCESS!\r\n"); for(BLOCK = 0;BLOCK < 3;BLOCK++) { BLOCK_NUM = (SECTOR * 4) + BLOCK; if(BLOCK_NUM == 0) BLOCK_NUM = 1; printf("-> SECTOR = %02X\r\n",SECTOR);; printf("-> BLOCK = %02X\r\n",BLOCK); printf("-> BLOCK_NUM = %02X\r\n",BLOCK_NUM); memcpy(BLOCK_DATA,"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",16); result = Mifare_Blockwrite(BLOCK_NUM,BLOCK_DATA); if(result != SUCCESS) { SetCW(DISABLE); printf("-> WRITE BLOCK ERROR!\r\n"); return result; } printf("-> WRITE BLOCK SUCCESS!\r\n"); result = Mifare_Blockread(BLOCK_NUM,BLOCK_DATA); if(result != SUCCESS) { SetCW(DISABLE); printf("-> READ BLOCK ERROR!\r\n"); return result; } printf("-> READ BLOCK = %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n",BLOCK_DATA[0],BLOCK_DATA[1],BLOCK_DATA[2],BLOCK_DATA[3],BLOCK_DATA[4],BLOCK_DATA[5],BLOCK_DATA[6],BLOCK_DATA[7],BLOCK_DATA[8],BLOCK_DATA[9],BLOCK_DATA[10],BLOCK_DATA[11],BLOCK_DATA[12],BLOCK_DATA[13],BLOCK_DATA[14],BLOCK_DATA[15]); } } SetCW(DISABLE); return result; } unsigned char MIFARE_CARD_EVENT(void) { unsigned char result; Mifare_Clear_Crypto(); SECTOR = 1; //for(SECTOR = 0;SECTOR < 16; SECTOR++) { BLOCK_NUM = (SECTOR * 4) + BLOCK; result = Mifare_Auth(KEY_A_M1,SECTOR,KEY_A[SECTOR],PICC_A.UID); if(result != SUCCESS) { SetCW(DISABLE); printf("-> AUTH ERROR!\r\n"); return result; } printf("-> AUTH SUCCESS!\r\n"); for(BLOCK = 0;BLOCK < 3;BLOCK++) { BLOCK_NUM = (SECTOR * 4) + BLOCK; if(BLOCK_NUM == 0) BLOCK_NUM = 1; printf("-> SECTOR = %02X\r\n",SECTOR);; printf("-> BLOCK = %02X\r\n",BLOCK); printf("-> BLOCK_NUM = %02X\r\n",BLOCK_NUM); memcpy(BLOCK_DATA,"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF",16); result = Mifare_Blockwrite(BLOCK_NUM,BLOCK_DATA); if(result != SUCCESS) { SetCW(DISABLE); printf("-> WRITE BLOCK ERROR!\r\n"); return result; } printf("-> WRITE BLOCK SUCCESS!\r\n"); result = Mifare_Blockread(BLOCK_NUM,BLOCK_DATA); if(result != SUCCESS) { SetCW(DISABLE); printf("-> READ BLOCK ERROR!\r\n"); return result; } printf("-> READ BLOCK = %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n",BLOCK_DATA[0],BLOCK_DATA[1],BLOCK_DATA[2],BLOCK_DATA[3],BLOCK_DATA[4],BLOCK_DATA[5],BLOCK_DATA[6],BLOCK_DATA[7],BLOCK_DATA[8],BLOCK_DATA[9],BLOCK_DATA[10],BLOCK_DATA[11],BLOCK_DATA[12],BLOCK_DATA[13],BLOCK_DATA[14],BLOCK_DATA[15]); } } SetCW(DISABLE); return result; } unsigned char Mifare_LoadKey(unsigned char *mifare_key) { unsigned char reg_data; SetCommand(CMD_IDLE); ModifyReg(REG_FIFOCONTROL,BIT_FIFOFLUSH,ENABLE); //Clear FIFO SetReg(REG_FIFODATA,mifare_key[0]); SetReg(REG_FIFODATA,mifare_key[1]); SetReg(REG_FIFODATA,mifare_key[2]); SetReg(REG_FIFODATA,mifare_key[3]); SetReg(REG_FIFODATA,mifare_key[4]); SetReg(REG_FIFODATA,mifare_key[5]); SetCommand(CMD_LOADKEY); DelayMs(1); GetReg(REG_COMMAND,®_data); if((reg_data & CMD_MASK) == CMD_IDLE) return SUCCESS; else return FAIL; } /*****************************************************************************************/ /*���ƣ�Mifare_Auth */ /*���ܣ�Mifare_Auth��Ƭ��֤ */ /*���룺mode����֤ģʽ��0��key A��֤��1��key B��֤����sector����֤�������ţ�0~15�� */ /* *mifare_key��6�ֽ���֤��Կ���飻*card_uid��4�ֽڿ�ƬUID���� */ /*���: */ /* OK :��֤�ɹ� */ /* ERROR :��֤ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Auth(unsigned char key_mode,unsigned char sector,unsigned char *mifare_key,unsigned char *card_uid) { unsigned char result,reg_data; result = Mifare_LoadKey(mifare_key); if (result != SUCCESS) return result; SetCommand(CMD_IDLE); ModifyReg(REG_FIFOCONTROL,BIT_FIFOFLUSH,ENABLE); //Clear FIFO if(key_mode == KEY_A_M1) { SetReg(REG_FIFODATA,0x60);//60 keyA M1��ָ֤�� ModifyReg(REG_RXTXCON,BIT_SHMODE,DISABLE); } if(key_mode == KEY_B_M1) { SetReg(REG_FIFODATA,0x61);//61 keyB M1��ָ֤�� ModifyReg(REG_RXTXCON,BIT_SHMODE,DISABLE); } SetReg(REG_FIFODATA,sector * 4);//��֤�����Ŀ�0��ַ SetReg(REG_FIFODATA,card_uid[0]); SetReg(REG_FIFODATA,card_uid[1]); SetReg(REG_FIFODATA,card_uid[2]); SetReg(REG_FIFODATA,card_uid[3]); ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,ENABLE); SetCommand(CMD_AUTHENT); DelayMs(5); GetReg(REG_COMMAND,®_data); if((reg_data & CMD_MASK) == CMD_IDLE) { GetReg(REG_STATUS,®_data); if(reg_data & BIT_CRYPTO1ON)//�жϼ��ܱ�־λ��ȷ����֤��� return SUCCESS; } return FAIL; } /*****************************************************************************************/ /*���ƣ�Mifare_Blockset */ /*���ܣ�Mifare_Blockset��Ƭ��ֵ���� */ /*���룺block����ţ�*buff����Ҫ���õ�4�ֽ���ֵ���� */ /* */ /*���: */ /* OK :���óɹ� */ /* ERROR :����ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Blockset(unsigned char block,unsigned char *data_buff) { unsigned char block_data[16],result; block_data[0] = data_buff[3]; block_data[1] = data_buff[2]; block_data[2] = data_buff[1]; block_data[3] = data_buff[0]; block_data[4] = ~data_buff[3]; block_data[5] = ~data_buff[2]; block_data[6] = ~data_buff[1]; block_data[7] = ~data_buff[0]; block_data[8] = data_buff[3]; block_data[9] = data_buff[2]; block_data[10] = data_buff[1]; block_data[11] = data_buff[0]; block_data[12] = block; block_data[13] = ~block; block_data[14] = block; block_data[15] = ~block; result = Mifare_Blockwrite(block,block_data); return result; } /*****************************************************************************************/ /*���ƣ�Mifare_Blockread */ /*���ܣ�Mifare_Blockread��Ƭ������� */ /*���룺block����ţ�0x00~0x3F����buff��16�ֽڶ����������� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Blockread(unsigned char block,unsigned char *data_buff) { unsigned char reg_data,i; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0x30);//30 ����ָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,ENABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(2); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 16) //���յ������ݳ���Ϊ16 return FAIL; GetReg(REG_ERROR,®_data); if(reg_data & 0x07) return FAIL; for(i=0;i<16;i++) { GetReg (REG_FIFODATA,&data_buff[i]); } return SUCCESS; } /*****************************************************************************************/ /*���ƣ�mifare_blockwrite */ /*���ܣ�Mifare��Ƭд����� */ /*���룺block����ţ�0x00~0x3F����buff��16�ֽ�д���������� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Blockwrite(unsigned char block,unsigned char *data_buff) { unsigned char reg_data,i; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0xA0);//A0 д��ָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,DISABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; for(i=0;i<16;i++) { SetReg(REG_FIFODATA,data_buff[i]); } SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; return SUCCESS; } /*****************************************************************************************/ /*���ƣ� */ /*���ܣ�Mifare ��Ƭ��ֵ���� */ /*���룺block����ţ�0x00~0x3F����buff��4�ֽ���ֵ�������� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Blockinc(unsigned char block,unsigned char *data_buff) { unsigned char reg_data,i; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0xC1);//C1 ��ֵָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,DISABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; for(i=0;i<4;i++) { SetReg(REG_FIFODATA,data_buff[i]); } SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; return SUCCESS; } /*****************************************************************************************/ /*���ƣ�mifare_blockdec */ /*���ܣ�Mifare ��Ƭ��ֵ���� */ /*���룺block����ţ�0x00~0x3F����buff��4�ֽڼ�ֵ�������� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Blockdec(unsigned char block,unsigned char *data_buff) { unsigned char reg_data,i; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0xC0);//C0 ��ֵָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,DISABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; for(i=0;i<4;i++) { SetReg(REG_FIFODATA,data_buff[i]); } SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; return SUCCESS; } /*****************************************************************************************/ /*���ƣ�mifare_transfer */ /*���ܣ�Mifare ��Ƭtransfer���� */ /*���룺block����ţ�0x00~0x3F�� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Transfer(unsigned char block) { unsigned char reg_data; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0xC1);//C1 Transferָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,DISABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; return SUCCESS; } /*****************************************************************************************/ /*���ƣ�mifare_restore */ /*���ܣ�Mifare ��Ƭrestore���� */ /*���룺block����ţ�0x00~0x3F�� */ /*���: */ /* OK :�ɹ� */ /* ERROR :ʧ�� */ /*****************************************************************************************/ unsigned char Mifare_Restore(unsigned char block) { unsigned char reg_data,i; SetCommand(CMD_IDLE); SetReg(REG_TXDATANUM,0x08); SetReg(REG_FIFODATA,0xC2);//C1 Transferָ�� SetReg(REG_FIFODATA,block);//���ַ ModifyReg(REG_TXCRCCON, BIT_CRCEN,ENABLE); ModifyReg(REG_RXCRCCON, BIT_CRCEN,DISABLE); SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; for(i=0;i<4;i++) { SetReg(REG_FIFODATA,0); } SetCommand(CMD_TRANSCEIVE); DelayMs(5); GetReg(REG_FIFOLENGTH,®_data); if (reg_data != 1) //���յ������ݳ���Ϊ1 return FAIL; GetReg (REG_FIFODATA,®_data); if(reg_data != 0x0A) return FAIL; return SUCCESS; }