SPI client refactoring and block read/write functions.
[goodfet] / client / goodfet.spiflash
1 #!/usr/bin/env python
2
3 #GoodFET SPI Flash Client
4 #by Travis Goodspeed
5
6 #N.B.,
7 #Might be Winbond W25x80-specific.
8
9 import sys;
10 import binascii;
11 import array;
12
13 from GoodFETSPI import GoodFETSPIFlash;
14 from intelhex import IntelHex;
15
16 if(len(sys.argv)==1):
17     print "Usage: %s verb [objects]\n" % sys.argv[0];
18     print "%s info" % sys.argv[0];
19     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0];
20     print "%s erase" % sys.argv[0];
21     print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
22     print "%s verify $foo.hex [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];
25     sys.exit();
26
27 #Initialize FET and set baud rate
28 client=GoodFETSPIFlash();
29 client.serInit()
30
31
32 client.SPIsetup();
33
34 #Dummy read.
35 #Might read as all ones if chip has a startup delay.
36 client.SPIjedec();
37
38 if(sys.argv[1]=="test"):
39     result="";
40     dropped=0;
41     for i in range(40):
42         data=client.SPIjedec();
43         if ord(data[1])==0xFF:
44             result+="-";
45             dropped=dropped+1;
46         else:
47             result+="+";
48     print "Connection Test: (- is bad)\n%s" % result;
49     print "%i misreads" % dropped;
50     if(dropped==40):
51         print "No successful reads.  Is the chip wired correctly?";
52     elif(dropped>0):
53         print "Some success, some failures.  Is a wire loose?";
54     else:
55         print "All reads succeeded.  Wiring is probably good.";
56
57 if(sys.argv[1]=="info"):
58     data=client.SPIjedec();
59     print "Ident as %s\nManufacturer: %02x %s\nType: %02x\nCapacity: %02x (%i bytes)" % (
60         client.SPIjedecstr(),
61         ord(data[1]),client.SPIjedecmanstr(),
62         ord(data[2]),
63         ord(data[3]),
64         client.JEDECsize);
65
66 if(sys.argv[1]=="dump"):
67     f = sys.argv[2];
68     start=0x0000;
69     stop=client.JEDECsize;
70     if(len(sys.argv)>3):
71         start=int(sys.argv[3],16);
72     if(len(sys.argv)>4):
73         stop=int(sys.argv[4],16);
74     
75     print "Dumping code from %06x to %06x as %s." % (start,stop,f);
76     file = open(f, mode='wb')
77     
78     i=start;
79     while i<=stop:
80         data=client.SPIpeekblock(i,255);
81         #if(i%0x1000==0):
82         print "Dumped %06x."%i;
83         for j in data:
84             if i<stop: file.write(j);
85             i+=1;
86     file.close()
87
88 if(sys.argv[1]=="verify"):
89     f = sys.argv[2];
90     start=0x0000;
91     stop=client.JEDECsize;
92     if(len(sys.argv)>3):
93         start=int(sys.argv[3],16);
94     if(len(sys.argv)>4):
95         stop=int(sys.argv[4],16);
96     
97     print "Verifying code from %06x to %06x as %s." % (start,stop,f);
98     file = open(f, mode='rb')
99     
100     i=start;
101     bits=0;
102     while i<=stop:
103         data=client.SPIpeekblock(i,255);
104         print "Verified %06x." % i;
105         for j in data:
106             if i<stop:
107                 bits|=ord(file.read(1))^ord(j);
108             i+=1;
109         if bits!=0:
110             print "Bits don't match."
111
112     file.close()
113
114 if(sys.argv[1]=="flash"):
115     f = sys.argv[2];
116     start=0x0000;
117     stop=client.JEDECsize;
118     
119     if(len(sys.argv)>3):
120         start=int(sys.argv[3],16);
121     if(len(sys.argv)>4):
122         stop=int(sys.argv[4],16);
123     
124     print "Flashing code from %06x to %06x with %s." % (start,stop,f);
125     file = open(f, mode='rb')
126
127     i=start;
128     chars=list(file.read());
129     chunksize=0x80;
130     
131     while i<=stop:
132         bytes=range(0,chunksize);
133         for j in range(0,chunksize):
134             bytes[j]=ord(chars[i+j]);
135         #client.SPIpokebyte(i,ord(chars[i]));
136         client.SPIpokebytes(i,bytes);
137         
138         i+=chunksize;
139         if(i%0x1000==0):
140             print "Flashed %06x."%i;
141     file.close()
142
143
144 if(sys.argv[1]=="erase"):
145   client.SPIchiperase();
146
147 if(sys.argv[1]=="peek"):
148     start=0x0000;
149     if(len(sys.argv)>2):
150         start=int(sys.argv[2],16);
151     stop=start;
152     if(len(sys.argv)>3):
153         stop=int(sys.argv[3],16);
154     print "Peeking from %06x to %06x." % (start,stop);
155     while start<=stop:
156         print "%06x: %02x" % (start,client.SPIpeek(start));
157         start=start+1;
158
159 if(sys.argv[1]=="poke"):
160     start=0x0000;
161     val=0x00;
162     if(len(sys.argv)>2):
163         start=int(sys.argv[2],16);
164     if(len(sys.argv)>3):
165         val=int(sys.argv[3],16);
166     print "Poking %06x to become %02x." % (start,val);
167     
168     while client.SPIpeek(start)!=val:
169         client.SPIpokebyte(start,val);
170         print "Poked to %02x" % client.SPIpeek(start);
171