X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=3a192fcf43d3aea2f8ef41c7c9d389819c54df2c;hp=9c111617cc7463eb96dd34f034212c99e31cd424;hb=c28cce5afcc1e1747f51e5afe15e338dae030376;hpb=9e13b1450d770a5645468221d0eacc1533d654a9 diff --git a/client/GoodFET.py b/client/GoodFET.py index 9c11161..3a192fc 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -6,18 +6,30 @@ # This code is ugly as sin, for bootstrapping the firmware only. # Rewrite cleanly as soon as is convenient. -import sys, time, string, cStringIO, struct -#sys.path.append("/usr/lib/tinyos") -import serial +import sys, time, string, cStringIO, struct, glob, serial, os; class GoodFET: def __init__(self, *args, **kargs): self.data=[0]; def timeout(self): - print "timout\n"; - def serInit(self, port): + print "timeout\n"; + def serInit(self, port=None): """Open the serial port""" + + if port is 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: + port = glob_list[0]; + if port is None: + glob_list = glob.glob("/dev/ttyUSB*"); + if len(glob_list) > 0: + port = glob_list[0]; + self.serialport = serial.Serial( port, #9600, @@ -33,8 +45,8 @@ class GoodFET: #time.sleep(1); self.readcmd(); #Read the first command. if(self.verb!=0x7F): - print "Verb is wrong. Incorrect firmware?"; - + print "Verb %02x is wrong. Incorrect firmware?" % self.verb; + #print "Connected." def writecmd(self, app, verb, count, data): """Write a command and some data to the GoodFET.""" self.serialport.write(chr(app)); @@ -69,8 +81,30 @@ class GoodFET: self.data=[address&0xff,address>>8,value]; self.writecmd(0,0x03,3,self.data); return ord(self.data[0]); + def dumpmem(self,begin,end): + i=begin; + while i>16, + (adr&0xFF00)>>8, + adr&0xFF]; + + self.writecmd(0x01,0x02,3,data); + return self.data; + def SPIpokebyte(self,adr,val): + self.SPIpokebytes(adr,[val]); + def SPIpokebytes(self,adr,data): + #self.SPIwriteenable(); + adranddata=[(adr&0xFF0000)>>16, + (adr&0xFF00)>>8, + adr&0xFF + ]+data; + self.writecmd(0x01,0x03, + len(adranddata),adranddata); + + def SPIchiperase(self): + """Mass erase an SPI Flash ROM.""" + self.writecmd(0x01,0x81,0,[]); + def SPIwriteenable(self): + """SPI Flash Write Enable""" + data=[0x06]; + self.SPItrans(data); + def SPIjedecmanstr(self): """Grab the JEDEC manufacturer string. Call after SPIjedec().""" - man=self.JEDECmanufacturers[self.JEDECmanufacturer]; + man=self.JEDECmanufacturers.get(self.JEDECmanufacturer) if man==0: man="UNKNOWN"; return man; def SPIjedecstr(self): """Grab the JEDEC manufacturer string. Call after SPIjedec().""" - man=self.JEDECmanufacturers[self.JEDECmanufacturer]; + man=self.JEDECmanufacturers.get(self.JEDECmanufacturer); if man==0: man="UNKNOWN"; - device=self.JEDECdevices[self.JEDECdevice]; + device=self.JEDECdevices.get(self.JEDECdevice); if device==0: device="???" return "%s %s" % (man,device); @@ -161,11 +247,26 @@ class GoodFET: 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.""" @@ -183,7 +284,7 @@ class GoodFET: 0xFF00:"CCmissing"}; def CCidentstr(self): ident=self.CCident(); - chip=self.CCversions[ident&0xFF00]; + chip=self.CCversions.get(ident&0xFF00); return "%s/r%02x" % (chip, ident&0xFF); def CCident(self): """Get a chipcon's ID.""" @@ -261,10 +362,11 @@ class GoodFET: self.writecmd(0x30,0x20,0,self.data); ident=self.CCidentstr(); print "Target identifies as %s." % ident; - print "Status: %s." % self.CCstatusstr(); + #print "Status: %s." % self.CCstatusstr(); self.CCreleasecpu(); self.CChaltcpu(); - print "Status: %s." % self.CCstatusstr(); + #print "Status: %s." % self.CCstatusstr(); + def CCstop(self): """Stop debugging.""" self.writecmd(0x30,0x21,0,self.data); @@ -348,7 +450,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(); @@ -359,26 +461,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.";