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);
166 client.RF_txpacket([0x3f, 0x01, 0x08, 0x82,
167 0xDE, 0xff, 0xff, 0xff,
168 0xde, 0xad, 0xbe, 0xef,
176 #0x00, 0xA7, #CC2420 SFD
178 0x0f, 0x01, 0x08, 0x82,
179 0xff, 0xff, 0xff, 0xff,
180 0xde, 0xad, 0xbe, 0xef,
183 0xff, 0xff, 0xff, 0xff,
184 0xff, 0xff, 0xff, 0xff,
185 0xff, 0xff, 0xff, 0xff,
186 0xff, 0xff, 0xff, 0xff,
187 0xff, 0xff, 0xff, 0xff,
188 0xff, 0xff, 0xff, 0xff,
189 0xff, 0xff, 0xff, 0xff,
192 if(sys.argv[1]=="peek"):
195 start=int(sys.argv[2],16);
198 stop=int(sys.argv[3],16);
199 print "Peeking from %04x to %04x." % (start,stop);
201 print "%04x: 0x%04x" % (start,client.peek(start));
203 if(sys.argv[1]=="poke"):
207 start=int(sys.argv[2],16);
209 val=int(sys.argv[3],16);
210 print "Poking r%02x to become 0x%04x." % (start,val);
212 client.poke(start,val);