From fa5713a93ff59ebdd126f5b7914a96b5030b32fb Mon Sep 17 00:00:00 2001 From: travisutk Date: Sun, 4 Oct 2009 07:40:00 +0000 Subject: [PATCH] 16-bit MSP430 support working well from 1612. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@167 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFET.py | 17 ++++++++++++----- client/GoodFETMSP430.py | 15 +++------------ client/goodfet.msp430 | 3 ++- firmware/apps/jtag/jtag430.c | 27 ++++++++++++++++++--------- firmware/goodfet.c | 1 + 5 files changed, 36 insertions(+), 27 deletions(-) diff --git a/client/GoodFET.py b/client/GoodFET.py index af24201..a31676c 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -60,11 +60,13 @@ class GoodFET: for d in data: self.serialport.write(chr(d)); + #self.serialport.flushOutput(); + #self.serialport.flushInput(); + + if not self.besilent: - #print "Reading reply to %02x/%02x." % (app,verb); self.readcmd(blocks); - #print "Read reply." - + besilent=0; app=0; verb=0; @@ -74,16 +76,21 @@ class GoodFET: def readcmd(self,blocks=1): """Read a reply from the GoodFET.""" while 1: + #print "Reading..."; self.app=ord(self.serialport.read(1)); + #print "APP=%2x" % self.app; self.verb=ord(self.serialport.read(1)); + #print "VERB=%02x" % self.verb; self.count=ord(self.serialport.read(1)); - self.data=self.serialport.read(self.count*blocks); + #print "Waiting for %i bytes." % self.count; + #print "READ %02x %02x %02x " % (self.app, self.verb, self.count); #Debugging string; print, but wait. if self.app==0xFF and self.verb==0xFF: - print "DEBUG %s" % self.data; + print "DEBUG %s" % self.serialport.read(self.count); else: + self.data=self.serialport.read(self.count*blocks); return self.data; #Monitor stuff diff --git a/client/GoodFETMSP430.py b/client/GoodFETMSP430.py index 884a47a..7ad26d2 100644 --- a/client/GoodFETMSP430.py +++ b/client/GoodFETMSP430.py @@ -45,8 +45,8 @@ class GoodFETMSP430(GoodFET): def MSP430peekblock(self,adr,blocks=1): """Grab a few block from an SPI Flash ROM. Block size is unknown""" data=[adr&0xff, (adr&0xff00)>>8, - (adr&0xff0000)>>16,(adr&0xff000000)>>24, - blocks]; + (adr&0xff0000)>>16,(adr&0xff000000)>>24, + blocks]; self.writecmd(self.MSP430APP,0x02,5,data,blocks); return self.data; @@ -162,16 +162,7 @@ class GoodFETMSP430(GoodFET): def MSP430masserase(self): """Erase MSP430 flash memory.""" self.writecmd(self.MSP430APP,0xE3,0,None); - def MSP430writeflash(self,adr,val): - """Write a word of flash memory.""" - if(self.MSP430peek(adr)!=0xFFFF): - print "FLASH ERROR: %04x not clear." % adr; - data=[adr&0xFF,(adr&0xFF00)>>8,val&0xFF,(val&0xFF00)>>8]; - self.writecmd(self.MSP430APP,0xE1,4,data); - rval=ord(self.data[0])+(ord(self.data[1])<<8); - if(val!=rval): - print "FLASH WRITE ERROR AT %04x. Found %04x, wrote %04x." % (adr,rval,val); - + def MSP430dumpbsl(self): self.MSP430dumpmem(0xC00,0xfff); def MSP430dumpallmem(self): diff --git a/client/goodfet.msp430 b/client/goodfet.msp430 index 9745a5a..3140e13 100755 --- a/client/goodfet.msp430 +++ b/client/goodfet.msp430 @@ -27,6 +27,7 @@ client.MSP430setup(); #Identify model number. client.MSP430start(); +client.MSP430haltcpu(); #print "started" if(sys.argv[1]=="info"): @@ -77,7 +78,7 @@ if(sys.argv[1]=="flash"): for i in h._buf.keys(): #print "%04x: %04x"%(i,h[i>>1]); if(i>=start and i>1]); + client.MSP430pokeflash(i,h[i>>1]); if(i%0x100==0): print "%04x" % i; if(sys.argv[1]=="flashtest"): diff --git a/firmware/apps/jtag/jtag430.c b/firmware/apps/jtag/jtag430.c index 66adb11..ce4e7b6 100644 --- a/firmware/apps/jtag/jtag430.c +++ b/firmware/apps/jtag/jtag430.c @@ -52,6 +52,8 @@ void jtag430_releasecpu(){ //! Read data from address unsigned int jtag430_readmem(unsigned int adr){ unsigned int toret; + jtag430_haltcpu(); + CLRTCLK; jtag_ir_shift8(IR_CNTRL_SIG_16BIT); @@ -132,7 +134,7 @@ void jtag430_writeflash(unsigned int adr, unsigned int data){ //FCTL1=0xA500, disabling flash write jtag430_writemem(0x0128, 0xA500); - jtag430_releasecpu(); + //jtag430_releasecpu(); } @@ -188,7 +190,7 @@ void jtag430_eraseflash(unsigned int mode, unsigned int adr, unsigned int count) //FCTL1=0xA500, disabling flash write jtag430_writemem(0x0128, 0xA500); - jtag430_releasecpu(); + //jtag430_releasecpu(); } @@ -252,10 +254,14 @@ void jtag430_start(){ //Perform a reset and disable watchdog. jtag430_por(); + jtag430_writemem(0x120,0x5a80);//disable watchdog + + jtag430_haltcpu(); } //! Set CPU to Instruction Fetch void jtag430_setinstrfetch(){ + jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); // Wait until instruction fetch state. @@ -276,6 +282,8 @@ void jtag430handle(unsigned char app, unsigned long at; unsigned int i, val; + //debugstr("Classic MSP430 handler."); + switch(verb){ case START: //Enter JTAG mode. @@ -307,7 +315,11 @@ void jtag430handle(unsigned char app, blocks=(len>4?cmddata[4]:1); at=cmddatalong[0]; - len=0x80; + //Fetch large blocks for bulk fetches, + //small blocks for individual peeks. + if(blocks>1) + len=0x80; + serial_tx(app); serial_tx(verb); serial_tx(len); @@ -315,18 +327,15 @@ void jtag430handle(unsigned char app, while(blocks--){ for(i=0;i>8); } } - - - break; case JTAG430_WRITEMEM: case POKE: @@ -335,7 +344,7 @@ void jtag430handle(unsigned char app, txdata(app,verb,2); break; case JTAG430_WRITEFLASH: - debugstr("Poking flash memory."); + //debugstr("Poking flash memory."); jtag430_writeflash(cmddataword[0],cmddataword[2]); cmddataword[0]=jtag430_readmem(cmddataword[0]); txdata(app,verb,2); diff --git a/firmware/goodfet.c b/firmware/goodfet.c index d09683c..c310c0c 100644 --- a/firmware/goodfet.c +++ b/firmware/goodfet.c @@ -36,6 +36,7 @@ void init(){ void handle(unsigned char app, unsigned char verb, unsigned char len){ + //debugstr("GoodFET"); switch(app){ case MONITOR: monitorhandle(app,verb,len); -- 2.20.1