Closer to reliable AVR glitching.
[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 = 2048; #2kB pages in 32-bit words
150      bcount = 0;
151      
152      print "Wiping Flash."
153      #Wipe all of flash.
154      #client.CCchiperase();
155      #Wipe the RAM buffer for the next flash page.
156      #client.CCeraseflashbuffer();
157      for i in h._buf.keys():
158          while(i>page+pagelen):
159              if bcount>0:
160                  client.CCflashpage(page);
161                  #client.CCeraseflashbuffer();
162                  bcount=0;
163                  print "Flashed page at %06x" % page
164              page+=pagelen;
165              
166          #Place byte into buffer.
167          client.CCpokedatabyte(0xF000+i-page,
168                                h[i]);
169          bcount+=1;
170          if(i%0x100==0):
171                 print "Buffering %04x toward %06x" % (i,page);
172      #last page
173      client.CCflashpage(page);
174      print "Flashed final page at %06x" % page;
175      
176 if(sys.argv[1]=="lock"):
177     print "Status: %s" %client.CCstatusstr();
178     client.CClockchip();
179     print "Status: %s" %client.CCstatusstr();
180 if(sys.argv[1]=="flashpage"):
181     target=0;
182     if(len(sys.argv)>2):
183         target=int(sys.argv[2],16);
184     print "Writing a page of flash from 0xF000 in XDATA"
185     client.CCflashpage(target);
186 if(sys.argv[1]=="erasebuffer"):
187     print "Erasing flash buffer.";
188     client.CCeraseflashbuffer();
189
190 if(sys.argv[1]=="writedata"):
191     f=sys.argv[2];
192     start=0;
193     stop=0xFFFF;
194     if(len(sys.argv)>3):
195         start=int(sys.argv[3],16);
196     if(len(sys.argv)>4):
197         stop=int(sys.argv[4],16);
198     
199     h = IntelHex(f);
200     
201     for i in h._buf.keys():
202         if(i>=start and i<=stop):
203             client.CCpokedatabyte(i,h[i]);
204             if(i%0x100==0):
205                 print "%04x" % i;
206 #if(sys.argv[1]=="flashtest"):
207 #    client.CCflashtest();
208 if(sys.argv[1]=="peekdata"):
209     start=0x0000;
210     if(len(sys.argv)>2):
211         start=int(sys.argv[2],16);
212     stop=start;
213     if(len(sys.argv)>3):
214         stop=int(sys.argv[3],16);
215     print "Peeking from %04x to %04x." % (start,stop);
216     while start<=stop:
217         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
218         start=start+1;
219 if(sys.argv[1]=="peek"):
220     start=0x0000;
221     if(len(sys.argv)>2):
222         start=int(sys.argv[2],16);
223     stop=start;
224     if(len(sys.argv)>3):
225         stop=int(sys.argv[3],16);
226     print "Peeking from %04x to %04x." % (start,stop);
227     while start<=stop:
228         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
229         start=start+1;
230
231 if(sys.argv[1]=="peekcode"):
232     start=0x0000;
233     if(len(sys.argv)>2):
234         start=int(sys.argv[2],16);
235     stop=start;
236     if(len(sys.argv)>3):
237         stop=int(sys.argv[3],16);
238     print "Peeking from %04x to %04x." % (start,stop);
239     while start<=stop:
240         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
241         start=start+1;
242 if(sys.argv[1]=="pokedata"):
243     start=0x0000;
244     val=0x00;
245     if(len(sys.argv)>2):
246         start=int(sys.argv[2],16);
247     if(len(sys.argv)>3):
248         val=int(sys.argv[3],16);
249     print "Poking %04x to become %02x." % (start,val);
250     client.CCpokedatabyte(start,val);
251
252 client.stop();