SPI Flash dumping.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Thu, 16 Jul 2009 18:54:00 +0000 (18:54 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Thu, 16 Jul 2009 18:54:00 +0000 (18:54 +0000)
Dumping is a hell of a lot faster in blocks, as round-trip time is
no longer a bottleneck.

git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@64 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/goodfet.spiflash
firmware/apps/spi/spi.c
firmware/include/command.h

index 9c11161..952ae98 100755 (executable)
@@ -139,6 +139,14 @@ class GoodFET:
               0];
         self.SPItrans(data);
         return ord(self.data[4]);
               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];
+        
+        self.writecmd(0x01,0x02,3,data);
+        return self.data;
     
     def SPIjedecmanstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
     
     def SPIjedecmanstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
index ef72c28..7056968 100755 (executable)
@@ -69,10 +69,15 @@ if(sys.argv[1]=="dump"):
     h = IntelHex(None);
     i=start;
     while i<=stop:
     h = IntelHex(None);
     i=start;
     while i<=stop:
-        h[i>>1]=client.SPIpeek(i);
+        data=client.SPIpeekblock(i);
+        
+        
         if(i%0x100==0):
             print "Dumped %04x."%i;
         if(i%0x100==0):
             print "Dumped %04x."%i;
-        i+=1;
+        for j in data:
+            h[i]=ord(j);
+            #print "*%08x=%02x" % (i,ord(j));
+            i+=1;
     h.write_hex_file(f);
 
 if(sys.argv[1]=="erase"):
     h.write_hex_file(f);
 
 if(sys.argv[1]=="erase"):
index 2ee2d2c..93a41b9 100644 (file)
@@ -32,9 +32,9 @@
 
 //! Set up the pins for SPI mode.
 void spisetup(){
 
 //! Set up the pins for SPI mode.
 void spisetup(){
+  P5OUT|=SS;
   P5DIR|=MOSI+SCK+SS;
   P5DIR&=~MISO;
   P5DIR|=MOSI+SCK+SS;
   P5DIR&=~MISO;
-  P5OUT|=SS;
 }
 
 //! Read and write an SPI bit.
 }
 
 //! Read and write an SPI bit.
@@ -81,6 +81,27 @@ void spihandle(unsigned char app,
     P5OUT|=SS;  //Raise !SS to end transaction.
     txdata(app,verb,len);
     break;
     P5OUT|=SS;  //Raise !SS to end transaction.
     txdata(app,verb,len);
     break;
+  case SPI_JEDEC://Grab 3-byte JEDEC ID.
+    P5OUT&=~SS; //Drop !SS to begin transaction.
+    spitrans8(0x9f);
+    len=3;
+    for(i=0;i<len;i++)
+      cmddata[i]=spitrans8(cmddata[i]);
+    txdata(app,verb,len);
+    P5OUT|=SS;  //Raise !SS to end transaction.
+    break;
+  case PEEK://Grab 128 bytes from an SPI Flash ROM
+    P5OUT&=~SS; //Drop !SS to begin transaction.
+    spitrans8(0x03);//Flash Read Command
+    len=3;//write 3 byte pointer
+    for(i=0;i<len;i++)
+      spitrans8(cmddata[i]);
+    len=0x80;//128 byte chunk
+    for(i=0;i<len;i++)
+      cmddata[i]=spitrans8(0);
+    txdata(app,verb,len);
+    P5OUT|=SS;  //Raise !SS to end transaction.
+    break;
   case SETUP:
     spisetup();
     txdata(app,verb,0);
   case SETUP:
     spisetup();
     txdata(app,verb,0);
index c539175..7eb1f61 100644 (file)
@@ -49,6 +49,11 @@ extern unsigned char cmddata[256];
 #define JTAG_DR_SHIFT 0x81
 #define JTAG_DR_SHIFT20 0x91
 
 #define JTAG_DR_SHIFT 0x81
 #define JTAG_DR_SHIFT20 0x91
 
+//SPI commands
+#define SPI_JEDEC 0x80
+#define SPI_ERASE 0x81
+#define SPI_WRITE 0x82
+
 //JTAG430 commands
 #define JTAG430_HALTCPU 0xA0
 #define JTAG430_RELEASECPU 0xA1
 //JTAG430 commands
 #define JTAG430_HALTCPU 0xA0
 #define JTAG430_RELEASECPU 0xA1