Quantitative tests of AVR power stability,
[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]=="test"):
40     client.CCtest();
41 if(sys.argv[1]=="deadtest"):
42     for i in range(1,10):
43         print "IDENT as %s" % client.CCidentstr();
44 if(sys.argv[1]=="dumpcode"):
45     f = sys.argv[2];
46     start=0x0000;
47     stop=0xFFFF;
48     if(len(sys.argv)>3):
49         start=int(sys.argv[3],16);
50     if(len(sys.argv)>4):
51         stop=int(sys.argv[4],16);
52     
53     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
54     h = IntelHex(None);
55     i=start;
56     while i<=stop:
57         h[i]=client.CCpeekcodebyte(i);
58         if(i%0x100==0):
59             print "Dumped %04x."%i;
60         i+=1;
61     h.write_hex_file(f);
62 if(sys.argv[1]=="dumpdata"):
63     f = sys.argv[2];
64     start=0xE000;
65     stop=0xFFFF;
66     if(len(sys.argv)>3):
67         start=int(sys.argv[3],16);
68     if(len(sys.argv)>4):
69         stop=int(sys.argv[4],16);
70     
71     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
72     h = IntelHex(None);
73     i=start;
74     while i<=stop:
75         h[i]=client.CCpeekdatabyte(i);
76         if(i%0x100==0):
77             print "Dumped %04x."%i;
78         i+=1;
79     h.write_hex_file(f);
80 if(sys.argv[1]=="status"):
81     print "Status: %s" %client.CCstatusstr();
82 if(sys.argv[1]=="erase"):
83     print "Status: %s" % client.CCstatusstr();
84     client.CCchiperase();
85     print "Status: %s" %client.CCstatusstr();
86
87 if(sys.argv[1]=="peekinfo"):
88     print "Select info flash."
89     client.CCwr_config(1);
90     print "Config is %02x" % client.CCrd_config();
91     
92     start=0x0000;
93     if(len(sys.argv)>2):
94         start=int(sys.argv[2],16);
95     stop=start;
96     if(len(sys.argv)>3):
97         stop=int(sys.argv[3],16);
98     print "Peeking from %04x to %04x." % (start,stop);
99     while start<=stop:
100         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
101         start=start+1;
102 if(sys.argv[1]=="poke"):
103     client.CCpokeirambyte(int(sys.argv[2],16),
104                           int(sys.argv[3],16));
105 if(sys.argv[1]=="randtest"):
106     #Seed RNG
107     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
108     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
109     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
110     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
111     
112     #Dump values
113     for foo in range(1,10):
114         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
115         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
116         client.CCreleasecpu();
117         client.CChaltcpu();
118     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
119 if(sys.argv[1]=="adctest"):
120     # ADCTest 0xDF3A 0xDF3B
121     print "ADC TEST %02x%02x" % (
122         client.CCpeekdatabyte(0xDF3A),
123         client.CCpeekdatabyte(0xDF3B));
124 if(sys.argv[1]=="config"):
125     print "Config is %02x" % client.CCrd_config();
126
127 if(sys.argv[1]=="flash"):
128      f=sys.argv[2];
129      start=0;
130      stop=0xFFFF;
131      if(len(sys.argv)>3):
132          start=int(sys.argv[3],16);
133      if(len(sys.argv)>4):
134          stop=int(sys.argv[4],16);
135    
136      h = IntelHex(f);
137      page = 0x0000;
138      pagelen = 2048; #2kB pages in 32-bit words
139      bcount = 0;
140      
141      print "Wiping Flash."
142      #Wipe all of flash.
143      #client.CCchiperase();
144      #Wipe the RAM buffer for the next flash page.
145      #client.CCeraseflashbuffer();
146      for i in h._buf.keys():
147          while(i>page+pagelen):
148              if bcount>0:
149                  client.CCflashpage(page);
150                  #client.CCeraseflashbuffer();
151                  bcount=0;
152                  print "Flashed page at %06x" % page
153              page+=pagelen;
154              
155          #Place byte into buffer.
156          client.CCpokedatabyte(0xF000+i-page,
157                                h[i]);
158          bcount+=1;
159          if(i%0x100==0):
160                 print "Buffering %04x toward %06x" % (i,page);
161      #last page
162      client.CCflashpage(page);
163      print "Flashed final page at %06x" % page;
164      
165 if(sys.argv[1]=="lock"):
166     print "Status: %s" %client.CCstatusstr();
167     client.CClockchip();
168     print "Status: %s" %client.CCstatusstr();
169 if(sys.argv[1]=="flashpage"):
170     target=0;
171     if(len(sys.argv)>2):
172         target=int(sys.argv[2],16);
173     print "Writing a page of flash from 0xF000 in XDATA"
174     client.CCflashpage(target);
175 if(sys.argv[1]=="erasebuffer"):
176     print "Erasing flash buffer.";
177     client.CCeraseflashbuffer();
178
179 if(sys.argv[1]=="writedata"):
180     f=sys.argv[2];
181     start=0;
182     stop=0xFFFF;
183     if(len(sys.argv)>3):
184         start=int(sys.argv[3],16);
185     if(len(sys.argv)>4):
186         stop=int(sys.argv[4],16);
187     
188     h = IntelHex(f);
189     
190     for i in h._buf.keys():
191         if(i>=start and i<=stop):
192             client.CCpokedatabyte(i,h[i]);
193             if(i%0x100==0):
194                 print "%04x" % i;
195 #if(sys.argv[1]=="flashtest"):
196 #    client.CCflashtest();
197 if(sys.argv[1]=="peekdata"):
198     start=0x0000;
199     if(len(sys.argv)>2):
200         start=int(sys.argv[2],16);
201     stop=start;
202     if(len(sys.argv)>3):
203         stop=int(sys.argv[3],16);
204     print "Peeking from %04x to %04x." % (start,stop);
205     while start<=stop:
206         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
207         start=start+1;
208 if(sys.argv[1]=="peek"):
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.CCpeekirambyte(start));
218         start=start+1;
219
220 if(sys.argv[1]=="peekcode"):
221     start=0x0000;
222     if(len(sys.argv)>2):
223         start=int(sys.argv[2],16);
224     stop=start;
225     if(len(sys.argv)>3):
226         stop=int(sys.argv[3],16);
227     print "Peeking from %04x to %04x." % (start,stop);
228     while start<=stop:
229         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
230         start=start+1;
231 if(sys.argv[1]=="pokedata"):
232     start=0x0000;
233     val=0x00;
234     if(len(sys.argv)>2):
235         start=int(sys.argv[2],16);
236     if(len(sys.argv)>3):
237         val=int(sys.argv[3],16);
238     print "Poking %04x to become %02x." % (start,val);
239     client.CCpokedatabyte(start,val);
240
241 client.stop();