SPI Flash dumping.
[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
12 from GoodFET import GoodFET;
13 from intelhex import IntelHex;
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s info" % sys.argv[0];
18     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0];
19     print "%s erase" % sys.argv[0];
20     print "%s write $foo.hex [0x$start 0x$stop]" % sys.argv[0];
21     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
22     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
23     print "%s poke 0x$adr 0x$val" % sys.argv[0];
24     sys.exit();
25
26 #Initailize FET and set baud rate
27 client=GoodFET();
28 client.serInit("/dev/ttyUSB0")
29
30 client.SPIsetup();
31
32 if(sys.argv[1]=="test"):
33     result="";
34     dropped=0;
35     for i in range(40):
36         data=client.SPIjedec();
37         if ord(data[1])==0xFF:
38             result+="-";
39             dropped=dropped+1;
40         else:
41             result+="+";
42     print "Connection Test: (- is bad)\n%s" % result;
43     print "%i misreads" % dropped;
44     if(dropped==40):
45         print "No successful reads.  Is the chip wired correctly?";
46     elif(dropped>0):
47         print "Some success, some failures.  Is a wire loose?";
48     else:
49         print "All reads succeeded.  Wiring is probably good.";
50
51 if(sys.argv[1]=="info"):
52     data=client.SPIjedec();
53     print "Ident as %s\nManufacturer: %02x %s\nType: %02x\nCapacity: %02x" % (
54         client.SPIjedecstr(),
55         ord(data[1]),client.SPIjedecmanstr(),
56         ord(data[2]),
57         ord(data[3]));
58
59 if(sys.argv[1]=="dump"):
60     f = sys.argv[2];
61     start=0x0000;
62     stop=0xFFFF;
63     if(len(sys.argv)>3):
64         start=int(sys.argv[3],16);
65     if(len(sys.argv)>4):
66         stop=int(sys.argv[4],16);
67     
68     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
69     h = IntelHex(None);
70     i=start;
71     while i<=stop:
72         data=client.SPIpeekblock(i);
73         
74         
75         if(i%0x100==0):
76             print "Dumped %04x."%i;
77         for j in data:
78             h[i]=ord(j);
79             #print "*%08x=%02x" % (i,ord(j));
80             i+=1;
81     h.write_hex_file(f);
82
83 if(sys.argv[1]=="erase"):
84   print "Status: %s" % client.CCstatusstr();
85   client.CCchiperase();
86   print "Status: %s" %client.CCstatusstr();
87
88 if(sys.argv[1]=="peek"):
89     start=0x0000;
90     if(len(sys.argv)>2):
91         start=int(sys.argv[2],16);
92     stop=start;
93     if(len(sys.argv)>3):
94         stop=int(sys.argv[3],16);
95     print "Peeking from %04x to %04x." % (start,stop);
96     while start<=stop:
97         print "%04x: %02x" % (start,client.SPIpeek(start));
98         start=start+1;
99 # if(sys.argv[1]=="poke"):
100 #     start=0x0000;
101 #     val=0x00;
102 #     if(len(sys.argv)>2):
103 #         start=int(sys.argv[2],16);
104 #     if(len(sys.argv)>3):
105 #         val=int(sys.argv[3],16);
106 #     print "Poking %04x to become %02x." % (start,val);
107 #     client.CCpokedatabyte(start,val);
108
109