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);
97 freq=eval(sys.argv[2]);
99 client.RF_setfreq(freq);
101 client.RF_setchan(freq);
103 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
104 client.RF_getfreq()/10**6);
105 #Now we're ready to get packets.
109 packet=client.RF_rxpacket();
110 if sys.argv[1]=="sniffdissect":
111 client.printdissect(packet);
113 client.printpacket(packet);
115 if(sys.argv[1]=="bsniff"):
117 client.RF_promiscuity(0);
118 client.RF_setsmac(0xFFFFFFFF);
121 freq=eval(sys.argv[2]);
123 client.RF_setfreq(freq);
125 client.RF_setchan(freq);
127 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
128 client.RF_getfreq()/10**6);
129 #Now we're ready to get packets.
133 packet=client.RF_rxpacket();
134 client.printpacket(packet);
137 if(sys.argv[1]=="txtest"):
139 freq=eval(sys.argv[2]);
141 client.RF_setfreq(freq);
143 client.RF_setchan(freq);
144 print "Transmitting DEADBEEF as %010x on %i MHz" % (
146 client.RF_getfreq()/10**6);
149 client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
150 0xff, 0xff, 0xff, 0xff,
151 0xde, 0xad, 0xbe, 0xef,
154 if(sys.argv[1]=="txpiptest"):
156 freq=eval(sys.argv[2]);
158 client.RF_setfreq(freq);
160 print "Channels not yet supported."
161 print "Transmitting on as %010x on %i MHz" % (
163 client.RF_getfreq()/10**6);
165 client.RF_setsync(0xFFFF);
170 #Real header, must begin with SFD.
175 0x1f, 0x01, 0x08, 0x82,
176 0xDF, 0xff, 0xff, 0xff,
177 0xde, 0xad, 0xbe, 0xef,
184 0x00, 0xA7, #CC2420 SFD
186 0x0f, 0x01, 0x08, 0x82,
187 0xff, 0xff, 0xff, 0xff,
188 0xde, 0xad, 0xbe, 0xef,
191 0xff, 0xff, 0xff, 0xff,
192 0xff, 0xff, 0xff, 0xff,
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,
200 if(sys.argv[1]=="peek"):
203 start=int(sys.argv[2],16);
206 stop=int(sys.argv[3],16);
207 print "Peeking from %04x to %04x." % (start,stop);
209 print "%04x: 0x%04x" % (start,client.peek(start));
211 if(sys.argv[1]=="poke"):
215 start=int(sys.argv[2],16);
217 val=int(sys.argv[3],16);
218 print "Poking r%02x to become 0x%04x." % (start,val);
220 client.poke(start,val);