From: travisutk Date: Sat, 5 Sep 2009 21:55:00 +0000 (+0000) Subject: SPI client refactoring and block read/write functions. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=fbf1dcfd59f6213926c78178115c1b7110afdf8f SPI client refactoring and block read/write functions. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@124 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFET.py b/client/GoodFET.py index 912c9a6..5645f52 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -168,112 +168,6 @@ class GoodFET: """Write bytes by I2C.""" self.writecmd(0x02,0x01,len(bytes),bytes); #SPI/SETUP return ord(self.data[0]); -class GoodFETSPI(GoodFET): - def SPIsetup(self): - """Move the FET into the SPI application.""" - self.writecmd(0x01,0x10,0,self.data); #SPI/SETUP - - def SPItrans8(self,byte): - """Read and write 8 bits by SPI.""" - 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; - -class GoodFETSPIFlash(GoodFETSPI): - JEDECmanufacturers={0xFF: "MISSING", - 0xEF: "Winbond", - 0xC2: "MXIC", - 0x20: "Numonyx/ST" - }; - - JEDECdevices={0xFFFFFF: "MISSING", - 0xEF3014: "W25X80L", - 0xEF3013: "W25X40L", - 0xEF3012: "W25X20L", - 0xEF3011: "W25X10L", - 0xC22014: "MX25L8005", - 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]; - 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.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): - """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,blocks=1): - """Grab a few block from an SPI Flash ROM. Block size is unknown""" - data=[(adr&0xFF0000)>>16, - (adr&0xFF00)>>8, - adr&0xFF, - blocks]; - - self.writecmd(0x01,0x02,4,data,blocks); - 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.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); - class GoodFETCC(GoodFET): """A GoodFET variant for use with Chipcon 8051 Zigbe SoC.""" def CChaltcpu(self): diff --git a/client/GoodFETSPI.py b/client/GoodFETSPI.py new file mode 100644 index 0000000..bee77f5 --- /dev/null +++ b/client/GoodFETSPI.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# GoodFET SPI and SPIFlash Client Library +# +# (C) 2009 Travis Goodspeed +# +# This code is being rewritten and refactored. You've been warned! + +import sys, time, string, cStringIO, struct, glob, serial, os; + +from GoodFET import GoodFET; + +class GoodFETSPI(GoodFET): + def SPIsetup(self): + """Move the FET into the SPI application.""" + self.writecmd(0x01,0x10,0,self.data); #SPI/SETUP + + def SPItrans8(self,byte): + """Read and write 8 bits by SPI.""" + 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; + +class GoodFETSPIFlash(GoodFETSPI): + JEDECmanufacturers={0xFF: "MISSING", + 0xEF: "Winbond", + 0xC2: "MXIC", + 0x20: "Numonyx/ST" + }; + + JEDECdevices={0xFFFFFF: "MISSING", + 0xEF3014: "W25X80L", + 0xEF3013: "W25X40L", + 0xEF3012: "W25X20L", + 0xEF3011: "W25X10L", + 0xC22014: "MX25L8005", + 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]; + 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.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): + """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,blocks=1): + """Grab a few block from an SPI Flash ROM. Block size is unknown""" + data=[(adr&0xFF0000)>>16, + (adr&0xFF00)>>8, + adr&0xFF, + blocks]; + + self.writecmd(0x01,0x02,4,data,blocks); + 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.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); + diff --git a/client/goodfet.spiflash b/client/goodfet.spiflash index c47c4dc..7aa287d 100755 --- a/client/goodfet.spiflash +++ b/client/goodfet.spiflash @@ -10,7 +10,7 @@ import sys; import binascii; import array; -from GoodFET import GoodFETSPIFlash; +from GoodFETSPI import GoodFETSPIFlash; from intelhex import IntelHex; if(len(sys.argv)==1): diff --git a/firmware/apps/spi/spi.c b/firmware/apps/spi/spi.c index 594e04f..21bf66a 100644 --- a/firmware/apps/spi/spi.c +++ b/firmware/apps/spi/spi.c @@ -10,26 +10,13 @@ #include #include - -//Pins and I/O -#define SS BIT0 -#define MOSI BIT1 -#define MISO BIT2 -#define SCK BIT3 - +#include //This could be more accurate. //Does it ever need to be? #define SPISPEED 0 #define SPIDELAY(x) delay(x) -#define SETMOSI P5OUT|=MOSI -#define CLRMOSI P5OUT&=~MOSI -#define SETCLK P5OUT|=SCK -#define CLRCLK P5OUT&=~SCK -#define READMISO (P5IN&MISO?1:0) - - //! Set up the pins for SPI mode. void spisetup(){ @@ -75,6 +62,7 @@ unsigned char spitrans8(unsigned char byte){ //! Enable SPI writing void spiflash_wrten(){ + SETSS; P5OUT&=~SS; //Drop !SS to begin transaction. spitrans8(0x04);//Write Disable P5OUT|=SS; //Raise !SS to end transaction. @@ -98,13 +86,66 @@ unsigned char spiflash_status(){ //! Grab the SPI flash status byte. void spiflash_setstatus(unsigned char c){ - P5OUT&=~SS; //Drop !SS to begin transaction. + SETSS; + CLRSS; //Drop !SS to begin transaction. spitrans8(0x01);//SET STATUS spitrans8(c); - P5OUT|=SS; //Raise !SS to end transaction. + SETSS; //Raise !SS to end transaction. //return c; } + +//! Read a block to a buffer. +void spiflash_peekblock(unsigned long adr, + unsigned char *buf, + unsigned int len){ + unsigned char i; + + SETSS; + CLRSS; //Drop !SS to begin transaction. + spitrans8(0x03);//Flash Read Command + + //Send address + spitrans8((adr&0xFF0000)>>16); + spitrans8((adr&0xFF00)>>8); + spitrans8(adr&0xFF); + + for(i=0;i>16); + spitrans8((adr&0xFF00)>>8); + spitrans8(adr&0xFF); + + for(i=0;i