📄 ic.cpp
字号:
#include "at45.h"
#include "stdio.h"
unsigned short verRder=0;
long ttt=0;
long clkReader=3571200l;
long clkCpu=3571200l;
long baudRate=9600l;
short tout=1;
short getByte();
short sendByte(short dt);
#include<windows.h>
void delay(unsigned short i){
DWORD a=GetTickCount(),b;
do b=GetTickCount()-a; while (b<=i);
}
#include <string.h>
////////////////////////////////////////////////////////////////////////////////
#define jbGetInfo 0
#define jbPowerOff 1
#define jbEnd 2
#define jbPowerOn 3
#define jbPowerOnCpu 4
#define jbSetPort 5
#define jbSetLed 6
#define jbEject 7
#define jbIOUp 8
#define jbIODown 9
#define jbLowIO5 10
#define jbLowIO4 11
#define jbLowIO3 12
#define jbLowIO2 13
#define jbLowIO1 14
#define jbLowIO0 15
#define jbUpIO5 16
#define jbUpIO4 17
#define jbUpIO3 18
#define jbUpIO2 19
#define jbUpIO1 20
#define jbUpIO0 21
#define jbGotoAdd 22
#define jbRead6603 23
#define jbWrt6603 24
#define jbWrt6603V 25
#define jbWrt6603E 26
#define jbWrt6603EV 27
#define jbCompare 28
#define jbGetCmpCnt 29
#define jbReadSPI 30
#define jbWriteSPI 31
#define jbReadIIC 32
#define jbWriteIIC 33
#define jbSendCPU 34
#define jbIICATR 35
#define jbEraseSPI 36
#define jbEraseIIC 37
#define jbErase6603 38
#define jbSetBaud 39
#define jbSendCPU1 40
short sold[]={jbSetPort,0xc7,0x6b,-1,jbSetLed,2,jbLowIO1,jbWriteSPI, //old
0,jbUpIO3,jbLowIO3,jbSetLed,1,jbReadSPI,0,jbUpIO1};
#define mBfSz 256
#define SPITimeOut 11
#define timeOut 550//182
#define times GetTickCount()
short sdBuffer[mBfSz];
unsigned char recBuffer[mBfSz];
short CardType=0;
short BufSize=11;
short sbs=0,sbe=0,rbe=0;
#define getByte1 getByte
short checkSBuf(){
short r=getByte1();
if (r<0) return 0;
if (sbs==sbe) return erTooManyResponse;
short a=sdBuffer[sbs++];
if (sbs>=BufSize) sbs=0;
if (a==-1) {
if (rbe<mBfSz) recBuffer[rbe++]=(unsigned char)r;
} else {
if (a!=r) return erLoopBackErr;
}
return 0;
}
short sendBytes(short *b,short l){
short r=0;
unsigned long t1=times;
for (short i=0;i<l;){
r|=checkSBuf();
short a=sbe+1;
if (a>=BufSize) a=0;
if (a!=sbs){
short r1=0;
if (b[i]>=0) r1=sendByte(b[i]);
if (b[i]<0 || r1>=0) {
// if (b[i]>=0) delay(2); //for win95 bug.
sdBuffer[sbe]=b[i++];
sbe=a;
t1=times;
}
}
if (times<t1) t1=times;
if (times-t1>(unsigned)timeOut*tout) return r|erTimeOverFlow;
}
return r;
}
short recWait(){
unsigned long t1=times;
short r=0;
while (sbs!=sbe){
r|=checkSBuf();
if (times<t1) t1=times;
if (times-t1>(unsigned)timeOut*tout) return r|erTimeOverFlow;
}
return r;
}
short EndJob(){
short hd[]={jbSetLed,0,jbEnd};
short r=sendBytes(hd,3);
if (r!=0) return r;
r=recWait();
return r;
}
short SendHead(){
rbe=0;
sbe=sbs=0;
tout=1;
short x,y;
for (x=0,y=0;x<300;x++)
{
if (getByte1()==-1)
{
if (y==0) break;
else
{
delay(1);
y=0;
}
} else y=1;
}
if (x==300) return erTimeOverFlow;
short hd[]={0,0x55,0xaa,0x55,-1};
short r=sendBytes(hd,5);
if (r!=0) return r|EndJob();
r=recWait();
if (r!=0) return r|EndJob();
return 0;
}
short readBytes(unsigned char *buf,short l){
unsigned long t1=times;
short r=0;
for (short i=0;i<l&&r==0;){
if (sbs!=sbe) r=checkSBuf(); else {
short r1=getByte1();
if (r1>=0){
buf[i++]=(unsigned char)r1;
t1=times;
}
}
if (times<t1) t1=times;
if (times-t1>(unsigned)timeOut*tout) r|=erTimeOverFlow;
}
return r;
}
short AT45_PowerOn(){
short rst=0;
short r=SendHead();
if (r!=0) return r;
if ((recBuffer[0]&ifPowerOff)==0&&rst==0) {
return erPowerIsOn|EndJob();
}
if ((recBuffer[0]&ifPowerOff)!=0&&rst==1) {
return erPowerIsOff|EndJob();
}
short pno[]={jbSetPort,0xc0,0x40,-1};
short pon[]={
jbPowerOn,0xc9,0x75,-1,jbSetLed,0,jbEnd, //6603
jbPowerOn,0xcc,0x45,-1,jbSetLed,0,jbEnd, //iic
jbPowerOn,0xd5,0x77,-1,jbSetLed,0,jbEnd, //spi
jbPowerOnCpu,0xc8,0x41,0xc0,-1,jbSetLed,0,jbEnd //cpu
};
short ponOld[]={jbPowerOn,0xc7,0x6b,-1,jbSetLed,0,jbEnd}; //spi old
short l=7;
short *p;
p=ponOld;
if (rst) p[0]=jbSetPort;
r=sendBytes(pno,4);
if (r!=0) return r;
r=recWait();
if (r!=0) return r;
if ((recBuffer[1]&0x80)!=0) return erNOCard|EndJob();
r=sendBytes(p,l)|recWait();
return r;
}
short AT45_PowerOff(){
CardType=0;
short r=SendHead();
if (r!=0) return r;
if ((recBuffer[0]&ifPowerOff)!=0) return erPowerIsOff|EndJob();
short hd[]={jbPowerOff,jbEnd};
r=sendBytes(hd,2);
if (r!=0) return r;
r=recWait();
return r;
}
short AT45_Set232Baud(long baud){
if ((verRder&0x8000)==0) erFunNotSupport;
short r=SendHead();
if (r!=0) return r;
short pno[2]={jbSetBaud,0};
pno[1]=(short)((clkReader>>4)/baud-1);
r=sendBytes(pno,1);
if(r!=0) return r;
r=recWait();
if (r!=0) return r;
r=sendBytes(pno+1,1);
return r;
}
short testReader(){
short r=SendHead();
if (r!=0) return r|recWait();
short s=jbGetInfo;
r=sendBytes(&s,1);
if (r) return r|recWait();
unsigned char buf[17];
r=readBytes(buf,16);
short n=11;
if (r==0){
verRder=((buf[4]<<8)|buf[5]); //&0x7fff;
const long clkList[]={3571200l,3579545l,3276800l,1843200l,2000000l};
short a=buf[2]&0xf;
if (a>4) a=1;
clkReader=clkList[a];
a=buf[2]>>4;
if (a==0) a=1;
clkReader*=a;
a=buf[3]; if (a==0) a=1;
clkCpu=clkReader/a;
baudRate=(clkReader>>4)/(buf[0]+1);
if ((buf[2]==0x11||buf[2]==0x10) && buf[0]==0x16) baudRate=9600l;
n=buf[1];
if (n==0) n=256;
} else if (r==4) {
r=0;
verRder=0x100;
clkReader=3571200l;
clkCpu=3571200l;
baudRate=9600l;
} else return r|recWait();
s=jbEnd;
r|=sendBytes(&s,1);
r|=recWait();
sbe=sbs=0;
BufSize=n;
return r;
}
NOMANGLE short CCONV RWSPI(unsigned char*bfin,short li,unsigned char *bfout,short lo,short ck){
unsigned char err1=0;
short r=SendHead();
if (r!=0) return r;
if ((recBuffer[0]&ifPowerOff)!=0) return erPowerIsOff|EndJob();
short *s;
short i,l;
s=sold;
if (ck)
{
unsigned long t1=times;
while (ck)
{
r=sendBytes(s,4);
r|=recWait();
if (r) return r|EndJob();
if ((recBuffer[1]&4)!=0) ck=0;
rbe--;
if (times<t1) t1=times;
if (times-t1>SPITimeOut) return erTimeOverFlow|EndJob();
}
}
r=sendBytes(s+4,3);
if (r!=0) return r|EndJob();
while (li>0){
short l=(li>=256?256:(short)li);
s[8]=l&0xff;
r=sendBytes(s+7,2);
for (i=0;i<l&&((r&erTimeOverFlow)==0);i++){
s[8]=bfin[i];
r|=sendBytes(s+8,1);
}
bfin+=l;
r|=readBytes(&err1,1);
if(err1!=0) return 1;
if (r) return r|EndJob();
li-=l;
}
if (lo>0) r=sendBytes(s+9,4);
if (r) return r|EndJob();
while (lo>0){
l=(lo>=256?256:lo);
s[14]=l&0xff;
r=sendBytes(s+13,2);
if (r) return r|EndJob();
r|=readBytes(bfout,l);
bfout+=l;
r|=readBytes(&err1,1);
if(err1!=0) return 1;
if (r) return r|EndJob();
lo-=l;
}
r=sendBytes(s+15,1);
return r|EndJob();
}
short ReadData(long add,unsigned char *buf,long len){
unsigned char s[8];
short Buf_Address,Page_Address;
long Read_Length;
short r=erCardType;
s[0]=0x52; //Main_page_read cmd
s[4]=s[5]=s[6]=s[7]=0;
Read_Length = len;
Sleep(4);
while (Read_Length>0)
{
Page_Address=(short)(add/264); //page_addr
Buf_Address=(short)(add-Page_Address*264l); //buf_addr
s[1]=(unsigned char)((Page_Address>>7)&0xff);
s[2]=(unsigned char)(((Page_Address<<1)&0xff)+(Buf_Address>=256?1:0));
s[3]=(unsigned char)(Buf_Address&0xff);
Buf_Address=264-Buf_Address;
if (Buf_Address > Read_Length) Buf_Address=(short)Read_Length;
r=RWSPI(s,8,buf,Buf_Address,(Read_Length==len?1:0));
if (r!=0) break;
buf+=Buf_Address;
add+=Buf_Address;
Read_Length-=Buf_Address;
}
Sleep(4);
return r;
}
short WriteData(long add,unsigned char *buf,long len){
short Page_Addr,Buf_Addr;
short pg,ck;
long i, Write_Len;
unsigned char pp[268];
unsigned char *s=pp;
short r=0;
pg=0; ck=1;
Write_Len=len;
Sleep(4);
while (Write_Len>0)
{
Page_Addr=(short)(add/264);
Buf_Addr=(short)(add-Page_Addr*264l);
i= 264 - Buf_Addr;
if (i > Write_Len) i = Write_Len;
if (i < 264 )
{
s[0]=(unsigned char)(pg==0?0x53:0x55); //Main page to buffer
s[1]=(unsigned char)((Page_Addr>>7)&0xff);
s[2]=(unsigned char)((Page_Addr<<1)&0xff);
s[3]=0;
r=RWSPI(s,4,0,0,ck); ck=0;
if (r!=0) break;
}
s[0]=(unsigned char)(pg==0?0x84:0x87); //buffer write
s[1]=0;
s[2]=(unsigned char)(Buf_Addr>=256?1:0);
s[3]=(unsigned char)(Buf_Addr&0xff);
memcpy(s+4,buf,i);
r=RWSPI(s,4+i,0,0,0);
if (r!=0) break;
Sleep(1);
/* if (len!=Write_Len) //verify last page
{
s[0]=(unsigned char)(pg==0?0x61:0x60); //verify
s[1]=(unsigned char)(((Page_Addr-1)>>7)&0xff);
s[2]=(unsigned char)(((Page_Addr-1)<<1)&0xfe);
s[3]=0;
r=RWSPI(s,4,0,0,ck); ck=0;
ttt=3;
if (r!=0) break;
}*/
buf+=i; add+=i;Write_Len-=i;
s[0]=(unsigned char)(pg==0?0x83:0x86); //buffer to main page
s[1]=(unsigned char)((Page_Addr>>7)&0xff);
s[2]=(unsigned char)((Page_Addr<<1)&0xfe);
s[3]=0;
r=RWSPI(s,4,0,0,ck); ck=1;
if (r!=0) return r;
pg^=1;
}
if (r!=0 || Write_Len!=0) return r;
/*s[0]=(unsigned char)(pg==0?0x61:0x60); //verify
s[1]=(unsigned char)((Page_Addr>>7)&0xff); //
s[2]=(unsigned char)((Page_Addr<<1)&0xfe); //
s[3]=0;
r=RWSPI(s,4,0,0,ck); ck=0;*/
Sleep(4);
return r;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -