Writing of SPI Flash is more reliable.
[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 GoodFET import GoodFET;
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 write $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 #Initailize FET and set baud rate
28 client=GoodFET();
29 client.serInit("/dev/ttyUSB0")
30
31 client.SPIsetup();
32
33 if(sys.argv[1]=="test"):
34     result="";
35     dropped=0;
36     for i in range(40):
37         data=client.SPIjedec();
38         if ord(data[1])==0xFF:
39             result+="-";
40             dropped=dropped+1;
41         else:
42             result+="+";
43     print "Connection Test: (- is bad)\n%s" % result;
44     print "%i misreads" % dropped;
45     if(dropped==40):
46         print "No successful reads.  Is the chip wired correctly?";
47     elif(dropped>0):
48         print "Some success, some failures.  Is a wire loose?";
49     else:
50         print "All reads succeeded.  Wiring is probably good.";
51
52 if(sys.argv[1]=="info"):
53     data=client.SPIjedec();
54     print "Ident as %s\nManufacturer: %02x %s\nType: %02x\nCapacity: %02x" % (
55         client.SPIjedecstr(),
56         ord(data[1]),client.SPIjedecmanstr(),
57         ord(data[2]),
58         ord(data[3]));
59
60 if(sys.argv[1]=="dump"):
61     f = sys.argv[2];
62     start=0x0000;
63     stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
64     if(len(sys.argv)>3):
65         start=int(sys.argv[3],16);
66     if(len(sys.argv)>4):
67         stop=int(sys.argv[4],16);
68     
69     print "Dumping code from %06x to %06x as %s." % (start,stop,f);
70     file = open(f, mode='wb')
71
72     i=start;
73     while i<=stop:
74         data=client.SPIpeekblock(i);
75         
76         
77         if(i%0x100==0):
78             print "Dumped %06x."%i;
79         for j in data:
80             file.write(j);
81             i+=1;
82     file.close()
83 if(sys.argv[1]=="flash"):
84     f = sys.argv[2];
85     start=0x0000;
86     stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
87     if(len(sys.argv)>3):
88         start=int(sys.argv[3],16);
89     if(len(sys.argv)>4):
90         stop=int(sys.argv[4],16);
91     
92     print "Flashing code from %06x to %06x with %s." % (start,stop,f);
93     file = open(f, mode='rb')
94
95     i=start;
96     bytes=file.read();
97     while i<=stop:
98         client.SPIpokebyte(i,ord(bytes[i]));
99         
100         i+=1;
101         if(i%0x100==0):
102             print "Flashed %06x."%i;
103     file.close()
104
105
106 if(sys.argv[1]=="erase"):
107   client.SPIchiperase();
108
109 if(sys.argv[1]=="peek"):
110     start=0x0000;
111     if(len(sys.argv)>2):
112         start=int(sys.argv[2],16);
113     stop=start;
114     if(len(sys.argv)>3):
115         stop=int(sys.argv[3],16);
116     print "Peeking from %06x to %06x." % (start,stop);
117     while start<=stop:
118         print "%06x: %02x" % (start,client.SPIpeek(start));
119         start=start+1;
120
121 if(sys.argv[1]=="poke"):
122     start=0x0000;
123     val=0x00;
124     if(len(sys.argv)>2):
125         start=int(sys.argv[2],16);
126     if(len(sys.argv)>3):
127         val=int(sys.argv[3],16);
128     print "Poking %06x to become %02x." % (start,val);
129     
130     while client.SPIpeek(start)!=val:
131         client.SPIpokebyte(start,val);
132         print "Poked to %02x" % client.SPIpeek(start);
133