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