7dbb59ac52c4f82011cc50ac000b27d5f353699d
[goodfet] / client / goodfet.cc
1 #!/usr/bin/env python
2 # GoodFET Chipcon Example
3
4 # (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 import sys;
9 import binascii;
10
11 from GoodFETCC import GoodFETCC;
12 from intelhex import IntelHex;
13
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s test" % sys.argv[0];
18     print "%s info" % sys.argv[0];
19     print "%s dumpcode $foo.hex [0x$start 0x$stop]" % sys.argv[0];
20     print "%s dumpdata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
21     print "%s erase" % sys.argv[0];
22     print "%s writedata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
23     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
24     print "%s peekdata 0x$start [0x$stop]" % sys.argv[0];
25     print "%s pokedata 0x$adr 0x$val" % sys.argv[0];
26     print "%s peek 0x$iram" % sys.argv[0];
27     print "%s poke 0x$iram 0x$val" % sys.argv[0];
28     print "%s peekcode 0x$start [0x$stop]" % sys.argv[0];
29     sys.exit();
30
31 #Initailize FET and set baud rate
32 client=GoodFETCC();
33 client.serInit()
34
35 #Connect to target
36 client.setup();
37 client.start();
38
39 if(sys.argv[1]=="explore"):
40     print "Exploring undefined commands."
41     print "Status: %s" %client.status();
42     
43     cmd=0x04; #read status
44     for foo in range(0,0x5):
45         client.CCcmd([(0x0F<<3)|(0x00)|0x03,0x09<<3]);
46         print "Status %02x: %s" % (foo,client.status());
47     for foo in range(0,3):
48         print "PC: %04x" % client.CCgetPC();
49         
50 if(sys.argv[1]=="test"):
51     client.test();
52 if(sys.argv[1]=="deadtest"):
53     for i in range(1,10):
54         print "IDENT as %s" % client.CCidentstr();
55 if(sys.argv[1]=="dumpcode"):
56     f = sys.argv[2];
57     start=0x0000;
58     stop=0xFFFF;
59     if(len(sys.argv)>3):
60         start=int(sys.argv[3],16);
61     if(len(sys.argv)>4):
62         stop=int(sys.argv[4],16);
63     
64     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
65     h = IntelHex(None);
66     i=start;
67     while i<=stop:
68         h[i]=client.CCpeekcodebyte(i);
69         if(i%0x100==0):
70             print "Dumped %04x."%i;
71         i+=1;
72     h.write_hex_file(f);
73 if(sys.argv[1]=="dumpdata"):
74     f = sys.argv[2];
75     start=0xE000;
76     stop=0xFFFF;
77     if(len(sys.argv)>3):
78         start=int(sys.argv[3],16);
79     if(len(sys.argv)>4):
80         stop=int(sys.argv[4],16);
81     
82     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
83     h = IntelHex(None);
84     i=start;
85     while i<=stop:
86         h[i]=client.CCpeekdatabyte(i);
87         if(i%0x100==0):
88             print "Dumped %04x."%i;
89         i+=1;
90     h.write_hex_file(f);
91 if(sys.argv[1]=="status"):
92     print "Status: %s" %client.status();
93 if(sys.argv[1]=="info"):
94     print "%s" % client.CCidentstr();
95 if(sys.argv[1]=="erase"):
96     print "Status: %s" % client.status();
97     client.CCchiperase();
98     print "Status: %s" %client.status();
99
100 if(sys.argv[1]=="peekinfo"):
101     print "Select info flash."
102     client.CCwr_config(1);
103     print "Config is %02x" % client.CCrd_config();
104     
105     start=0x0000;
106     if(len(sys.argv)>2):
107         start=int(sys.argv[2],16);
108     stop=start;
109     if(len(sys.argv)>3):
110         stop=int(sys.argv[3],16);
111     print "Peeking from %04x to %04x." % (start,stop);
112     while start<=stop:
113         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
114         start=start+1;
115 if(sys.argv[1]=="poke"):
116     client.CCpokeirambyte(int(sys.argv[2],16),
117                           int(sys.argv[3],16));
118 if(sys.argv[1]=="randtest"):
119     #Seed RNG
120     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
121     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
122     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
123     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
124     
125     #Dump values
126     for foo in range(1,10):
127         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
128         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
129         client.CCreleasecpu();
130         client.CChaltcpu();
131     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
132 if(sys.argv[1]=="adctest"):
133     # ADCTest 0xDF3A 0xDF3B
134     print "ADC TEST %02x%02x" % (
135         client.CCpeekdatabyte(0xDF3A),
136         client.CCpeekdatabyte(0xDF3B));
137 if(sys.argv[1]=="config"):
138     print "Config is %02x" % client.CCrd_config();
139
140 if(sys.argv[1]=="flash"):
141      f=sys.argv[2];
142      start=0;
143      stop=0xFFFF;
144      if(len(sys.argv)>3):
145          start=int(sys.argv[3],16);
146      if(len(sys.argv)>4):
147          stop=int(sys.argv[4],16);
148    
149      h = IntelHex(f);
150      page = 0x0000;
151      pagelen = client.CCpagesize(); #2048; #2kB pages in 32-bit words
152      
153      print "page=%04x, pagelen=%04x" % (page,pagelen);
154      
155      bcount = 0;
156      
157      #Wipe the RAM buffer for the next flash page.
158      client.CCeraseflashbuffer();
159      for i in h._buf.keys():
160          while(i>=page+pagelen):
161              if bcount>0:
162                  client.CCflashpage(page);
163                  #client.CCeraseflashbuffer();
164                  bcount=0;
165                  print "Flashed page at %06x" % page
166              page+=pagelen;
167              
168          #Place byte into buffer.
169          client.CCpokedatabyte(0xF000+i-page,
170                                h[i]);
171          bcount+=1;
172          if(i%0x100==0):
173                 print "Buffering %04x toward %06x" % (i,page);
174      #last page
175      client.CCflashpage(page);
176      print "Flashed final page at %06x" % page;
177      
178 if(sys.argv[1]=="lock"):
179     print "Status: %s" %client.status();
180     client.CClockchip();
181     print "Status: %s" %client.status();
182 if(sys.argv[1]=="flashpage"):
183     target=0;
184     if(len(sys.argv)>2):
185         target=int(sys.argv[2],16);
186     print "Writing a page of flash from 0xF000 in XDATA"
187     client.CCflashpage(target);
188 if(sys.argv[1]=="erasebuffer"):
189     print "Erasing flash buffer.";
190     client.CCeraseflashbuffer();
191
192 if(sys.argv[1]=="writedata"):
193     f=sys.argv[2];
194     start=0;
195     stop=0xFFFF;
196     if(len(sys.argv)>3):
197         start=int(sys.argv[3],16);
198     if(len(sys.argv)>4):
199         stop=int(sys.argv[4],16);
200     
201     h = IntelHex(f);
202     
203     for i in h._buf.keys():
204         if(i>=start and i<=stop):
205             client.CCpokedatabyte(i,h[i]);
206             if(i%0x100==0):
207                 print "%04x" % i;
208 #if(sys.argv[1]=="flashtest"):
209 #    client.CCflashtest();
210 if(sys.argv[1]=="peekdata"):
211     start=0x0000;
212     if(len(sys.argv)>2):
213         start=int(sys.argv[2],16);
214     stop=start;
215     if(len(sys.argv)>3):
216         stop=int(sys.argv[3],16);
217     print "Peeking from %04x to %04x." % (start,stop);
218     while start<=stop:
219         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
220         start=start+1;
221 if(sys.argv[1]=="peek"):
222     start=0x0000;
223     if(len(sys.argv)>2):
224         start=int(sys.argv[2],16);
225     stop=start;
226     if(len(sys.argv)>3):
227         stop=int(sys.argv[3],16);
228     print "Peeking from %04x to %04x." % (start,stop);
229     while start<=stop:
230         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
231         start=start+1;
232 if(sys.argv[1]=="verify"):
233     f=sys.argv[2];
234     start=0;
235     stop=0xFFFF;
236     if(len(sys.argv)>3):
237         start=int(sys.argv[3],16);
238     if(len(sys.argv)>4):
239         stop=int(sys.argv[4],16);
240     
241     h = IntelHex(f);
242     for i in h._buf.keys():
243         if(i>=start and i<stop):
244             peek=client.CCpeekcodebyte(i)
245             if(h[i]!=peek):
246                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
247             if(i%0x100==0):
248                 print "%04x" % i;
249 if(sys.argv[1]=="peekcode"):
250     start=0x0000;
251     if(len(sys.argv)>2):
252         start=int(sys.argv[2],16);
253     stop=start;
254     if(len(sys.argv)>3):
255         stop=int(sys.argv[3],16);
256     print "Peeking from %04x to %04x." % (start,stop);
257     while start<=stop:
258         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
259         start=start+1;
260 if(sys.argv[1]=="pokedata"):
261     start=0x0000;
262     val=0x00;
263     if(len(sys.argv)>2):
264         start=int(sys.argv[2],16);
265     if(len(sys.argv)>3):
266         val=int(sys.argv[3],16);
267     print "Poking %04x to become %02x." % (start,val);
268     client.CCpokedatabyte(start,val);
269
270 client.stop();