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