48729fc7fc6d247a35cfdc9b77e7ac3a6b757087
[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
16 def printpacket(packet):
17     s="";
18     i=0;
19     for foo in packet:
20         i=i+1;
21         #if i>client.packetlen: break;
22         s="%s %02x" % (s,ord(foo));
23     print "%s" %s;
24
25 if(len(sys.argv)==1):
26     print "Usage: %s verb [objects]\n" % sys.argv[0];
27     print "%s erase" % sys.argv[0];
28     print "%s flash $foo.hex" % sys.argv[0];
29     print "%s test" % sys.argv[0];
30     print "%s term" % sys.argv[0];
31     print "%s info" % sys.argv[0];
32     print "%s halt"  % sys.argv[0];
33     print "%s regs" % sys.argv[0];
34     print "%s dumpcode $foo.hex [0x$start 0x$stop]" % sys.argv[0];
35     print "%s dumpdata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
36     print "%s writedata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
37     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
38     print "%s peekdata 0x$start [0x$stop]" % sys.argv[0];
39     print "%s pokedata 0x$adr 0x$val" % sys.argv[0];
40     print "%s peek 0x$iram" % sys.argv[0];
41     print "%s poke 0x$iram 0x$val" % sys.argv[0];
42     print "%s peekcode 0x$start [0x$stop]" % sys.argv[0];
43     print "\n"
44     print "%s rssi [freq]\n\tGraphs signal strength on [freq] Hz." % sys.argv[0];
45     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
46     print "%s reflex [freq]\n\tJams on [freq] Hz." % sys.argv[0];
47     print "%s sniffsimpliciti [us|eu|lf]\n\tSniffs SimpliciTI packets." % sys.argv[0];
48     
49     sys.exit();
50
51 #Initailize FET and set baud rate
52 #client=GoodFET.GoodFETCC.GoodFETCC();
53 client=GoodFETCC();
54 client.serInit()
55
56 #Connect to target
57 client.setup();
58 client.start();
59
60
61
62 if(sys.argv[1]=="carrier"):
63     if len(sys.argv)>2:
64         client.RF_setfreq(eval(sys.argv[2]));
65     client.RF_carrier();
66     #printconfig();
67     #print "\nHolding a carrier wave.";
68     while(1):
69         time.sleep(1);
70
71 if(sys.argv[1]=="reflex"):
72     client.CC1110_crystal();
73     client.RF_idle();
74     
75     client.config_simpliciti();
76     client.pokebysym("MDMCFG4",   0x0c);  #ultrawide
77     client.pokebysym("FSCTRL1",   0x12);  #IF of 457.031
78     client.pokebysym("FSCTRL0",   0x00); 
79     client.pokebysym("FSCAL2" ,   0x2A);  #above mid
80     client.pokebysym("MCSM0"  ,   0x00);  # Main Radio Control State Machine
81     
82     client.pokebysym("FSCAL3"   , 0xEA)   # Frequency synthesizer calibration.
83     client.pokebysym("FSCAL2"   , 0x2A)   # Frequency synthesizer calibration.
84     client.pokebysym("FSCAL1"   , 0x00)   # Frequency synthesizer calibration.
85     client.pokebysym("FSCAL0"   , 0x1F)   # Frequency synthesizer calibration.
86         
87     client.pokebysym("TEST2"    , 0x88)   # Various test settings.
88     client.pokebysym("TEST1"    , 0x35)   # Various test settings.
89     client.pokebysym("TEST0"    , 0x09)   # Various test settings.
90     
91     threshold=200;
92     if len(sys.argv)>2:
93         client.RF_setfreq(eval(sys.argv[2]));
94     print "Listening on %f MHz." % (client.RF_getfreq()/10**6);
95     print "Jamming if RSSI>=%i" % threshold;
96     
97     #FIXME, ugly
98     RFST=0xDFE1
99     client.CC_RFST_CAL(); #SCAL
100     time.sleep(1);
101     
102     maxrssi=0;
103     while 1:
104         
105         client.CC_RFST_RX(); #SRX
106         rssi=client.RF_getrssi();
107         client.CC_RFST_IDLE(); #idle
108         time.sleep(0.01);
109         string="";
110         for foo in range(0,rssi>>2):
111             string=("%s."%string);
112         print "%02x %04i %04i %s" % (rssi,rssi, maxrssi, string); 
113         if rssi>maxrssi:
114             maxrssi=(rssi);
115         if rssi>threshold:
116             #print "Triggered jamming for 1s.";
117             client.RF_carrier();
118             time.sleep(1);
119             print "JAMMING JAMMING JAMMING JAMMING";
120 if(sys.argv[1]=="rssi"):
121     client.CC1110_crystal();
122     client.RF_idle();
123     
124     client.config_simpliciti();
125     
126     threshold=200;
127     if len(sys.argv)>2:
128         client.RF_setfreq(eval(sys.argv[2]));
129     print "Listening on %f MHz." % (client.RF_getfreq()/10**6);
130         
131     #FIXME, ugly
132     RFST=0xDFE1
133     client.CC_RFST_CAL();
134     time.sleep(1);
135     
136     while 1:
137         client.CC_RFST_RX();
138         rssi=client.RF_getrssi();
139         client.CC_RFST_IDLE(); #idle
140         time.sleep(0.01);
141         string="";
142         for foo in range(0,rssi>>2):
143             string=("%s."%string);
144         print "%02x %04i %s" % (rssi,rssi, string); 
145
146 if(sys.argv[1]=="sniffsimpliciti"):
147     #TODO remove all poke() calls.
148     
149     client.CC1110_crystal();
150     client.RF_idle();
151     
152     
153     client.config_simpliciti("lf");
154     #client.RF_setfreq(2481 * 10**6);
155     
156     #OpenBeacon defines these in little endian as follows.
157     #client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
158     #0x01, 0x02, 0x03, 0x02, 0x01
159     #client.RF_setsmac(0x0102030201);
160     #'O', 'C', 'A', 'E', 'B'
161     #client.RF_settmac(0x424541434F);
162     
163     #Set packet length of 16.
164     #client.RF_setpacketlen(16);
165     
166     
167     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
168                                            client.RF_getfreq()/10**6);
169     #Now we're ready to get packets.
170     while 1:
171         packet=None;
172         while packet==None:
173             #time.sleep(0.1);
174             packet=client.RF_rxpacket();
175         printpacket(packet);
176         sys.stdout.flush();
177
178
179
180 if(sys.argv[1]=="explore"):
181     print "Exploring undefined commands."
182     print "Status: %s" %client.status();
183     
184     cmd=0x04; #read status
185     for foo in range(0,0x5):
186         client.CCcmd([(0x0F<<3)|(0x00)|0x03,0x09<<3]);
187         print "Status %02x: %s" % (foo,client.status());
188     for foo in range(0,3):
189         print "PC: %04x" % client.CCgetPC();
190 if(sys.argv[1]=="term"):
191     GoodFETConsole(client).run();
192 if(sys.argv[1]=="test"):
193     client.test();
194 if(sys.argv[1]=="deadtest"):
195     for i in range(1,10):
196         print "IDENT as %s" % client.CCidentstr();
197 if(sys.argv[1]=="dumpcode"):
198     f = sys.argv[2];
199     start=0x0000;
200     stop=0xFFFF;
201     if(len(sys.argv)>3):
202         start=int(sys.argv[3],16);
203     if(len(sys.argv)>4):
204         stop=int(sys.argv[4],16);
205     
206     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
207     h = IntelHex(None);
208     i=start;
209     while i<=stop:
210         h[i]=client.CCpeekcodebyte(i);
211         if(i%0x100==0):
212             print "Dumped %04x."%i;
213         i+=1;
214     h.write_hex_file(f);
215 if(sys.argv[1]=="dumpdata"):
216     f = sys.argv[2];
217     start=0xE000;
218     stop=0xFFFF;
219     if(len(sys.argv)>3):
220         start=int(sys.argv[3],16);
221     if(len(sys.argv)>4):
222         stop=int(sys.argv[4],16);
223     
224     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
225     h = IntelHex(None);
226     i=start;
227     while i<=stop:
228         h[i]=client.CCpeekdatabyte(i);
229         if(i%0x100==0):
230             print "Dumped %04x."%i;
231         i+=1;
232     h.write_hex_file(f);
233 if(sys.argv[1]=="status"):
234     print "Status: %s" %client.status();
235 if(sys.argv[1]=="halt"):
236     print "Halting CPU."
237     client.halt();
238 if(sys.argv[1]=="info"):
239     print "Ident   %s" % client.CCidentstr();
240     
241     try:
242         print "Freq    %10.3f MHz" % (client.RF_getfreq()/10**6);
243         print "RSSI    %02x" % client.RF_getrssi();
244     except:
245         print "Freq, RSSI, etc unknown.  Install SmartRF7.";
246     #print "Rate    %10i kbps" % (client.RF_getrate()/1000);
247     #print "PacketLen %02i bytes" % client.RF_getpacketlen();
248     #print "SMAC  0x%010x" % client.RF_getsmac();
249     #print "TMAC  0x%010x" % client.RF_gettmac();
250
251 if(sys.argv[1]=="regs"):
252     client.CMDrs();
253
254 if(sys.argv[1]=="erase"):
255     print "Status: %s" % client.status();
256     client.CCchiperase();
257     print "Status: %s" %client.status();
258
259 if(sys.argv[1]=="peekinfo"):
260     print "Select info flash."
261     client.CCwr_config(1);
262     print "Config is %02x" % client.CCrd_config();
263     
264     start=0x0000;
265     if(len(sys.argv)>2):
266         start=int(sys.argv[2],16);
267     stop=start;
268     if(len(sys.argv)>3):
269         stop=int(sys.argv[3],16);
270     print "Peeking from %04x to %04x." % (start,stop);
271     while start<=stop:
272         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
273         start=start+1;
274 if(sys.argv[1]=="poke"):
275     client.CCpokeirambyte(int(sys.argv[2],16),
276                           int(sys.argv[3],16));
277 if(sys.argv[1]=="randtest"):
278     #Seed RNG
279     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
280     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
281     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
282     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
283     
284     #Dump values
285     for foo in range(1,10):
286         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
287         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
288         client.CCreleasecpu();
289         client.CChaltcpu();
290     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
291 if(sys.argv[1]=="adctest"):
292     # ADCTest 0xDF3A 0xDF3B
293     print "ADC TEST %02x%02x" % (
294         client.CCpeekdatabyte(0xDF3A),
295         client.CCpeekdatabyte(0xDF3B));
296 if(sys.argv[1]=="config"):
297     print "Config is %02x" % client.CCrd_config();
298
299 if(sys.argv[1]=="flash"):
300      f=sys.argv[2];
301      start=0;
302      stop=0xFFFF;
303      if(len(sys.argv)>3):
304          start=int(sys.argv[3],16);
305      if(len(sys.argv)>4):
306          stop=int(sys.argv[4],16);
307    
308      client.flash(f);
309 if(sys.argv[1]=="lock"):
310     print "Status: %s" %client.status();
311     client.CClockchip();
312     print "Status: %s" %client.status();
313 if(sys.argv[1]=="flashpage"):
314     target=0;
315     if(len(sys.argv)>2):
316         target=int(sys.argv[2],16);
317     print "Writing a page of flash from 0xF000 in XDATA"
318     client.CCflashpage(target);
319 if(sys.argv[1]=="erasebuffer"):
320     print "Erasing flash buffer.";
321     client.CCeraseflashbuffer();
322
323 if(sys.argv[1]=="writedata"):
324     f=sys.argv[2];
325     start=0;
326     stop=0xFFFF;
327     if(len(sys.argv)>3):
328         start=int(sys.argv[3],16);
329     if(len(sys.argv)>4):
330         stop=int(sys.argv[4],16);
331     
332     h = IntelHex(f);
333     
334     for i in h._buf.keys():
335         if(i>=start and i<=stop):
336             client.CCpokedatabyte(i,h[i]);
337             if(i%0x100==0):
338                 print "%04x" % i;
339 #if(sys.argv[1]=="flashtest"):
340 #    client.CCflashtest();
341 if(sys.argv[1]=="peekdata"):
342     start=0x0000;
343     if(len(sys.argv)>2):
344         start=int(sys.argv[2],16);
345     stop=start;
346     if(len(sys.argv)>3):
347         stop=int(sys.argv[3],16);
348     print "Peeking from %04x to %04x." % (start,stop);
349     while start<=stop:
350         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
351         start=start+1;
352 if(sys.argv[1]=="peek"):
353     start=0x0000;
354     if(len(sys.argv)>2):
355         start=int(sys.argv[2],16);
356     stop=start;
357     if(len(sys.argv)>3):
358         stop=int(sys.argv[3],16);
359     print "Peeking from %04x to %04x." % (start,stop);
360     while start<=stop:
361         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
362         start=start+1;
363 if(sys.argv[1]=="verify"):
364     f=sys.argv[2];
365     start=0;
366     stop=0xFFFF;
367     if(len(sys.argv)>3):
368         start=int(sys.argv[3],16);
369     if(len(sys.argv)>4):
370         stop=int(sys.argv[4],16);
371     
372     h = IntelHex(f);
373     for i in h._buf.keys():
374         if(i>=start and i<stop):
375             peek=client.CCpeekcodebyte(i)
376             if(h[i]!=peek):
377                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
378             if(i%0x100==0):
379                 print "%04x" % i;
380 if(sys.argv[1]=="peekcode"):
381     start=0x0000;
382     if(len(sys.argv)>2):
383         start=int(sys.argv[2],16);
384     stop=start;
385     if(len(sys.argv)>3):
386         stop=int(sys.argv[3],16);
387     print "Peeking from %04x to %04x." % (start,stop);
388     while start<=stop:
389         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
390         start=start+1;
391 if(sys.argv[1]=="pokedata"):
392     start=0x0000;
393     val=0x00;
394     if(len(sys.argv)>2):
395         start=int(sys.argv[2],16);
396     if(len(sys.argv)>3):
397         val=int(sys.argv[3],16);
398     print "Poking %04x to become %02x." % (start,val);
399     client.CCpokedatabyte(start,val);
400
401 client.stop();