X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETSPI.py;h=9c684b7c7fd14b1af7c96b830a29888385427162;hp=e0a6126d614fc3d92ae70d12b1bc8705954bd309;hb=b606e1a567586b0498a0632142904ad1a79d6e44;hpb=aa39840460c7b1c557beb82f3154cb38978d9607 diff --git a/client/GoodFETSPI.py b/client/GoodFETSPI.py index e0a6126..9c684b7 100644 --- a/client/GoodFETSPI.py +++ b/client/GoodFETSPI.py @@ -25,11 +25,28 @@ class GoodFETSPI(GoodFET): self.writecmd(0x01,0x00,len(data),data); return self.data; +class GoodFETSPI25C(GoodFETSPI): + #opcodes + WREN=0x06; + WRDI=0x04; + RDSR=0x05; + WRSR=0x01; + READ=0x03; + WRITE=0x02; + + def peek8(self,adr,memory="vn"): + """Read a byte from the given address.""" + data=self.SPItrans([self.READ,(adr>>8)&0xFF,adr&0xFF,0x00]); + return ord(data[3]); + + class GoodFETSPIFlash(GoodFETSPI): JEDECmanufacturers={0xFF: "MISSING", 0xEF: "Winbond", 0xC2: "MXIC", - 0x20: "Numonyx/ST" + 0x20: "Numonyx/ST", + 0x1F: "Atmel", + 0x01: "AMD/Spansion" }; JEDECdevices={0xFFFFFF: "MISSING", @@ -43,7 +60,9 @@ class GoodFETSPIFlash(GoodFETSPI): 0xC22015: "MX25L1605D", 0xC22014: "MX25L8005", 0xC22013: "MX25L4005", - 0x204011: "M45PE10" + 0x204011: "M45PE10", + 0x202014: "M25P80", + 0x1f4501: "AT24DF081", }; JEDECsizes={0x17: 0x800000, @@ -61,13 +80,17 @@ class GoodFETSPIFlash(GoodFETSPI): """Grab an SPI Flash ROM's JEDEC bytes.""" data=[0x9f, 0, 0, 0]; data=self.SPItrans(data); + 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]); + jedec=(ord(data[1])<<16)+(ord(data[2])<<8)+ord(data[3]); + if jedec==0x1F4501: + self.JEDECsize=1024**2; + self.JEDECdevice=jedec; return data; def SPIpeek(self,adr): """Grab a byte from an SPI Flash ROM.""" @@ -78,30 +101,31 @@ class GoodFETSPIFlash(GoodFETSPI): 0]; self.SPItrans(data); return ord(self.data[4]); - def SPIpeekblock(self,adr,blocks=1): + def SPIpeekblock(self,adr): """Grab a few block from an SPI Flash ROM. Block size is unknown""" data=[(adr&0xFF0000)>>16, (adr&0xFF00)>>8, - adr&0xFF, - blocks]; + adr&0xFF]; - self.writecmd(0x01,0x02,4,data,blocks); + 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; + #Used to be 24 bits, BE, not 32 bits, LE. + adranddata=[adr&0xFF, + (adr&0xFF00)>>8, + (adr&0xFF0000)>>16, + 0, #MSB + ]+data; + #print "%06x: poking %i bytes" % (adr,len(data)); self.writecmd(0x01,0x03, len(adranddata),adranddata); def SPIchiperase(self): """Mass erase an SPI Flash ROM.""" - self.writecmd(0x01,0x81,0,[]); + self.writecmd(0x01,0x81); def SPIwriteenable(self): """SPI Flash Write Enable""" data=[0x06];