SPI client refactoring and block read/write functions.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sat, 5 Sep 2009 21:55:00 +0000 (21:55 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sat, 5 Sep 2009 21:55:00 +0000 (21:55 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@124 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/GoodFETSPI.py [new file with mode: 0644]
client/goodfet.spiflash
firmware/apps/spi/spi.c
firmware/include/command.h

index 912c9a6..5645f52 100755 (executable)
@@ -168,112 +168,6 @@ class GoodFET:
         """Write bytes by I2C."""
         self.writecmd(0x02,0x01,len(bytes),bytes); #SPI/SETUP
         return ord(self.data[0]);
         """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):
 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 (file)
index 0000000..bee77f5
--- /dev/null
@@ -0,0 +1,117 @@
+#!/usr/bin/env python
+# GoodFET SPI and SPIFlash Client Library
+# 
+# (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
+#
+# 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);
+
index c47c4dc..7aa287d 100755 (executable)
@@ -10,7 +10,7 @@ import sys;
 import binascii;
 import array;
 
 import binascii;
 import array;
 
-from GoodFET import GoodFETSPIFlash;
+from GoodFETSPI import GoodFETSPIFlash;
 from intelhex import IntelHex;
 
 if(len(sys.argv)==1):
 from intelhex import IntelHex;
 
 if(len(sys.argv)==1):
index 594e04f..21bf66a 100644 (file)
 #include <io.h>
 #include <iomacros.h>
 
 #include <io.h>
 #include <iomacros.h>
 
-
-//Pins and I/O
-#define SS   BIT0
-#define MOSI BIT1
-#define MISO BIT2
-#define SCK  BIT3
-
+#include <spi.h>
 
 //This could be more accurate.
 //Does it ever need to be?
 #define SPISPEED 0
 #define SPIDELAY(x) delay(x)
 
 
 //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(){
 
 //! 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(){
 
 //! 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.
   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){
 
 //! 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);
   spitrans8(0x01);//SET STATUS
   spitrans8(c);
-  P5OUT|=SS;  //Raise !SS to end transaction.
+  SETSS;  //Raise !SS to end transaction.
   //return c;
 }
 
   //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<len;i++)
+    buf[i]=spitrans8(0);
+  SETSS;  //Raise !SS to end transaction.
+}
+
+
+//! Read a block to a buffer.
+void spiflash_pokeblock(unsigned long adr,
+                       unsigned char *buf,
+                       unsigned int len){
+  unsigned char i;
+  
+  SETSS;
+  
+  spiflash_setstatus(0x02);
+  spiflash_wrten();
+  
+  CLRSS; //Drop !SS to begin transaction.
+  spitrans8(0x02); //Poke command.
+  
+  //Send address
+  spitrans8((adr&0xFF0000)>>16);
+  spitrans8((adr&0xFF00)>>8);
+  spitrans8(adr&0xFF);
+
+  for(i=0;i<len;i++)
+    spitrans8(buf[i]);
+  SETSS;  //Raise !SS to end transaction.
+  
+  while(spiflash_status()&0x01)
+    ;
+  
+  return;
+}
+
+
 //! Peek some blocks.
 void spiflash_peek(unsigned char app,
                   unsigned char verb,
 //! Peek some blocks.
 void spiflash_peek(unsigned char app,
                   unsigned char verb,
index 29e791e..5855699 100644 (file)
@@ -58,6 +58,7 @@ extern unsigned char cmddata[256];
 
 //OCT commands
 #define OCT_CMP 0x90
 
 //OCT commands
 #define OCT_CMP 0x90
+#define OCT_RES 0x91
 
 //JTAG430 commands
 #define JTAG430_HALTCPU 0xA0
 
 //JTAG430 commands
 #define JTAG430_HALTCPU 0xA0