JEDEC size detection.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 2 Sep 2009 00:53:44 +0000 (00:53 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 2 Sep 2009 00:53:44 +0000 (00:53 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@107 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/goodfet.spiflash

index 3a192fc..99756ba 100755 (executable)
@@ -179,6 +179,11 @@ class GoodFET:
                   0xC22013: "MX25L4005",
                   0x204011: "M45PE10"
                   };
                   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];
     def SPIjedec(self):
         """Grab an SPI Flash ROM's JEDEC bytes."""
         data=[0x9f, 0, 0, 0];
@@ -187,6 +192,7 @@ class GoodFET:
         self.JEDECmanufacturer=ord(data[1]);
         self.JEDECtype=ord(data[2]);
         self.JEDECcapacity=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);
         self.JEDECdevice=(ord(data[1])<<16)+(ord(data[2])<<8)+ord(data[3]);
         return data;
     def SPIpeek(self,adr):
         self.JEDECdevice=(ord(data[1])<<16)+(ord(data[2])<<8)+ord(data[3]);
         return data;
     def SPIpeek(self,adr):
@@ -199,14 +205,13 @@ class GoodFET:
         self.SPItrans(data);
         return ord(self.data[4]);
     def SPIpeekblock(self,adr):
         self.SPItrans(data);
         return ord(self.data[4]);
     def SPIpeekblock(self,adr):
-        """Grab a byte from an SPI Flash ROM."""
+        """Grab a block from an SPI Flash ROM.  Block size is unknown"""
         data=[(adr&0xFF0000)>>16,
               (adr&0xFF00)>>8,
               adr&0xFF];
         
         self.writecmd(0x01,0x02,3,data);
         return self.data;
         data=[(adr&0xFF0000)>>16,
               (adr&0xFF00)>>8,
               adr&0xFF];
         
         self.writecmd(0x01,0x02,3,data);
         return self.data;
-    
     def SPIpokebyte(self,adr,val):
         self.SPIpokebytes(adr,[val]);
     def SPIpokebytes(self,adr,data):
     def SPIpokebyte(self,adr,val):
         self.SPIpokebytes(adr,[val]);
     def SPIpokebytes(self,adr,data):
index 23585a7..e6150e2 100755 (executable)
@@ -19,7 +19,7 @@ if(len(sys.argv)==1):
     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0];
     print "%s erase" % sys.argv[0];
     print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0];
     print "%s erase" % sys.argv[0];
     print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
-    print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
+    #print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
     print "%s poke 0x$adr 0x$val" % sys.argv[0];
     sys.exit();
     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
     print "%s poke 0x$adr 0x$val" % sys.argv[0];
     sys.exit();
@@ -65,7 +65,7 @@ if(sys.argv[1]=="info"):
 if(sys.argv[1]=="dump"):
     f = sys.argv[2];
     start=0x0000;
 if(sys.argv[1]=="dump"):
     f = sys.argv[2];
     start=0x0000;
-    stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
+    stop=client.JEDECsize;
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
@@ -86,7 +86,8 @@ if(sys.argv[1]=="dump"):
 if(sys.argv[1]=="flash"):
     f = sys.argv[2];
     start=0x0000;
 if(sys.argv[1]=="flash"):
     f = sys.argv[2];
     start=0x0000;
-    stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
+    stop=client.JEDECsize;
+    
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
@@ -107,7 +108,7 @@ if(sys.argv[1]=="flash"):
         client.SPIpokebytes(i,bytes);
         
         i+=chunksize;
         client.SPIpokebytes(i,bytes);
         
         i+=chunksize;
-        if(i%0x100==0):
+        if(i%0x1000==0):
             print "Flashed %06x."%i;
     file.close()
 
             print "Flashed %06x."%i;
     file.close()