X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=263e368aa75ebd44cbdab70bf6c4d0ad05e11fbe;hp=387eeab5f74b3148fda75da2b45603f2d07ab257;hb=2578d3d26d4b79f281f46ca36faf6d0c67edbace;hpb=a653ba1562dc444e4be791e22264a89a3c6b4a19 diff --git a/client/GoodFET.py b/client/GoodFET.py index 387eeab..263e368 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -13,7 +13,6 @@ import serial class GoodFET: def __init__(self, *args, **kargs): - print "inited\n"; self.data=[0]; def timeout(self): print "timout\n"; @@ -21,7 +20,8 @@ class GoodFET: """Open the serial port""" self.serialport = serial.Serial( port, - 9600, + #9600, + 115200, parity = serial.PARITY_NONE ) #Drop DTR, which is !RST, low to begin the app. @@ -30,12 +30,11 @@ class GoodFET: self.serialport.flushOutput() #Read and handle the initial command. - time.sleep(1); + #time.sleep(1); self.readcmd(); #Read the first command. if(self.verb!=0x7F): print "Verb is wrong. Incorrect firmware?"; - def writecmd(self, app, verb, count, data): """Write a command and some data to the GoodFET.""" self.serialport.write(chr(app)); @@ -70,7 +69,23 @@ class GoodFET: self.data=[address&0xff,address>>8,value]; self.writecmd(0,0x03,3,self.data); return ord(self.data[0]); - + def setBaud(self,baud): + rates=[9600, 9600, 19200, 38400]; + self.data=[baud]; + print "Changing FET baud." + self.serialport.write(chr(0x00)); + self.serialport.write(chr(0x80)); + self.serialport.write(chr(1)); + self.serialport.write(chr(baud)); + + print "Changed host baud." + self.serialport.setBaudrate(rates[baud]); + time.sleep(1); + self.serialport.flushInput() + self.serialport.flushOutput() + + print "Baud is now %i." % rates[baud]; + return; def monitortest(self): """Self-test several functions through the monitor.""" print "Performing monitor self-test."; @@ -86,7 +101,6 @@ class GoodFET: def spisetup(self): """Moved the FET into the SPI application.""" - print "Initializing SPI."; self.writecmd(1,0x10,0,self.data); #SPI/SETUP #self.readcmd(); def spitrans8(self,byte): @@ -102,6 +116,23 @@ class GoodFET: """Move the FET into the MSP430 JTAG application.""" print "Initializing MSP430."; self.writecmd(0x11,0x10,0,self.data); + def CCsetup(self): + """Move the FET into the CC2430/CC2530 application.""" + print "Initializing Chipcon."; + self.writecmd(0x30,0x10,0,self.data); + def CCrd_config(self): + """Read the config register of a Chipcon.""" + self.writecmd(0x30,0x82,0,self.data); + return ord(self.data[0]); + def CCwr_config(self,config): + """Write the config register of a Chipcon.""" + self.writecmd(0x30,0x81,1,[config&0xFF]); + def CCident(self): + """Get a chipcon's ID.""" + self.writecmd(0x30,0x8B,0,None); + chip=ord(self.data[0]); + rev=ord(self.data[1]); + return (chip<<8)+rev; def MSP430peek(self,adr): """Read the contents of memory at an address.""" self.data=[adr&0xff, (adr&0xff00)>>8]; @@ -116,6 +147,21 @@ class GoodFET: def MSP430start(self): """Start debugging.""" self.writecmd(0x11,0x20,0,self.data); + ident=self.MSP430ident(); + print "Target identifies as %04x." % ident; + + def CCstart(self): + """Start debugging.""" + self.writecmd(0x30,0x20,0,self.data); + ident=self.CCident(); + print "Target identifies as %04x." % ident; + def CCstop(self): + """Stop debugging.""" + self.writecmd(0x30,0x21,0,self.data); + + def MSP430stop(self): + """Stop debugging.""" + self.writecmd(0x11,0x21,0,self.data); def MSP430haltcpu(self): """Halt the CPU.""" self.writecmd(0x11,0xA0,0,self.data); @@ -137,28 +183,52 @@ class GoodFET: """Set the instruction fetch mode.""" self.writecmd(0x11,0xC1,0,self.data); 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) def MSP430test(self): """Test MSP430 JTAG. Requires that a chip be attached.""" - self.MSP430setup(); - self.MSP430start(); - self.MSP430haltcpu(); - - ident=self.MSP430peek(0x0ff0); - print "Target identifies as %04x." % ident; - if ident==0xffff: + if self.MSP430ident()==0xffff: print "Is anything connected?"; print "Testing RAM."; temp=self.MSP430peek(0x0200); self.MSP430poke(0x0200,0xdead); if(self.MSP430peek(0x0200)!=0xdead): print "Poke of 0x0200 did not set to 0xDEAD properly."; - exit; + return; self.MSP430poke(0x0200,temp); #restore old value. - self.MSP430releasecpu(); - + def MSP430flashtest(self): + self.MSP430masserase(); + i=0x2500; + while(i<0xFFFF): + if(self.MSP430peek(i)!=0xFFFF): + print "ERROR: Unerased flash at %04x."%i; + self.MSP430writeflash(i,0xDEAD); + i+=2; + def MSP430masserase(self): + """Erase MSP430 flash memory.""" + self.writecmd(0x11,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(0x11,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): - i=0xC00; - while i<0x1000: + self.MSP430dumpmem(0xC00,0xfff); + def MSP430dumpallmem(self): + self.MSP430dumpmem(0x200,0xffff); + def MSP430dumpmem(self,begin,end): + i=begin; + while i