[嵌入式Linux驱动]关于RFID模块的Linux控制应用程序

2019-07-12 17:49发布


硬件说明:

关于RFID的基础知识
程序设计流程图
#include #include #include #include #include #include #include #include #include #include #define DEBUG 0 #define DB_MSG(m) do{ #if DEBUG printf(m) #endif }while(0) #define TTY0_PATH "/dev/s3c2410_serial0" #define TTY1_PATH "/dev/s3c2410_serial1" #define TTY2_PATH "/dev/s3c2410_serial2" #define TTY3_PATH "/dev/s3c2410_serial3" #define SERIAL_SELECTED TTY1_PATH #define REQUEST_MODE_ALL 0x52 #define REQUEST_MODE_IDLE 0x26 #define CMDTYPE_PROTOCOL_CTRL 0x00 #define CMDTYPE_DEVICE_CTRL 0x01 #define CMDTYPE_ISO14443A 0x02 #define CMD_GETEVCINFO 'A' #define CMD_PCDCONFIG 'B' #define CMD_PCDCLOSE 'C' #define ATQ_Mifarel_S50 0x0004 #define ATQ_SHC1101 0x0004 #define ATQ_11RF32 0x0004 #define ATQ_Mifarel_S70 0x0002 #define ATQ_Mifarel_Light 0x0010 #define ATQ_Mifarel_UltraLight 0x0044 #define ATQ_SHC1102 0x3300 #define ATQ_Mifare3_DESFire 0x0344 #define AVOID_COLLISION_LEVEL_1 0x93 #define AVOID_COLLISION_LEVEL_2 0x95 #define AVOID_COLLISION_LEVEL_3 0x97 #define SAK_Mifarel_S50 0x08 #define SAK_Mifarel_S70 0x18 #define SAK_Mifarel_Light 0x01 #define SAK_Mifarel0_UltraLight 0x04 #define SAK_Mifare3_DESFire 0x24 #define SAK_SHC1101 0x22 #define SAK_SHC1102 0x21 #define SAK_11RF32 0x08 /* Frame (Byte) */ #define FRAME_MIN_LENGTH 6 #define FRAME_MAX_LENGTH 54 #define DATA_BUFF_LENGTH 16 #define DEVICE_INFO_SIZE 12 /* Communication Tab */ #define STX 0x20 #define ETX 0x03 #define ACK 0x06 #define NAK 0x15 /* Error Table */ #define ERR_ACCESS_FAILED 0x11 #define ERR_TIMEOUT 0x12 #define ERR_CHECKSUM_FAILED 0x13 #define ERR_DATA_ERROR 0x14 #define ERR_ANTICOLL_FAILED 0x15 #define ERR_INVALID_PARAM 0x16 #define ERR_PACKET_MISSED 0x17 #define ERR_REQUEST_FAILED 0x18 #define ERR_LENGTH_ERROR 0x19 #define ERR_READ_FAILED 0x1a #define ERR_OPERATION_DENIED 0x1b #define ERR_AUTHKEY_FAILED 0x0a #define ERR_WRITE_FAILED 0x0b #define EXCEPTION_INCOMPLETE_UID 0x20 #define ISO14443A_Request 'A' #define ISO14443A_CascAnticoll 'B' #define ISO14443A_CascSelect 'C' #define ISO14443A_Halt 'D' #define ISO14443A_Authentication 'E' #define ISO14443A_AuthKey 'F' #define ISO14443A_Read 'G' #define ISO14443A_Write 'H' #define KEY_A 0x60 #define KEY_B 0x61 #define BLOCK_SELECTED 0x1 unsigned char key_buff[6] = {0xff,0xff,0xff,0xff,0xff,0xff}; int tty_fd[4]; #define DELAY_SHORT_TIME (5 * 1000) #define DELAY_MEDIUM_TIME (5 * DELAY_SHORT_TIME) #define DELAY_LONG_TIME (5 * DELAY_MEDIUM_TIME) volatile unsigned int cardid; struct Uid{ unsigned char uid_buff[FRAME_MAX_LENGTH]; unsigned char uid_length; }; unsigned char seq = 0; unsigned char current_section_id; unsigned char not_readed_flag = 0; unsigned char readdata_buff[DATA_BUFF_LENGTH]; unsigned char writedata_buff[DATA_BUFF_LENGTH]; struct termios *new_config = NULL; struct termios *old_config = NULL; int tty_init(int fd, struct termios *old_config,struct termios *new_config); int GetDvcInfo(int fd,unsigned char *dev_info); int PCDConfig(int fd); int PCDClose(int fd); int PiccRequest(int fd, unsigned int *atq_num); int PiccAnticoll(int fd,unsigned char level,struct Uid * uid_p); int PiccSelect(int fd,struct Uid * uid_p); int PiccHalt(int fd); int PiccAuthKey(int fd,unsigned char key,struct Uid * uid_p,unsigned char block_id); int PiccRead(int fd,unsigned char block_id,unsigned char *data_buff); int PiccWrite(int fd,unsigned char block_id,unsigned char *data_buff); static inline int Read_Buff(int fd,unsigned char *rbuff,unsigned char size); static inline int Write_Buff(int fd,unsigned char *wbuff,unsigned char size); static inline void Display_Atq_Num(unsigned int atq_num); static inline void Display_Uid(struct Uid * uid_p); static inline void Display_The_Frame(unsigned char *buff,unsigned char size); static inline void Display_Card_Data(unsigned char *data_buff); static inline void Display_Device_Info(unsigned char *dev_info); static inline unsigned char Caculate_BCC(unsigned char* buff,unsigned char length); static inline int Check_The_Frame(unsigned char *buff, unsigned char frame_length,unsigned char packet_info,unsigned char checksum_bit); /************** Use this interface ***************/ int Card_Operation(int fd,unsigned char operation,unsigned char block_id); #define OPERATION_READ 11 #define OPERATION_WRITE 12 /************************************************/ /* Module Function */ static inline unsigned char Caculate_BCC(unsigned char* buff,unsigned char length) { unsigned char BCC = 0; unsigned char i; for(i=0;iuid_length); printf("%s: The card serial number is 0x",__FUNCTION__); for(i = uid_p->uid_length; i > 0 ; i--){ printf("%x",uid_p->uid_buff[i-1]); } printf(" "); } static inline void Display_Atq_Num(unsigned int atq_num) { switch(atq_num){ case (ATQ_Mifarel_S50|ATQ_SHC1101|ATQ_11RF32): printf("%s: The card type is mifarel_S50 or SHC1101 or 11RF32. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; case ATQ_Mifarel_S70: printf("%s: The card type is Mifarel_S70. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; case ATQ_Mifarel_Light: printf("%s: The card type is Mifarel_Light. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; case ATQ_Mifarel_UltraLight: printf("%s: The card type is Mifarel_UltraLight. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; case ATQ_SHC1102: printf("%s: The card type is SHC1102. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; case ATQ_Mifare3_DESFire: printf("%s: The card type is Mifare3_DESFire. ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; default: printf("%s: Other card type! ",__FUNCTION__); printf("%s: The ATQ is 0x%x ",__FUNCTION__,atq_num); break; } } static inline int Check_The_Frame(unsigned char *buff, unsigned char frame_length,unsigned char packet_info,unsigned char checksum_bit) { if(*(buff+0) > frame_length){ printf("%s: length error! ",__FUNCTION__); return -ERR_LENGTH_ERROR; } else if(*(buff + 1) != packet_info){ printf("%s: packet missed! ",__FUNCTION__); return -ERR_PACKET_MISSED; } else if(*(buff + checksum_bit)!= Caculate_BCC(buff,*(buff + 0))){ //!!! printf("%s: checksum error! ",__FUNCTION__); return -ERR_CHECKSUM_FAILED; } else if(*(buff + 2)){ printf("%s: request failed! ",__FUNCTION__); return -ERR_REQUEST_FAILED; } return 0; } static inline int Write_Buff(int fd,unsigned char *wbuff,unsigned char size) { int ret; ret = write(fd,wbuff,size); if(ret<0){ printf("%s: unable to write! ",__FUNCTION__); return ret; } if(seq == 15){ seq = 0; } else{ seq++; } usleep(DELAY_SHORT_TIME); return 0; } static inline int Read_Buff(int fd,unsigned char *rbuff,unsigned char size) { int ret; fd_set read_fd_set; FD_ZERO(&read_fd_set); FD_SET(fd,&read_fd_set); struct timeval timeout; timeout.tv_sec = 3; timeout.tv_usec = 0; ret=select(fd+1,&read_fd_set,NULL,NULL,&timeout); switch(ret){ case -1: printf("%s: select error! ",__FUNCTION__); return ret; case 0: printf("%s: select timeout! ",__FUNCTION__); return -ERR_TIMEOUT; default: ret=read(fd,rbuff,size); if(ret < 0){ printf("%s: unable to read! ",__FUNCTION__); return ret; } break; } return 0; } /*** Device Control ****/ int GetDvcInfo(int fd,unsigned char *dev_info) { printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x06; // wbuff[1] = (seq << 4)|CMDTYPE_DEVICE_CTRL; wbuff[1] = CMDTYPE_DEVICE_CTRL; wbuff[2] = CMD_GETEVCINFO; wbuff[3] = 0x0; wbuff[4] = Caculate_BCC(wbuff,wbuff[0]); wbuff[5] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x10); //!!! if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } usleep(DELAY_MEDIUM_TIME); ret = Read_Buff(fd,&rbuff[16],0x02); //!!! if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,0x12); #endif ret = Check_The_Frame(rbuff,0x12,wbuff[1],16); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); memcpy(dev_info,&rbuff[4],DEVICE_INFO_SIZE); } return 0; } int PCDConfig(int fd) { printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x06; // wbuff[1] = (seq << 4)|CMDTYPE_DEVICE_CTRL; wbuff[1] = CMDTYPE_DEVICE_CTRL; wbuff[2] = CMD_PCDCONFIG; wbuff[3] = 0x0; wbuff[4] = Caculate_BCC(wbuff,wbuff[0]); wbuff[5] = ETX; return 0; } int PCDClose(int fd) { printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x06; // wbuff[1] = (seq << 4)|CMDTYPE_DEVICE_CTRL; wbuff[1] = CMDTYPE_DEVICE_CTRL; wbuff[2] = CMD_PCDCLOSE; wbuff[3] = 0x0; wbuff[4] = Caculate_BCC(wbuff,wbuff[0]); wbuff[5] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x06); //!!! if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } usleep(DELAY_MEDIUM_TIME); #if DEBUG Display_The_Frame(rbuff,0x06); #endif ret = Check_The_Frame(rbuff,0x06,wbuff[1],4); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); } return 0; } /*** Card Operation ***/ int PiccRequest(int fd, unsigned int *atq_num) { printf("Entering %s! ",__FUNCTION__); not_readed_flag = 0; unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x07; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_Request; wbuff[3] = 0x01; wbuff[4] = REQUEST_MODE_ALL; wbuff[5] = Caculate_BCC(wbuff,wbuff[0]); wbuff[6] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x08); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,0x8); #endif ret = Check_The_Frame(rbuff,0x8,wbuff[1],6); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); *atq_num = 0; *atq_num = (rbuff[4])|(rbuff[5] << 8); } return 0; } int PiccAnticoll(int fd,unsigned char level,struct Uid * uid_p) { printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; unsigned int uid; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x08; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_CascAnticoll; wbuff[3] = 0x02; wbuff[4] = level; wbuff[5] = 0x00; wbuff[6] = Caculate_BCC(wbuff,wbuff[0]); wbuff[7] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x0a); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,10); #endif ret = Check_The_Frame(rbuff,0xa,wbuff[1],8); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else if(rbuff[4] == 0x88){ switch(level){ case AVOID_COLLISION_LEVEL_1: uid_p->uid_buff[uid_p->uid_length + 0] = rbuff[5]; uid_p->uid_buff[uid_p->uid_length + 1] = rbuff[6]; uid_p->uid_buff[uid_p->uid_length + 2] = rbuff[7]; uid_p->uid_length += 3; ret = PiccAnticoll(fd,AVOID_COLLISION_LEVEL_2,uid_p); return ret; case AVOID_COLLISION_LEVEL_2: uid_p->uid_buff[uid_p->uid_length + 0] = rbuff[5]; uid_p->uid_buff[uid_p->uid_length + 1] = rbuff[6]; uid_p->uid_buff[uid_p->uid_length + 2] = rbuff[7]; uid_p->uid_length += 3; ret = PiccAnticoll(fd,AVOID_COLLISION_LEVEL_3,uid_p); return ret; case AVOID_COLLISION_LEVEL_3: printf("%s: Avoid collision failed!Please try again later! ",__FUNCTION__); return -ERR_ANTICOLL_FAILED; default: return -ERR_INVALID_PARAM; } } else{ printf("%s: successed! ",__FUNCTION__); uid_p->uid_buff[uid_p->uid_length + 0] = rbuff[4]; uid_p->uid_buff[uid_p->uid_length + 1] = rbuff[5]; uid_p->uid_buff[uid_p->uid_length + 2] = rbuff[6]; uid_p->uid_buff[uid_p->uid_length + 3] = rbuff[7]; uid_p->uid_length += 4; } return 0; } int PiccSelect(int fd,struct Uid * uid_p) { printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = uid_p->uid_length + 7; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_CascSelect; wbuff[3] = uid_p->uid_length + 1; wbuff[4] = REQUEST_MODE_ALL; //!!! memcpy(&wbuff[5],uid_p->uid_buff,uid_p->uid_length); wbuff[5 + uid_p->uid_length] = Caculate_BCC(wbuff,wbuff[0]); wbuff[6 + uid_p->uid_length] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x07); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,7); #endif ret = Check_The_Frame(rbuff,0x7,wbuff[1],5); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else if(rbuff[4]& 0x4){ printf("%s: Incompleted uid,need to PiccAnticoll more... ",__FUNCTION__); return EXCEPTION_INCOMPLETE_UID; } else{ printf("%s: successed! ",__FUNCTION__); } return 0; } int PiccHalt(int fd){ printf("Entering %s! ",__FUNCTION__); unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x06; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_Halt; wbuff[3] = 0x0; wbuff[4] = Caculate_BCC(wbuff,wbuff[0]); wbuff[5] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x06); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,6); #endif ret = Check_The_Frame(rbuff,0x6,wbuff[1],4); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); } return 0; } int PiccAuthKey(int fd,unsigned char key,struct Uid * uid_p,unsigned char block_id) { printf("Entering %s! ",__FUNCTION__); if(not_readed_flag && ((block_id/4)!=current_section_id)){ printf("%s:Failed! You must read the section first! ",__FUNCTION__); return -ERR_OPERATION_DENIED; } unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = uid_p->uid_length + 0x0e; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_AuthKey; wbuff[3] = uid_p->uid_length + 0x08; wbuff[4] = key; memcpy(&wbuff[5],uid_p->uid_buff,uid_p->uid_length); memcpy(&wbuff[5 + uid_p->uid_length],key_buff,6); wbuff[11 + uid_p->uid_length] = block_id; wbuff[12 + uid_p->uid_length] = Caculate_BCC(wbuff,wbuff[0]); wbuff[13 + uid_p->uid_length] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x06); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,6); #endif ret = Check_The_Frame(rbuff,0x6,wbuff[1],4); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); not_readed_flag = 1; } return 0; } int PiccRead(int fd,unsigned char block_id,unsigned char *data_buff) { printf("Entering %s! ",__FUNCTION__); if((block_id/4) != current_section_id){ printf("%s:Operation denied,invalid block id! ",__FUNCTION__); return -ERR_INVALID_PARAM; } if(block_id%4 == 3){ printf("%s:*** This is the block save password. *** ",__FUNCTION__); } unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x07; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_Read; wbuff[3] = 0x01; wbuff[4] = block_id; wbuff[5] = Caculate_BCC(wbuff,wbuff[0]); wbuff[6] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,16); //!!! if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } usleep(DELAY_MEDIUM_TIME); ret = Read_Buff(fd,&rbuff[16],6); //!!! if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,22); #endif ret = Check_The_Frame(rbuff,0x17,wbuff[1],20); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); memcpy(data_buff,&rbuff[4],16); not_readed_flag = 0; } return 0; } int PiccWrite(int fd,unsigned char block_id,unsigned char *data_buff) { printf("Entering %s! ",__FUNCTION__); if((block_id/4) != current_section_id){ printf("%s:Operation denied,invalid block id! ",__FUNCTION__); return -ERR_INVALID_PARAM; } if(block_id%4 == 3){ printf("%s:*** This is the block save password. *** ",__FUNCTION__); } unsigned char wbuff[FRAME_MAX_LENGTH],rbuff[FRAME_MAX_LENGTH]; int ret; memset(rbuff,0,FRAME_MAX_LENGTH); memset(wbuff,0,FRAME_MAX_LENGTH); wbuff[0] = 0x17; // wbuff[1] = (seq << 4)|CMDTYPE_ISO14443A; wbuff[1] = CMDTYPE_ISO14443A; wbuff[2] = ISO14443A_Write; wbuff[3] = 0x11; wbuff[4] = block_id; memcpy(&wbuff[5],data_buff,16); wbuff[21] = Caculate_BCC(wbuff,wbuff[0]); wbuff[22] = ETX; ret = Write_Buff(fd,wbuff,wbuff[0]); if(ret < 0){ printf("%s:Write_Buff failed! ",__FUNCTION__); return -ERR_WRITE_FAILED; } ret = Read_Buff(fd,rbuff,0x06); if(ret){ printf("%s:Read_Buff failed! ",__FUNCTION__); return -ERR_READ_FAILED; } #if DEBUG Display_The_Frame(rbuff,6); #endif ret = Check_The_Frame(rbuff,0x6,wbuff[1],4); if(ret){ printf("%s: Check_The_Frame failed! ",__FUNCTION__); return ret; } else{ printf("%s: successed! ",__FUNCTION__); } return 0; } int tty_init(int fd, struct termios *old_config,struct termios *new_config) { printf("Entering %s! ",__FUNCTION__); int ret; ret = tcgetattr(fd,old_config); if(ret){ printf("Failed to get old config! "); goto err; } cfmakeraw(new_config); new_config->c_cflag = (B9600); new_config->c_cflag |= CLOCAL | CREAD; new_config->c_cflag &= ~CSIZE; new_config->c_cflag |= CS8; new_config->c_cflag &= ~PARENB; new_config->c_cflag &= ~CSTOPB; tcflush(fd,TCIFLUSH); new_config->c_cc[VTIME] = 10; new_config->c_cc[VMIN] = 1; tcflush(fd,TCIFLUSH); tcsetattr(fd,TCSANOW,new_config); printf("Tty init finished! "); return 0; err: return -ERR_ACCESS_FAILED; } /*** Start from here! ***/ int main(void) { printf("Entering %s! ",__FUNCTION__); unsigned char i; int ret; unsigned char dev_info[DEVICE_INFO_SIZE]; unsigned char block_id; current_section_id = 255; tty_fd[1] = open(SERIAL_SELECTED,O_RDWR | O_NOCTTY | O_NONBLOCK); if(tty_fd[1] < 0){ printf("Failed to open serial! "); goto err0; } new_config = (struct termios *)malloc(sizeof(struct termios)); if(NULL == new_config){ printf("%s: Failed to malloc new_config! ",__FUNCTION__); goto err0; } old_config = (struct termios *)malloc(sizeof(struct termios)); if(NULL == old_config){ printf("%s: Failed to malloc old_config! ",__FUNCTION__); goto err1; } bzero(new_config, sizeof(struct termios)); bzero(old_config, sizeof(struct termios)); if( tty_init(tty_fd[1],old_config,new_config) ){ printf("%s: tty_init failed!!! ",__FUNCTION__); goto err2; } ret = GetDvcInfo(tty_fd[1],dev_info); if(ret){ printf("%s: GetDvcInfo failed!!! ",__FUNCTION__); } else{ Display_Device_Info(dev_info); } /* let's do something interesting : ) */ bzero(writedata_buff,sizeof(writedata_buff)); unsigned char my_data[]="What the fuck!"; memcpy(writedata_buff,my_data,sizeof(my_data)); // block_id = 0; for(block_id = 1;block_id < 64;block_id++){ if((block_id%4) != 3){ // while(Card_Operation(tty_fd[1],OPERATION_WRITE,block_id)); while(Card_Operation(tty_fd[1],OPERATION_READ,block_id)); } } free(old_config); free(new_config); return 0; err2: free(old_config); err1: free(new_config); err0: return -1; } int Card_Operation(int fd,unsigned char operation,unsigned char block_id) { printf("%s: The sector_id operating is: %d ",__FUNCTION__,block_id / 4); printf("%s: The block_id operating is: %d ",__FUNCTION__,block_id); sleep(1); int ret; unsigned int atq_num; struct Uid uid_str; bzero(&uid_str, sizeof(struct Uid)); bzero(readdata_buff,sizeof(readdata_buff)); if(current_section_id != block_id / 4){ ret = PiccRequest(fd,&atq_num); if(ret){ return ret; } else{ Display_Atq_Num(atq_num); } usleep(DELAY_MEDIUM_TIME); ret = PiccAnticoll(fd,AVOID_COLLISION_LEVEL_1,&uid_str); if(ret){ return ret; } else{ Display_Uid(&uid_str); } usleep(DELAY_MEDIUM_TIME); ret = PiccSelect(fd,&uid_str); if(ret){ return ret; } usleep(DELAY_MEDIUM_TIME); ret = PiccAuthKey(fd,KEY_A,&uid_str,block_id); if(ret){ return ret; } else{ current_section_id = block_id / 4; } usleep(DELAY_MEDIUM_TIME); } switch(operation){ case OPERATION_WRITE: ret = PiccWrite(fd,block_id,writedata_buff); if(ret){ return ret; } else{ printf("*** Data writing success! *** "); } break; case OPERATION_READ: ret = PiccRead(fd,block_id,readdata_buff); if(ret){ return ret; } else{ Display_Card_Data(readdata_buff); } break; default: printf("%s: The invalid operation!!! ",__FUNCTION__); break; } return 0; } /********************* USE FOR DEBUG *********************/ static inline void Display_The_Frame(unsigned char *buff,unsigned char size) { unsigned char i; for(i=0;i