From: travisutk Date: Sun, 4 Oct 2009 03:12:18 +0000 (+0000) Subject: 16-bit MSP430 Flash writing works again on 1612-based GoodFETs. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=27317fc9af778f929496abb25ddb1ac68b1beb4e 16-bit MSP430 Flash writing works again on 1612-based GoodFETs. 2xx-based GoodFETs coming very soon. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@166 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETMSP430.py b/client/GoodFETMSP430.py index 7aff5a5..884a47a 100644 --- a/client/GoodFETMSP430.py +++ b/client/GoodFETMSP430.py @@ -58,6 +58,14 @@ class GoodFETMSP430(GoodFET): val&0xff, (val&0xff00)>>8]; self.writecmd(self.MSP430APP,0x03,6,self.data); return ord(self.data[0])+(ord(self.data[1])<<8); + def MSP430pokeflash(self,adr,val): + """Write the contents of flash memory at an address.""" + self.data=[adr&0xff, (adr&0xff00)>>8, + (adr&0xff0000)>>16,(adr&0xff000000)>>24, + val&0xff, (val&0xff00)>>8]; + self.writecmd(self.MSP430APP,0xE1,6,self.data); + return ord(self.data[0])+(ord(self.data[1])<<8); + def MSP430start(self): """Start debugging.""" self.writecmd(self.MSP430APP,0x20,0,self.data); diff --git a/client/goodfet.msp430 b/client/goodfet.msp430 index f9c744c..9745a5a 100755 --- a/client/goodfet.msp430 +++ b/client/goodfet.msp430 @@ -30,10 +30,12 @@ client.MSP430start(); #print "started" if(sys.argv[1]=="info"): - print "Model %08x " % client.MSP430deviceid(); - print "Core %04x " % client.MSP430coreid(); - print "Identity %04x" % client.MSP430ident(); - print "Identifies as %s" % client.MSP430identstr(); + #print "Model %08x " % client.MSP430deviceid(); + #print "Core %04x " % client.MSP430coreid(); + #print "Identity %04x" % client.MSP430ident(); + print "Identifies as %s (%04x)" % ( + client.MSP430identstr(), + client.MSP430ident()); if(sys.argv[1]=="test"): client.MSP430test(); if(sys.argv[1]=="dump"): @@ -116,10 +118,10 @@ if(sys.argv[1]=="poke"): start=int(sys.argv[2],16); if(len(sys.argv)>3): val=int(sys.argv[3],16); - print "Poking %06x to become %02x." % (start,val); + print "Poking %06x to become %04x." % (start,val); while client.MSP430peek(start)!=val: - client.MSP430poke(start,val); + client.MSP430pokeflash(start,val); print "Poked to %04x" % client.MSP430peek(start); diff --git a/firmware/apps/jtag/jtag430.c b/firmware/apps/jtag/jtag430.c index 9260b0c..66adb11 100644 --- a/firmware/apps/jtag/jtag430.c +++ b/firmware/apps/jtag/jtag430.c @@ -88,7 +88,7 @@ void jtag430_writemem(unsigned int adr, unsigned int data){ //! Write data to flash memory. Must be preconfigured. void jtag430_writeflashword(unsigned int adr, unsigned int data){ - /* + CLRTCLK; jtag_ir_shift8(IR_CNTRL_SIG_16BIT); jtag_dr_shift16(0x2408);//word write @@ -102,12 +102,13 @@ void jtag430_writeflashword(unsigned int adr, unsigned int data){ CLRTCLK; jtag_ir_shift8(IR_CNTRL_SIG_16BIT); jtag_dr_shift16(0x2409); - */ + /* jtag430_writemem(adr,data); CLRTCLK; jtag_ir_shift8(IR_CNTRL_SIG_16BIT); jtag_dr_shift16(0x2409); + */ //Pulse TCLK jtag430_tclk_flashpulses(35); //35 standard @@ -123,7 +124,7 @@ void jtag430_writeflash(unsigned int adr, unsigned int data){ //FCTL2=0xA540, selecting MCLK as source, DIV=1 jtag430_writemem(0x012A, 0xA540); //FCTL3=0xA500, should be 0xA540 for Info Seg A on 2xx chips. - jtag430_writemem(0x012C, 0xA500); + jtag430_writemem(0x012C, 0xA500); //all but info flash. //Write the word itself. jtag430_writeflashword(adr,data); @@ -268,7 +269,7 @@ void jtag430_setinstrfetch(){ //! Handles classic MSP430 JTAG commands. Forwards others to JTAG. -void oldjtag430handle(unsigned char app, +void jtag430handle(unsigned char app, unsigned char verb, unsigned char len){ register char blocks; @@ -329,12 +330,13 @@ void oldjtag430handle(unsigned char app, break; case JTAG430_WRITEMEM: case POKE: - jtag430_writemem(cmddatalong[0],cmddataword[2]); - cmddataword[0]=jtag430_readmem(cmddatalong[0]); + jtag430_writemem(cmddataword[0],cmddataword[2]); + cmddataword[0]=jtag430_readmem(cmddataword[0]); txdata(app,verb,2); break; case JTAG430_WRITEFLASH: - jtag430_writeflash(cmddataword[0],cmddataword[1]); + debugstr("Poking flash memory."); + jtag430_writeflash(cmddataword[0],cmddataword[2]); cmddataword[0]=jtag430_readmem(cmddataword[0]); txdata(app,verb,2); break; @@ -361,17 +363,3 @@ void oldjtag430handle(unsigned char app, } jtag430_resettap(); } - -//! Handles unique MSP430 JTAG commands. Forwards others to JTAG. -void jtag430handle(unsigned char app, - unsigned char verb, - unsigned char len){ - switch(jtag430mode){ - case MSP430MODE: - return oldjtag430handle(app,verb,len); - case MSP430X2MODE: - return jtag430x2handle(app,verb,len); - default: - txdata(app,NOK,0); - } -}