still working on it
[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 Tunrning Point Clicker traffic." % sys.argv[0];
53
54     print "%s hosttp\n\tHosts Tunrning Point Clicker traffic." % sys.argv[0];
55
56     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
57     sys.exit();
58
59 #Initialize FET and set baud rate
60 client=GoodFETNRF();
61 client.serInit()
62
63 client.NRFsetup();
64
65 if(sys.argv[1]=="info"):
66     printconfig();
67
68 if(sys.argv[1]=="test"):
69     print "Old registers:"
70     printconfig();
71     
72     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
73     client.poke(0x00,2);
74     #Delay of 1.5ms by round-trip.
75     
76     print "\n\n";
77     
78     #Try all data rates
79     for foo in [250*10**3,
80                 1*10**6,
81                 2*10**6]:
82         client.RF_setrate(foo);
83         if(client.RF_getrate()!=foo):
84             print "ERROR Rate %i not supported.  Got %i instead." % (foo,
85                                                                      client.RF_getrate());
86     
87     print "\n\n";
88     client.poke(0x0A,0xDEADBEEF,5);
89     #print "SMAC set to %010x" % client.RF_getsmac();
90     if client.RF_getsmac()!=0xdeadbeef:
91         print "ERROR: Failed to set MAC address.";
92     print "Final registers:"
93     printconfig();
94     
95 if(sys.argv[1]=="carrier"):
96     if len(sys.argv)>2:
97         client.RF_setfreq(eval(sys.argv[2]));
98     client.RF_carrier();
99     printconfig();
100     print "\nHolding a carrier wave.";
101     while(1):
102         time.sleep(1);
103 if(sys.argv[1]=="regs"):
104     for r in range(0,0x20):
105         print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]);
106 if(sys.argv[1]=="pyregs"):
107     for r in range(0,0x20):
108         print "client.set(0x%02x,0x%010x); #%16s " % (r,client.peek(r),regnames[r]);
109
110 if(sys.argv[1]=="peek"):
111     start=0x0000;
112     if(len(sys.argv)>2):
113         start=int(sys.argv[2],16);
114     stop=start;
115     if(len(sys.argv)>3):
116         stop=int(sys.argv[3],16);
117     print "Peeking from %02x to %02x." % (start,stop);
118     while start<=stop:
119         print "%02x: %010x" % (start,client.peek(start));
120         start=start+1;
121 if(sys.argv[1]=="poke"):
122     start=0x0000;
123     val=0x00;
124     if(len(sys.argv)>2):
125         start=int(sys.argv[2],16);
126     if(len(sys.argv)>3):
127         val=int(sys.argv[3],16);
128     print "Poking %02x to become %010x." % (start,val);
129     
130     client.poke(start,val);
131     print "Poked to %04x" % client.peek(start);
132
133 if(sys.argv[1]=="sniffob"):
134     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
135     #TODO remove all poke() calls.
136     
137     client.poke(0x00,0x00); #Stop nRF
138     client.poke(0x01,0x00); #Disable Shockburst
139     client.poke(0x02,0x01); #Set RX Pipe 0
140     
141     client.RF_setfreq(2481 * 10**6);
142     client.poke(0x06,0x09); #2MBps, -18dBm in RF_SETUP
143     client.poke(0x07,0x78); #Reset status register
144     
145     #OpenBeacon defines these in little endian as follows.
146     client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
147     #0x01, 0x02, 0x03, 0x02, 0x01
148     client.RF_setsmac(0x0102030201);
149     #'O', 'C', 'A', 'E', 'B'
150     client.RF_settmac(0x424541434F);
151     
152     #Set packet length of 16.
153     client.RF_setpacketlen(16);
154     
155     #Power radio, prime for RX, one-byte checksum.
156     client.poke(0x00,0x70|0x03|0x08); #0x08 for one byte, 0x04 for two.
157     
158     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
159                                            client.RF_getfreq()/10**6);
160     #Now we're ready to get packets.
161     while 1:
162         packet=None;
163         while packet==None:
164             #time.sleep(0.1);
165             packet=client.RF_rxpacket();
166         printpacket(packet);
167         sys.stdout.flush();
168
169 if(sys.argv[1]=="snifftp"):
170     client.poke(0x00,0x00); #Stop nRF
171     client.poke(0x01,0x00); #Disable Shockburst
172     client.poke(0x02,0x01); #Set RX Pipe 0
173     
174     client.RF_setfreq((2400+0x29) * 10**6);
175     client.poke(0x06,0x00); #1Mbps
176     client.poke(0x07,0x78); #Reset status register
177     
178     client.RF_setmaclen(3); # SETUP_AW for 3-byte addresses.
179     client.RF_setsmac(0x123456);
180     client.RF_setpacketlen(4);
181     
182     #Power radio, prime for RX, two-byte checksum.
183     client.poke(0x00,0x70|0x03|0x04|0x08);
184     
185     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
186                                            client.RF_getfreq()/10**6);
187     #Now we're ready to get packets.
188     while 1:
189         packet=None;
190         while packet==None:
191             #time.sleep(0.1);
192             packet=client.RF_rxpacket();
193         printpacket(packet);
194         sys.stdout.flush();
195
196 if(sys.argv[1]=="hosttp"):
197     client.poke(0x00,0x00); #Stop nRF
198     client.poke(0x01,0x00); #Disable Shockburst
199     client.poke(0x02,0x01); #Set RX Pipe 0
200     
201     chan=0x29;
202
203     client.RF_setfreq((2400+chan) * 10**6);
204     client.poke(0x06,0x00); #1Mbps
205     client.poke(0x07,0x78); #Reset status register
206     
207     client.RF_setmaclen(3); # SETUP_AW for 3-byte addresses.
208     client.RF_setsmac(0x123456);
209     client.RF_setpacketlen(4);
210     
211     #Power radio, prime for RX, two-byte checksum.
212     client.poke(0x00,0x70|0x03|0x04|0x08);
213     
214     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
215                                            client.RF_getfreq()/10**6);
216     #Now we're ready to get packets.
217     while 1:
218         packet=None;
219         while packet==None:
220             packet=client.RF_rxpacket();
221         mac=((ord(packet[0])<<16)+
222              (ord(packet[1])<<8)+
223              ord(packet[2]));
224         key=packet[3];
225         print "%c from %06x" % (key,mac);
226         sys.stdout.flush();
227
228 if(sys.argv[1]=="sniff"):
229     #client.poke(0x00,0x00); #Stop nRF
230     client.poke(0x07,0x78); #Reset status register
231     
232     #Power radio, prime for RX, checksum.
233     client.poke(0x00,0x70|0x03|0x08);
234     
235     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
236                                            client.RF_getfreq()/10**6);
237     #Now we're ready to get packets.
238     
239     while 1:
240         packet=None;
241         while packet==None:
242             #time.sleep(0.1);
243             packet=client.RF_rxpacket();
244         printpacket(packet);
245         sys.stdout.flush();
246 if(sys.argv[1]=="explore"):
247     #client.poke(0x00,0x00); #Stop nRF
248     client.poke(0x07,0x78); #Reset status register
249     
250     #Power radio, prime for RX, no checksum.
251     client.poke(0x00,0x70|0x03);
252     
253     #Set packet length of 32.
254     #Without checksums, extra data will mix in.
255     client.RF_setpacketlen(32);
256     client.RF_setmaclen(3); # shortest address length
257     
258     #Now we're ready to get packets.
259     for smac in [0x0102030201, 0]:
260         client.RF_setsmac(smac);
261         for chan in range(0,0x80):
262             client.RF_setfreq((2400+chan) * 10**6);
263             time.sleep(1);
264             packet=client.RF_rxpacket();
265             if packet!=None:
266                 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
267                                                         client.RF_getfreq()/10**6);
268                 printpacket(packet);
269                 sys.stdout.flush();