self.verb=ord(self.serialport.read(1));
self.count=ord(self.serialport.read(1));
self.data=self.serialport.read(self.count*blocks);
self.verb=ord(self.serialport.read(1));
self.count=ord(self.serialport.read(1));
self.data=self.serialport.read(self.count*blocks);
#print "READ %02x %02x %02x " % (self.app, self.verb, self.count);
#print "READ %02x %02x %02x " % (self.app, self.verb, self.count);
#Monitor stuff
def peekbyte(self,address):
#Monitor stuff
def peekbyte(self,address):
class GoodFETMSP430(GoodFET):
MSP430APP=0x11; #Changed by inheritors.
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."""
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 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];
def MSP430peek(self,adr):
"""Read the contents of memory at an address."""
self.data=[adr&0xff, (adr&0xff00)>>8];
def MSP430start(self):
"""Start debugging."""
self.writecmd(self.MSP430APP,0x20,0,self.data);
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."""
def MSP430haltcpu(self):
"""Halt the CPU."""
return self.data[0];
def MSP430ident(self):
"""Grab self-identification word from 0x0FF0 as big endian."""
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:
def MSP430test(self):
"""Test MSP430 JTAG. Requires that a chip be attached."""
if self.MSP430ident()==0xffff:
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);
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):
def MSP430dumpbsl(self):
self.MSP430dumpmem(0xC00,0xfff);
def MSP430dumpallmem(self):
print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
sys.exit();
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=GoodFETMSP430();
client.serInit()
#Connect to target
client.MSP430setup();
+#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"):
if(sys.argv[1]=="test"):
client.MSP430test();
if(sys.argv[1]=="dump"):
print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]);
if(i%0x100==0):
print "%04x" % i;
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]:
if(sys.argv[1]=="whatever"):
for i in [0x24FF, 0x2500, 0x2502, 0x2504]:
return jtag_dr_shift20(0);
}
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){
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);