From 4b2f28239ea1c0f76117e813fc8838f8a368d2bf Mon Sep 17 00:00:00 2001 From: travisutk Date: Fri, 4 Sep 2009 09:04:55 +0000 Subject: [PATCH 1/1] MSP430X2 support is sufficient to read memory! git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@122 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFET.py | 2 +- client/GoodFETMSP430.py | 41 ++++++++++++++++---- client/goodfet.msp430 | 24 +++++++++--- firmware/apps/jtag/jtag430x2.c | 71 ++++++++++++---------------------- 4 files changed, 77 insertions(+), 61 deletions(-) diff --git a/client/GoodFET.py b/client/GoodFET.py index 3b4d9e7..912c9a6 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -64,8 +64,8 @@ class GoodFET: self.verb=ord(self.serialport.read(1)); self.count=ord(self.serialport.read(1)); self.data=self.serialport.read(self.count*blocks); - return self.data; #print "READ %02x %02x %02x " % (self.app, self.verb, self.count); + return self.data; #Monitor stuff def peekbyte(self,address): diff --git a/client/GoodFETMSP430.py b/client/GoodFETMSP430.py index fc507c5..22b7ee8 100644 --- a/client/GoodFETMSP430.py +++ b/client/GoodFETMSP430.py @@ -11,14 +11,30 @@ from GoodFET import GoodFET; class GoodFETMSP430(GoodFET): MSP430APP=0x11; #Changed by inheritors. + CoreID=0; + DeviceID=0; + JTAGID=0; + MSP430ident=0; def MSP430setup(self): """Move the FET into the MSP430 JTAG application.""" - print "Initializing MSP430."; - self.writecmd(0x11,0x10,0,self.data); + self.writecmd(self.MSP430APP,0x10,0,None); + def MSP430stop(self): """Stop debugging.""" self.writecmd(self.MSP430APP,0x21,0,self.data); - + + def MSP430coreid(self): + """Get the Core ID.""" + self.writecmd(self.MSP430APP,0xF0); + CoreID=ord(self.data[0])+(ord(self.data[1])<<8); + return CoreID; + def MSP430deviceid(self): + """Get the Core ID.""" + self.writecmd(self.MSP430APP,0xF1); + DeviceID=( + ord(self.data[0])+(ord(self.data[1])<<8)+ + (ord(self.data[2])<<16)+(ord(self.data[3])<<24)); + return DeviceID; def MSP430peek(self,adr): """Read the contents of memory at an address.""" self.data=[adr&0xff, (adr&0xff00)>>8]; @@ -32,8 +48,12 @@ class GoodFETMSP430(GoodFET): def MSP430start(self): """Start debugging.""" self.writecmd(self.MSP430APP,0x20,0,self.data); - ident=self.MSP430ident(); - print "Target identifies as %04x." % ident; + self.JTAGID=ord(self.data[0]); + #print "Identified as %02x." % id; + if(self.JTAGID==0x89 or self.JTAGID==0x91): + print "Successfully connected." + else: + print "Error, misidentified as %02x." % id; def MSP430haltcpu(self): """Halt the CPU.""" @@ -57,8 +77,13 @@ class GoodFETMSP430(GoodFET): return self.data[0]; def MSP430ident(self): """Grab self-identification word from 0x0FF0 as big endian.""" - i=self.MSP430peek(0x0ff0); - return ((i&0xFF00)>>8)+((i&0xFF)<<8) + if(self.JTAGID==0x89): + i=self.MSP430peek(0x0ff0); + ident=((i&0xFF00)>>8)+((i&0xFF)<<8) + if(self.JTAGID==0x91): + i=self.MSP430peek(0x1A04); + ident=((i&0xFF00)>>8)+((i&0xFF)<<8) + return ident; def MSP430test(self): """Test MSP430 JTAG. Requires that a chip be attached.""" if self.MSP430ident()==0xffff: @@ -90,7 +115,7 @@ class GoodFETMSP430(GoodFET): 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 d961c77..b1a129c 100755 --- a/client/goodfet.msp430 +++ b/client/goodfet.msp430 @@ -17,18 +17,20 @@ if(len(sys.argv)==1): print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0]; sys.exit(); -#Initailize FET and set baud rate +#Initialize FET and set baud rate client=GoodFETMSP430(); client.serInit() #Connect to target client.MSP430setup(); -client.MSP430start(); -#client.setBaud(2); +#Identify model number. +client.MSP430start(); -if(sys.argv[1]=="monitortest"): - client.monitortest(); +if(sys.argv[1]=="info"): + print "Model %04x " % client.MSP430coreid(); + print "Core %08x " % client.MSP430deviceid(); + print "Identity %04x" % client.MSP430ident(); if(sys.argv[1]=="test"): client.MSP430test(); if(sys.argv[1]=="dump"): @@ -90,6 +92,18 @@ if(sys.argv[1]=="verify"): print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]); if(i%0x100==0): print "%04x" % i; +if(sys.argv[1]=="peek"): + start=0x0000; + if(len(sys.argv)>2): + start=int(sys.argv[2],16); + stop=start; + if(len(sys.argv)>3): + stop=int(sys.argv[3],16); + print "Peeking from %04x to %04x." % (start,stop); + while start<=stop: + print "%04x: %04x" % (start,client.MSP430peek(start)); + start=start+2; + if(sys.argv[1]=="whatever"): for i in [0x24FF, 0x2500, 0x2502, 0x2504]: diff --git a/firmware/apps/jtag/jtag430x2.c b/firmware/apps/jtag/jtag430x2.c index 5cafafe..e496346 100644 --- a/firmware/apps/jtag/jtag430x2.c +++ b/firmware/apps/jtag/jtag430x2.c @@ -56,61 +56,38 @@ unsigned long jtag430_deviceid(){ return jtag_dr_shift20(0); } -//! Set the program counter. -void jtag430x2_setpc(unsigned long pc){ - //From SLAU265. - - unsigned short Mova; - unsigned short Pc_l; - Mova = 0x0080; - Mova += (unsigned short)((pc>>8) & 0x00000F00); - Pc_l = (unsigned short)((pc & 0xFFFF)); +//! Read data from address +unsigned int jtag430x2_readmem(unsigned long adr){ + unsigned int toret=0; - // Check Full-Emulation-State at the beginning jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); if(jtag_dr_shift16(0) & 0x0301){ - // MOVA #imm20, PC - CLRTCLK; - // take over bus control during clock LOW phase - jtag_ir_shift8(IR_DATA_16BIT); - SETTCLK; - jtag_dr_shift16(Mova); - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - jtag_dr_shift16(0x1400); - jtag_ir_shift8(IR_DATA_16BIT); - CLRTCLK; - SETTCLK; - jtag_dr_shift16(Pc_l); - CLRTCLK; - SETTCLK; - jtag_dr_shift16(0x4303); - CLRTCLK; - jtag_ir_shift8(IR_ADDR_CAPTURE); - jtag_dr_shift20(0x00000); - }else{ - while(1) P1OUT^=1; //Lock LED if locked up. - } -} - + // Read Memory + CLRTCLK; + jtag_ir_shift8(IR_CNTRL_SIG_16BIT); + if(adr>=0x100){ + jtag_dr_shift16(0x0501);//word read + }else{ + jtag_dr_shift16(0x0511);//byte read + } + jtag_ir_shift8(IR_ADDR_16BIT); + jtag_dr_shift20(adr); -//! Read data from address -unsigned int jtag430x2_readmem(unsigned int adr){ - unsigned int toret; - - jtag430x2_setpc(adr); - SETTCLK; - jtag_ir_shift8(IR_CNTRL_SIG_16BIT); - jtag_dr_shift16(0x0501); - jtag_ir_shift8(IR_ADDR_CAPTURE); + jtag_ir_shift8(IR_DATA_TO_ADDR); + SETTCLK; + CLRTCLK; + toret = jtag_dr_shift16(0x0000); + + SETTCLK; + // one or more cycle, so CPU is driving correct MAB - jtag_ir_shift8(IR_DATA_QUICK); + CLRTCLK; + SETTCLK; + // Processor is now again in Init State + } - SETTCLK; - CLRTCLK; - toret = jtag_dr_shift16(0);//read - jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE); return toret; } -- 2.20.1