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,
156 if(sys.argv[1]=="txpiptest"):
158 freq=eval(sys.argv[2]);
160 client.RF_setfreq(freq);
162 print "Channels not yet supported."
163 print "Transmitting on as %010x on %i MHz" % (
165 client.RF_getfreq()/10**6);
167 client.RF_setsync(0xFFFF);
172 #Real header, must begin with SFD.
177 0x1f, 0x01, 0x08, 0x82,
178 0xDF, 0xff, 0xff, 0xff,
179 0xde, 0xad, 0xbe, 0xef,
186 0x00, 0xA7, #CC2420 SFD
188 0x0f, 0x01, 0x08, 0x82,
189 0xff, 0xff, 0xff, 0xff,
190 0xde, 0xad, 0xbe, 0xef,
193 0xff, 0xff, 0xff, 0xff,
194 0xff, 0xff, 0xff, 0xff,
195 0xff, 0xff, 0xff, 0xff,
196 0xff, 0xff, 0xff, 0xff,
197 0xff, 0xff, 0xff, 0xff,
198 0xff, 0xff, 0xff, 0xff,
199 0xff, 0xff, 0xff, 0xff,
202 if(sys.argv[1]=="peek"):
205 start=int(sys.argv[2],16);
208 stop=int(sys.argv[3],16);
209 print "Peeking from %04x to %04x." % (start,stop);
211 print "%04x: 0x%04x" % (start,client.peek(start));
213 if(sys.argv[1]=="poke"):
217 start=int(sys.argv[2],16);
219 val=int(sys.argv[3],16);
220 print "Poking r%02x to become 0x%04x." % (start,val);
222 client.poke(start,val);