#
# This code is being rewritten and refactored. You've been warned!
-import sys, time, string, cStringIO, struct, glob, serial, os;
+import sys, time, string, cStringIO, struct, glob, os;
from GoodFET import GoodFET;
class GoodFETSPI(GoodFET):
+ APP=0x01;
def SPIsetup(self):
"""Move the FET into the SPI application."""
self.writecmd(0x01,0x10,0,self.data); #SPI/SETUP
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",
0xC22015: "MX25L1605D",
0xC22014: "MX25L8005",
0xC22013: "MX25L4005",
- 0x204011: "M45PE10"
+ 0x204011: "M45PE10",
+ 0x202014: "M25P80",
+ 0x1f4501: "AT24DF081",
};
JEDECsizes={0x17: 0x800000,
JEDECsize=0;
def SPIjedec(self):
- """Grab an SPI Flash ROM's JEDEC bytes."""
+ """Grab an SPI Flash ROM's JEDEC bytes. Some chips don't implement
+ this, such as Numonyx M25P* except in the 110nm processed."""
data=[0x9f, 0, 0, 0];
data=self.SPItrans(data);
+ jedec=0;
self.JEDECmanufacturer=ord(data[1]);
- self.JEDECtype=ord(data[2]);
- self.JEDECcapacity=ord(data[3]);
+ if self.JEDECmanufacturer==0xFF:
+ self.JEDECtype=0x20;
+ self.JEDECcapacity=0x14;
+ jedec=0x202014;
+ else:
+ self.JEDECtype=ord(data[2]);
+ self.JEDECcapacity=ord(data[3]);
+ jedec=(ord(data[1])<<16)+(ord(data[2])<<8)+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]);
+
+ if jedec==0x1F4501:
+ self.JEDECsize=1024**2;
+ self.JEDECdevice=jedec;
return data;
def SPIpeek(self,adr):
"""Grab a byte from an SPI Flash ROM."""
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];