diff options
author | Attila Veghelyi <aveghelyi@dension.com> | 2023-06-29 16:24:54 +0200 |
---|---|---|
committer | Attila Veghelyi <aveghelyi@dension.com> | 2023-06-29 16:24:54 +0200 |
commit | 925d0670c45e1100e412070fa0ce2405604f219a (patch) | |
tree | 9bb4412d148bc80751b7a02023cd3e0167f588e7 /progEEPROM.c | |
download | OpenProgrammer-925d0670c45e1100e412070fa0ce2405604f219a.tar.gz OpenProgrammer-925d0670c45e1100e412070fa0ce2405604f219a.zip |
Init repo
Diffstat (limited to 'progEEPROM.c')
-rw-r--r-- | progEEPROM.c | 2311 |
1 files changed, 2311 insertions, 0 deletions
diff --git a/progEEPROM.c b/progEEPROM.c new file mode 100644 index 0000000..f0e8259 --- /dev/null +++ b/progEEPROM.c @@ -0,0 +1,2311 @@ +/** + * \file progEEPROM.c + * algorithms to program various EEPROM types + * Copyright (C) 2009-2022 Alberto Maccioni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA + * or see <http://www.gnu.org/licenses/> + */ + +#include "common.h" + +void ReadI2C(int dim,int addr) +// read I2C memories +// dim=size in bytes +// addr: +// [3:0] =0: 1 byte address =1: 2 byte address +// [7:4] A2:A0 value +// [11:8] 17th address bit location (added to control byte) +{ + int k=0,z=0,i,j; + int AX=(addr>>4)&7; + int addr17=(addr>>8)&0xF; + addr&=1; + if(dim>0x30000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"ReadI2C(%d,%d) (0x%X,0x%X)\n",dim,addr,dim,addr); + } + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + hvreg=0; + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=I2C_INIT; + bufferU[j++]=AX; //100k + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); +//****************** read ******************** + PrintMessage(strings[S_ReadEE]); //read EEPROM ... + PrintStatusSetup(); + int inc; + for(i=0,j=0;i<dim;i+=inc){ + if(i<0x10000&&i>0x10000-(DIMBUF-4)) inc=0x10000-i; //do not cross 64KB boundary + else inc=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + if(!addr){ //1 byte address + bufferU[j++]=I2C_READ; + bufferU[j++]=inc; + bufferU[j++]=0xA0+((i>>7)&0x0E); + bufferU[j++]=i&0xFF; + } + else{ //2 byte address + bufferU[j++]=I2C_READ2; + bufferU[j++]=inc; + bufferU[j++]=0xA0+(i>0xFFFF?addr17:0); //17th bit if>64K + bufferU[j++]=(i>>8)&0xFF; + bufferU[j++]=i&0xFF; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(8); + for(j=0;j<DIMBUF-1&&bufferI[j]!=I2C_READ&&bufferI[j]!=I2C_READ2;j++); + if(j<DIMBUF-1&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++) memEE[k++]=bufferI[z]; + } + PrintStatus(strings[S_CodeReading2],i*100/(dim),i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + else PrintMessage(strings[S_Compl]); +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +void WriteI2C(int dim,int addr,int page) +// write I2C memories +// dim=size in bytes +// addr: +// [3:0] =0: 1 byte address =1: 2 byte address +// [7:4] A2:A0 value +// [11:8] 17th address bit location (added to control byte) +// page=page size +{ + int k=0,z=0,i,j; + int err=0; + int AX=(addr>>4)&7; + int addr17=(addr>>8)&0xF; + addr&=1; + hvreg=0; + if(dim>0x30000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"WriteI2C(%d,%d,%d) (0x%X,0x%X)\n",dim,addr,page,dim,addr); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=I2C_INIT; + bufferU[j++]=AX; //100k + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + PrintStatusSetup(); + for(;page>=DIMBUF-6;page>>=1); + for(i=0,j=0;i<dim;i+=page){ + bufferU[j++]=I2C_WRITE; + if(!addr){ //1 byte address + bufferU[j++]=page; + bufferU[j++]=0xA0+((i>>7)&0x0E); + bufferU[j++]=i&0xFF; + } + else{ //2 byte address + bufferU[j++]=page+1; + bufferU[j++]=0xA0+(i>0xFFFF?addr17:0); //17th bit if>64K + bufferU[j++]=(i>>8)&0xFF; + bufferU[j++]=i&0xFF; + } + for(k=0;k<page;k++) bufferU[j++]=memEE[i+k]; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(3); + for(j=0;j<DIMBUF-1&&bufferI[j]!=I2C_WRITE;j++); + if(bufferI[j]!=I2C_WRITE||bufferI[j+1]>=0xFA) i=dim+10; + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" + } + bufferU[j++]=I2C_WRITE; + bufferU[j++]=0; + bufferU[j++]=0xA0; //ACK polling + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + int ack=0xFD; + for(j=0;ack==0xFD&&j<20;j++){ //ACK polling until write complete + PacketIO(2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=I2C_WRITE;j++); + if(bufferI[j]!=I2C_WRITE||bufferI[j+1]>=0xFA) ack=0xFD; + else ack=bufferI[j+1]; + } + j=0; + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + k=0; + int inc; + for(i=0,j=0;i<dim;i+=inc){ + if(i<0x10000&&i>0x10000-(DIMBUF-4)) inc=0x10000-i; //do not cross 64KB boundary + else inc=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + if(!addr){ //1 byte address + bufferU[j++]=I2C_READ; + bufferU[j++]=inc; + bufferU[j++]=0xA0+((i>>7)&0x0E); + bufferU[j++]=i&0xFF; + } + else{ //2 byte address + bufferU[j++]=I2C_READ2; + bufferU[j++]=inc; + bufferU[j++]=0xA0+(i>0xFFFF?addr17:0); //17th bit if>64K + bufferU[j++]=(i>>8)&0xFF; + bufferU[j++]=i&0xFF; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(8); + for(j=0;j<DIMBUF-1&&bufferI[j]!=I2C_READ&&bufferI[j]!=I2C_READ2;j++); + if((bufferI[j]==I2C_READ||bufferI[j]==I2C_READ2)&&bufferI[j+1]<0xFA){ + for(z=j+2;z<(j+2+bufferI[j+1])&&z<DIMBUF;z++){ + if(memEE[k++]!=bufferI[z]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],i+z-3,i+z-3,memEE[k-1],bufferI[z]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + } + } + PrintStatus(strings[S_CodeV2],i*100/(dim),i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +#define PRE 0x08 //RB3 +#define S 0x10 //RB4 +#define W 0x20 //RB5 +#define ORG 0x20 //RB5 + +void Read93x(int dim,int na,int options) +// read 93Sx6 uW memories +// dim=size in bytes +// na=address bits +// options=0: x16 organization =1: x8 organization +{ + int k=0,z=0,i,j,x8; + hvreg=0; + if(dim>0x3000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(na>13) na=13; + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Read93x(%d,%d,%d) (0x%X,0x%X)\n",dim,na,options,dim,na); + } + x8=options&1; + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=uW_INIT; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=EXT_PORT; + bufferU[j++]=x8?S:S+ORG; + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); +//****************** read ******************** + PrintMessage(strings[S_ReadEE]); //read EEPROM ... + PrintStatusSetup(); + int dim2=x8?dim:dim/2; + for(i=0;i<dim2;){ + for(j=0;j<DIMBUF-14&&i<dim2;){ + bufferU[j++]=uWTX; + bufferU[j++]=na+3; //READ + bufferU[j++]=0xC0+((i>>(na-5))&0x1F); //110aaaaa aaax0000 + bufferU[j++]=(i<<(13-na))&0xFF; + bufferU[j++]=uWRX; + bufferU[j++]=x8?8:16; + bufferU[j++]=EXT_PORT; + bufferU[j++]=x8?0:ORG; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=x8?S:S+ORG; + bufferU[j++]=0; + i++; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + for(z=0;z<DIMBUF-3;z++){ + for(;bufferI[z]!=uWRX&&z<DIMBUF-3;z++); + if(bufferI[z]==uWRX){ + if(x8) memEE[k++]=bufferI[z+2]; + else{ + memEE[k+1]=bufferI[z+2]; + memEE[k]=bufferI[z+3]; + k+=2; + } + z+=3; + } + } + PrintStatus(strings[S_CodeReading2],i*100/dim2,i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + else PrintMessage(strings[S_Compl]); +//****************** exit ******************** + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +void Write93Sx(int dim,int na,int page) +// write 93Sx6 uW memories +// dim=size in bytes +// na=address bits +// page=page size (bytes) +// automatic write delay +{ + int k=0,z=0,i,j; + int err=0; + hvreg=0; + if(dim>0x1000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(na>13) na=13; + if(page>48) page=48; + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Write93Sx(%d,%d,%d) (0x%X,0x%X)\n",dim,na,page,dim,na); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=uW_INIT; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0x98; //100 11xxx write enable + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=W; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0x98; //100 11xxx Prot. reg. enable + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=W+PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0xFF; //111 11111111 Prot. reg. clear + bufferU[j++]=0xF0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=W+PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0x98; //100 11xxx write enable + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=W; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0xC0; //110 xxxxx Prot. reg. read + bufferU[j++]=0; + bufferU[j++]=uWRX; + bufferU[j++]=10; + bufferU[j++]=EXT_PORT; + bufferU[j++]=W+PRE; + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + PrintStatusSetup(); + int addr=0; + for(i=0,j=0;i<dim;i+=page,addr+=(0x10000>>na)*page/2){ + bufferU[j++]=EXT_PORT; + bufferU[j++]=W; //make sure to start with S=0 + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=3; + bufferU[j++]=0xE0; //111aaaaa aaa(a) D page write + bufferU[j++]=uWTX; + bufferU[j++]=na; + bufferU[j++]=addr>>8; + if(na>8) bufferU[j++]=addr&0xFF; + bufferU[j++]=uWTX; + bufferU[j++]=8*page; + for(k=0;k<page;k+=2){ + bufferU[j++]=memEE[i+k+1]; + bufferU[j++]=memEE[i+k]; + } + bufferU[j++]=EXT_PORT; + bufferU[j++]=W; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S+W; //S=1 to check status + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + j=0; + for(j=0;j<DIMBUF-1&&bufferI[j]!=uWTX;j++); + if(bufferI[j]!=uWTX||bufferI[j+1]>=0xFA) i=dim+10; + bufferU[j++]=uWRX; + bufferU[j++]=1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + for(z=0,k=0;z<30&&!k;z++){ //Wait until ready + PacketIO(2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=uWRX;j++); + if(bufferI[j]==uWRX) k=bufferI[j+2]; + } + j=0; + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" + } + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + j=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=S; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; //READ (16bit) + bufferU[j++]=0xC0; //110aaaaa aaax0000 + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + k=0; + int n=(DIMBUF-2); + if(n>30) n=30; //max 240 bit = 30 Byte + for(i=0,j=0;i<dim;i+=n){ + bufferU[j++]=uWRX; + bufferU[j++]=i<(dim-n)?n*8:(dim-i)*8; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + for(j=0;bufferI[j]!=uWRX&&j<DIMBUF-1;j++); + if(bufferI[j]==uWRX){ + for(z=j+2;z<j+2+bufferI[j+1]/8&&z<DIMBUF;z+=2,k+=2){ + if(memEE[k+1]!=bufferI[z]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],i+z-3,i+z-3,memEE[k+1],bufferI[z]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + if(memEE[k]!=bufferI[z+1]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],i+z-3,i+z-3,memEE[k],bufferI[z+1]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + } + } + PrintStatus(strings[S_CodeV2],i*100/(dim),i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +void Write93Cx(int dim,int na, int options) +// write 93Cx6 uW memories +// dim=size in bytes +// na=address bits +// options=0: x16 organization =1: x8 organization +{ + int k=0,z=0,i,j; + int err=0; + hvreg=0; + if(dim>0x1000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(na>13) na=13; + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Write93Cx(%d,%d,%d) (0x%X,0x%X)\n",dim,na,options,dim,na); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=uW_INIT; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0x98; //100 11xxx EWEN + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG+PRE:PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=na+3; + bufferU[j++]=0x90; //100 10xxx ERAL + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG+PRE:PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=uWRX; + bufferU[j++]=1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + bufferU[j++]=uWRX; + bufferU[j++]=1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + for(i=0,k=0;i<30&&!k;i++){ //Wait until ready + PacketIO(2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=uWRX;j++); + if(bufferI[j]==uWRX) k=bufferI[j+2]; + } +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + PrintStatusSetup(); + int addr=0; + j=0; + for(i=0;i<dim;i+=options==0?2:1,addr+=0x10000>>na){ + if(memEE[i]<0xFF||(options==0&&memEE[i+1]<0xFF)){ + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG+PRE:PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=uWTX; + bufferU[j++]=3; + bufferU[j++]=0xA0; //101aaaaa aaa(a) write + bufferU[j++]=uWTX; + bufferU[j++]=na; + bufferU[j++]=addr>>8; + if(na>8) bufferU[j++]=addr&0xFF; + bufferU[j++]=uWTX; + if(options==0){ //x16 + bufferU[j++]=16; + bufferU[j++]=memEE[i+1]; + bufferU[j++]=memEE[i]; + } + else{ //x8 + bufferU[j++]=8; + bufferU[j++]=memEE[i]; + } + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG+PRE:PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=uWRX; + bufferU[j++]=1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" + } + bufferU[j++]=uWRX; + bufferU[j++]=1; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + for(z=0,k=0;z<30&&!k;z++){ //Wait until ready + PacketIO(2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=uWRX;j++); + if(bufferI[j]==uWRX) k=bufferI[j+2]; + } + j=0; + } + } + msDelay(2); + PrintStatusEnd(); + if(i!=dim){ + PrintMessage2(strings[S_CodeWError4],i,dim); //"Error writing code area, requested %d bytes, read %d\r\n" + } + else PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + j=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG+PRE:PRE; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG+PRE:S+PRE; + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + k=0; + int dim2=options==0?dim/2:dim; + for(i=0;i<dim2;){ + for(j=0;j<DIMBUF-14&&i<dim2;){ + bufferU[j++]=uWTX; + bufferU[j++]=na+3; //READ + bufferU[j++]=0xC0+((i>>(na-5))&0x1F); //110aaaaa aaax0000 + bufferU[j++]=(i<<(13-na))&0xFF; + bufferU[j++]=uWRX; + bufferU[j++]=options==0?16:8; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?ORG:0; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=options==0?S+ORG:S; + bufferU[j++]=0; + i++; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + for(z=0;z<DIMBUF-3;z++){ + for(;bufferI[z]!=uWRX&&z<DIMBUF-3;z++); + if(bufferI[z]==uWRX){ + if(options==1){ //x8 + if(memEE[k]!=bufferI[z+2]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],k,k,memEE[k],bufferI[z+2]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + k++; + } + else{ //x16 + if(memEE[k]!=bufferI[z+3]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],k,k,memEE[k],bufferI[z+3]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + if(memEE[k+1]!=bufferI[z+2]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],k+1,k+1,memEE[k+1],bufferI[z+2]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + k+=2; + } + z+=3; + } + } + PrintStatus(strings[S_CodeV2],i*100/dim2,i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +#define CS 8 +#define HLD 16 //Hold +#define WP 0x40 //Write protect + +void Read25xx(int dim) +// read 25xx SPI memories +// dim=size in bytes +{ + int k=0,z=0,i,j,ID; + hvreg=0; + if(dim>0x1000000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Read25xx(%d) (0x%X)\n",dim,dim); + } + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=SPI_INIT; + bufferU[j++]=3; //0=100k, 1=200k, 2=300k, 3=500k (in reality 200k) +// bufferU[j++]=SET_T1T2; +// bufferU[j++]=2; //force T=28us -> 286 kbps +// bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=0 + bufferU[j++]=CS+HLD; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //READ ID + bufferU[j++]=1; + bufferU[j++]=0x9F; + bufferU[j++]=SPI_READ; + bufferU[j++]=3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=0 + bufferU[j++]=CS+HLD; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //Read + if(dim>0x10000){ //24 bit address + bufferU[j++]=4; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + } + else if(dim>0x200){ //16 bit address + bufferU[j++]=3; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + } + else{ //8 bit address + bufferU[j++]=2; + bufferU[j++]=3; + bufferU[j++]=0; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + for(z=0;z<DIMBUF-4&&bufferI[z]!=SPI_READ;z++); + ID=(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + if(ID>0&&ID!=0xFFFFFF) PrintMessage1("DEVICE ID=0x%06X\r\n",ID); +//****************** read ******************** + PrintMessage(strings[S_ReadEE]); //read EEPROM ... + PrintStatusSetup(); + for(i=0,j=0;i<dim;i+=DIMBUF-4){ + bufferU[j++]=SPI_READ; + bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(4); + for(j=0;j<DIMBUF-1&&bufferI[j]!=SPI_READ;j++); + if(bufferI[j]==SPI_READ&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++) memEE[k++]=bufferI[z]; + } + PrintStatus(strings[S_CodeReading2],i*100/(dim),i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + else PrintMessage(strings[S_Compl]); +//****************** exit ******************** + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +/*void Read25xxFast(int dim) +// read 25xx SPI memories +// dim=size in bytes +{ + int k=0,z=0,i,j,ID; + hvreg=0; + if(dim>0x1000000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Read25xxF(%d) (0x%X)\n",dim,dim); + } + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=SPI_INIT; + bufferU[j++]=3; //0=100k, 1=200k, 2=300k, 3=500k (in reality 200k) +// bufferU[j++]=SET_T1T2; +// bufferU[j++]=2; //force T=28us -> 286 kbps +// bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=0 + bufferU[j++]=CS+HLD; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ ID + bufferU[j++]=1; + bufferU[j++]=0x9F; + bufferU[j++]=SPI_READ; + bufferU[j++]=3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //Read + if(dim>0x10000){ //24 bit address + bufferU[j++]=4; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + } + else if(dim>0x200){ //16 bit address + bufferU[j++]=3; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + } + else{ //8 bit address + bufferU[j++]=2; + bufferU[j++]=3; + bufferU[j++]=0; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + for(z=0;z<DIMBUF-4&&bufferI[z]!=SPI_READ;z++); + ID=(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + if(ID>0&&ID!=0xFFFFFF) PrintMessage1("DEVICE ID=0x%06X\r\n",ID); +//****************** read ******************** + PrintMessage(strings[S_ReadEE]); //read EEPROM ... + PrintStatusSetup(); + #define rSize (DIMBUF-5-2) + #define npack 255 + j=0; + bufferU[j++]=0xF6; + bufferU[j++]=npack; + bufferU[j++]=SPI_READ; + bufferU[j++]=rSize; + bufferU[j++]=0xF7; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + for(i=0;i<dim;i+=rSize*npack){ + #define TIMEOUT 50 + ULONG Result; + __int64 start,stop,freq,timeout; + QueryPerformanceCounter((LARGE_INTEGER *)&start); + QueryPerformanceFrequency((LARGE_INTEGER *)&freq); + //write + Result = WriteFile(WriteHandle,bufferU0,DIMBUF+1,&BytesWritten,NULL); +// QueryPerformanceCounter((LARGE_INTEGER *)&stop); +// timeout=stop+delay*freq/1000.0; +// while(stop<timeout) QueryPerformanceCounter((LARGE_INTEGER *)&stop); + //read + fprintf(logfile,"bufferU=["); + for(int i=0;i<DIMBUF;i++){ + if(i%32==0) fprintf(logfile,"\n"); + fprintf(logfile,"%02X ",bufferU[i]); + } + fprintf(logfile,"]\n"); + for(int r=0;r<npack;r++){ + Result = ReadFile(ReadHandle,bufferI0,DIMBUF+1,&NumberOfBytesRead,(LPOVERLAPPED) &HIDOverlapped); + Result = WaitForSingleObject(hEventObject,TIMEOUT); +// if(saveLog&&logfile) WriteLogIO(); + fprintf(logfile,"bufferI=["); + for(int i=0;i<DIMBUF;i++){ + if(i%32==0) fprintf(logfile,"\n"); + fprintf(logfile,"%02X ",bufferI[i]); + } + fprintf(logfile,"]\n"); + ResetEvent(hEventObject); + if(Result!=WAIT_OBJECT_0){ + PrintMessage(strings[S_comTimeout]); //"comm timeout\r\n" + if(saveLog&&logfile) fprintf(logfile,strings[S_comTimeout]); + } + QueryPerformanceCounter((LARGE_INTEGER *)&stop); + if(saveLog&&logfile) fprintf(logfile,"T=%.2f ms (%+.2f ms)\n",(stop-start)*1000.0/freq,(stop-start)*1000.0/freq); + QueryPerformanceCounter((LARGE_INTEGER *)&start); + for(j=0;j<DIMBUF-1&&bufferI[j]!=SPI_READ;j++); + if(bufferI[j]==SPI_READ&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF&&k<dim;z++) memEE[k++]=bufferI[z]; + } + PrintStatus(strings[S_CodeReading2],i*100/(dim),i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + else PrintMessage(strings[S_Compl]); +//****************** exit ******************** + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} +*/ + +void Write25xx(int dim,int options) +// write SPI memories +// dim=size in bytes +// options: +// [11:0]=page size +// [12]=erase before write +// [13]=use status register 2 +// automatic write delay +{ + int k=0,z=0,i,j,ID; + int err=0; + hvreg=0; + int page=options&0xFFF; + if(dim>0x1000000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Write25xx(%d,%d) (0x%X,0x%X)\n",dim,options,dim,options); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=SPI_INIT; + bufferU[j++]=3; //0=100k, 1=200k, 2=300k, 3=500k + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=0 + bufferU[j++]=CS+HLD; + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //READ ID + bufferU[j++]=1; + bufferU[j++]=0x9F; + bufferU[j++]=SPI_READ; + bufferU[j++]=3; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + if(options&0x2000){ + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS2 + bufferU[j++]=1; + bufferU[j++]=0x35; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + for(z=0;z<DIMBUF-4&&bufferI[z]!=SPI_READ;z++); + ID=(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + if(ID>0&&ID!=0xFFFFFF){ + PrintMessage1("DEVICE ID=0x%06X\r\n",ID); + if(saveLog) fprintf(logfile,"DEVICE ID=0x%06X\n",ID); + } + msDelay(10); //wait power-up timer in some devices + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //WRITE ENABLE + bufferU[j++]=1; + bufferU[j++]=6; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + if(options&0x2000){ //status 1+2 + bufferU[j++]=SPI_WRITE; //WRITE STATUS + bufferU[j++]=3; + bufferU[j++]=1; + bufferU[j++]=0; + bufferU[j++]=0; + } + else{ + bufferU[j++]=SPI_WRITE; //WRITE STATUS + bufferU[j++]=2; + bufferU[j++]=1; + bufferU[j++]=0; + } + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + if(options&0x1000){ //erase before write + PrintMessage(strings[S_StartErase]); //"Erasing ... " + if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]); //"Erasing ... " + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + if(options&0x2000){ + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS2 + bufferU[j++]=1; + bufferU[j++]=0x35; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + } + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //WRITE ENABLE + bufferU[j++]=1; + bufferU[j++]=6; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //CHIP ERASE + bufferU[j++]=1; + bufferU[j++]=0xC7; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + int pp; + for(pp=1,j=0;pp&&j<400;j++){ //wait for erase completion max 40s + PacketIO(2); + msDelay(100); + for(z=0;z<DIMBUF-1&&bufferI[z]!=SPI_READ;z++); + pp=bufferI[z+2]&1; //WIP bit + PrintStatus(strings[S_StartErase],0,0); //"Erasing ... " Also allows the gui loop to run + } + if(saveLog) fprintf(logfile,"Erase time %d ms\n",j*100); + PrintMessage(strings[S_Compl]); //"completed" + PrintStatus(strings[S_Compl],0,0); //"completed" +// msDelay(100); + } +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]); //"Write EEPROM ... " + int pp; + for(i=0,j=0;i<dim;i+=page){ + if(options&0x1000){ //if chip erase skip empty pages + for(k=page;k==page&&i<dim-page;){ + for(k=0;k<page;k++){ if(memEE[i+k]<0xFF) k=page;} + if(k==page) i+=page; + } + } + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //WRITE ENABLE + bufferU[j++]=1; + bufferU[j++]=6; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //WRITE + if(dim>0x10000){ //24 bit address + bufferU[j++]=4; + bufferU[j++]=2; + bufferU[j++]=i>>16; + bufferU[j++]=(i>>8)&0xFF; + bufferU[j++]=i&0xFF; + } + else if(dim>0x200){ //16 bit address + bufferU[j++]=3; + bufferU[j++]=2; + bufferU[j++]=i>>8; + bufferU[j++]=i&0xFF; + } + else{ //8 bit address + bufferU[j++]=2; + bufferU[j++]=2+(i&0x100?8:0); + bufferU[j++]=i&0xFF; + } + pp=page<DIMBUF-j-4?page:DIMBUF-j-4; + for(k=0;k<page;){ + bufferU[j++]=SPI_WRITE; + bufferU[j++]=pp; + for(;k<page&&pp;k++,pp--) bufferU[j++]=memEE[i+k]; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + for(z=0;z<DIMBUF-1&&bufferI[z]!=SPI_WRITE;z++); + if(bufferI[z+1]>=0xFA) k=i=dim+10; + pp=(page-k)<DIMBUF-4?page-k:DIMBUF-4; + j=0; + } + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + j=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=1 + bufferU[j++]=HLD; + bufferU[j++]=WP; + bufferU[j++]=SPI_WRITE; //READ STATUS + bufferU[j++]=1; + bufferU[j++]=5; + bufferU[j++]=SPI_READ; + bufferU[j++]=1; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + for(pp=1,j=0;pp&&j<50;j++){ //wait for write completion + PacketIO(2); + for(z=0;z<DIMBUF-1&&bufferI[z]!=SPI_READ;z++); + pp=bufferI[z+2]&1; //WIP bit + } + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + } + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + if(saveLog) fprintf(logfile,"%s\n",strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + j=0; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //Read + if(dim>0x10000){ //24 bit address + bufferU[j++]=4; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + } + else if(dim>0x200){ //16 bit address + bufferU[j++]=3; + bufferU[j++]=3; + bufferU[j++]=0; + bufferU[j++]=0; + } + else{ //8 bit address + bufferU[j++]=2; + bufferU[j++]=3; + bufferU[j++]=0; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + int i0,k2,valid; + k=0; + for(i=0,j=0;i<dim;i+=DIMBUF-4){ + if(options&0x1000){ //skip empty space if erase before write + i0=i; + for(valid=0;!valid&&i<dim;i+=valid?0:DIMBUF-4){ //skip verification if 0xFF + for(k2=0;k2<DIMBUF-4&&!valid&&i+k2<dim;k2++) if(memEE[i+k2]<0xFF) valid=1; + } + if(i>=dim) break; + if(i>i0){ //some data was skipped; update current address + j=0; + bufferU[j++]=EXT_PORT; //CS=1, HLD=1, WP=1 + bufferU[j++]=CS+HLD; + bufferU[j++]=WP; + bufferU[j++]=EXT_PORT; //CS=0, HLD=1, WP=0 + bufferU[j++]=HLD; + bufferU[j++]=0; + bufferU[j++]=SPI_WRITE; //Read + if(dim>0x10000){ //24 bit address + bufferU[j++]=4; + bufferU[j++]=3; + bufferU[j++]=i>>16; + bufferU[j++]=(i>>8)&0xFF; + bufferU[j++]=i&0xFF; + } + else if(dim>0x200){ //16 bit address + bufferU[j++]=3; + bufferU[j++]=3; + bufferU[j++]=i>>8; + bufferU[j++]=i&0xFF; + } + else{ //8 bit address + bufferU[j++]=2; + bufferU[j++]=3+(i&0x100?8:0); + bufferU[j++]=i&0xFF; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + j=0; + } + } + bufferU[j++]=SPI_READ; + bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(4); + for(j=0;j<DIMBUF-1&&bufferI[j]!=SPI_READ;j++); + if(bufferI[j]==SPI_READ&&bufferI[j+1]<0xFA){ + for(z=0;z<bufferI[j+1]&&z<DIMBUF;z++){ + if(memEE[i+z]!=bufferI[z+j+2]){ + PrintMessage4(strings[S_CodeVError],i+z,i+z,memEE[i+z],bufferI[z+3]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + } + } + PrintStatus(strings[S_CodeV2],i*100/(dim),i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(i<dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,i); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +struct ID_OW{ + int id; + char *device; +} OW_LIST[]={ + {0x10,"DS1820\r\n"}, + {0x14,"DS2430\r\n"}, + {0x23,"DS2433\r\n"}, + {0x28,"DS18B20\r\n"}, + {0x2D,"DS2431\r\n"}, + {0x43,"DS28EC20\r\n"}, +}; + +void OW_ID(int id) +{ + char s[64]; + int i; + for(i=0;i<sizeof(OW_LIST)/sizeof(OW_LIST[0]);i++){ + if(id==OW_LIST[i].id){ + sprintf(s,OW_LIST[i].device,id); + PrintMessage(s); + return; + } + } + sprintf(s,"%s",strings[S_nodev]); //"Unknown device\r\n"); + PrintMessage(s); +} + +#define READ_ROM 0x33 +#define MATCH_ROM 0x55 +#define SKIP_ROM 0xCC +#define SEARCH_ROM 0xF0 +#define WRITE_SCRATCHPAD 0x0F +#define READ_SCRATCHPAD 0xAA +#define COPY_SCRATCHPAD 0x55 +#define READ_MEMORY 0xF0 +#define WRITE_APP_REGISTER 0x99 +#define READ_STAT_REGISTER 0x66 +#define READ_APP_REGISTER 0xC3 +#define COPY_LOCK_APP_REGISTER 0x5A + +void ReadOneWireMem(int dim,int options) +// read OneWire memories +// dim=size in bytes +// options: +// 1=status register + application register +// 2=protection bytes + ID after memory area +{ + int k=0,z=0,i,j; + hvreg=0; + if(FWVersion<0x800){ + PrintMessage1(strings[S_FWver2old],"0.8.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(dim>0x10000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"ReadOneWireMem(%d) (0x%X)\n",dim,dim); + } + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=uW_INIT; //set RB1=0 to use as GND terminal beside RB0 + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=1; + bufferU[j++]=READ_ROM; + bufferU[j++]=OW_READ; + bufferU[j++]=8; + if(dim<=32){ //1 byte address + bufferU[j++]=OW_WRITE; + bufferU[j++]=2; + bufferU[j++]=READ_MEMORY; + bufferU[j++]=0; //address + } + else{ //2 byte address + bufferU[j++]=OW_WRITE; + bufferU[j++]=3; + bufferU[j++]=READ_MEMORY; + bufferU[j++]=0; //address + bufferU[j++]=0; //address + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(12); + j=0; + for(z=0;bufferI[z]!=OW_RESET&&z<DIMBUF;z++); + if(bufferI[z]==OW_RESET&&bufferI[z+1]==0){ //no presence pulse + PrintMessage(strings[S_ComErr]); //communication error + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + return; + } + for(;bufferI[z]!=OW_READ&&z<DIMBUF;z++); + if(bufferI[z]==OW_READ&&z<DIMBUF-9){ + PrintMessage1("Family code: 0x%02X ",bufferI[z+2]); + OW_ID(bufferI[z+2]); + PrintMessage3("Serial ID: 0x%02X%02X%02X",bufferI[z+3],bufferI[z+4],bufferI[z+5]); + PrintMessage3("%02X%02X%02X",bufferI[z+6],bufferI[z+7],bufferI[z+8]); + PrintMessage1("\r\nCRC: 0x%02X\r\n",bufferI[z+9]); + } +//****************** read ******************** + PrintStatusSetup(); + for(i=0,j=0;i<dim;i+=DIMBUF-4){ + bufferU[j++]=OW_READ; + bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(37); + for(j=0;bufferI[j]!=OW_READ&&j<DIMBUF;j++); + if(bufferI[j]==OW_READ&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++) memEE[k++]=bufferI[z]; + } + PrintStatus(strings[S_CodeReading2],i*100/(dim),i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + if(options==1){ //read status register + application register + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=3; + bufferU[j++]=SKIP_ROM; + bufferU[j++]=READ_STAT_REGISTER; + bufferU[j++]=0; + bufferU[j++]=OW_READ; + bufferU[j++]=1; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=3; + bufferU[j++]=SKIP_ROM; + bufferU[j++]=READ_APP_REGISTER; + bufferU[j++]=0; + bufferU[j++]=OW_READ; + bufferU[j++]=8; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(15); + j=0; + for(z=0;bufferI[z]!=OW_READ&&z<DIMBUF-2;z++); + if(z<DIMBUF-2) PrintMessage1("Status register: 0x%02X\r\n",bufferI[z+2]); + for(z+=2;bufferI[z]!=OW_READ&&z<DIMBUF-10;z++); + PrintMessage("Application register: 0x"); + for(i=z+2;i<z+10&&i<DIMBUF;i++) PrintMessage1("%02X",bufferI[i]); + PrintMessage("\r\n"); + } + else if(options==2){ //read protection & ID bytes + bufferU[j++]=OW_READ; + if(dim==0xA00) bufferU[j++]=0x24; + else bufferU[j++]=8; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(25); + j=0; + for(z=0;bufferI[z]!=OW_READ&&z<DIMBUF-2;z++); + if(bufferI[z]==OW_READ&&bufferI[z+1]<0xFA){ + if(dim==0xA00){ + for(i=0;i<10;i++) PrintMessage2("Protection Control Byte Block %d: 0x%02X\r\n",i,bufferI[z+2+i]); + PrintMessage("User EEPROM:\r\n"); + for(i=0;i<10;i++) PrintMessage1("%02X",bufferI[z+2+i+10]); + PrintMessage("\r\n"); + for(i=0;i<10;i++) PrintMessage1("%02X",bufferI[z+2+i+20]); + PrintMessage1("\r\nMemory Block Lock: 0x%02X\r\n",bufferI[z+2+30]); + PrintMessage1("Register Page Lock: 0x%02X\r\n",bufferI[z+2+31]); + PrintMessage1("Factory Byte: 0x%02X\r\n",bufferI[z+2+32]); + PrintMessage2("Factory Trim Bytes: 0x%02X%02X\r\n",bufferI[z+2+33],bufferI[z+2+34]); + PrintMessage2("Manufacturer ID: 0x%02X%02X\r\n",bufferI[z+2+35],bufferI[z+2+36]); + } + else{ + PrintMessage1("Protection Control Byte Page 0: 0x%02X\r\n",bufferI[z+2]); + PrintMessage1("Protection Control Byte Page 1: 0x%02X\r\n",bufferI[z+2+1]); + PrintMessage1("Protection Control Byte Page 2: 0x%02X\r\n",bufferI[z+2+2]); + PrintMessage1("Protection Control Byte Page 3: 0x%02X\r\n",bufferI[z+2+3]); + PrintMessage1("Copy Protection Byte: 0x%02X\r\n",bufferI[z+2+4]); + PrintMessage1("Factory Byte: 0x%02X\r\n",bufferI[z+2+5]); + PrintMessage2("User Bytes/Manufacturer ID: 0x%02X%02X\r\n",bufferI[z+2+6],bufferI[z+2+7]); + } + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +void WriteOneWireMem(int dim,int options) +// write OneWire memories +// dim=size in bytes +// options: +// 0 = 8 byte scratchpad +// 1 = 32 byte scratchpad +{ + int k=0,z=0,i,j; + int err=0; + hvreg=0; + if(FWVersion<0x800){ + PrintMessage1(strings[S_FWver2old],"0.8.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(dim>0x10000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"WriteOneWireMem(%d,%d) (0x%X,0x%X)\n",dim,options,dim,options); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=uW_INIT; //set RB1=0 to use as GND terminal beside RB0 + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=1; + bufferU[j++]=READ_ROM; + bufferU[j++]=OW_READ; + bufferU[j++]=8; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(12); + j=0; + for(z=0;bufferI[z]!=OW_RESET&&z<DIMBUF;z++); + if(bufferI[z]==OW_RESET&&bufferI[z+1]==0){ //no presence pulse + PrintMessage(strings[S_ComErr]); //communication error + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + j=0; + if(saveLog) CloseLogFile(); + return; + } + for(z=0;bufferI[z]!=OW_READ&&z<DIMBUF;z++); + if(bufferI[z]==OW_READ){ + PrintMessage1("Family code: 0x%02X ",bufferI[z+2]); + OW_ID(bufferI[z+2]); + PrintMessage3("Serial ID: 0x%02X%02X%02X",bufferI[z+3],bufferI[z+4],bufferI[z+5]); + PrintMessage3("%02X%02X%02X",bufferI[z+6],bufferI[z+7],bufferI[z+8]); + PrintMessage1("\r\nCRC: 0x%02X\r\n",bufferI[z+9]); + } +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + int page=options==0?8:32; + for(i=0,j=0;i<dim;i+=page){ + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=page+(dim<=32?3:4); + bufferU[j++]=SKIP_ROM; + bufferU[j++]=WRITE_SCRATCHPAD; + bufferU[j++]=i&0xFF; + if(dim>32) bufferU[j++]=i>>8; + for(k=0;k<page;k++) bufferU[j++]=memEE[i+k]; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=dim<=32?3:5; + bufferU[j++]=SKIP_ROM; + bufferU[j++]=COPY_SCRATCHPAD; + if(dim<=32) bufferU[j++]=0xA5; + else{ + bufferU[j++]=i&0xFF; + bufferU[j++]=i>>8; + bufferU[j++]=page-1; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(6+0.8*page); + msDelay(10); //TPROG + j=0; + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + } + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + if(saveLog) fprintf(logfile,"%s\n",strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + k=0; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=1; + bufferU[j++]=SKIP_ROM; + if(dim<=32){ //1 byte address + bufferU[j++]=OW_WRITE; + bufferU[j++]=2; + bufferU[j++]=READ_MEMORY; + bufferU[j++]=0; //address + } + else{ //2 byte address + bufferU[j++]=OW_WRITE; + bufferU[j++]=3; + bufferU[j++]=READ_MEMORY; + bufferU[j++]=0; //address + bufferU[j++]=0; //address + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(10); + j=0; + for(i=0,j=0;i<dim;i+=DIMBUF-4){ + bufferU[j++]=OW_READ; + bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(37); + for(j=0;bufferI[j]!=OW_READ&&j<DIMBUF;j++); + if(bufferI[j]==OW_READ&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++){ + if(memEE[k++]!=bufferI[z]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],i+z-(j+2),i+z-(j+2),memEE[k-1],bufferI[z]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + } + } + PrintStatus(strings[S_CodeV2],i*100/(dim),i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +#define READ_SCRATCHPAD2 0xBE +#define CONVERT_TEMP 0x44 +#define RECALL_EE 0xB8 +#define READ_PWSUP 0xB4 + +void ReadDS1820() +// read DS1820 one-wire digital thermometer +{ + int z=0,j; + double TLSB=0.5; + hvreg=0; + if(FWVersion<0x800){ + PrintMessage1(strings[S_FWver2old],"0.8.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"ReadDS1820()\n"); + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=uW_INIT; //set RB1=0 to use as GND terminal beside RB0 + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=1; + bufferU[j++]=READ_ROM; + bufferU[j++]=OW_READ; + bufferU[j++]=8; + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=2; + bufferU[j++]=SKIP_ROM; + bufferU[j++]=CONVERT_TEMP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(16); + j=0; + for(z=0;bufferI[z]!=OW_RESET&&z<DIMBUF;z++); + if(bufferI[z]==OW_RESET&&bufferI[z+1]==0){ //no presence pulse + PrintMessage(strings[S_ComErr]); //communication error + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + if(saveLog) CloseLogFile(); + return; + } + for(z=0;bufferI[z]!=OW_READ&&z<DIMBUF;z++); + if(z<DIMBUF-9){ + PrintMessage1("Family code: 0x%02X ",bufferI[z+2]); + OW_ID(bufferI[z+2]); + if(bufferI[z+2]==0x10) TLSB=0.5; //DS1820 + else if(bufferI[z+2]==0x28) TLSB=0.0625; //DS18B20 + PrintMessage3("Serial ID: 0x%02X%02X%02X",bufferI[z+3],bufferI[z+4],bufferI[z+5]); + PrintMessage3("%02X%02X%02X",bufferI[z+6],bufferI[z+7],bufferI[z+8]); + PrintMessage1("\r\nCRC: 0x%02X\r\n",bufferI[z+9]); + } +//****************** read ******************** + msDelay(800); + bufferU[j++]=OW_RESET; + bufferU[j++]=OW_WRITE; + bufferU[j++]=2; + bufferU[j++]=SKIP_ROM; + bufferU[j++]=READ_SCRATCHPAD2; + bufferU[j++]=OW_READ; + bufferU[j++]=8; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(10); + j=0; + for(z=0;bufferI[z]!=OW_READ&&z<DIMBUF-2;z++); + //PrintMessage("0x"); + //for(i=z+2;i<z+10&&i<DIMBUF;i++) PrintMessage1("%02X",bufferI[i]); + //PrintMessage("\r\n"); + int T=bufferI[z+2]+(bufferI[z+3]<<8); + if(T>0xF000) T|=0xFFFF0000; //adjust negative value +#ifdef _MSC_VER + PrintMessage2("T=%.4f°C (0x%04X)\r\n",T*TLSB,T); +#else + PrintMessage2("T=%.4f°C (0x%04X)\r\n",T*TLSB,T); +#endif +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; //turn off + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + + +#define UNIO_READ 0x03 +#define UNIO_CRRD 0x06 +#define UNIO_WRITE 0x6C +#define UNIO_WREN 0x96 +#define UNIO_WRDI 0x91 +#define UNIO_RDSR 0x05 +#define UNIO_WRSR 0x6E +#define UNIO_ERAL 0x6D +#define UNIO_SETAL 0x67 + +void Read11xx(int dim) +// read 11xx UNIO memories +// dim=size in bytes +{ + int k=0,z=0,i,j; + hvreg=0; + if(FWVersion<0x800){ + PrintMessage1(strings[S_FWver2old],"0.8.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(dim>=0x10000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Read11xx(%d) (0x%X)\n",dim,dim); + } + sizeEE=dim; + if(memEE) free(memEE); + memEE=(unsigned char*)malloc(dim); //EEPROM + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=1; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_RDSR; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); +//****************** read ******************** + PrintMessage(strings[S_ReadEE]); //read EEPROM ... + PrintStatusSetup(); + for(i=0,j=0;i<dim;i+=DIMBUF-5){ + bufferU[j++]=UNIO_COM; + bufferU[j++]=4; //write x bytes + bufferU[j++]=i<dim-(DIMBUF-5)?DIMBUF-5:dim-i; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_READ; + bufferU[j++]=i>>8; + bufferU[j++]=i&0xFF; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(14); + for(j=0;j<DIMBUF-1&&bufferI[j]!=UNIO_COM;j++); + if(bufferI[j]==UNIO_COM&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++) memEE[k++]=bufferI[z]; + } + PrintStatus(strings[S_CodeReading2],i*100/(dim),i); //"Read: %d%%, addr. %05X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X) \n" + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + sizeEE=k; + } + else PrintMessage(strings[S_Compl]); +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + DisplayEE(); //visualize + int sum=0; + for(i=0;i<sizeEE;i++) sum+=memEE[i]; + PrintMessage1("Checksum: 0x%X\r\n",sum&0xFFFF); + sprintf(str,strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} + +void Write11xx(int dim,int page) +// write 11xx UNIO memories +// dim=size in bytes +// page=page size +{ + int k=0,z=0,i,j; + int err=0; + if(FWVersion<0x800){ + PrintMessage1(strings[S_FWver2old],"0.8.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + hvreg=0; + if(dim>=0x10000||dim<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + if(saveLog){ + OpenLogFile(); //"Log.txt" + fprintf(logfile,"Write11xx(%d,%d) (0x%X,0x%X)\n",dim,page,dim,page); + } + if(dim>sizeEE){ + i=sizeEE; + memEE=(unsigned char*)realloc(memEE,dim); + for(;i<dim;i++) memEE[i]=0xFF; + sizeEE=dim; + } + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Data area is empty\r\n" + return; + } + unsigned int start=GetTickCount(); + j=0; + bufferU[j++]=VREG_DIS; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=UNIO_STBY; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=0; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_WREN; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=1; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_RDSR; + bufferU[j++]=UNIO_COM; + bufferU[j++]=3; //write x bytes + bufferU[j++]=0; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_WRSR; + bufferU[j++]=0; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=1; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_RDSR; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=0; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_WREN; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(25); +//****************** write ******************** + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + PrintStatusSetup(); + for(;page>=DIMBUF-8;page>>=1); + for(i=0,j=0;i<dim;i+=page){ + bufferU[j++]=UNIO_COM; + bufferU[j++]=4+page; //write x bytes + bufferU[j++]=0; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_WRITE; + bufferU[j++]=i>>8; + bufferU[j++]=i&0xFF; + for(k=0;k<page;k++) bufferU[j++]=memEE[i+k]; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO((5+page)*0.2+2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=UNIO_COM;j++); + if(bufferI[j]!=UNIO_COM||bufferI[j+1]>=0xFA) i=dim+10; + PrintStatus(strings[S_CodeWriting2],i*100/(dim),i); //"Write: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" + } + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=1; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_RDSR; + bufferU[j++]=UNIO_COM; + bufferU[j++]=2; //write x bytes + bufferU[j++]=0; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_WREN; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + int status=1; + for(k=0;status&&k<20;k++){ //status polling until write complete + PacketIO(2); + for(j=0;j<DIMBUF-1&&bufferI[j]!=UNIO_COM;j++); + if(bufferI[j]==UNIO_COM) status=bufferI[j+2]&1; + } + j=0; + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify EEPROM ******************** + PrintMessage(strings[S_EEV]); //"Verify EEPROM ... " + PrintStatusSetup(); + k=0; + for(i=0,j=0;i<dim;i+=DIMBUF-4){ + bufferU[j++]=UNIO_COM; + bufferU[j++]=4; //write x bytes + bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; //read x bytes + bufferU[j++]=0xA0; + bufferU[j++]=UNIO_READ; + bufferU[j++]=i>>8; + bufferU[j++]=i&0xFF; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(14); + for(j=0;j<DIMBUF-1&&bufferI[j]!=UNIO_COM;j++); + if(bufferI[j]==UNIO_COM&&bufferI[j+1]<0xFA){ + for(z=j+2;z<j+2+bufferI[j+1]&&z<DIMBUF;z++){ + if(memEE[k++]!=bufferI[z]){ + PrintMessage("\r\n"); + PrintMessage4(strings[S_CodeVError],i+z-3,i+z-3,memEE[k-1],bufferI[z]); //"Error verifying address %04X (%d), written %02X, read %02X\r\n" + err++; + } + } + } + PrintStatus(strings[S_CodeV2],i*100/(dim),i); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + j=0; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i,i,k,k,err); //"i=%d, k=%d, err=%d\n" + } + if(err>=max_err) break; + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadEEErr],dim,k); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" + } + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" +//****************** exit ******************** + bufferU[j++]=EN_VPP_VCC; + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(2); + unsigned int stop=GetTickCount(); + PrintStatusClear(); + sprintf(str,strings[S_EndErr],(stop-start)/1000.0,err,err!=1?strings[S_ErrPlur]:strings[S_ErrSing]); //"\r\nEnd (%.2f s) %d %s\r\n\r\n" + PrintMessage(str); + if(saveLog){ + fprintf(logfile,str); + CloseLogFile(); + } +} |