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);
-
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];
//Always init. Might help with buggy lines.
//Might hurt too.
//ccdebuginit();
+ long i;
switch(verb){
//CC_PEEK and CC_POKE will come later.
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:
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
//! 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);
//((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;
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
}
#define CC_READ_FLASH_PAGE 0x96
#define CC_MASS_ERASE_FLASH 0x97
#define CC_PROGRAM_FLASH 0x98
+#define CC_WIPEFLASHBUFFER 0x99
+