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