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

来源:互联网 发布:电脑网络格斗游戏 编辑:程序博客网 时间:2024/06/07 21:45


硬件说明:



关于RFID的基础知识


程序设计流程图


#include <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h> #include <unistd.h>#include <sys/types.h>#include <time.h>#include <sys/select.h>#include <errno.h>#include <termios.h> #define DEBUG0#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_SELECTEDTTY1_PATH#define REQUEST_MODE_ALL0x52#define REQUEST_MODE_IDLE0x26#define CMDTYPE_PROTOCOL_CTRL0x00#define CMDTYPE_DEVICE_CTRL0x01#define CMDTYPE_ISO14443A0x02#define CMD_GETEVCINFO 'A'#define CMD_PCDCONFIG 'B'#define CMD_PCDCLOSE'C'#define ATQ_Mifarel_S500x0004#define ATQ_SHC11010x0004#define ATQ_11RF320x0004#define ATQ_Mifarel_S700x0002#define ATQ_Mifarel_Light0x0010#define ATQ_Mifarel_UltraLight0x0044#define ATQ_SHC11020x3300#define ATQ_Mifare3_DESFire0x0344#define AVOID_COLLISION_LEVEL_10x93#define AVOID_COLLISION_LEVEL_20x95#define AVOID_COLLISION_LEVEL_30x97#define SAK_Mifarel_S500x08#define SAK_Mifarel_S700x18#define SAK_Mifarel_Light0x01#define SAK_Mifarel0_UltraLight0x04#define SAK_Mifare3_DESFire0x24#define SAK_SHC11010x22#define SAK_SHC11020x21#define SAK_11RF320x08/* Frame (Byte) */#define FRAME_MIN_LENGTH6#define FRAME_MAX_LENGTH54#define DATA_BUFF_LENGTH16#define DEVICE_INFO_SIZE12/* 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_FAILED0x13#define ERR_DATA_ERROR0x14#define ERR_ANTICOLL_FAILED0x15#define ERR_INVALID_PARAM0x16#define ERR_PACKET_MISSED0x17#define ERR_REQUEST_FAILED0x18#define ERR_LENGTH_ERROR0x19#define ERR_READ_FAILED0x1a#define ERR_OPERATION_DENIED0x1b#define ERR_AUTHKEY_FAILED0x0a#define ERR_WRITE_FAILED0x0b#define EXCEPTION_INCOMPLETE_UID0x20#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_A0x60#define KEY_B0x61#define BLOCK_SELECTED0x1unsigned 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_READ11#define OPERATION_WRITE12/************************************************//* Module Function */static inline unsigned char Caculate_BCC(unsigned char* buff,unsigned char length){unsigned char BCC = 0;unsigned char i;for(i=0;i<length-2;i++){BCC ^= *(buff + i);}return ~BCC;}static inline void Display_Card_Data(unsigned char *data_buff){unsigned char i;printf("Read Card success! The data is (int):");for(i=0 ; i<DATA_BUFF_LENGTH ; i++){printf(" %x",*(data_buff + i));}printf("\n");printf("The data is (char):");for(i=0 ; i<DATA_BUFF_LENGTH ; i++){printf("%c",*(data_buff + i));}printf("\n\n");}static inline void Display_Device_Info(unsigned char *dev_info){unsigned char i;printf("The device infomation is: ");for(i=0;i<DEVICE_INFO_SIZE;i++){printf("%c",*(dev_info + i));}printf("\n");}static inline void Display_Uid(struct Uid * uid_p){unsigned char i;printf("%s: The uid_length is:%d \n",__FUNCTION__,uid_p->uid_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("\n\n");}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.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;case ATQ_Mifarel_S70:printf("%s: The card type is Mifarel_S70.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;case ATQ_Mifarel_Light:printf("%s: The card type is Mifarel_Light.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;case ATQ_Mifarel_UltraLight:printf("%s: The card type is Mifarel_UltraLight.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;case ATQ_SHC1102:printf("%s: The card type is SHC1102.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;case ATQ_Mifare3_DESFire:printf("%s: The card type is Mifare3_DESFire.\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__FUNCTION__,atq_num);break;default:printf("%s: Other card type!\n",__FUNCTION__);printf("%s: The ATQ is 0x%x\n",__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!\n",__FUNCTION__);return -ERR_LENGTH_ERROR;}else if(*(buff + 1) != packet_info){printf("%s: packet missed!\n",__FUNCTION__);return -ERR_PACKET_MISSED;}else if(*(buff + checksum_bit)!= Caculate_BCC(buff,*(buff + 0))){//!!!printf("%s: checksum error!\n",__FUNCTION__);return -ERR_CHECKSUM_FAILED;}else if(*(buff + 2)){printf("%s: request failed!\n",__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!\n",__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!\n",__FUNCTION__);return ret;case 0:printf("%s: select timeout!\n",__FUNCTION__);return -ERR_TIMEOUT;default:ret=read(fd,rbuff,size);if(ret < 0){printf("%s: unable to read!\n",__FUNCTION__);return ret;}break;}return 0;}/*** Device Control ****/int GetDvcInfo(int fd,unsigned char *dev_info){printf("Entering %s!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x10);//!!!if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}usleep(DELAY_MEDIUM_TIME);ret = Read_Buff(fd,&rbuff[16],0x02);//!!!if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,0x12);#endifret = Check_The_Frame(rbuff,0x12,wbuff[1],16);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__FUNCTION__);memcpy(dev_info,&rbuff[4],DEVICE_INFO_SIZE);}return 0;}int PCDConfig(int fd){printf("Entering %s!\n",__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!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x06);//!!!if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}usleep(DELAY_MEDIUM_TIME);#if DEBUGDisplay_The_Frame(rbuff,0x06);#endifret = Check_The_Frame(rbuff,0x06,wbuff[1],4);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__FUNCTION__);}return 0;}/*** Card Operation ***/int PiccRequest(int fd,unsigned int *atq_num){printf("Entering %s!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x08);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,0x8);#endifret = Check_The_Frame(rbuff,0x8,wbuff[1],6);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__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!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x0a);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,10);#endifret = Check_The_Frame(rbuff,0xa,wbuff[1],8);if(ret){printf("%s: Check_The_Frame failed!\n",__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!\n",__FUNCTION__);return -ERR_ANTICOLL_FAILED;default:return -ERR_INVALID_PARAM;}}else{printf("%s: successed!\n",__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!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x07);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,7);#endifret = Check_The_Frame(rbuff,0x7,wbuff[1],5);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else if(rbuff[4]& 0x4){printf("%s: Incompleted uid,need to PiccAnticoll more...\n",__FUNCTION__);return EXCEPTION_INCOMPLETE_UID;}else{printf("%s: successed!\n",__FUNCTION__);}return 0;}int PiccHalt(int fd){printf("Entering %s!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x06);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,6);#endifret = Check_The_Frame(rbuff,0x6,wbuff[1],4);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__FUNCTION__);}return 0;}int PiccAuthKey(int fd,unsigned char key,struct Uid * uid_p,unsigned char block_id){printf("Entering %s!\n",__FUNCTION__);if(not_readed_flag && ((block_id/4)!=current_section_id)){printf("%s:Failed! You must read the section first!\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x06);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,6);#endifret = Check_The_Frame(rbuff,0x6,wbuff[1],4);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__FUNCTION__);not_readed_flag = 1;}return 0;}int PiccRead(int fd,unsigned char block_id,unsigned char *data_buff){printf("Entering %s!\n",__FUNCTION__);if((block_id/4) != current_section_id){printf("%s:Operation denied,invalid block id!\n",__FUNCTION__);return -ERR_INVALID_PARAM;}if(block_id%4 == 3){printf("%s:*** This is the block save password. ***\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,16);//!!!if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}usleep(DELAY_MEDIUM_TIME);ret = Read_Buff(fd,&rbuff[16],6);//!!!if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,22);#endifret = Check_The_Frame(rbuff,0x17,wbuff[1],20);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__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!\n",__FUNCTION__);if((block_id/4) != current_section_id){printf("%s:Operation denied,invalid block id!\n",__FUNCTION__);return -ERR_INVALID_PARAM;}if(block_id%4 == 3){printf("%s:*** This is the block save password. ***\n",__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!\n",__FUNCTION__);return -ERR_WRITE_FAILED;}ret = Read_Buff(fd,rbuff,0x06);if(ret){printf("%s:Read_Buff failed!\n",__FUNCTION__);return -ERR_READ_FAILED;}#if DEBUGDisplay_The_Frame(rbuff,6);#endifret = Check_The_Frame(rbuff,0x6,wbuff[1],4);if(ret){printf("%s: Check_The_Frame failed!\n",__FUNCTION__);return ret;}else{printf("%s: successed!\n",__FUNCTION__);}return 0;}int tty_init(int fd, struct termios *old_config,struct termios *new_config){printf("Entering %s!\n",__FUNCTION__);int ret;ret = tcgetattr(fd,old_config);if(ret){printf("Failed to get old config!\n");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!\n");return 0;err:return -ERR_ACCESS_FAILED;}/*** Start from here! ***/int main(void){printf("Entering %s!\n",__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!\n");goto err0;}new_config = (struct termios *)malloc(sizeof(struct termios));if(NULL == new_config){printf("%s: Failed to malloc new_config!\n",__FUNCTION__);goto err0;}old_config = (struct termios *)malloc(sizeof(struct termios));if(NULL == old_config){printf("%s: Failed to malloc old_config!\n",__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!!!\n",__FUNCTION__);goto err2;}ret = GetDvcInfo(tty_fd[1],dev_info);if(ret){printf("%s: GetDvcInfo failed!!!\n",__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 \n",__FUNCTION__,block_id / 4);printf("%s: The block_id operating is: %d \n",__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! ***\n");}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!!!\n",__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<size;i++){printf("%d.\t%d\n",i,*(buff+i));}}