📄 pcd.c
字号:
#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <asm/hardware.h>#include "rc531.h"int fd531;// Access IO bank 0int r5310(int reg){ return *(unsigned char*)(reg+0x0a000000);}void w5310(int reg, int data){ *(unsigned char*)(reg+0x0a000000) = data;}// Access IO bankint r531(int reg){ *(unsigned char*)0x0a000000 = ((reg>>3)&0x07)|0x80; return *(unsigned char*)((reg&0x07)+0x0a000000);}void w531(int reg, int data){ *(unsigned char*)0x0a000000 = ((reg>>3)&0x07)|0x80; *(unsigned char*)((reg&0x07)+0x0a000000) = data;}// PCD functionint pcd_reset(int type){/* int pc; pc = PDATC; pc &= 0xf7ff; PDATC = pc; usleep(25000); pc = PDATC; pc |= 0x0800; PDATC = pc; usleep(2500); pc = PDATC; pc &= 0xf7ff; PDATC = pc; while((r5310(0x01)&0x3f)!=0x3f); while(r5310(0x01)&0x3f); w5310(0x00, 0x80); if(r5310(0x01)) return -1; else return 0;*/ //Set timeout to 2ms w531(0x2b, 0x06); w531(0x2a, 0x0a); w531(0x2c, 0x1a); if(type==RESET_TYPEA){ //Type A Register Reset w531(0x11, 0x51); w531(0x13, 0x3f); w531(0x14, 0x19); w531(0x17, 0x3b); w531(0x19, 0x73); w531(0x1a, 0x28); w531(0x1c, 0xff); w531(0x1d, 0x3e); w531(0x22, 0x0f); w531(0x23, 0x63); w531(0x24, 0x63); }else{ //Type B Register Reset w531(0x11, 0x4b); w531(0x13, 0x06); w531(0x14, 0x20); w531(0x17, 0x23); w531(0x19, 0x73); w531(0x1a, 0x19); w531(0x1c, 0x44); w531(0x1d, 0x3e); w531(0x22, 0x2c); w531(0x23, 0xff); w531(0x24, 0xff); } return 0;}int pcd_open(void){ fd531 = open("/dev/rc531", O_RDWR); if(fd531<0){ printf("Cannot open rc531!\n"); exit(-1); } return 0;}int pcd_close(void){ close(fd531); return 0;}int pcd_writee2(int addr, char *buf, int len){ int i; char sbuf[128], rbuf[8]; struct rc531_cmd cmd; cmd.sendbuf = sbuf; cmd.recvbuf = rbuf; cmd.cmd = 0x01; cmd.timeout = 0x1a; cmd.bytesent = len+2; *(int*)sbuf = addr; for(i=0; i<len; i++){ sbuf[i+2] = buf[i]; } ioctl(fd531, RC531_CMD, &cmd); return cmd.status;}int pcd_reade2(int addr, char *buf, int len){ char sbuf[8]; struct rc531_cmd cmd; cmd.sendbuf = sbuf; cmd.recvbuf = buf; cmd.cmd = 0x03; cmd.timeout = 0x1a; cmd.bytesent = 3; *(int*)sbuf = addr; sbuf[2] = len; ioctl(fd531, RC531_CMD, &cmd); return cmd.status;}int pcd_loadconfig(int addr){ char sbuf[8], rbuf[8]; struct rc531_cmd cmd; cmd.sendbuf = sbuf; cmd.recvbuf = rbuf; cmd.cmd = 0x07; cmd.timeout = 0x1a; cmd.bytesent = 2; *(int*)sbuf = addr; ioctl(fd531, RC531_CMD, &cmd); return cmd.status;}void mferror(int code){ switch(code){ case E_OK: printf("OK!\n"); break; case E_COLL: printf("COLL ERROR!\n"); break; case E_PARITY: printf("PARITY ERROR!\n"); break; case E_FRAME: printf("FRAME ERROR!\n"); break; case E_CRC: printf("CRC ERROR!\n"); break; case E_OVERFLOW: printf("FIFO OVERFLOW\n"); break; case E_ACCESS: printf("ACCESS ERROR!\n"); break; case E_KEY: printf("LOADKEY ERROR!\n"); break; case E_TIMEOUT: printf("TIMEOUT!\n"); break; case E_BIT: printf("BIT COUNT ERROR!\n"); break; case E_BYTE: printf("BYTE COUNT ERROR!\n"); break; case E_AUTH: printf("AUTHENT ERROR!\n"); break; case E_NAUTH: printf("NOT AUTHENT!\n"); break; case E_CODE: printf("CODE ERROR!\n"); break; case E_WRITE: printf("WRITE ERROR!\n"); break; case E_VALUE: printf("VALUE ERROR!\n"); break; case E_RESET: printf("RESET ERROR!\n"); break; default: printf("UNKOWN ERROR: %04x\n", code); };}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -