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 /progP32.c | |
download | OpenProgrammer-925d0670c45e1100e412070fa0ce2405604f219a.tar.gz OpenProgrammer-925d0670c45e1100e412070fa0ce2405604f219a.zip |
Init repo
Diffstat (limited to 'progP32.c')
-rw-r--r-- | progP32.c | 2454 |
1 files changed, 2454 insertions, 0 deletions
diff --git a/progP32.c b/progP32.c new file mode 100644 index 0000000..9416eed --- /dev/null +++ b/progP32.c @@ -0,0 +1,2454 @@ +/** + * \file progP32.c - algorithms to program the PIC32 family of microcontrollers + * Copyright (C) 2019 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" + +/*#ifdef _MSC_VER +void COpenProgDlg::CheckData(int a,int b,int addr,int *err) +#else +void CheckData(int a,int b,int addr,int *err) +#endif +{ + if(a!=b){ +#ifdef _MSC_VER + CString str; +#endif + PrintMessage(strings[S_NL]); + PrintMessage4(strings[S_CodeVError],addr,addr,a,b); //"Error writing address %4X: written %02X, read %02X\r\n" + (*err)++; + } +} +*/ +struct ID32{ + int id; + char *device; +} PIC32LIST[]={ + {0x0938053,"PIC32MX360F512L"}, + {0x0934053,"PIC32MX360F256L"}, + {0x092D053,"PIC32MX340F128L"}, + {0x092A053,"PIC32MX320F128L"}, + {0x0916053,"PIC32MX340F512H"}, + {0x0912053,"PIC32MX340F256H"}, + {0x090D053,"PIC32MX340F128H"}, + {0x090A053,"PIC32MX320F128H"}, + {0x0906053,"PIC32MX320F064H"}, + {0x0902053,"PIC32MX320F032H"}, + {0x0978053,"PIC32MX460F512L"}, + {0x0974053,"PIC32MX460F256L"}, + {0x096D053,"PIC32MX440F128L"}, + {0x0952053,"PIC32MX440F256H"}, + {0x0956053,"PIC32MX440F512H"}, + {0x094D053,"PIC32MX440F128H"}, + {0x0942053,"PIC32MX420F032H"}, + {0x04317053,"PIC32MX575F256H"}, + {0x0430B053,"PIC32MX675F256H"}, + {0x04303053,"PIC32MX775F256H"}, + {0x04309053,"PIC32MX575F512H"}, + {0x0430C053,"PIC32MX675F512H"}, + {0x04325053,"PIC32MX695F512H"}, + {0x0430D053,"PIC32MX775F512H"}, + {0x0430E053,"PIC32MX795F512H"}, + {0x04333053,"PIC32MX575F256L"}, + {0x04305053,"PIC32MX675F256L"}, + {0x04312053,"PIC32MX775F256L"}, + {0x0430F053,"PIC32MX575F512L"}, + {0x04311053,"PIC32MX675F512L"}, + {0x04341053,"PIC32MX695F512L"}, + {0x04307053,"PIC32MX775F512L"}, + {0x04307053,"PIC32MX795F512L"}, + {0x04400053,"PIC32MX534F064H"}, + {0x04401053,"PIC32MX564F064H"}, + {0x04403053,"PIC32MX564F128H"}, + {0x04405053,"PIC32MX664F064H"}, + {0x04407053,"PIC32MX664F128H"}, + {0x0440B053,"PIC32MX764F128H"}, + {0x0440C053,"PIC32MX534F064L"}, + {0x0440D053,"PIC32MX564F064L"}, + {0x0440F053,"PIC32MX564F128L"}, + {0x04411053,"PIC32MX664F064L"}, + {0x04413053,"PIC32MX664F128L"}, + {0x04417053,"PIC32MX764F128L"}, + {0x04A07053,"PIC32MX110F016B"}, + {0x04A09053,"PIC32MX110F016C"}, + {0x04A0B053,"PIC32MX110F016D"}, + {0x04A01053,"PIC32MX210F016B"}, + {0x04A03053,"PIC32MX210F016C"}, + {0x04A05053,"PIC32MX210F016D"}, + {0x04A06053,"PIC32MX120F032B"}, + {0x04A08053,"PIC32MX120F032C"}, + {0x04A0A053,"PIC32MX120F032D"}, + {0x04A00053,"PIC32MX220F032B"}, + {0x04A02053,"PIC32MX220F032C"}, + {0x04A04053,"PIC32MX220F032D"}, + {0x04D07053,"PIC32MX130F064B"}, + {0x04D09053,"PIC32MX130F064C"}, + {0x04D0B053,"PIC32MX130F064D"}, + {0x04D01053,"PIC32MX230F064B"}, + {0x04D03053,"PIC32MX230F064C"}, + {0x04D05053,"PIC32MX230F064D"}, + {0x04D06053,"PIC32MX150F128B"}, + {0x04D08053,"PIC32MX150F128C"}, + {0x04D0A053,"PIC32MX150F128D"}, + {0x04D00053,"PIC32MX250F128B"}, + {0x04D02053,"PIC32MX250F128C"}, + {0x04D04053,"PIC32MX250F128D"}, + {0x06610053,"PIC32MX170F256B"}, + {0x0661A053,"PIC32MX170F256D"}, + {0x06600053,"PIC32MX270F256B"}, + {0x0660A053,"PIC32MX270F256D"}, + {0x0660C053,"PIC32MX270F256DB"}, + {0x06703053,"PIC32MX130F256B"}, + {0x06705053,"PIC32MX130F256D"}, + {0x06700053,"PIC32MX230F256B"}, + {0x06702053,"PIC32MX230F256D"}, + {0x05600053,"PIC32MX330F064H"}, + {0x05601053,"PIC32MX330F064L"}, + {0x05704053,"PIC32MX350F256H"}, + {0x05705053,"PIC32MX350F256L"}, + {0x05602053,"PIC32MX430F064H"}, + {0x05603053,"PIC32MX430F064L"}, + {0x05706053,"PIC32MX450F256H"}, + {0x05707053,"PIC32MX450F256L"}, + {0x0570C053,"PIC32MX350F128H"}, + {0x0570D053,"PIC32MX350F128L"}, + {0x0570E053,"PIC32MX450F128H"}, + {0x0570F053,"PIC32MX450F128L"}, + {0x05808053,"PIC32MX370F512H"}, + {0x05809053,"PIC32MX370F512L"}, + {0x0580A053,"PIC32MX470F512H"}, + {0x0580B053,"PIC32MX470F512L"}, + {0x05710053,"PIC32MX450F256HB"}, + {0x05811053,"PIC32MX470F512LB"}, + {0x05103053,"PIC32MZ1024ECG064"}, + {0x05108053,"PIC32MZ1024ECH064"}, + {0x05130053,"PIC32MZ1024ECM064"}, + {0x05104053,"PIC32MZ2048ECG064"}, + {0x05109053,"PIC32MZ2048ECH064"}, + {0x05131053,"PIC32MZ2048ECM064"}, + {0x0510D053,"PIC32MZ1024ECG100"}, + {0x05112053,"PIC32MZ1024ECH100"}, + {0x0513A053,"PIC32MZ1024ECM100"}, + {0x0510E053,"PIC32MZ2048ECG100"}, + {0x05113053,"PIC32MZ2048ECH100"}, + {0x0513B053,"PIC32MZ2048ECM100"}, + {0x05117053,"PIC32MZ1024ECG124"}, + {0x0511C053,"PIC32MZ1024ECH124"}, + {0x05144053,"PIC32MZ1024ECM124"}, + {0x05118053,"PIC32MZ2048ECG124"}, + {0x0511D053,"PIC32MZ2048ECH124"}, + {0x05145053,"PIC32MZ2048ECM124"}, + {0x05121053,"PIC32MZ1024ECG144"}, + {0x05126053,"PIC32MZ1024ECH144"}, + {0x0514E053,"PIC32MZ1024ECM144"}, + {0x05122053,"PIC32MZ2048ECG144"}, + {0x05127053,"PIC32MZ2048ECH144"}, + {0x0514F053,"PIC32MZ2048ECM144"}, + {0x06A10053,"PIC32MX150F256H"}, + {0x06A11053,"PIC32MX150F256L"}, + {0x06A30053,"PIC32MX170F512H"}, + {0x06A31053,"PIC32MX170F512L"}, + {0x06A12053,"PIC32MX250F256H"}, + {0x06A13053,"PIC32MX250F256L"}, + {0x06A32053,"PIC32MX270F512H"}, + {0x06A33053,"PIC32MX270F512L"}, + {0x06A14053,"PIC32MX550F256H"}, + {0x06A15053,"PIC32MX550F256L"}, + {0x06A34053,"PIC32MX570F512H"}, + {0x06A35053,"PIC32MX570F512L"}, + {0x06A50053,"PIC32MX120F064H"}, + {0x06A00053,"PIC32MX130F128H"}, + {0x06A01053,"PIC32MX130F128L"}, + {0x06A02053,"PIC32MX230F128H"}, + {0x06A03053,"PIC32MX230F128L"}, + {0x06A04053,"PIC32MX530F128H"}, + {0x06A05053,"PIC32MX530F128L"}, + {0x07201053,"PIC32MZ0512EFE064"}, + {0x07206053,"PIC32MZ0512EFF064"}, + {0x0722E053,"PIC32MZ0512EFK064"}, + {0x07202053,"PIC32MZ1024EFE064"}, + {0x07207053,"PIC32MZ1024EFF064"}, + {0x0722F053,"PIC32MZ1024EFK064"}, + {0x07203053,"PIC32MZ1024EFG064"}, + {0x07208053,"PIC32MZ1024EFH064"}, + {0x07230053,"PIC32MZ1024EFM064"}, + {0x07204053,"PIC32MZ2048EFG064"}, + {0x07209053,"PIC32MZ2048EFH064"}, + {0x07231053,"PIC32MZ2048EFM064"}, + {0x0720B053,"PIC32MZ0512EFE100"}, + {0x07210053,"PIC32MZ0512EFF100"}, + {0x07238053,"PIC32MZ0512EFK100"}, + {0x0720C053,"PIC32MZ1024EFE100"}, + {0x07211053,"PIC32MZ1024EFF100"}, + {0x07239053,"PIC32MZ1024EFK100"}, + {0x0720D053,"PIC32MZ1024EFG100"}, + {0x07212053,"PIC32MZ1024EFH100"}, + {0x0723A053,"PIC32MZ1024EFM100"}, + {0x0720E053,"PIC32MZ2048EFG100"}, + {0x07213053,"PIC32MZ2048EFH100"}, + {0x0723B053,"PIC32MZ2048EFM100"}, + {0x07215053,"PIC32MZ0512EFE124"}, + {0x0721A053,"PIC32MZ0512EFF124"}, + {0x07242053,"PIC32MZ0512EFK124"}, + {0x07216053,"PIC32MZ1024EFE124"}, + {0x0721B053,"PIC32MZ1024EFF124"}, + {0x07243053,"PIC32MZ1024EFK124"}, + {0x07217053,"PIC32MZ1024EFG124"}, + {0x0721C053,"PIC32MZ1024EFH124"}, + {0x07244053,"PIC32MZ1024EFM124"}, + {0x07218053,"PIC32MZ2048EFG124"}, + {0x0721D053,"PIC32MZ2048EFH124"}, + {0x07245053,"PIC32MZ2048EFM124"}, + {0x0721F053,"PIC32MZ0512EFE144"}, + {0x07224053,"PIC32MZ0512EFF144"}, + {0x0724C053,"PIC32MZ0512EFK144"}, + {0x07220053,"PIC32MZ1024EFE144"}, + {0x07225053,"PIC32MZ1024EFF144"}, + {0x0724D053,"PIC32MZ1024EFK144"}, + {0x07221053,"PIC32MZ1024EFG144"}, + {0x07226053,"PIC32MZ1024EFH144"}, + {0x0724E053,"PIC32MZ1024EFM144"}, + {0x07222053,"PIC32MZ2048EFG144"}, + {0x07227053,"PIC32MZ2048EFH144"}, + {0x0724F053,"PIC32MZ2048EFM144"}, + {0x05F0C053,"PIC32MZ1025DAA169"}, + {0x05F0D053,"PIC32MZ1025DAB169"}, + {0x05F0F053,"PIC32MZ1064DAA169"}, + {0x05F10053,"PIC32MZ1064DAB169"}, + {0x05F15053,"PIC32MZ2025DAA169"}, + {0x05F16053,"PIC32MZ2025DAB169"}, + {0x05F18053,"PIC32MZ2064DAA169"}, + {0x05F19053,"PIC32MZ2064DAB169"}, + {0x05F42053,"PIC32MZ1025DAG169"}, + {0x05F43053,"PIC32MZ1025DAH169"}, + {0x05F45053,"PIC32MZ1064DAG169"}, + {0x05F46053,"PIC32MZ1064DAH169"}, + {0x05F4B053,"PIC32MZ2025DAG169"}, + {0x05F4C053,"PIC32MZ2025DAH169"}, + {0x05F4E053,"PIC32MZ2064DAG169"}, + {0x05F4F053,"PIC32MZ2064DAH169"}, + {0x05F78053,"PIC32MZ1025DAA176"}, + {0x05F79053,"PIC32MZ1025DAB176"}, + {0x05F7B053,"PIC32MZ1064DAA176"}, + {0x05F7C053,"PIC32MZ1064DAB176"}, + {0x05F81053,"PIC32MZ2025DAA176"}, + {0x05F82053,"PIC32MZ2025DAB176"}, + {0x05F84053,"PIC32MZ2064DAA176"}, + {0x05F85053,"PIC32MZ2064DAB176"}, + {0x05FAE053,"PIC32MZ1025DAG176"}, + {0x05FAF053,"PIC32MZ1025DAH176"}, + {0x05FB1053,"PIC32MZ1064DAG176"}, + {0x05FB2053,"PIC32MZ1064DAH176"}, + {0x05FB7053,"PIC32MZ2025DAG176"}, + {0x05FB8053,"PIC32MZ2025DAH176"}, + {0x05FBA053,"PIC32MZ2064DAG176"}, + {0x05FBB053,"PIC32MZ2064DAH176"}, + {0x05F5D053,"PIC32MZ1025DAA288"}, + {0x05F5E053,"PIC32MZ1025DAB288"}, + {0x05F60053,"PIC32MZ1064DAA288"}, + {0x05F61053,"PIC32MZ1064DAB288"}, + {0x05F66053,"PIC32MZ2025DAA288"}, + {0x05F67053,"PIC32MZ2025DAB288"}, + {0x05F69053,"PIC32MZ2064DAA288"}, + {0x05F6A053,"PIC32MZ2064DAB288"}, + {0x07800053,"PIC32MX154F128B"}, + {0x07804053,"PIC32MX154F128D"}, + {0x07808053,"PIC32MX155F128B"}, + {0x0780C053,"PIC32MX155F128D"}, + {0x07801053,"PIC32MX174F256B"}, + {0x07805053,"PIC32MX174F256D"}, + {0x07809053,"PIC32MX175F256B"}, + {0x0780D053,"PIC32MX175F256D"}, + {0x07802053,"PIC32MX254F128B"}, + {0x07806053,"PIC32MX254F128D"}, + {0x0780A053,"PIC32MX255F128B"}, + {0x0780E053,"PIC32MX255F128D"}, + {0x07803053,"PIC32MX274F256B"}, + {0x07807053,"PIC32MX274F256D"}, + {0x0780B053,"PIC32MX275F256B"}, + {0x0780F053,"PIC32MX275F256D"}, + {0x06211053,"PIC32MK0512GPD064"}, + {0x0620E053,"PIC32MK1024GPD064"}, + {0x06210053,"PIC32MK0512GPD100"}, + {0x0620D053,"PIC32MK1024GPD100"}, + {0x0620B053,"PIC32MK0512GPE064"}, + {0x06208053,"PIC32MK1024GPE064"}, + {0x0620A053,"PIC32MK0512GPE100"}, + {0x06207053,"PIC32MK1024GPE100"}, + {0x06205053,"PIC32MK0512MCF064"}, + {0x06202053,"PIC32MK1024MCF064"}, + {0x06201053,"PIC32MK0512MCF100"}, + {0x06201053,"PIC32MK1024MCF100"}, +}; + +void PIC32_ID(int id) +{ + char s[64]; + int i; + for(i=0;i<sizeof(PIC32LIST)/sizeof(PIC32LIST[0]);i++){ + if((id&0x0FFFFFFF)==PIC32LIST[i].id){ + strcpy(s,PIC32LIST[i].device); + strcat(s,"\r\n"); + PrintMessage(s); + return; + } + } + PrintMessage(strings[S_nodev]); //"Unknown device\r\n"); +} + +/*#ifdef _MSC_VER +void COpenProgDlg::DisplayCODE24F(int dim){ +#else +void DisplayCODE24F(int dim){ +#endif +// display 16 bit PIC CODE memory + char s[256]="",t[256]=""; + char* aux=(char*)malloc((dim/COL+1)*2*(16+COL*9)); + aux[0]=0; + int valid=0,empty=1,i,j,d,lines=0; + for(i=0;i<dim&&i<size;i+=COL*2){ + valid=0; + for(j=i;j<i+COL*2&&j<dim;j+=4){ + d=(memCODE[j+3]<<24)+(memCODE[j+2]<<16)+(memCODE[j+1]<<8)+memCODE[j]; + sprintf(t,"%08X ",d); + strcat(s,t); + if(d!=0xffffffff) valid=1; + } + if(valid){ + sprintf(t,"%06X: %s\r\n",i/2,s); + empty=0; + strcat(aux,t); + lines++; + if(lines>500){ //limit number of lines printed + strcat(aux,"(...)\r\n"); + i=(dim<size?dim:size)-COL*4; + lines=490; + } + } + s[0]=0; + } + if(empty) PrintMessage(strings[S_Empty]); //empty + else PrintMessage(aux); + free(aux); +} + +*/ +/* +TDI=RB7 -> +TCK=RB6 -> +TDO=RB5 <- +TMS=RB4 -> +MCLR=RB3 -> +*/ +//MCHP TAP INSTRUCTIONS (sent via JTAGSendCommand) +#define MTAP_COMMAND 0x07 //TDI and TDO connected to MCHP Command Shift register +#define MTAP_SW_MTAP 0x04 //Switch TAP controller to MCHP TAP controller +#define MTAP_SW_ETAP 0x05 //Switch TAP controller to EJTAG TAP controller +#define MTAP_IDCODE 0x01 //Select Chip Identification Data register +//MTAP_COMMAND DR COMMANDS (sent via xferData) +#define MCHP_STATUS 0x00 //NOP and return Status. +#define MCHP_ASSERT_RST 0xD1 //Requests the reset controller to assert device Reset. +#define MCHP_DE_ASSERT_RST 0xD0 //Removes the request for device Reset, which causes the reset controller + //to deassert device Reset if there is no other source requesting Reset (i.e., MCLR). +#define MCHP_ERASE 0xFC //Cause the Flash controller to perform a Chip Erase. +#define MCHP_FLASH_ENABLE 0xFE //Enables fetches and loads to the Flash (from the processor). +#define MCHP_FLASH_DISABLE 0xFD //Disables fetches and loads to the Flash (from the processor). +//EJTAG TAP INSTRUCTIONS +#define ETAP_ADDRESS 0x08 //Select Address register. +#define ETAP_DATA 0x09 //Select Data register. +#define ETAP_CONTROL 0x0A //Select EJTAG Control register. +#define ETAP_EJTAGBOOT 0x0C //Set EjtagBrk, ProbEn and ProbTrap to ‘1’ as the reset value. +#define ETAP_FASTDATA 0x0E //Selects the Data and Fastdata registers. + +void XferInstruction(int* j,int instruction){ +// fill buffer with XferInstruction (14 bytes) +// if j<0 use separate counter and perform IO directly (also wait for CPU ready) + int i=0,z,w0=0; + int IO=0; + if((int)j==-1){ + j=&i; + IO=1; + } + if(IO){ +// bufferU[(*j)++]=JTAG_SEND_CMD; +// bufferU[(*j)++]=MTAP_SW_ETAP; +// bufferU[(*j)++]=JTAG_SET_MODE; +// bufferU[(*j)++]=0x3E;//0x1F; + bufferU[(*j)++]=JTAG_SEND_CMD; + bufferU[(*j)++]=ETAP_CONTROL; + bufferU[(*j)++]=FLUSH; + for(;(*j)<DIMBUF;(*j)++) bufferU[(*j)]=0x0; + PacketIO(5); + i=0; + bufferU[(*j)++]=JTAG_XFER_DATA; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=0x04; + bufferU[(*j)++]=0xC0; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=FLUSH; + for(;(*j)<DIMBUF;(*j)++) bufferU[(*j)]=0x0; + for(i=0;i<20;i++){ //Wait for CPU ready + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + if(w0&0x40000) break; + } + if(i==20) PrintMessage1("i=20 ECR=0x%08X\r\n",w0); + i=0; + } + bufferU[(*j)++]=JTAG_SEND_CMD; + bufferU[(*j)++]=ETAP_DATA; + bufferU[(*j)++]=JTAG_XFER_DATA; + bufferU[(*j)++]=(instruction>>24)&0xFF; + bufferU[(*j)++]=(instruction>>16)&0xFF; + bufferU[(*j)++]=(instruction>>8)&0xFF; + bufferU[(*j)++]=instruction&0xFF; + bufferU[(*j)++]=JTAG_SEND_CMD; + bufferU[(*j)++]=ETAP_CONTROL; + bufferU[(*j)++]=JTAG_XFER_DATA; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=0x00; + bufferU[(*j)++]=0xC0; + bufferU[(*j)++]=0x00; + if(IO){ + bufferU[(*j)++]=FLUSH; + for(;(*j)<DIMBUF;(*j)++) bufferU[(*j)]=0x0; + PacketIO(5); + i=0; + } +} + + + +void Read32x(int dim,int options){ +// read 32 bit PIC32x +// deviceID @ 0xFF0000 +// dim=program size (bytes) +// options: +// bit [3:0] + int k=0,k2=0,z=0,i,j; + if(FWVersion<0xA00){ + PrintMessage1(strings[S_FWver2old],"0.10.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(!CheckV33Regulator()){ + PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board + return; + } + if(saveLog){ + OpenLogFile(); + fprintf(logfile,"Read32x(%d,%d) (0x%X,0x%X)\n",dim,options,dim,options); + } + //dim*=2; //from words to bytes + if(dim>0x80000||dim<0){ + PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" + return; + } + //unsigned char *memExec=0; + //executiveArea*=2; + //if(executiveArea) memExec=(unsigned char *)malloc(executiveArea); + //for(i=0;i<executiveArea;i++) memExec[i]=0xFF; + size=dim; + if(memCODE) free(memCODE); + memCODE=(unsigned char*)malloc(size); //CODE + memset(memCODE,0xFF,dim); + StartHVReg(-1); //disable HV + unsigned int start=GetTickCount(); + int w0=0; + j=0; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=10000>>8; + bufferU[j++]=10000&0xff; + bufferU[j++]=EN_VPP_VCC; //enter program mode + bufferU[j++]=0x0; + bufferU[j++]=WAIT_T2; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=WAIT_T3; + bufferU[j++]=SET_PORT_DIR; + bufferU[j++]=0x27; //RB7-6-4-3 output + bufferU[j++]=0xFF; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0x08; //MCLR=1 + bufferU[j++]=0; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; //MCLR=0 + bufferU[j++]=0; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_SW_MTAP; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_COMMAND; + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=MCHP_STATUS; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(25); + j=0; + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; +// PrintMessage1("w0: (0x%08X)\r\n",w0); + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=MCHP_STATUS; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + j=0; + for(i=0;(w0&0xC)!=0x8&&i<20;i++){ + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; +// PrintMessage1("w0: (0x%08X)\r\n",w0); + } + PrintMessage3("Device status: CFGRDY=%d FCBUSY=%d (0x%02X)\r\n",w0&0x8?1:0,w0&0x4?1:0,w0&0xFF); + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_IDCODE; + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=FLUSH; + PacketIO(5); + j=0; + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("IDCODE=0x%08X\r\n",w0); + PIC32_ID(w0); + //enable serial execution mode + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_SW_MTAP; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_COMMAND; + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=0; + bufferU[j++]=MCHP_STATUS; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_SW_ETAP; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_EJTAGBOOT; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0x8; //MCLR=1 + bufferU[j++]=0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; +// msDelay(5); + /* + PrintMessage2("DevID: 0x%04X\r\nDevRev: 0x%04X\r\n",w0,w1); + PIC24_ID(w0); + //Read ApplicationID @ appIDaddr + j=1; + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2) w0=(bufferI[z+1]<<8)+bufferI[z+2]; + PrintMessage2("ApplicationID @ 0x80%04X: 0x%04X\r\n",appIDaddr,w0); +//****************** read code ******************** + PrintMessage(strings[S_CodeReading1]); //code read ... + PrintStatusSetup(); +//Read 6 24 bit words packed in 9 16 bit words +//memory address advances by 24 bytes because of alignment + int High=0; + for(i=0;i<dim;i+=24){ + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + memCODE[k+1]=bufferI[z+1]; //M0 + memCODE[k]=bufferI[z+2]; //L0 + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + memCODE[k+2]=bufferI[z+2]; //H0 + memCODE[k+6]=bufferI[z+1]; //H1 + } + PrintStatus(strings[S_CodeReading2],i*100/dim,i/2); //"Read: %d%%, addr. %05X" + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + } + PrintStatusEnd(); + if(k!=dim){ + PrintMessage("\r\n"); + PrintMessage2(strings[S_ReadCodeErr2],dim,k); //"Error reading code area, requested %d bytes, read %d\r\n" + } + else PrintMessage(strings[S_Compl]);*/ +//****************** read config area ******************** +//0x1FC00BF0-0BFF + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=MTAP_SW_ETAP; + bufferU[j++]=JTAG_SET_MODE; + bufferU[j++]=0x3E;//0x1F; + + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_CONTROL; + bufferU[j++]=JTAG_XFER_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + j=0; + for(i=0;i<20;i++){ //Wait for CPU ready + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + if(w0&0x40000) break; + } + //PrintMessage1("i=%d\r\n",i); + PrintMessage1("ECR=0x%08X\r\n",w0); + for(i=0xbFC00BF0;i<0xbFC00C10;i+=4){ +/* XferInstruction(&j,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(&j,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + XferInstruction(&j,0xae690000); //sw $t1, 0($s3) + XferInstruction(&j,0); //nop +*/ + XferInstruction(-1,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(-1,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + w0=-10; + //for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + //for(z+=4;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage2("[0x%08X]=0x%08X\r\n",i,w0); + //msDelay(5); + } + i=0xBF80F230; //DEV ID + XferInstruction(-1,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(-1,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + +/* XferInstruction(&j,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(&j,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + XferInstruction(&j,0xae690000); //sw $t1, 0($s3) + */ + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + w0=-10; +// for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); +// for(z+=4;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); + PacketIO(5); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); + XferInstruction(-1,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(-1,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(-1,0x35080000+(i&0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(-1,0x8d090000); //lw $t1, 0($t0) + XferInstruction(-1,0xae690000); //sw $t1, 0($s3) + XferInstruction(-1,0); //nop + j=0; + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + w0=-10; +// for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); +// for(z+=4;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + for(z=0;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage1("DEVID=0x%08X\r\n",w0); +// Boot block +// PrintMessage("BOOT BLOCK @0x1FC00000\r\n"); + for(i=0x1FC00000;i<0x1FC00BF0&&0;i+=4){ + XferInstruction(&j,0x3C13FF20); //lui $s3, 0xFF20 + XferInstruction(&j,0x3C080000+(i>>16)); //lui $t0,<FLASH_WORD_ADDR(31:16)> + XferInstruction(&j,0x35080000+(i%0xFFFF)); //ori $t0,<FLASH_WORD_ADDR(15:0)> + XferInstruction(&j,0x8d090000); //lw $t1, 0($t0) + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + XferInstruction(&j,0xae690000); //sw $t1, 0($s3) + bufferU[j++]=JTAG_SEND_CMD; + bufferU[j++]=ETAP_FASTDATA; + bufferU[j++]=JTAG_XFER_F_DATA; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + PacketIO(5); + j=0; + for(z=0;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + for(z+=4;bufferI[z]!=JTAG_XFER_DATA&&z<DIMBUF;z++); + for(z+=4;bufferI[z]!=JTAG_XFER_F_DATA&&z<DIMBUF;z++); + if(z<DIMBUF-4) w0=(bufferI[z+1]<<24)+(bufferI[z+2]<<16)+(bufferI[z+3]<<8)+bufferI[z+4]; + PrintMessage2("[0x%08X]=0x%08X\r\n",i,w0); + } + +/* if(config>2){ //config area @ 0xF80000 + if(saveLog) fprintf(logfile,"\nCONFIG:\n"); + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0x80; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],0xF80000,0xF80000,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + //save 0xF800000 to 0xF80010 + for(i=0,z=1;i<9;i++){ + for(;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + memCONFIG[i*4]=bufferI[z+2]; //Low byte + memCONFIG[i*4+1]=bufferI[z+1]; //High byte + z+=3; + } + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],0xF80000,0xF80000,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + //save 0xF800012 to 0xF80016 + for(i=9,z=1;i<12;i++){ + for(;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + memCONFIG[i*4]=bufferI[z+2]; //Low byte + memCONFIG[i*4+1]=bufferI[z+1]; //High byte + z+=3; + } + PrintStatusClear(); + }*/ +//****************** exit ******************** + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=2000>>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=EXT_PORT; + bufferU[j++]=0; //MCLR=0 + bufferU[j++]=0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + if(saveLog) WriteLogIO(); + unsigned int stop=GetTickCount(); + PrintStatusClear(); +//****************** visualize ******************** +/* if(config>2){ //only if separate config area + PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" + if(config==3||config==4||config==6){ + PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); + if(config==4){ //0xF80000-16 + PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); + } + PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); + PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); + PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); + PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); + PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); + PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); + if(config==3){ //0xF80000-10 except 02 + PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); + } + else if(config==4){ //0xF80000-16 + PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); + PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); + PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); + PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); + } + } + else if(config==5){ //0xF80000-0C (16 bit) + PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); + PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); + PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); + PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); + PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); + PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); + PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); + } + } + else{ + //last 2 program words + PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ + ,(memCODE[dim-7]<<8)+memCODE[dim-8]); + if(config==1){ //last 3 program words + PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); + } + if(config==2){ //last 4 program words + PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); + } + } + PrintMessage(strings[S_CodeMem]); //"\r\nCode memory:\r\n" + DisplayCODE24F(dim); + if(dim2){ + PrintMessage(strings[S_EEMem]); //"\r\nEEPROM memory:\r\n" + DisplayEE24F(); + } + if(executiveArea){ + char s[256],t[256]; + int d,valid,empty=1; + char* aux=(char*)malloc((dim/COL+1)*2*(16+COL*9)); + aux[0]=0; + s[0]=0; + empty=1; + PrintMessage(strings[S_ExeMem]); //"\r\nExecutive memory:\r\n" + for(i=0;i<executiveArea;i+=COL*2){ + valid=0; + for(j=i;j<i+COL*2&&j<executiveArea;j+=4){ + d=(memExec[j+3]<<24)+(memExec[j+2]<<16)+(memExec[j+1]<<8)+memExec[j]; + sprintf(t,"%08X ",d); + strcat(s,t); + if(d!=0xffffffff) valid=1; + } + if(valid){ + sprintf(t,"%06X: %s\r\n",i/2,s); + empty=0; + strcat(aux,t); + } + s[0]=0; + } + if(empty) PrintMessage(strings[S_Empty]); //empty + else PrintMessage(aux); + free(aux); + }*/ + PrintMessage1(strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" + if(saveLog) CloseLogFile(); +} + +/* +#ifdef _MSC_VER +void COpenProgDlg::Write24Fx(int dim,int dim2,int options,int appIDaddr,int rowSize, double wait){ +#else +void Write24Fx(int dim,int dim2,int options,int appIDaddr,int rowSize, double wait){ +#endif +// write 16 bit PIC 24Fxxxx +// deviceID @ 0xFF0000 +// dim=program size (16 bit words) +// dim2=eeprom size (in bytes, area starts at 0x800000-size) +// options: +// bit [3:0] +// 0 = low voltage ICSP entry +// 1 = High voltage ICSP entry (6V) +// 2 = High voltage ICSP entry (12V) + PIC30F sequence (additional NOPs) +// 3 = low voltage ICSP entry (5V power supply) +// bit [7:4] +// 0 = config area in the last 2 program words +// 1 = config area in the last 3 program words +// 2 = config area in the last 4 program words +// 3 = 0xF80000 to 0xF80010 except 02 (24F) +// 4 = 0xF80000 to 0xF80016 (24H-33F) +// 5 = 0xF80000 to 0xF8000C (x16 bit, 30F) +// 6 = 0xF80000 to 0xF8000E (30FSMPS) +// bit [11:8] +// 0 = code erase word is 0x4064, row write is 0x4004 +// 1 = code erase word is 0x404F, row write is 0x4001 +// 2 = code erase word is 0x407F, row write is 0x4001, 55AA unlock and external timing (2 ms) +// 3 = code erase word is 0x407F, row write is 0x4001, 55AA unlock and external timing (200 ms) +// bit [15:12] +// 0 = eeprom erase word is 0x4050, write word is 0x4004 +// 1 = eeprom erased with bulk erase, write word is 0x4004 +// 2 = eeprom erased with special sequence, write word is 0x4004 +// bit [19:16] +// 0 = config write is 0x4000 +// 1 = config write is 0x4003 +// 2 = config write is 0x4004 +// 3 = config write is 0x4008 +// bit [20] +// 0 = standard TABLPAG address +// 1 = new TABLPAG address +// appIDaddr = application ID word lower address (high is 0x80) +// rowSize = row size in instruction words (a row is written altogether) +// wait = write delay in ms + int k=0,k2=0,z=0,i,j; + int entry=options&0xF; + int config=(options>>4)&0xF; + int EEbaseAddr=0x1000-dim2; + int newTABLPAG=options&0x100000?1:0; + int err=0; + if(FWVersion<0x700){ + PrintMessage1(strings[S_FWver2old],"0.7.0"); //"This firmware is too old. Version %s is required\r\n" + return; + } + if(entry<2&&!CheckV33Regulator()){ //except 30Fxx which is on 5V + PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board + return; + } + if(saveLog){ + OpenLogFile(); + fprintf(logfile,"Write24Fx(%d,%d,%d,%d,%d,%.1f) (0x%X,0x%X,0x%X,0x%X,0x%X,%.3f)\n" + ,dim,dim2,options,appIDaddr,rowSize,wait,dim,dim2,options,appIDaddr,rowSize,wait); + } + dim*=2; //from words to bytes + if(dim>0x80000||dim<0){ + PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" + return; + } + if(dim2>0x1000||dim2<0){ + PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" + return; + } + j=size; + if(j%(rowSize*4)){ //grow to an integer number of rows + size=(j/(rowSize*4)+1)*rowSize*4; + memCODE=(unsigned char*)realloc(memCODE,size); + for(;j<size;j++) memCODE[j]=0xFF; + } + if(dim>size) dim=size; + if(sizeEE<0x1000) dim2=0; + if(dim<1){ + PrintMessage(strings[S_NoCode]); //"Empty code area\r\n" + return; + } + if((entry==1)||(entry==2)){ //High voltage programming: 3.3V + 1.5V + R drop + margin + if(!StartHVReg(entry==2?12:6)){ //12V only for 30Fxx !!! + PrintMessage(strings[S_HVregErr]); //"HV regulator error\r\n" + return; + } + } + else StartHVReg(-1); //LVP: current limited to (5-0.7-3.6)/10k = 50uA + if(config>2){ //only if separate config area + PrintMessage(strings[S_ConfigMem]); //"\r\nConfig Memory:\r\n" + if(config==3||config==4||config==6){ + PrintMessage1("0xF80000: FBS = 0x%02X\r\n",memCONFIG[0]); + if(config==4){ //0xF80000-16 + PrintMessage1("0xF80002: FSS = 0x%02X\r\n",memCONFIG[4]); + } + PrintMessage1("0xF80004: FGS = 0x%02X\r\n",memCONFIG[8]); + PrintMessage1("0xF80006: FOSCSEL = 0x%02X\r\n",memCONFIG[12]); + PrintMessage1("0xF80008: FOSC = 0x%02X\r\n",memCONFIG[16]); + PrintMessage1("0xF8000A: FWDT = 0x%02X\r\n",memCONFIG[20]); + PrintMessage1("0xF8000C: FPOR = 0x%02X\r\n",memCONFIG[24]); + PrintMessage1("0xF8000E: FICD = 0x%02X\r\n",memCONFIG[28]); + if(config==3){ //0xF80000-10 except 02 + PrintMessage1("0xF80010: FDS = 0x%02X\r\n",memCONFIG[32]); + } + else if(config==4){ //0xF80000-16 + PrintMessage1("0xF80010: UID0 = 0x%02X\r\n",memCONFIG[32]); + PrintMessage1("0xF80012: UID1 = 0x%02X\r\n",memCONFIG[36]); + PrintMessage1("0xF80014: UID2 = 0x%02X\r\n",memCONFIG[40]); + PrintMessage1("0xF80016: UID3 = 0x%02X\r\n",memCONFIG[44]); + } + } + else if(config==5){ //0xF80000-0C (16 bit) + PrintMessage2("0xF80000: FOSC = 0x%02X%02X\r\n",memCONFIG[1],memCONFIG[0]); + PrintMessage2("0xF80002: FWDT = 0x%02X%02X\r\n",memCONFIG[5],memCONFIG[4]); + PrintMessage2("0xF80004: FBORPOR = 0x%02X%02X\r\n",memCONFIG[9],memCONFIG[8]); + PrintMessage2("0xF80006: FBS = 0x%02X%02X\r\n",memCONFIG[13],memCONFIG[12]); + PrintMessage2("0xF80008: FSS = 0x%02X%02X\r\n",memCONFIG[17],memCONFIG[16]); + PrintMessage2("0xF8000A: FGS = 0x%02X%02X\r\n",memCONFIG[21],memCONFIG[20]); + PrintMessage2("0xF8000C: FICD = 0x%02X%02X\r\n",memCONFIG[25],memCONFIG[24]); + } + } + else{ + //last 2 program words + PrintMessage2("CONFIG1: 0x%04X\r\nCONFIG2: 0x%04X\r\n",(memCODE[dim-3]<<8)+memCODE[dim-4]\ + ,(memCODE[dim-7]<<8)+memCODE[dim-8]); + if(config==1){ //last 3 program words + PrintMessage1("CONFIG3: 0x%04X\r\n",(memCODE[dim-11]<<8)+memCODE[dim-12]); + } + if(config==2){ //last 4 program words + PrintMessage1("CONFIG4: 0x%04X\r\n",(memCODE[dim-15]<<8)+memCODE[dim-16]); + } + } + unsigned int start=GetTickCount(); + bufferU[0]=0; + j=1; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=2000>>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=EN_VPP_VCC; //enter program mode + bufferU[j++]=0x0; + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; + bufferU[j++]=WAIT_T2; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + if((entry==0)||(entry==3)){ //LVP: pulse on MCLR + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + } + else PrintMessage(strings[S_HVICSP]); //"High Voltage ICSP\r\n" + bufferU[j++]=WAIT_T3; + bufferU[j++]=TX16; + bufferU[j++]=2; + bufferU[j++]=0x4D; + bufferU[j++]=0x43; + bufferU[j++]=0x48; + bufferU[j++]=0x51; + bufferU[j++]=WAIT_T3; //min 1ms + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=30000>>8; + bufferU[j++]=30000&0xff; + bufferU[j++]=WAIT_T3; //min 25ms + if(entry==2){ //30Fx entry + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=EN_VPP_VCC; //VDD + bufferU[j++]=0x1; + bufferU[j++]=EN_VPP_VCC; //VDD + VPP + bufferU[j++]=0x5; + bufferU[j++]=ICSP_NOP; + } + else{ + //Additional 5 clock cycles upon entering program mode + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x4; //CK=1 + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; //CK=0 + } + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(37); + readP(); + if(saveLog)WriteLogIO(); + j=1; + //Read DeviceID @0xFF0000, DevRev @0xFF0002 + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0xF0; //0xFF + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x20; //MOV XXXX,W6 + bufferU[j++]=0x00; + bufferU[j++]=0x06; //0x0000 + bufferU[j++]=0x20; //MOV #VISI,W7 + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + if(saveLog)WriteLogIO(); + j=1; + int w0=0,w1=0; + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2) w0=(bufferI[z+1]<<8)+bufferI[z+2]; + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2) w1=(bufferI[z+1]<<8)+bufferI[z+2]; + PrintMessage2("DevID: 0x%04X\r\nDevRev: 0x%04X\r\n",w0,w1); + PIC24_ID(w0); + //Read ApplicationID @ appIDaddr + bufferU[j++]=SIX_N; + bufferU[j++]=0x44; //append 1 NOP + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x08; + bufferU[j++]=0x00; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x20+((appIDaddr>>12)&0xF); //MOV XXXX,W6 + bufferU[j++]=(appIDaddr>>4)&0xFF; + bufferU[j++]=((appIDaddr<<4)&0xF0)+6; + bufferU[j++]=0x20; //MOV #VISI,W7 + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=SET_PARAMETER; + bufferU[j++]=SET_T3; + bufferU[j++]=2000>>8; + bufferU[j++]=2000&0xff; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + j=1; + if(saveLog)WriteLogIO(); + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2) w0=(bufferI[z+1]<<8)+bufferI[z+2]; + PrintMessage2("ApplicationID @ 0x80%04X: 0x%04X\r\n",appIDaddr,w0); +//****************** erase memory ******************** + PrintMessage(strings[S_StartErase]); //"Erase ... " + if(saveLog) fprintf(logfile,"\nERASE:\n"); + int erase=(options&0xF00)>>8; + //bulk erase command + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x24; //MOV XXXX,W10 + if(erase==0){ //0x4064 + bufferU[j++]=0x06; + bufferU[j++]=0x4A; + } + else if(erase==1){ //0x404F + bufferU[j++]=0x04; + bufferU[j++]=0xFA; + } + else if(erase>=2){ //0x407F + bufferU[j++]=0x07; + bufferU[j++]=0xFA; + } + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W0] (dummy write) + bufferU[j++]=0xBB; + bufferU[j++]=0x08; + bufferU[j++]=0x00; + if(erase>=2){ //30Fx, unlock and external timing + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + if(erase==3){ //200 ms timing + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(200); + readP(); + j=1; + if(saveLog)WriteLogIO(); + } + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + else{ //internal timing + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=SIX; //MOV NVMCON,W2 + bufferU[j++]=0x80; + bufferU[j++]=0x3B; + bufferU[j++]=0x02; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //MOV W2,VISI + bufferU[j++]=0x88; + bufferU[j++]=0x3C; + bufferU[j++]=0x22; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=REGOUT; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(7); + readP(); + j=1; + if(saveLog)WriteLogIO(); + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + w0=bufferI[z+1]&0x80; + //Wait for erase completion (max 1s) + for(i=0;erase<2&&i<100&&w0;i++){ + bufferU[j++]=SIX; //MOV NVMCON,W2 + bufferU[j++]=0x80; + bufferU[j++]=0x3B; + bufferU[j++]=0x02; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //MOV W2,VISI + bufferU[j++]=0x88; + bufferU[j++]=0x3C; + bufferU[j++]=0x22; + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(10); + readP(); + j=1; + if(saveLog)WriteLogIO(); + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + w0=bufferI[z+1]&0x80; + } +//****************** prepare write ******************** + bufferU[j++]=SIX_N; + bufferU[j++]=5; + bufferU[j++]=0x24; //MOV XXXX,W10 + bufferU[j++]=0x00; + bufferU[j++]=erase>0?0x1A:0x4A; //0x4001/0x4004 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV XXXX,W0 + bufferU[j++]=0x00; + bufferU[j++]=0x00; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x04; //GOTO 0x200 + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + j=1; + if(saveLog)WriteLogIO(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** write code ******************** + PrintMessage(strings[S_StartCodeProg]); //"Write code ... " + if(saveLog) fprintf(logfile,"\nWRITE CODE:\n"); + PrintStatusSetup(); +// instruction words are stored in code memory array as follows: +// L0 M0 H0 FF L1 M1 H1 FF + int valid,High=0; + for(i=0,k=0;i<dim;i+=4*4){ //write 4 instruction words + if(k==0){ //skip row if empty + for(valid=0;!valid&&i<dim;i+=valid?0:rowSize*4){ + for(k2=0;k2<rowSize*4&&!valid;k2++) if(memCODE[i+k2]<0xFF) valid=1; + } + if(i>=dim) break; + } + if((i>>17)!=High){ //advance page + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(i>>21)&0xFF; + bufferU[j++]=(i>>13)&0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + j=1; + if(saveLog)WriteLogIO(); + High=i>>17; + } + bufferU[j++]=SIX_N; + bufferU[j++]=8; + bufferU[j++]=0x20+((i>>13)&0xF); //MOV i/2,W7 + bufferU[j++]=(i>>5)&0xFF; + bufferU[j++]=((i<<3)&0xF0)+7; + bufferU[j++]=0x20+((memCODE[i+1]>>4)&0xF); //MOV LSW0,W0 + bufferU[j++]=((memCODE[i+1]<<4)&0xF0)+((memCODE[i]>>4)&0xF); + bufferU[j++]=(memCODE[i]<<4)&0xF0; + bufferU[j++]=0x20+((memCODE[i+6]>>4)&0xF); //MOV MSB1:MSB0,W1 + bufferU[j++]=((memCODE[i+6]<<4)&0xF0)+((memCODE[i+2]>>4)&0xF); + bufferU[j++]=((memCODE[i+2]<<4)&0xF0)+1; + bufferU[j++]=0x20+((memCODE[i+5]>>4)&0xF); //MOV LSW1,W2 + bufferU[j++]=((memCODE[i+5]<<4)&0xF0)+((memCODE[i+4]>>4)&0xF); + bufferU[j++]=((memCODE[i+4]<<4)&0xF0)+2; + bufferU[j++]=0x20+((memCODE[i+9]>>4)&0xF); //MOV LSW2,W3 + bufferU[j++]=((memCODE[i+9]<<4)&0xF0)+((memCODE[i+8]>>4)&0xF); + bufferU[j++]=((memCODE[i+8]<<4)&0xF0)+3; + bufferU[j++]=0x20+((memCODE[i+14]>>4)&0xF); //MOV MSB3:MSB2,W4 + bufferU[j++]=((memCODE[i+14]<<4)&0xF0)+((memCODE[i+10]>>4)&0xF); + bufferU[j++]=((memCODE[i+10]<<4)&0xF0)+4; + bufferU[j++]=0x20+((memCODE[i+13]>>4)&0xF); //MOV LSW3,W5 + bufferU[j++]=((memCODE[i+13]<<4)&0xF0)+((memCODE[i+12]>>4)&0xF); + bufferU[j++]=((memCODE[i+12]<<4)&0xF0)+5; + bufferU[j++]=0xEB; //CLR W6 + bufferU[j++]=0x03; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_N; + bufferU[j++]=0x88; //Append 2 NOP + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] + bufferU[j++]=0xEB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] + bufferU[j++]=0x1B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7] + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[W7++] + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTH.B [W6++],[++W7] + bufferU[j++]=0xEB; + bufferU[j++]=0xB6; + bufferU[j++]=0xBB; //TBLWTL [W6++],[W7++] + bufferU[j++]=0x1B; + bufferU[j++]=0xB6; + k++; + if(k==rowSize/4){ //Write row + if(erase>1){ //30Fx, unlock and external timing + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d, k=%d 0=%d\n" + WriteLogIO(); + } + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV XXXX,W10 + bufferU[j++]=0x00; + bufferU[j++]=erase>0?0x1A:0x4A; //0x4001/0x4004 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + } + else{ //internal timing + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + k=0; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + PrintStatus(strings[S_CodeWriting2],i*100/(dim+dim2),i/2); //"Write: %d%%,addr. %04X" + if(RWstop) i=dim; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i/2,i/2,k,k); //"i=%d, k=%d 0=%d\n" + WriteLogIO(); + } + } + PrintStatusEnd(); + PrintMessage(strings[S_Compl]); //"completed\r\n" +//****************** verify code ******************** + PrintMessage(strings[S_CodeV]); //"Verify code ... " + if(saveLog) fprintf(logfile,"\nVERIFY CODE:\n"); + PrintStatusSetup(); +//Read 4 24 bit words packed in 6 16 bit words +//memory address advances by 16 bytes because of alignment + High=0xE0000000; + int r0=0,r1=0,r2=0,r3=0,w3,w2; + for(i=0;i<dim;i+=16){ + //skip row if empty + for(valid=0;!valid&&i<dim;i+=valid?0:16){ + for(k2=0;k2<16&&!valid;k2++) if(memCODE[i+k2]<0xFF) valid=1; + } + if(i>=dim) break; + if((i>>17)!=High){ //advance page + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(i>>21)&0xFF; + bufferU[j++]=(i>>13)&0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + j=1; + if(saveLog)WriteLogIO(); + High=i>>17; + } + bufferU[j++]=SIX; //MOV i/2,W6 + bufferU[j++]=0x20+((i>>13)&0xF); + bufferU[j++]=(i>>5)&0xFF; + bufferU[j++]=((i<<3)&0xF0)+6; + bufferU[j++]=SIX; //MOV #VISI,W7 + bufferU[j++]=0x20; + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] + bufferU[j++]=0xBA; + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] + bufferU[j++]=0xBA; + bufferU[j++]=0xD3; + bufferU[j++]=0xD6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0x96; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDH.B [W6++],[W7++] + bufferU[j++]=0xBA; + bufferU[j++]=0xDB; + bufferU[j++]=0xB6; + bufferU[j++]=SIX_LONG; //TBLRDH.B [++W6],[W7--] + bufferU[j++]=0xBA; + bufferU[j++]=0xD3; + bufferU[j++]=0xD6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + PrintStatus(strings[S_CodeV2],i*100/(dim+dim2),i/2); //"Verify: %d%%, addr. %04X" + if(RWstop) i=dim; + for(z=1;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r0=(bufferI[z+1]<<8)+bufferI[z+2]; + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r0+=bufferI[z+2]<<16; + r1=bufferI[z+1]<<16; + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r1+=(bufferI[z+1]<<8)+bufferI[z+2]; + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r2=(bufferI[z+1]<<8)+bufferI[z+2]; + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r2+=bufferI[z+2]<<16; + r3=bufferI[z+1]<<16; + } + for(z+=3;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + if(z<DIMBUF-2){ + r3+=(bufferI[z+1]<<8)+bufferI[z+2]; + } + w0=(memCODE[i+2]<<16)+(memCODE[i+1]<<8)+memCODE[i]; + w1=(memCODE[i+6]<<16)+(memCODE[i+5]<<8)+memCODE[i+4]; + w2=(memCODE[i+10]<<16)+(memCODE[i+9]<<8)+memCODE[i+8]; + w3=(memCODE[i+14]<<16)+(memCODE[i+13]<<8)+memCODE[i+12]; + CheckData(w0,r0,i/2,&err); + CheckData(w1,r1,i/2+2,&err); + CheckData(w2,r2,i/2+4,&err); + CheckData(w3,r3,i/2+6,&err); + PrintStatus(strings[S_CodeV2],i*100/dim,i/2); //"Verify: %d%%, addr. %05X" + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log8],i/2,i/2,k,k,err); //"i=%d, k=%d, errori=%d\n" + WriteLogIO(); + } + if(err>=max_err) break; + } + PrintStatusEnd(); + PrintMessage1(strings[S_ComplErr],err); //"completed: %d errors\r\n" + if(err>=max_err){ + PrintMessage1(strings[S_MaxErr],err); //"Exceeded maximum number of errors (%d), write interrupted\r\n" + } +//****************** erase, write and verify EEPROM ******************** + if(dim2&&err<max_err){ + //EEPROM @ 0x7F(EEbaseAddr) + PrintMessage(strings[S_EEAreaW]); //"Write EEPROM ... " + PrintStatusSetup(); + if(saveLog) fprintf(logfile,"\nWRITE EEPROM:\n"); + int eewrite=(options&0xf000)>>12; + if(eewrite==0){ //24FxxKAxx + bufferU[j++]=SIX; //MOV 0x4050,W10 + bufferU[j++]=0x24; + bufferU[j++]=0x05; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //MOV W10,NVMCON + bufferU[j++]=0x88; + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //MOV 0x7F,W0 + bufferU[j++]=0x20; + bufferU[j++]=0x07; + bufferU[j++]=0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=SIX; //MOV EEbaseAddr,W0 + bufferU[j++]=0x2F; + bufferU[j++]=EEbaseAddr>>4; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX; //TBLWTL W0,[W0] + bufferU[j++]=0xBB; + bufferU[j++]=0x08; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP;/**/ + /* //Erase EEPROM + bufferU[j++]=SIX; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=WAIT_T3; + bufferU[j++]=SIX; //MOV 0x4004,W10 + bufferU[j++]=0x24; + bufferU[j++]=0x00; + bufferU[j++]=0x4A; + bufferU[j++]=SIX; //MOV W10,NVMCON + bufferU[j++]=0x88; + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(9); + readP(); + j=1; + if(saveLog)WriteLogIO(); + } + else if(eewrite==2){ //separate erase + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 4046,W10 + bufferU[j++]=0x04; + bufferU[j++]=0x6A; + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 4056,W10 + bufferU[j++]=0x05; + bufferU[j++]=0x6A; + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(6); + readP(); + j=1; + if(saveLog)WriteLogIO(); + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 4066,W10 + bufferU[j++]=0x06; + bufferU[j++]=0x6A; + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(4); + readP(); + j=1; + if(saveLog)WriteLogIO(); + } + else if(eewrite==1){ //30Fxx + bufferU[j++]=SIX; //MOV 0x7F,W0 + bufferU[j++]=0x20; + bufferU[j++]=0x07; + bufferU[j++]=0xF0; + bufferU[j++]=SIX; //MOV W0,TABLPAG + bufferU[j++]=0x88; + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(1); + readP(); + j=1; + if(saveLog)WriteLogIO(); + } + //Write EEPROM + for(k2=0,i=0x1000-dim2;i<0x1000;i+=2){ //write 1 word (2 bytes) + if(memEE[i]<0xFF||memEE[i+1]<0xFF){ + bufferU[j++]=SIX; //MOV i,W7 + bufferU[j++]=0x2F; + bufferU[j++]=i>>4; + bufferU[j++]=((i<<4)&0xF0)+7; + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20+((memEE[i+1]>>4)&0xF); + bufferU[j++]=((memEE[i+1]<<4)&0xF0)+((memEE[i]>>4)&0xF); + bufferU[j++]=(memEE[i]<<4)&0xF0; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + if(eewrite==0){ //24FxxKAxx + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + else if(eewrite==1){ //30Fxxxx + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 0x4004,W10 + bufferU[j++]=0x00; + bufferU[j++]=0x4A; + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(wait+2); //write delay + readP(); + j=1; + PrintStatus(strings[S_CodeWriting],(i-0x1000+dim2)*100/(dim2),i); //"Scrittura: %d%%, ind. %03X" + if(RWstop) i=dim; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d, k=%d 0=%d\n" + WriteLogIO(); + } + } + } + //Verify EEPROM + if(saveLog) fprintf(logfile,"\nVERIFY EEPROM:\n"); + bufferU[j++]=SIX; //MOV 0xFE00,W6 + bufferU[j++]=0x2F; + bufferU[j++]=EEbaseAddr>>4; + bufferU[j++]=0x06; + bufferU[j++]=SIX; //MOV #VISI,W7 + bufferU[j++]=0x20; + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=SIX; //GOTO 0x200 + bufferU[j++]=0x04; + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + int errE=0; + for(i=k2=EEbaseAddr;i<EEbaseAddr+dim2;i+=2){ + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + if(j>DIMBUF-7||i==dim2-4){ + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + for(z=1;z<DIMBUF-2;z++){ + if(bufferI[z]==REGOUT){ + CheckData(memEE[k2],bufferI[z+2],i,&errE); + CheckData(memEE[k2+1],bufferI[z+1],i+1,&errE); + z+=3; + k2+=2; + } + } + PrintStatus(strings[S_CodeReading],(i-EEbaseAddr)*100/(dim2),i); //"Read: %d%%, addr. %03X" + if(RWstop) i=EEbaseAddr+dim2; + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,k2,k2); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + } + } + PrintStatusEnd(); + PrintMessage1(strings[S_ComplErr],errE); //"completed: %d errors \r\n" + err+=errE; + PrintStatusClear(); + } +//****************** write CONFIG ******************** + int written, read; + j=1; + if(config>2&&config<5&&err<max_err){ //config area @ 0xF80000 + PrintMessage(strings[S_ConfigW]); //"Write CONFIG ..." + if(saveLog) fprintf(logfile,"\nWRITE CONFIG:\n"); + int confword=(options&0xF0000)>>16; + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x20; //MOV 0xF8,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0x80; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x24; //MOV 0x400x,W10 + bufferU[j++]=0x00; + if(confword==0)bufferU[j++]=0x0A; //0x4000 + else if(confword==1)bufferU[j++]=0x3A; //0x4003 + else if(confword==2)bufferU[j++]=0x4A; //0x4004 + else if(confword==3)bufferU[j++]=0x8A; //0x4008 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0,W7 + bufferU[j++]=0x00; + bufferU[j++]=0x07; + bufferU[j++]=0x04; //GOTO 0x200 + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + for(i=0;i<12;i++){ + //Write CONFIG + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20; + bufferU[j++]=(memCONFIG[i*4]>>4)&0xF; + bufferU[j++]=(memCONFIG[i*4]<<4)&0xF0; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + //if(memCONFIG[i*4]<0xFF){ //write if not empty + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + //} + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(27); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + } + //Verify write + int errC=0; + bufferU[j++]=SIX; + bufferU[j++]=0x20; //MOV XXXX,W6 + bufferU[j++]=0x00; + bufferU[j++]=0x06; + bufferU[j++]=SIX; + bufferU[j++]=0x20; //MOV #VISI,W7 + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],0xF80000,0xF80000,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + for(i=0,z=1;i<9;i++){ + for(;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + written=memCONFIG[i*4]; + read=bufferI[z+2]; //Low byte + if(~written&read)CheckData(written,read,0xF80000+i*2,&errC); + z+=3; + } + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],0xF80000,0xF80000,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + for(z=1;i<12;i++){ + for(;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + written=memCONFIG[i*4]; + read=bufferI[z+2]; //Low byte + if(~written&read)CheckData(written,read,0xF80000+i*2,&errC); + z+=3; + } + PrintMessage1(strings[S_ComplErr],errC); //"completed: %d errors \r\n" + PrintStatusClear(); + err+=errC; + } + else if(config>=5&&err<max_err){ //16 bit config area (30Fxxxx) + PrintMessage(strings[S_ConfigW]); //"Write CONFIG ..." + if(saveLog) fprintf(logfile,"\nWRITE CONFIG:\n"); + int Nconf=config==5?7:8; + bufferU[j++]=SIX_N; + bufferU[j++]=4; + bufferU[j++]=0x20; //MOV 0xF8,W0 + bufferU[j++]=0x0F; + bufferU[j++]=0x80; + bufferU[j++]=0x88; //MOV W0,TABLPAG + if(newTABLPAG){ + bufferU[j++]=0x02; + bufferU[j++]=0xA0; + } + else{ + bufferU[j++]=0x01; + bufferU[j++]=0x90; + } + bufferU[j++]=0x20; //MOV 0,W7 + bufferU[j++]=0x00; + bufferU[j++]=0x07; + bufferU[j++]=0x04; //GOTO 0x200 + bufferU[j++]=0x02; + bufferU[j++]=0x00; + bufferU[j++]=ICSP_NOP; + for(i=0;i<Nconf;i++){ + //Erase CONFIG + bufferU[j++]=SIX; //MOV 0xFFFF,W0 + bufferU[j++]=0x2F; + bufferU[j++]=0xFF; + bufferU[j++]=0xF0; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 0x400x,W10 + bufferU[j++]=0x00; + bufferU[j++]=0x8A; //0x4008 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + } + bufferU[j++]=SIX; + bufferU[j++]=0x20; //MOV 0,W7 + bufferU[j++]=0x00; + bufferU[j++]=0x07; + for(i=0;i<Nconf;i++){ + int value=memCONFIG[i*4]+(memCONFIG[i*4+1]<<8); + //Write CONFIG + bufferU[j++]=SIX; //MOV XXXX,W0 + bufferU[j++]=0x20+(value>>12); + bufferU[j++]=(value>>4); + bufferU[j++]=(value<<4); + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLWTL W0,[W7++] + bufferU[j++]=0xBB; + bufferU[j++]=0x1B; + bufferU[j++]=0x80; + if(value<0xFFFF){ //write if not empty + bufferU[j++]=SIX_N; + bufferU[j++]=6; + bufferU[j++]=0x24; //MOV 0x400x,W10 + bufferU[j++]=0x00; + bufferU[j++]=0x8A; //0x4008 + bufferU[j++]=0x88; //MOV W10,NVMCON + bufferU[j++]=0x3B; + bufferU[j++]=0x0A; + bufferU[j++]=0x20; //MOV 0x55,W8 + bufferU[j++]=0x05; + bufferU[j++]=0x58; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=0x20; //MOV 0xAA,W8 + bufferU[j++]=0x0A; + bufferU[j++]=0xA8; + bufferU[j++]=0x88; //MOV W8,NVMKEY + bufferU[j++]=0x3B; + bufferU[j++]=0x38; + bufferU[j++]=SIX_LONG; //BSET NVMCON,#WR + bufferU[j++]=0xA8; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + bufferU[j++]=WAIT_T3; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //BCLR NVMCON,#WR + bufferU[j++]=0xA9; + bufferU[j++]=0xE7; + bufferU[j++]=0x61; + } + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],i,i,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + } + //Verify write + int errC=0; + bufferU[j++]=SIX; + bufferU[j++]=0x20; //MOV XXXX,W6 + bufferU[j++]=0x00; + bufferU[j++]=0x06; + bufferU[j++]=SIX; + bufferU[j++]=0x20; //MOV #VISI,W7 + bufferU[j++]=0x78; + bufferU[j++]=0x47; + bufferU[j++]=ICSP_NOP; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=SIX_LONG; //TBLRDL [W6++],[W7] + bufferU[j++]=0xBA; + bufferU[j++]=0x0B; + bufferU[j++]=0xB6; + bufferU[j++]=REGOUT; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(3); + readP(); + j=1; + if(saveLog){ + fprintf(logfile,strings[S_Log7],0xF80000,0xF80000,0,0); //"i=%d(0x%X), k=%d(0x%X)\n" + WriteLogIO(); + } + for(i=0,z=1;i<7;i++){ + for(;bufferI[z]!=REGOUT&&z<DIMBUF;z++); + written=memCONFIG[i*4+1]+(memCONFIG[i*4]<<8); + read=bufferI[z+1]+(bufferI[z+2]<<8); + if(~written&read)CheckData(written,read,0xF80000+i*2,&errC); //16 bit + z+=3; + } + PrintMessage1(strings[S_ComplErr],errC); //"completed: %d errors \r\n" + PrintStatusClear(); + err+=errC; + } +//****************** exit ******************** + bufferU[j++]=SET_CK_D; + bufferU[j++]=0x0; + bufferU[j++]=EN_VPP_VCC; //0 + bufferU[j++]=0x0; + bufferU[j++]=FLUSH; + for(;j<DIMBUF;j++) bufferU[j]=0x0; + writeP(); + msDelay(2); + readP(); + if(saveLog)WriteLogIO(); + j=1; + unsigned int stop=GetTickCount(); + PrintStatusClear(); + PrintMessage3(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" + if(saveLog) CloseLogFile(); +} +*/ |