19a0b13ef0589d5f3753b2bb86612fe5e14aece5
[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.CCstatusstr();
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.CCstatusstr());
47     for foo in range(0,3):
48         print "PC: %04x" % client.CCgetPC();
49         
50 if(sys.argv[1]=="test"):
51     client.CCtest();
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.CCstatusstr();
93 if(sys.argv[1]=="erase"):
94     print "Status: %s" % client.CCstatusstr();
95     client.CCchiperase();
96     print "Status: %s" %client.CCstatusstr();
97
98 if(sys.argv[1]=="peekinfo"):
99     print "Select info flash."
100     client.CCwr_config(1);
101     print "Config is %02x" % client.CCrd_config();
102     
103     start=0x0000;
104     if(len(sys.argv)>2):
105         start=int(sys.argv[2],16);
106     stop=start;
107     if(len(sys.argv)>3):
108         stop=int(sys.argv[3],16);
109     print "Peeking from %04x to %04x." % (start,stop);
110     while start<=stop:
111         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
112         start=start+1;
113 if(sys.argv[1]=="poke"):
114     client.CCpokeirambyte(int(sys.argv[2],16),
115                           int(sys.argv[3],16));
116 if(sys.argv[1]=="randtest"):
117     #Seed RNG
118     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
119     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
120     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
121     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
122     
123     #Dump values
124     for foo in range(1,10):
125         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
126         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
127         client.CCreleasecpu();
128         client.CChaltcpu();
129     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
130 if(sys.argv[1]=="adctest"):
131     # ADCTest 0xDF3A 0xDF3B
132     print "ADC TEST %02x%02x" % (
133         client.CCpeekdatabyte(0xDF3A),
134         client.CCpeekdatabyte(0xDF3B));
135 if(sys.argv[1]=="config"):
136     print "Config is %02x" % client.CCrd_config();
137
138 if(sys.argv[1]=="flash"):
139      f=sys.argv[2];
140      start=0;
141      stop=0xFFFF;
142      if(len(sys.argv)>3):
143          start=int(sys.argv[3],16);
144      if(len(sys.argv)>4):
145          stop=int(sys.argv[4],16);
146    
147      h = IntelHex(f);
148      page = 0x0000;
149      pagelen = client.CCpagesize(); #2048; #2kB pages in 32-bit words
150      
151      bcount = 0;
152      
153      #Wipe the RAM buffer for the next flash page.
154      client.CCeraseflashbuffer();
155      for i in h._buf.keys():
156          while(i>=page+pagelen):
157              if bcount>0:
158                  client.CCflashpage(page);
159                  #client.CCeraseflashbuffer();
160                  bcount=0;
161                  print "Flashed page at %06x" % page
162              page+=pagelen;
163              
164          #Place byte into buffer.
165          client.CCpokedatabyte(0xF000+i-page,
166                                h[i]);
167          bcount+=1;
168          if(i%0x100==0):
169                 print "Buffering %04x toward %06x" % (i,page);
170      #last page
171      client.CCflashpage(page);
172      print "Flashed final page at %06x" % page;
173      
174 if(sys.argv[1]=="lock"):
175     print "Status: %s" %client.CCstatusstr();
176     client.CClockchip();
177     print "Status: %s" %client.CCstatusstr();
178 if(sys.argv[1]=="flashpage"):
179     target=0;
180     if(len(sys.argv)>2):
181         target=int(sys.argv[2],16);
182     print "Writing a page of flash from 0xF000 in XDATA"
183     client.CCflashpage(target);
184 if(sys.argv[1]=="erasebuffer"):
185     print "Erasing flash buffer.";
186     client.CCeraseflashbuffer();
187
188 if(sys.argv[1]=="writedata"):
189     f=sys.argv[2];
190     start=0;
191     stop=0xFFFF;
192     if(len(sys.argv)>3):
193         start=int(sys.argv[3],16);
194     if(len(sys.argv)>4):
195         stop=int(sys.argv[4],16);
196     
197     h = IntelHex(f);
198     
199     for i in h._buf.keys():
200         if(i>=start and i<=stop):
201             client.CCpokedatabyte(i,h[i]);
202             if(i%0x100==0):
203                 print "%04x" % i;
204 #if(sys.argv[1]=="flashtest"):
205 #    client.CCflashtest();
206 if(sys.argv[1]=="peekdata"):
207     start=0x0000;
208     if(len(sys.argv)>2):
209         start=int(sys.argv[2],16);
210     stop=start;
211     if(len(sys.argv)>3):
212         stop=int(sys.argv[3],16);
213     print "Peeking from %04x to %04x." % (start,stop);
214     while start<=stop:
215         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
216         start=start+1;
217 if(sys.argv[1]=="peek"):
218     start=0x0000;
219     if(len(sys.argv)>2):
220         start=int(sys.argv[2],16);
221     stop=start;
222     if(len(sys.argv)>3):
223         stop=int(sys.argv[3],16);
224     print "Peeking from %04x to %04x." % (start,stop);
225     while start<=stop:
226         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
227         start=start+1;
228 if(sys.argv[1]=="verify"):
229     f=sys.argv[2];
230     start=0;
231     stop=0xFFFF;
232     if(len(sys.argv)>3):
233         start=int(sys.argv[3],16);
234     if(len(sys.argv)>4):
235         stop=int(sys.argv[4],16);
236     
237     h = IntelHex(f);
238     for i in h._buf.keys():
239         if(i>=start and i<stop):
240             peek=client.CCpeekcodebyte(i)
241             if(h[i]!=peek):
242                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
243             if(i%0x100==0):
244                 print "%04x" % i;
245 if(sys.argv[1]=="peekcode"):
246     start=0x0000;
247     if(len(sys.argv)>2):
248         start=int(sys.argv[2],16);
249     stop=start;
250     if(len(sys.argv)>3):
251         stop=int(sys.argv[3],16);
252     print "Peeking from %04x to %04x." % (start,stop);
253     while start<=stop:
254         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
255         start=start+1;
256 if(sys.argv[1]=="pokedata"):
257     start=0x0000;
258     val=0x00;
259     if(len(sys.argv)>2):
260         start=int(sys.argv[2],16);
261     if(len(sys.argv)>3):
262         val=int(sys.argv[3],16);
263     print "Poking %04x to become %02x." % (start,val);
264     client.CCpokedatabyte(start,val);
265
266 client.stop();