More OOK stuff.
[goodfet] / client / goodfet.nrf
1 #!/usr/bin/env python
2
3 #GoodFET SPI Flash Client
4 #by Travis Goodspeed
5
6 import sys;
7 import binascii;
8 import array;
9 import time;
10
11 from GoodFETNRF import GoodFETNRF;
12 from intelhex import IntelHex;
13
14
15 regnames=["CONFIG","EN_AA","EN_RXADDR","SETUP_AW","SETUP_RET",
16           "RF_CH","RF_SETUP","STATUS","OBSERVE_TX","RPD",
17           "RX_ADDR_P0","RX_ADDR_P1","RX_ADDR_P2","RX_ADDR_P3","RX_ADDR_P4","RX_ADDR_P5",
18           "TX_ADDR",
19           "RX_PW_P0","RX_PW_P1","RX_PW_P2","RX_PW_P3","RX_PW_P4","RX_PW_P5",
20           "FIFO_STATUS","?",
21           "?","?","DYNPD","?","?","?","?","?",
22           "?","?","?","?","?","?","?","?"];
23
24 def printpacket(packet):
25     s="";
26     i=0;
27     for foo in packet:
28         i=i+1;
29         if i>client.packetlen: break;
30         s="%s %02x" % (s,ord(foo));
31     print "%s" %s;
32
33 def printconfig():
34     print "Encoding %s" % client.RF_getenc();
35     print "Freq    %10i MHz" % (client.RF_getfreq()/10**6);
36     print "Rate    %10i kbps" % (client.RF_getrate()/1000);
37     print "PacketLen %02i bytes" % client.RF_getpacketlen();
38     #print "MacLen    %2i bytes" % client.RF_getmaclen();
39     print "SMAC  0x%010x" % client.RF_getsmac();
40     print "TMAC  0x%010x" % client.RF_gettmac();
41
42
43 if(len(sys.argv)==1):
44     print "Usage: %s verb [objects]\n" % sys.argv[0];
45     print "%s info" % sys.argv[0];
46     print "%s test" % sys.argv[0];
47     print "%s regs" % sys.argv[0];
48     print "%s pyregs" % sys.argv[0];
49
50     print "%s sniff\n\tSniffs packets by current config." % sys.argv[0];
51     print "%s sniffob\n\tSniffs OpenBeacon traffic." % sys.argv[0];
52     print "%s snifftp\n\tSniffs Turning Point Clicker traffic." % sys.argv[0];
53     print "%s snifftp\n\tSniffs SparkFun Dongle traffic." % sys.argv[0];
54     
55     print "%s hosttp\n\tHosts Turning Point Clicker traffic." % sys.argv[0];
56
57     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
58     sys.exit();
59
60 #Initialize FET and set baud rate
61 client=GoodFETNRF();
62 client.serInit()
63
64 client.NRFsetup();
65
66 if(sys.argv[1]=="info"):
67     printconfig();
68
69 if(sys.argv[1]=="test"):
70     print "Old registers:"
71     printconfig();
72     
73     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
74     client.poke(0x00,2);
75     #Delay of 1.5ms by round-trip.
76     
77     print "\n\n";
78     
79     #Try all data rates
80     for foo in [250*10**3,
81                 1*10**6,
82                 2*10**6]:
83         client.RF_setrate(foo);
84         if(client.RF_getrate()!=foo):
85             print "ERROR Rate %i not supported.  Got %i instead." % (foo,
86                                                                      client.RF_getrate());
87     
88     print "\n\n";
89     client.poke(0x0A,0xDEADBEEF,5);
90     #print "SMAC set to %010x" % client.RF_getsmac();
91     if client.RF_getsmac()!=0xdeadbeef:
92         print "ERROR: Failed to set MAC address.";
93     print "Final registers:"
94     printconfig();
95     
96 if(sys.argv[1]=="carrier"):
97     if len(sys.argv)>2:
98         client.RF_setfreq(eval(sys.argv[2]));
99     client.RF_carrier();
100     printconfig();
101     print "\nHolding a carrier wave.";
102     while(1):
103         time.sleep(1);
104 if(sys.argv[1]=="regs"):
105     for r in range(0,0x20):
106         print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]);
107 if(sys.argv[1]=="pyregs"):
108     for r in range(0,0x20):
109         print "client.set(0x%02x,0x%010x); #%16s " % (r,client.peek(r),regnames[r]);
110
111 if(sys.argv[1]=="peek"):
112     start=0x0000;
113     if(len(sys.argv)>2):
114         start=int(sys.argv[2],16);
115     stop=start;
116     if(len(sys.argv)>3):
117         stop=int(sys.argv[3],16);
118     print "Peeking from %02x to %02x." % (start,stop);
119     while start<=stop:
120         print "%02x: %010x" % (start,client.peek(start));
121         start=start+1;
122 if(sys.argv[1]=="poke"):
123     start=0x0000;
124     val=0x00;
125     if(len(sys.argv)>2):
126         start=int(sys.argv[2],16);
127     if(len(sys.argv)>3):
128         val=int(sys.argv[3],16);
129     print "Poking %02x to become %010x." % (start,val);
130     
131     client.poke(start,val);
132     print "Poked to %04x" % client.peek(start);
133
134 if(sys.argv[1]=="sniffob"):
135     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
136     #TODO remove all poke() calls.
137     
138     client.poke(0x00,0x00); #Stop nRF
139     client.poke(0x01,0x00); #Disable Shockburst
140     client.poke(0x02,0x01); #Set RX Pipe 0
141     
142     client.RF_setfreq(2481 * 10**6);
143     client.poke(0x06,0x09); #2MBps, -18dBm in RF_SETUP
144     client.poke(0x07,0x78); #Reset status register
145     
146     #OpenBeacon defines these in little endian as follows.
147     client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
148     #0x01, 0x02, 0x03, 0x02, 0x01
149     client.RF_setsmac(0x0102030201);
150     #'O', 'C', 'A', 'E', 'B'
151     client.RF_settmac(0x424541434F);
152     
153     #Set packet length of 16.
154     client.RF_setpacketlen(16);
155     
156     #Power radio, prime for RX, one-byte checksum.
157     client.poke(0x00,0x70|0x03|0x08); #0x08 for one byte, 0x04 for two.
158     
159     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
160                                            client.RF_getfreq()/10**6);
161     #Now we're ready to get packets.
162     while 1:
163         packet=None;
164         while packet==None:
165             #time.sleep(0.1);
166             packet=client.RF_rxpacket();
167         printpacket(packet);
168         sys.stdout.flush();
169
170 if(sys.argv[1]=="sniffsf"):
171     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
172     #TODO remove all poke() calls.
173     
174     client.poke(0x00,0x00); #Stop nRF
175     client.poke(0x01,0x00); #Disable Shockburst
176     client.poke(0x02,0x01); #Set RX Pipe 0
177     
178     client.RF_setfreq(2402 * 10**6);
179     client.poke(0x06,0x07); #1Mbps
180     client.poke(0x07,0x78); #Reset status register
181     
182     #OpenBeacon defines these in little endian as follows.
183     client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
184     #0x01, 0x02, 0x03, 0x02, 0x01
185     client.RF_setsmac(0xe7e7e7e7e7);
186     #'O', 'C', 'A', 'E', 'B'
187     client.RF_settmac(0xe7e7e7e7e7);
188     
189     #Set packet length of 16.
190     client.RF_setpacketlen(4);
191     
192     #Power radio, prime for RX, one-byte checksum.
193     client.poke(0x00,0x70|0x03|0x08); #0x08 for one byte, 0x04 for two.
194     
195     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
196                                            client.RF_getfreq()/10**6);
197     #Now we're ready to get packets.
198     while 1:
199         packet=None;
200         while packet==None:
201             #time.sleep(0.1);
202             packet=client.RF_rxpacket();
203         printpacket(packet);
204         sys.stdout.flush();
205
206 if(sys.argv[1]=="snifftp"):
207     client.poke(0x00,0x00); #Stop nRF
208     client.poke(0x01,0x00); #Disable Shockburst
209     client.poke(0x02,0x01); #Set RX Pipe 0
210     
211     client.RF_setfreq((2400+0x29) * 10**6);
212     client.poke(0x06,0x00); #1Mbps
213     client.poke(0x07,0x78); #Reset status register
214     
215     client.RF_setmaclen(3); # SETUP_AW for 3-byte addresses.
216     client.RF_setsmac(0x123456);
217     client.RF_setpacketlen(4);
218     
219     #Power radio, prime for RX, two-byte checksum.
220     client.poke(0x00,0x70|0x03|0x04|0x08);
221     
222     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
223                                            client.RF_getfreq()/10**6);
224     #Now we're ready to get packets.
225     while 1:
226         packet=None;
227         while packet==None:
228             #time.sleep(0.1);
229             packet=client.RF_rxpacket();
230         printpacket(packet);
231         sys.stdout.flush();
232
233 if(sys.argv[1]=="hosttp"):
234     client.poke(0x00,0x00); #Stop nRF
235     client.poke(0x01,0x00); #Disable Shockburst
236     client.poke(0x02,0x01); #Set RX Pipe 0
237     
238     chan=0x29;
239
240     client.RF_setfreq((2400+chan) * 10**6);
241     client.poke(0x06,0x00); #1Mbps
242     client.poke(0x07,0x78); #Reset status register
243     
244     client.RF_setmaclen(3); # SETUP_AW for 3-byte addresses.
245     client.RF_setsmac(0x123456);
246     client.RF_setpacketlen(4);
247     
248     #Power radio, prime for RX, two-byte checksum.
249     client.poke(0x00,0x70|0x03|0x04|0x08);
250     
251     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
252                                            client.RF_getfreq()/10**6);
253     #Now we're ready to get packets.
254     while 1:
255         packet=None;
256         while packet==None:
257             packet=client.RF_rxpacket();
258         mac=((ord(packet[0])<<16)+
259              (ord(packet[1])<<8)+
260              ord(packet[2]));
261         key=packet[3];
262         print "%c from %06x" % (key,mac);
263         sys.stdout.flush();
264
265 if(sys.argv[1]=="sniff"):
266     #client.poke(0x00,0x00); #Stop nRF
267     client.poke(0x07,0x78); #Reset status register
268     
269     #Power radio, prime for RX, checksum.
270     client.poke(0x00,0x70|0x03|0x08);
271     
272     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
273                                            client.RF_getfreq()/10**6);
274     #Now we're ready to get packets.
275     
276     while 1:
277         packet=None;
278         while packet==None:
279             #time.sleep(0.1);
280             packet=client.RF_rxpacket();
281         printpacket(packet);
282         sys.stdout.flush();
283 if(sys.argv[1]=="explore"):
284     #client.poke(0x00,0x00); #Stop nRF
285     client.poke(0x07,0x78); #Reset status register
286     
287     #Power radio, prime for RX, no checksum.
288     client.poke(0x00,0x70|0x03);
289     
290     #Set packet length of 32.
291     #Without checksums, extra data will mix in.
292     client.RF_setpacketlen(32);
293     client.RF_setmaclen(3); # shortest address length
294     
295     #Now we're ready to get packets.
296     for smac in [0x0102030201, 0]:
297         client.RF_setsmac(smac);
298         for chan in range(0,0x80):
299             client.RF_setfreq((2400+chan) * 10**6);
300             time.sleep(1);
301             packet=client.RF_rxpacket();
302             if packet!=None:
303                 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
304                                                         client.RF_getfreq()/10**6);
305                 printpacket(packet);
306                 sys.stdout.flush();