3 #GoodFET Chipcon SPI Client
4 # (C) 2011 Travis Goodspeed
7 #Might be CC2420 Specific
13 from GoodFETCCSPI import GoodFETCCSPI;
16 print "Usage: %s verb [objects]\n" % sys.argv[0];
17 print "%s info" % sys.argv[0];
18 print "%s regs" % sys.argv[0];
19 print "%s test" % sys.argv[0];
20 print "%s peek 0x$start [0x$stop]" % sys.argv[0];
21 print "%s poke 0x$adr 0x$val" % sys.argv[0];
22 print "%s txtest" % sys.argv[0];
24 print "\n%s rssi" % sys.argv[0];
25 print "%s sniff [chan]" % sys.argv[0];
26 print "%s bsniff [chan]" % sys.argv[0];
27 print "%s sniffdissect" % sys.argv[0];
31 #Initialize FET and set baud rate
32 client=GoodFETCCSPI();
39 #Might read as all ones if chip has a startup delay.
41 if(sys.argv[1]=="carrier"):
43 client.RF_setfreq(eval(sys.argv[2]));
49 if(sys.argv[1]=="modulated_spectrum"):
51 client.RF_setfreq(eval(sys.argv[2]));
53 client.RF_modulated_spectrum();
57 if(sys.argv[1]=="info"):
58 print "Found %s" % client.identstr();
59 print "Freq: %05f MHz" % (client.RF_getfreq()/(10**6));
60 print "Status: %s" % client.status();
61 if(sys.argv[1]=="regs"):
62 for adr in range(0x10,0x40): #*1024):
64 print "%04x:=0x%04x" % (adr,val);
65 if(sys.argv[1]=="test"):
66 data=client.trans([0x20, 0xde, 0xad]);
67 print "%02x %02x" % (ord(data[1]), ord(data[2]));
68 data=client.trans([0x40|0x20, 0xde, 0xad]);
69 print "%02x %02x" % (ord(data[1]), ord(data[2]));
70 if(sys.argv[1]=="rssi"):
72 freq=eval(sys.argv[2]);
74 client.RF_setfreq(freq);
76 client.RF_setchan(freq);
77 print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6);
79 client.strobe(0x02); #Calibrate
84 #client.strobe(0x03); #SRXON
85 rssi=client.RF_getrssi();
86 #client.CC_RFST_IDLE(); #idle
89 for foo in range(0,rssi>>2):
90 string=("%s."%string);
91 print "%02x %04i %s" % (rssi,rssi, string);
92 if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"):
94 client.RF_promiscuity(1);
98 freq=eval(sys.argv[2]);
100 client.RF_setfreq(freq);
102 client.RF_setchan(freq);
104 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
105 client.RF_getfreq()/10**6);
106 #Now we're ready to get packets.
110 packet=client.RF_rxpacket();
111 if sys.argv[1]=="sniffdissect":
112 client.printdissect(packet);
114 client.printpacket(packet);
116 if(sys.argv[1]=="bsniff"):
118 client.RF_promiscuity(0);
119 client.RF_setsmac(0xFFFFFFFF);
120 client.RF_autocrc(1);
123 freq=eval(sys.argv[2]);
125 client.RF_setfreq(freq);
127 client.RF_setchan(freq);
129 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
130 client.RF_getfreq()/10**6);
131 #Now we're ready to get packets.
135 packet=client.RF_rxpacket();
136 client.printpacket(packet);
139 if(sys.argv[1]=="txtest"):
141 freq=eval(sys.argv[2]);
143 client.RF_setfreq(freq);
145 client.RF_setchan(freq);
146 print "Transmitting DEADBEEF as %010x on %i MHz" % (
148 client.RF_getfreq()/10**6);
151 client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
152 0xff, 0xff, 0xff, 0xff,
153 0xde, 0xad, 0xbe, 0xef,
155 if(sys.argv[1]=="txtoscount"):
157 Clone of what TinyOS's BlinkToLED demo code does.
158 Specify a channel a TinyOS mote programmed with BlinkToLED is on, and this will act as the second device.
160 client.RF_promiscuity(1);
161 client.RF_autocrc(1);
163 freq=eval(sys.argv[2]);
165 client.RF_setfreq(freq);
167 client.RF_setchan(freq);
169 print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6);
170 print "Transmitting like the TinyOS CountToRadio program on %i MHz" % (client.RF_getfreq()/10**6);
172 #countpkt = [0x0f, 0x41, 0x88, 0xFF, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x3f, 0x06, 0xFF, 0x00, 0x00];
176 packet=client.RF_rxpacket();
178 client.printpacket(packet);
179 pkt = packet[:14]# + "\x00\x00";
181 client.printpacket(pkt)
182 client.RF_txpacket(pkt);
183 #TODO expand to actually do increments itself, if desired:
189 #client.RF_txpacket(pkt);
194 if(sys.argv[1]=="txpiptest"):# or sys.argv[1]=="txpipscapy"):
196 freq=eval(sys.argv[2]);
198 client.RF_setfreq(freq);
200 client.RF_setchan(freq);
201 print "Transmitting on as %010x on %i MHz" % (
203 client.RF_getfreq()/10**6);
205 client.RF_setsync(0xFFFF);
210 #Real header, must begin with SFD.
215 0x1f, 0x01, 0x08, 0x82,
216 0xDF, 0xff, 0xff, 0xff,
217 0xde, 0xad, 0xbe, 0xef,
223 0x00, 0xA7, #CC2420 SFD
225 0x0f, 0x01, 0x08, 0x82,
226 0xff, 0xff, 0xff, 0xff,
227 0xde, 0xad, 0xbe, 0xef,
230 0xff, 0xff, 0xff, 0xff,
231 0xff, 0xff, 0xff, 0xff,
232 0xff, 0xff, 0xff, 0xff,
233 0xff, 0xff, 0xff, 0xff,
234 0xff, 0xff, 0xff, 0xff,
235 0xff, 0xff, 0xff, 0xff,
236 0xff, 0xff, 0xff, 0xff,
239 if(sys.argv[1]=="peek"):
242 start=int(sys.argv[2],16);
245 stop=int(sys.argv[3],16);
246 print "Peeking from %04x to %04x." % (start,stop);
248 print "%04x: 0x%04x" % (start,client.peek(start));
250 if(sys.argv[1]=="poke"):
254 start=int(sys.argv[2],16);
256 val=int(sys.argv[3],16);
257 print "Poking r%02x to become 0x%04x." % (start,val);
259 client.poke(start,val);