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