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