goodfet.spiflash can erase, poke byte.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sat, 18 Jul 2009 15:25:42 +0000 (15:25 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sat, 18 Jul 2009 15:25:42 +0000 (15:25 +0000)
Writing pages will come next.

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

client/GoodFET.py
client/goodfet.spiflash

index 952ae98..f2a673b 100755 (executable)
@@ -115,11 +115,17 @@ class GoodFET:
         return self.data;
     
     JEDECmanufacturers={0xFF: "MISSING",
         return self.data;
     
     JEDECmanufacturers={0xFF: "MISSING",
-                        0xEF: "Winbond"};
-    JEDECdevices={0xEF3014: "W25X80L",
+                        0xEF: "Winbond",
+                        0xC2: "MXIC"};
+
+    JEDECdevices={0xFFFFFF: "MISSING",
+                  0xEF3014: "W25X80L",
                   0xEF3013: "W25X40L",
                   0xEF3012: "W25X20L",
                   0xEF3013: "W25X40L",
                   0xEF3012: "W25X20L",
-                  0xEF3011: "W25X10L"};
+                  0xEF3011: "W25X10L",
+                  0xC22014: "MX25L8005",
+                  0xC22013: "MX25L4005"
+                  };
     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];
@@ -147,20 +153,38 @@ class GoodFET:
         
         self.writecmd(0x01,0x02,3,data);
         return self.data;
         
         self.writecmd(0x01,0x02,3,data);
         return self.data;
-    
+    def SPIpokebyte(self,adr,val):
+        self.SPIwriteenable();
+        data=[0x02,
+              (adr&0xFF0000)>>16,
+              (adr&0xFF00)>>8,
+              adr&0xFF,
+              val];
+        self.SPItrans(data);
+    def SPIchiperase(self):
+        """Mass erase an SPI Flash ROM."""
+        self.SPIwriteenable();
+        #Chip Erase
+        data=[0xC7];
+        self.SPItrans(data);
+    def SPIwriteenable(self):
+        """SPI Flash Write Enable"""
+        data=[0x06];
+        self.SPItrans(data);
+        
     def SPIjedecmanstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
     def SPIjedecmanstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
-        man=self.JEDECmanufacturers[self.JEDECmanufacturer];
+        man=self.JEDECmanufacturers.get(self.JEDECmanufacturer)
         if man==0:
             man="UNKNOWN";
         return man;
     
     def SPIjedecstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
         if man==0:
             man="UNKNOWN";
         return man;
     
     def SPIjedecstr(self):
         """Grab the JEDEC manufacturer string.  Call after SPIjedec()."""
-        man=self.JEDECmanufacturers[self.JEDECmanufacturer];
+        man=self.JEDECmanufacturers.get(self.JEDECmanufacturer);
         if man==0:
             man="UNKNOWN";
         if man==0:
             man="UNKNOWN";
-        device=self.JEDECdevices[self.JEDECdevice];
+        device=self.JEDECdevices.get(self.JEDECdevice);
         if device==0:
             device="???"
         return "%s %s" % (man,device);
         if device==0:
             device="???"
         return "%s %s" % (man,device);
index 7056968..5c73eda 100755 (executable)
@@ -59,31 +59,30 @@ 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=0xFFFF;
+    stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
         stop=int(sys.argv[4],16);
     
     if(len(sys.argv)>3):
         start=int(sys.argv[3],16);
     if(len(sys.argv)>4):
         stop=int(sys.argv[4],16);
     
-    print "Dumping code from %04x to %04x as %s." % (start,stop,f);
-    h = IntelHex(None);
+    
+
+    print "Dumping code from %06x to %06x as %s." % (start,stop,f);
+    file = open(f, mode='wb')
+
     i=start;
     while i<=stop:
         data=client.SPIpeekblock(i);
         
         
         if(i%0x100==0):
     i=start;
     while i<=stop:
         data=client.SPIpeekblock(i);
         
         
         if(i%0x100==0):
-            print "Dumped %04x."%i;
+            print "Dumped %06x."%i;
         for j in data:
         for j in data:
-            h[i]=ord(j);
-            #print "*%08x=%02x" % (i,ord(j));
+            file.write(j);
             i+=1;
             i+=1;
-    h.write_hex_file(f);
-
+    file.close()
 if(sys.argv[1]=="erase"):
 if(sys.argv[1]=="erase"):
-  print "Status: %s" % client.CCstatusstr();
-  client.CCchiperase();
-  print "Status: %s" %client.CCstatusstr();
+  client.SPIchiperase();
 
 if(sys.argv[1]=="peek"):
     start=0x0000;
 
 if(sys.argv[1]=="peek"):
     start=0x0000;
@@ -92,18 +91,19 @@ if(sys.argv[1]=="peek"):
     stop=start;
     if(len(sys.argv)>3):
         stop=int(sys.argv[3],16);
     stop=start;
     if(len(sys.argv)>3):
         stop=int(sys.argv[3],16);
-    print "Peeking from %04x to %04x." % (start,stop);
+    print "Peeking from %06x to %06x." % (start,stop);
     while start<=stop:
     while start<=stop:
-        print "%04x: %02x" % (start,client.SPIpeek(start));
+        print "%06x: %02x" % (start,client.SPIpeek(start));
         start=start+1;
         start=start+1;
-# if(sys.argv[1]=="poke"):
-#     start=0x0000;
-#     val=0x00;
-#     if(len(sys.argv)>2):
-#         start=int(sys.argv[2],16);
-#     if(len(sys.argv)>3):
-#         val=int(sys.argv[3],16);
-#     print "Poking %04x to become %02x." % (start,val);
-#     client.CCpokedatabyte(start,val);
+
+if(sys.argv[1]=="poke"):
+    start=0x0000;
+    val=0x00;
+    if(len(sys.argv)>2):
+        start=int(sys.argv[2],16);
+    if(len(sys.argv)>3):
+        val=int(sys.argv[3],16);
+    print "Poking %06x to become %02x." % (start,val);
+    client.SPIpokebyte(start,val);