X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=f80a46ded7691923542e5ec8be4a6ae67788d253;hp=8d588ed29d5915bae857275ee7f522cbc352e2d7;hb=da2dad53f6596dbb3049ad14044b9b754dbf4245;hpb=8f05454eedc506a9b46c2b8bce9af2480089827f diff --git a/client/GoodFET.py b/client/GoodFET.py index 8d588ed..f80a46d 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -6,17 +6,22 @@ # This code is ugly as sin, for bootstrapping the firmware only. # Rewrite cleanly as soon as is convenient. -import sys, time, string, cStringIO, struct, glob, serial +import sys, time, string, cStringIO, struct, glob, serial, os; class GoodFET: + """GoodFET Client Library""" def __init__(self, *args, **kargs): self.data=[0]; def timeout(self): - print "timout\n"; + print "timeout\n"; def serInit(self, port=None): """Open the serial port""" + if port is None and os.environ.get("GOODFET")!=None: + glob_list = glob.glob(os.environ.get("GOODFET")); + if len(glob_list) > 0: + port = glob_list[0]; if port is None: glob_list = glob.glob("/dev/tty.usbserial*"); if len(glob_list) > 0: @@ -41,9 +46,9 @@ class GoodFET: #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): + print "Verb %02x is wrong. Incorrect firmware?" % self.verb; + #print "Connected." + def writecmd(self, app, verb, count=0, data=[], blocks=1): """Write a command and some data to the GoodFET.""" self.serialport.write(chr(app)); self.serialport.write(chr(verb)); @@ -52,14 +57,15 @@ class GoodFET: if count!=0: for d in data: self.serialport.write(chr(d)); - self.readcmd(); #Uncomment this later, to ensure a response. - def readcmd(self): + + self.readcmd(blocks); #Uncomment this later, to ensure a response. + def readcmd(self,blocks=1): """Read a reply from the GoodFET.""" self.app=ord(self.serialport.read(1)); self.verb=ord(self.serialport.read(1)); self.count=ord(self.serialport.read(1)); - if self.count>0: - self.data=self.serialport.read(self.count); + self.data=self.serialport.read(self.count*blocks); + return self.data; #print "READ %02x %02x %02x " % (self.app, self.verb, self.count); #Monitor stuff @@ -90,8 +96,17 @@ class GoodFET: """Determine how many bytes of RAM are unused by looking for 0xBEEF..""" self.writecmd(0,0x91,0,self.data); return ord(self.data[0])+(ord(self.data[1])<<8); + + #Baud rates. + baudrates=[115200, + 9600, + 19200, + 38400, + 57600, + 115200]; def setBaud(self,baud): - rates=[9600, 9600, 19200, 38400]; + """Change the baud rate. TODO fix this.""" + rates=self.baudrates; self.data=[baud]; print "Changing FET baud." self.serialport.write(chr(0x00)); @@ -107,11 +122,26 @@ class GoodFET: print "Baud is now %i." % rates[baud]; return; + def readbyte(self): + return ord(self.serialport.read(1)); + def findbaud(self): + for r in self.baudrates: + print "\nTrying %i" % r; + self.serialport.setBaudrate(r); + #time.sleep(1); + self.serialport.flushInput() + self.serialport.flushOutput() + + for i in range(1,10): + self.readbyte(); + + print "Read %02x %02x %02x %02x" % ( + self.readbyte(),self.readbyte(),self.readbyte(),self.readbyte()); def monitortest(self): """Self-test several functions through the monitor.""" print "Performing monitor self-test."; - if self.peekword(0x0c00)!=0x0c04: + if self.peekword(0x0c00)!=0x0c04 and self.peekword(0x0c00)!=0x0c06: print "ERROR Fetched wrong value from 0x0c04."; self.pokebyte(0x0021,0); #Drop LED if self.peekbyte(0x0021)!=0: @@ -150,6 +180,11 @@ class GoodFET: 0xC22013: "MX25L4005", 0x204011: "M45PE10" }; + JEDECsizes={0x14: 0x100000, + 0x13: 0x080000, + 0x12: 0x040000, + 0x11: 0x020000} + JEDECsize=0; def SPIjedec(self): """Grab an SPI Flash ROM's JEDEC bytes.""" data=[0x9f, 0, 0, 0]; @@ -158,6 +193,9 @@ class GoodFET: self.JEDECmanufacturer=ord(data[1]); self.JEDECtype=ord(data[2]); self.JEDECcapacity=ord(data[3]); + self.JEDECsize=self.JEDECsizes.get(self.JEDECcapacity); + if self.JEDECsize==None: + self.JEDECsize=0; self.JEDECdevice=(ord(data[1])<<16)+(ord(data[2])<<8)+ord(data[3]); return data; def SPIpeek(self,adr): @@ -169,13 +207,14 @@ class GoodFET: 0]; self.SPItrans(data); return ord(self.data[4]); - def SPIpeekblock(self,adr): - """Grab a byte from an SPI Flash ROM.""" + def SPIpeekblock(self,adr,blocks=1): + """Grab a few block from an SPI Flash ROM. Block size is unknown""" data=[(adr&0xFF0000)>>16, (adr&0xFF00)>>8, - adr&0xFF]; + adr&0xFF, + blocks]; - self.writecmd(0x01,0x02,3,data); + self.writecmd(0x01,0x02,4,data,blocks); return self.data; def SPIpokebyte(self,adr,val): @@ -213,16 +252,32 @@ class GoodFET: if device==0: device="???" return "%s %s" % (man,device); + def MSP430setup(self): """Move the FET into the MSP430 JTAG application.""" print "Initializing MSP430."; self.writecmd(0x11,0x10,0,self.data); - - + def I2Csetup(self): + """Move the FET into the I2C application.""" + self.writecmd(0x02,0x10,0,self.data); #SPI/SETUP + def I2Cstart(self): + """Start an I2C transaction.""" + self.writecmd(0x02,0x20,0,self.data); #SPI/SETUP + def I2Cstop(self): + """Stop an I2C transaction.""" + self.writecmd(0x02,0x21,0,self.data); #SPI/SETUP + def I2Cread(self,len=1): + """Read len bytes by I2C.""" + self.writecmd(0x02,0x00,1,[len]); #SPI/SETUP + return self.data; + def I2Cwrite(self,bytes): + """Write bytes by I2C.""" + self.writecmd(0x02,0x01,len(bytes),bytes); #SPI/SETUP + return ord(self.data[0]); def CCsetup(self): """Move the FET into the CC2430/CC2530 application.""" - print "Initializing Chipcon."; + #print "Initializing Chipcon."; self.writecmd(0x30,0x10,0,self.data); def CCrd_config(self): """Read the config register of a Chipcon.""" @@ -321,7 +376,7 @@ class GoodFET: #print "Status: %s." % self.CCstatusstr(); self.CCreleasecpu(); self.CChaltcpu(); - print "Status: %s." % self.CCstatusstr(); + #print "Status: %s." % self.CCstatusstr(); def CCstop(self): """Stop debugging.""" @@ -406,7 +461,7 @@ class GoodFET: def CCtest(self): self.CCreleasecpu(); self.CChaltcpu(); - print "Status: %s" % self.CCstatusstr(); + #print "Status: %s" % self.CCstatusstr(); #Grab ident three times, should be equal. ident1=self.CCident(); @@ -417,26 +472,22 @@ class GoodFET: print "%04x, %04x, %04x" % (ident1, ident2, ident3); #Single step, printing PC. - #print "Tracing execution at startup." + print "Tracing execution at startup." for i in range(1,15): pc=self.CCgetPC(); byte=self.CCpeekcodebyte(i); - print "PC=%04x, %02x" % (pc, byte); + #print "PC=%04x, %02x" % (pc, byte); self.CCstep_instr(); - #print "Verifying that debugging a NOP doesn't affect the PC." + print "Verifying that debugging a NOP doesn't affect the PC." for i in range(1,15): pc=self.CCgetPC(); self.CCdebuginstr([0x00]); if(pc!=self.CCgetPC()): print "ERROR: PC changed during CCdebuginstr([NOP])!"; - for i in range(0xE500,0xE600): - byte=self.CCpeekdatabyte(i); - print "data %04x: %02x" % (i,byte); - self.CCpokedatabyte(i,i&0xFF); - byte=self.CCpeekdatabyte(i); - print "data %04x: %02x" % (i,byte); - print "Status: %s." % self.CCstatusstr(); + + + #print "Status: %s." % self.CCstatusstr(); #Exit debugger self.CCstop(); print "Done.";