[嵌入式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
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮