Reflex works.
[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.01);
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 1s.";
117             client.RF_carrier();
118             time.sleep(1);
119             print "JAMMING JAMMING JAMMING JAMMING";
120
121 if(sys.argv[1]=="sniffsimpliciti"):
122     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
123     #TODO remove all poke() calls.
124     
125     client.config_simpliciti("lf");
126     #client.RF_setfreq(2481 * 10**6);
127     
128     #OpenBeacon defines these in little endian as follows.
129     #client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
130     #0x01, 0x02, 0x03, 0x02, 0x01
131     #client.RF_setsmac(0x0102030201);
132     #'O', 'C', 'A', 'E', 'B'
133     #client.RF_settmac(0x424541434F);
134     
135     #Set packet length of 16.
136     #client.RF_setpacketlen(16);
137     
138     
139     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
140                                            client.RF_getfreq()/10**6);
141     #Now we're ready to get packets.
142     while 1:
143         packet=None;
144         while packet==None:
145             #time.sleep(0.1);
146             packet=client.RF_rxpacket();
147         printpacket(packet);
148         sys.stdout.flush();
149
150
151
152 if(sys.argv[1]=="explore"):
153     print "Exploring undefined commands."
154     print "Status: %s" %client.status();
155     
156     cmd=0x04; #read status
157     for foo in range(0,0x5):
158         client.CCcmd([(0x0F<<3)|(0x00)|0x03,0x09<<3]);
159         print "Status %02x: %s" % (foo,client.status());
160     for foo in range(0,3):
161         print "PC: %04x" % client.CCgetPC();
162 if(sys.argv[1]=="term"):
163     GoodFETConsole(client).run();
164 if(sys.argv[1]=="test"):
165     client.test();
166 if(sys.argv[1]=="deadtest"):
167     for i in range(1,10):
168         print "IDENT as %s" % client.CCidentstr();
169 if(sys.argv[1]=="dumpcode"):
170     f = sys.argv[2];
171     start=0x0000;
172     stop=0xFFFF;
173     if(len(sys.argv)>3):
174         start=int(sys.argv[3],16);
175     if(len(sys.argv)>4):
176         stop=int(sys.argv[4],16);
177     
178     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
179     h = IntelHex(None);
180     i=start;
181     while i<=stop:
182         h[i]=client.CCpeekcodebyte(i);
183         if(i%0x100==0):
184             print "Dumped %04x."%i;
185         i+=1;
186     h.write_hex_file(f);
187 if(sys.argv[1]=="dumpdata"):
188     f = sys.argv[2];
189     start=0xE000;
190     stop=0xFFFF;
191     if(len(sys.argv)>3):
192         start=int(sys.argv[3],16);
193     if(len(sys.argv)>4):
194         stop=int(sys.argv[4],16);
195     
196     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
197     h = IntelHex(None);
198     i=start;
199     while i<=stop:
200         h[i]=client.CCpeekdatabyte(i);
201         if(i%0x100==0):
202             print "Dumped %04x."%i;
203         i+=1;
204     h.write_hex_file(f);
205 if(sys.argv[1]=="status"):
206     print "Status: %s" %client.status();
207 if(sys.argv[1]=="halt"):
208     print "Halting CPU."
209     client.halt();
210 if(sys.argv[1]=="info"):
211     print "Ident   %s" % client.CCidentstr();
212     
213     try:
214         print "Freq    %10.3f MHz" % (client.RF_getfreq()/10**6);
215         print "RSSI    %02x" % client.RF_getrssi();
216     except:
217         print "Freq, RSSI, etc unknown.  Install SmartRF7.";
218     #print "Rate    %10i kbps" % (client.RF_getrate()/1000);
219     #print "PacketLen %02i bytes" % client.RF_getpacketlen();
220     #print "SMAC  0x%010x" % client.RF_getsmac();
221     #print "TMAC  0x%010x" % client.RF_gettmac();
222
223 if(sys.argv[1]=="regs"):
224     client.CMDrs();
225
226 if(sys.argv[1]=="erase"):
227     print "Status: %s" % client.status();
228     client.CCchiperase();
229     print "Status: %s" %client.status();
230
231 if(sys.argv[1]=="peekinfo"):
232     print "Select info flash."
233     client.CCwr_config(1);
234     print "Config is %02x" % client.CCrd_config();
235     
236     start=0x0000;
237     if(len(sys.argv)>2):
238         start=int(sys.argv[2],16);
239     stop=start;
240     if(len(sys.argv)>3):
241         stop=int(sys.argv[3],16);
242     print "Peeking from %04x to %04x." % (start,stop);
243     while start<=stop:
244         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
245         start=start+1;
246 if(sys.argv[1]=="poke"):
247     client.CCpokeirambyte(int(sys.argv[2],16),
248                           int(sys.argv[3],16));
249 if(sys.argv[1]=="randtest"):
250     #Seed RNG
251     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
252     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
253     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
254     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
255     
256     #Dump values
257     for foo in range(1,10):
258         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
259         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
260         client.CCreleasecpu();
261         client.CChaltcpu();
262     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
263 if(sys.argv[1]=="adctest"):
264     # ADCTest 0xDF3A 0xDF3B
265     print "ADC TEST %02x%02x" % (
266         client.CCpeekdatabyte(0xDF3A),
267         client.CCpeekdatabyte(0xDF3B));
268 if(sys.argv[1]=="config"):
269     print "Config is %02x" % client.CCrd_config();
270
271 if(sys.argv[1]=="flash"):
272      f=sys.argv[2];
273      start=0;
274      stop=0xFFFF;
275      if(len(sys.argv)>3):
276          start=int(sys.argv[3],16);
277      if(len(sys.argv)>4):
278          stop=int(sys.argv[4],16);
279    
280      client.flash(f);
281 if(sys.argv[1]=="lock"):
282     print "Status: %s" %client.status();
283     client.CClockchip();
284     print "Status: %s" %client.status();
285 if(sys.argv[1]=="flashpage"):
286     target=0;
287     if(len(sys.argv)>2):
288         target=int(sys.argv[2],16);
289     print "Writing a page of flash from 0xF000 in XDATA"
290     client.CCflashpage(target);
291 if(sys.argv[1]=="erasebuffer"):
292     print "Erasing flash buffer.";
293     client.CCeraseflashbuffer();
294
295 if(sys.argv[1]=="writedata"):
296     f=sys.argv[2];
297     start=0;
298     stop=0xFFFF;
299     if(len(sys.argv)>3):
300         start=int(sys.argv[3],16);
301     if(len(sys.argv)>4):
302         stop=int(sys.argv[4],16);
303     
304     h = IntelHex(f);
305     
306     for i in h._buf.keys():
307         if(i>=start and i<=stop):
308             client.CCpokedatabyte(i,h[i]);
309             if(i%0x100==0):
310                 print "%04x" % i;
311 #if(sys.argv[1]=="flashtest"):
312 #    client.CCflashtest();
313 if(sys.argv[1]=="peekdata"):
314     start=0x0000;
315     if(len(sys.argv)>2):
316         start=int(sys.argv[2],16);
317     stop=start;
318     if(len(sys.argv)>3):
319         stop=int(sys.argv[3],16);
320     print "Peeking from %04x to %04x." % (start,stop);
321     while start<=stop:
322         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
323         start=start+1;
324 if(sys.argv[1]=="peek"):
325     start=0x0000;
326     if(len(sys.argv)>2):
327         start=int(sys.argv[2],16);
328     stop=start;
329     if(len(sys.argv)>3):
330         stop=int(sys.argv[3],16);
331     print "Peeking from %04x to %04x." % (start,stop);
332     while start<=stop:
333         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
334         start=start+1;
335 if(sys.argv[1]=="verify"):
336     f=sys.argv[2];
337     start=0;
338     stop=0xFFFF;
339     if(len(sys.argv)>3):
340         start=int(sys.argv[3],16);
341     if(len(sys.argv)>4):
342         stop=int(sys.argv[4],16);
343     
344     h = IntelHex(f);
345     for i in h._buf.keys():
346         if(i>=start and i<stop):
347             peek=client.CCpeekcodebyte(i)
348             if(h[i]!=peek):
349                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
350             if(i%0x100==0):
351                 print "%04x" % i;
352 if(sys.argv[1]=="peekcode"):
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.CCpeekcodebyte(start));
362         start=start+1;
363 if(sys.argv[1]=="pokedata"):
364     start=0x0000;
365     val=0x00;
366     if(len(sys.argv)>2):
367         start=int(sys.argv[2],16);
368     if(len(sys.argv)>3):
369         val=int(sys.argv[3],16);
370     print "Poking %04x to become %02x." % (start,val);
371     client.CCpokedatabyte(start,val);
372
373 client.stop();