From: travisutk Date: Sat, 17 Oct 2009 11:27:38 +0000 (+0000) Subject: 'goodfet.cc flash foo.hex' now works. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=ea4f451d1fbdc93bb175c7b55a43f3e906219a62 'goodfet.cc flash foo.hex' now works. It's slow as dirt for now, will optimize later. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@207 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index 969ba33..f426a5b 100644 --- a/client/GoodFETCC.py +++ b/client/GoodFETCC.py @@ -146,8 +146,14 @@ class GoodFETCC(GoodFET): def CCstep_instr(self): """Step one instruction.""" self.writecmd(0x30,0x89,0,self.data); + def CCeraseflashbuffer(self): + """Erase the 2kB flash buffer""" + self.writecmd(0x30,0x99); def CCflashpage(self,adr): - """Flash a page of flash from 0xF000 in XDATA""" - data=[0x00,0x00,0x00,0x00]; + """Flash 2kB a page of flash from 0xF000 in XDATA""" + data=[adr&0xFF, + (adr>>8)&0xFF, + (adr>>16)&0xFF, + (adr>>24)&0xFF]; + print "Flashing buffer to 0x%06x" % adr; self.writecmd(0x30,0x95,4,data); - diff --git a/client/goodfet.cc b/client/goodfet.cc index 1cea4e0..badbf7a 100755 --- a/client/goodfet.cc +++ b/client/goodfet.cc @@ -82,32 +82,52 @@ if(sys.argv[1]=="erase"): client.CCchiperase(); print "Status: %s" %client.CCstatusstr(); -# if(sys.argv[1]=="flash"): -# f=sys.argv[2]; -# start=0; -# stop=0xFFFF; -# if(len(sys.argv)>3): -# start=int(sys.argv[3],16); -# if(len(sys.argv)>4): -# stop=int(sys.argv[4],16); - -# h = IntelHex(f); - -# client.CCchiperase(); -# for i in h._buf.keys(): -# #print "%04x: %04x"%(i,h[i>>1]); -# if(i>=start and i<=stop and i&1==0): -# client.CCwriteflash(i,h[i>>1]); -# if(i%0x100==0): -# print "%04x" % i; - +if(sys.argv[1]=="flash"): + f=sys.argv[2]; + start=0; + stop=0xFFFF; + if(len(sys.argv)>3): + start=int(sys.argv[3],16); + if(len(sys.argv)>4): + stop=int(sys.argv[4],16); + + h = IntelHex(f); + page = 0x0000; + pagelen = 2048; #2kB pages in 32-bit words + bcount = 0; + + #Wipe all of flash. + client.CCchiperase(); + #Wipe the RAM buffer for the next flash page. + client.CCeraseflashbuffer(); + for i in h._buf.keys(): + while(i>page+pagelen): + if bcount>0: + client.CCflashpage(page); + client.CCeraseflashbuffer(); + bcount=0; + print "Flashed page at %06x" % page + page+=pagelen; + + #Place byte into buffer. + client.CCpokedatabyte(0xF000+i-page, + h[i]); + bcount+=1; + if(i%0x100==0): + print "%04x at %06x" % (i,page); + #last page + client.CCflashpage(page); + print "Flashed final page at %06x" % page; + if(sys.argv[1]=="flashpage"): + target=0; + if(len(sys.argv)>2): + target=int(sys.argv[2],16); print "Writing a page of flash from 0xF000 in XDATA" - print "Status: %s" %client.CCstatusstr(); - client.CCflashpage(0x0000); - while 1: - print "0x%06x: %s" %( - client.CCgetPC(),client.CCstatusstr()); + client.CCflashpage(target); +if(sys.argv[1]=="erasebuffer"): + print "Erasing flash buffer."; + client.CCeraseflashbuffer(); if(sys.argv[1]=="writedata"): f=sys.argv[2]; diff --git a/firmware/apps/chipcon/chipcon.c b/firmware/apps/chipcon/chipcon.c index 418561a..c585594 100644 --- a/firmware/apps/chipcon/chipcon.c +++ b/firmware/apps/chipcon/chipcon.c @@ -128,6 +128,7 @@ void cchandle(unsigned char app, //Always init. Might help with buggy lines. //Might hurt too. //ccdebuginit(); + long i; switch(verb){ //CC_PEEK and CC_POKE will come later. @@ -227,6 +228,11 @@ void cchandle(unsigned char app, cc_write_flash_page(cmddatalong[0]); txdata(app,verb,0); break; + case CC_WIPEFLASHBUFFER: + for(i=0xf000;i<0xf800;i++) + cc_pokedatabyte(i,0xFF); + txdata(app,verb,0); + break; case CC_MASS_ERASE_FLASH: case CC_CLOCK_INIT: case CC_PROGRAM_FLASH: @@ -316,12 +322,12 @@ const u8 flash_routine[] = { 0x00,//#imm=((address >> 8) / FLASH_WORD_SIZE) & 0x7E, 0x75, 0xAC, 0x00, // MOV FADDRL, #00; - /* Erase page. * + /* Erase page. */ 0x75, 0xAE, 0x01, // MOV FLC, #01H; // ERASE // ; Wait for flash erase to complete 0xE5, 0xAE, // eraseWaitLoop: MOV A, FLC; 0x20, 0xE7, 0xFB, // JB ACC_BUSY, eraseWaitLoop; - */ + /* End erase page. */ // ; Initialize the data pointer 0x90, 0xF0, 0x00, // MOV DPTR, #0F000H; // ; Outer loops @@ -346,7 +352,12 @@ const u8 flash_routine[] = { //! Copies flash buffer to flash. void cc_write_flash_page(u32 adr){ //Assumes that page has already been written to XDATA 0xF000 - debugstr("Flashing 2kb at 0xF000 to given adr."); + //debugstr("Flashing 2kb at 0xF000 to given adr."); + + if(adr&(FLASHPAGE_SIZE-1)){ + debugstr("Flash page address is not on a multiple of 2kB. Aborting."); + return; + } //Routine comes next //WRITE_XDATA_MEMORY(IN: 0xF000 + FLASH_PAGE_SIZE, sizeof(routine), routine); @@ -356,7 +367,7 @@ void cc_write_flash_page(u32 adr){ //((address >> 8) / FLASH_WORD_SIZE) & 0x7E cc_pokedatabyte(0xF000+FLASHPAGE_SIZE+2, ((adr>>8)/FLASH_WORD_SIZE)&0x7E); - debugstr("Wrote flash routine."); + //debugstr("Wrote flash routine."); //MOV MEMCTR, (bank * 16) + 1; @@ -364,18 +375,18 @@ void cc_write_flash_page(u32 adr){ cmddata[1]=0xc7; cmddata[2]=0x51; cc_debug_instr(3); - debugstr("Loaded bank info."); + //debugstr("Loaded bank info."); cc_set_pc(0xf000+FLASHPAGE_SIZE);//execute code fragment cc_resume(); - debugstr("Executing."); + //debugstr("Executing."); + - /* while(!(cc_read_status()&CC_STATUS_CPUHALTED)){ - P1OUT^=1;//blink LED - }*/ + P1OUT^=1;//blink LED while flashing + } - debugstr("Done flashing."); + //debugstr("Done flashing."); P1OUT&=~1;//clear LED } diff --git a/firmware/include/chipcon.h b/firmware/include/chipcon.h index 73906ab..524f623 100644 --- a/firmware/include/chipcon.h +++ b/firmware/include/chipcon.h @@ -94,3 +94,5 @@ void cc_step_instr(); #define CC_READ_FLASH_PAGE 0x96 #define CC_MASS_ERASE_FLASH 0x97 #define CC_PROGRAM_FLASH 0x98 +#define CC_WIPEFLASHBUFFER 0x99 +