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