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