3 #GoodFET SPI Flash Client
7 #Might be Winbond W25x80-specific.
13 from GoodFETSPI import GoodFETSPIFlash;
14 from intelhex import IntelHex;
17 print "Usage: %s verb [objects]\n" % sys.argv[0];
18 print "%s info" % sys.argv[0];
19 print "%s dump $foo.rom [0x$start 0x$stop]" % sys.argv[0];
20 print "%s erase" % sys.argv[0];
21 print "%s flash $foo.rom [0x$start 0x$stop]" % sys.argv[0];
22 print "%s verify $foo.rom [0x$start 0x$stop]" % sys.argv[0];
23 print "%s peek 0x$start [0x$stop]" % sys.argv[0];
24 print "%s poke 0x$adr 0x$val" % sys.argv[0];
27 #Initialize FET and set baud rate
28 client=GoodFETSPIFlash();
35 #Might read as all ones if chip has a startup delay.
38 if(sys.argv[1]=="test"):
42 data=client.SPIjedec();
43 if ord(data[1])==0xFF:
48 print "Connection Test: (- is bad)\n%s" % result;
49 print "%i misreads" % dropped;
51 print "No successful reads. Is the chip wired correctly?";
53 print "Some success, some failures. Is a wire loose?";
55 print "All reads succeeded. Wiring is probably good.";
57 client.SPIchiperase();
58 print "Testing erase.";
59 data=client.SPIpeekblock(0);
62 print "ERROR not properly erased!";
64 client.SPIpokebytes(0,data);
65 print "Testing flash write.";
67 if(client.SPIpeek(i)!=i):
68 print "%06x not properly poked to %02x" % (i,i);
69 print "Test complete.";
70 if(sys.argv[1]=="info"):
71 data=client.SPIjedec();
72 print "Ident as %s\nManufacturer: %02x %s\nType: %02x\nCapacity: %02x (%i bytes)" % (
74 ord(data[1]),client.SPIjedecmanstr(),
79 if(sys.argv[1]=="dump"):
82 stop=client.JEDECsize;
84 start=int(sys.argv[3],16);
86 stop=int(sys.argv[4],16);
88 print "Dumping code from %06x to %06x as %s." % (start,stop,f);
89 file = open(f, mode='wb')
93 data=client.SPIpeekblock(i);
95 print "Dumped %06x."%i;
97 if i<stop: file.write(j);
101 if(sys.argv[1]=="verify"):
104 stop=client.JEDECsize;
106 start=int(sys.argv[3],16);
108 stop=int(sys.argv[4],16);
110 print "Verifying code from %06x to %06x as %s." % (start,stop,f);
111 file = open(f, mode='rb')
116 data=client.SPIpeekblock(i,255);
117 print "Verified %06x." % i;
120 bits|=ord(file.read(1))^ord(j);
123 print "Bits don't match."
127 if(sys.argv[1]=="flash"):
130 stop=client.JEDECsize;
133 start=int(sys.argv[3],16);
135 stop=int(sys.argv[4],16);
137 print "Flashing code from %06x to %06x with %s." % (start,stop,f);
138 file = open(f, mode='rb')
141 chars=list(file.read());
143 #N.B., chunksize must be an even fraction of 0x100.
148 bytes=range(0,chunksize);
149 for j in range(0,chunksize):
150 bytes[j]=ord(chars[i+j]);
151 client.SPIpokebytes(i,bytes);
155 print "Flashed %06x."%i;
156 print "Done, ending silence.";
161 if(sys.argv[1]=="erase"):
162 client.SPIchiperase();
164 if(sys.argv[1]=="peek"):
167 start=int(sys.argv[2],16);
170 stop=int(sys.argv[3],16);
171 print "Peeking from %06x to %06x." % (start,stop);
173 print "%06x: %02x" % (start,client.SPIpeek(start));
176 if(sys.argv[1]=="poke"):
180 start=int(sys.argv[2],16);
182 val=int(sys.argv[3],16);
183 print "Poking %06x to become %02x." % (start,val);
185 while client.SPIpeek(start)!=val:
186 client.SPIpokebyte(start,val);
187 print "Poked to %02x" % client.SPIpeek(start);