X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=f2a673b124166acc7d74602cc3d1ca5d0cec3a23;hp=14728c73c3c5288bf5fe8f741f76249aa4b8d13c;hb=f13d84c954960084c69440ad035e68b6017572dc;hpb=3f38402660946d2792fd9a9974f3ffa670a123e8 diff --git a/client/GoodFET.py b/client/GoodFET.py index 14728c7..f2a673b 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -7,7 +7,7 @@ # Rewrite cleanly as soon as is convenient. import sys, time, string, cStringIO, struct -sys.path.append("/usr/lib/tinyos") +#sys.path.append("/usr/lib/tinyos") import serial @@ -99,23 +99,102 @@ class GoodFET: print "Self-test complete."; - def spisetup(self): + def SPIsetup(self): """Moved the FET into the SPI application.""" - self.writecmd(1,0x10,0,self.data); #SPI/SETUP + self.writecmd(0x01,0x10,0,self.data); #SPI/SETUP #self.readcmd(); - def spitrans8(self,byte): + def SPItrans8(self,byte): """Read and write 8 bits by SPI.""" - self.data=[byte]; - self.writecmd(1,0,1,self.data); #SPI exchange - #self.readcmd(); + data=self.SPItrans([byte]); + return ord(data[0]); + + def SPItrans(self,data): + """Exchange data by SPI.""" + self.data=data; + self.writecmd(0x01,0x00,len(data),data); + return self.data; + + JEDECmanufacturers={0xFF: "MISSING", + 0xEF: "Winbond", + 0xC2: "MXIC"}; + + JEDECdevices={0xFFFFFF: "MISSING", + 0xEF3014: "W25X80L", + 0xEF3013: "W25X40L", + 0xEF3012: "W25X20L", + 0xEF3011: "W25X10L", + 0xC22014: "MX25L8005", + 0xC22013: "MX25L4005" + }; + def SPIjedec(self): + """Grab an SPI Flash ROM's JEDEC bytes.""" + data=[0x9f, 0, 0, 0]; + data=self.SPItrans(data); + #print "Manufacturer: %02x\nType: %02x\nCapacity: %02x" % (ord(data[1]),ord(data[2]),ord(data[3])); + self.JEDECmanufacturer=ord(data[1]); + self.JEDECtype=ord(data[2]); + self.JEDECcapacity=ord(data[3]); + self.JEDECdevice=(ord(data[1])<<16)+(ord(data[2])<<8)+ord(data[3]); + return data; + def SPIpeek(self,adr): + """Grab a byte from an SPI Flash ROM.""" + data=[0x03, + (adr&0xFF0000)>>16, + (adr&0xFF00)>>8, + adr&0xFF, + 0]; + self.SPItrans(data); + return ord(self.data[4]); + def SPIpeekblock(self,adr): + """Grab a byte from an SPI Flash ROM.""" + data=[(adr&0xFF0000)>>16, + (adr&0xFF00)>>8, + adr&0xFF]; - if self.app!=1 or self.verb!=0: - print "Error in SPI transaction; app=%02x, verb=%02x" % (self.app, self.verb); - return ord(self.data[0]); + self.writecmd(0x01,0x02,3,data); + return self.data; + def SPIpokebyte(self,adr,val): + self.SPIwriteenable(); + data=[0x02, + (adr&0xFF0000)>>16, + (adr&0xFF00)>>8, + adr&0xFF, + val]; + self.SPItrans(data); + def SPIchiperase(self): + """Mass erase an SPI Flash ROM.""" + self.SPIwriteenable(); + #Chip Erase + data=[0xC7]; + self.SPItrans(data); + 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.get(self.JEDECmanufacturer) + if man==0: + man="UNKNOWN"; + return man; + + def SPIjedecstr(self): + """Grab the JEDEC manufacturer string. Call after SPIjedec().""" + man=self.JEDECmanufacturers.get(self.JEDECmanufacturer); + if man==0: + man="UNKNOWN"; + device=self.JEDECdevices.get(self.JEDECdevice); + 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 CCsetup(self): """Move the FET into the CC2430/CC2530 application.""" print "Initializing Chipcon."; @@ -132,7 +211,8 @@ class GoodFET: 0x8500:"CC2430", 0x8900:"CC2431", 0x8100:"CC2510", - 0x9100:"CC2511"}; + 0x9100:"CC2511", + 0xFF00:"CCmissing"}; def CCidentstr(self): ident=self.CCident(); chip=self.CCversions[ident&0xFF00];