3 #GoodFET SPI Flash Client
7 #Might be Winbond W25x80-specific.
13 from GoodFET import GoodFET;
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.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];
27 #Initailize FET and set baud rate
29 client.serInit("/dev/ttyUSB0")
33 if(sys.argv[1]=="test"):
37 data=client.SPIjedec();
38 if ord(data[1])==0xFF:
43 print "Connection Test: (- is bad)\n%s" % result;
44 print "%i misreads" % dropped;
46 print "No successful reads. Is the chip wired correctly?";
48 print "Some success, some failures. Is a wire loose?";
50 print "All reads succeeded. Wiring is probably good.";
52 if(sys.argv[1]=="info"):
53 data=client.SPIjedec();
54 print "Ident as %s\nManufacturer: %02x %s\nType: %02x\nCapacity: %02x" % (
56 ord(data[1]),client.SPIjedecmanstr(),
60 if(sys.argv[1]=="dump"):
63 stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
65 start=int(sys.argv[3],16);
67 stop=int(sys.argv[4],16);
69 print "Dumping code from %06x to %06x as %s." % (start,stop,f);
70 file = open(f, mode='wb')
74 data=client.SPIpeekblock(i);
78 print "Dumped %06x."%i;
83 if(sys.argv[1]=="flash"):
86 stop=0x100000; #TODO, adjust this by the JEDEC size parameter.
88 start=int(sys.argv[3],16);
90 stop=int(sys.argv[4],16);
92 print "Flashing code from %06x to %06x with %s." % (start,stop,f);
93 file = open(f, mode='rb')
98 client.SPIpokebyte(i,ord(bytes[i]));
102 print "Flashed %06x."%i;
106 if(sys.argv[1]=="erase"):
107 client.SPIchiperase();
109 if(sys.argv[1]=="peek"):
112 start=int(sys.argv[2],16);
115 stop=int(sys.argv[3],16);
116 print "Peeking from %06x to %06x." % (start,stop);
118 print "%06x: %02x" % (start,client.SPIpeek(start));
121 if(sys.argv[1]=="poke"):
125 start=int(sys.argv[2],16);
127 val=int(sys.argv[3],16);
128 print "Poking %06x to become %02x." % (start,val);
130 while client.SPIpeek(start)!=val:
131 client.SPIpokebyte(start,val);
132 print "Poked to %02x" % client.SPIpeek(start);