Register names for NRF.
[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 def printpacket(packet):
15     s="";
16     i=0;
17     for foo in packet:
18         i=i+1;
19         if i>client.packetlen: break;
20         s="%s %02x" % (s,ord(foo));
21     print "%s" %s;
22
23 def printconfig():
24     print "Encoding %s" % client.RF_getenc();
25     print "Freq    %10i MHz" % (client.RF_getfreq()/10**6);
26     print "Rate    %10i kbps" % (client.RF_getrate()/1000);
27     print "PacketLen %02i bytes" % client.RF_getpacketlen();
28     print "MacLen    %2i bytes" % client.RF_getmaclen();
29     print "SMAC  0x%010x" % client.RF_getsmac();
30     print "TMAC  0x%010x" % client.RF_gettmac();
31
32
33 if(len(sys.argv)==1):
34     print "Usage: %s verb [objects]\n" % sys.argv[0];
35     print "%s info" % sys.argv[0];
36     print "%s test" % sys.argv[0];
37     print "%s regs" % sys.argv[0];
38     print "%s sniff\n\tSniffs packets by current config." % sys.argv[0];
39     print "%s sniffob\n\tSniffs OpenBeacon traffic." % sys.argv[0];
40     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
41     sys.exit();
42
43 #Initialize FET and set baud rate
44 client=GoodFETNRF();
45 client.serInit()
46
47 client.NRFsetup();
48
49 if(sys.argv[1]=="info"):
50     printconfig();
51
52 if(sys.argv[1]=="test"):
53     print "Old registers:"
54     printconfig();
55     
56     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
57     client.poke(0x00,2);
58     #Delay of 1.5ms by round-trip.
59     
60     print "\n\n";
61     
62     #Try all data rates
63     for foo in [250*10**3,
64                 1*10**6,
65                 2*10**6]:
66         client.RF_setrate(foo);
67         if(client.RF_getrate()!=foo):
68             print "ERROR Rate %i not supported.  Got %i instead." % (foo,
69                                                                      client.RF_getrate());
70     
71     print "\n\n";
72     client.poke(0x0A,0xDEADBEEF,5);
73     #print "SMAC set to %010x" % client.RF_getsmac();
74     if client.RF_getsmac()!=0xdeadbeef:
75         print "ERROR: Failed to set MAC address.";
76     print "Final registers:"
77     printconfig();
78     
79 if(sys.argv[1]=="carrier"):
80     if len(sys.argv)>2:
81         client.RF_setfreq(eval(sys.argv[2]));
82     client.RF_carrier();
83     printconfig();
84     print "\nHolding a carrier wave.";
85     while(1):
86         time.sleep(1);
87 if(sys.argv[1]=="regs"):
88     regnames=["CONFIG","EN_AA","EN_RXADDR","SETUP_AW","SETUP_RET",
89               "RF_CH","RF_SETUP","STATUS","OBSERVE_TX","RPD",
90               "RX_ADDR_P0","RX_ADDR_P1","RX_ADDR_P2","RX_ADDR_P3","RX_ADDR_P4","RX_ADDR_P5",
91               "TX_ADDR",
92               "RX_PW_P0","RX_PW_P1","RX_PW_P2","RX_PW_P3","RX_PW_P4","RX_PW_P5",
93               "FIFO_STATUS","?",
94               "?","?","DYNPD","?","?","?","?","?",
95               "?","?","?","?","?","?","?","?"];
96     for r in range(0,0x20):
97         print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]);
98
99 if(sys.argv[1]=="peek"):
100     start=0x0000;
101     if(len(sys.argv)>2):
102         start=int(sys.argv[2],16);
103     stop=start;
104     if(len(sys.argv)>3):
105         stop=int(sys.argv[3],16);
106     print "Peeking from %02x to %02x." % (start,stop);
107     while start<=stop:
108         print "%02x: %010x" % (start,client.peek(start));
109         start=start+1;
110 if(sys.argv[1]=="poke"):
111     start=0x0000;
112     val=0x00;
113     if(len(sys.argv)>2):
114         start=int(sys.argv[2],16);
115     if(len(sys.argv)>3):
116         val=int(sys.argv[3],16);
117     print "Poking %02x to become %010x." % (start,val);
118     
119     client.poke(start,val);
120     print "Poked to %04x" % client.peek(start);
121
122 if(sys.argv[1]=="sniffob"):
123     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
124     #TODO remove all poke() calls.
125     
126     client.poke(0x00,0x00); #Stop nRF
127     client.poke(0x01,0x00); #Disable Shockburst
128     client.poke(0x02,0x01); #Set RX Pipe 0
129     client.RF_setmaclen(5); # SETUP_AW for 5-byte addresses.
130     client.RF_setfreq(2481 * 10**6);
131     client.poke(0x06,0x09); #2MBps, -18dBm in RF_SETUP
132     client.poke(0x07,0x78); #Reset status register
133     
134     #OpenBeacon defines these in little endian as follows.
135     #0x01, 0x02, 0x03, 0x02, 0x01
136     client.RF_setsmac(0x0102030201);
137     #'O', 'C', 'A', 'E', 'B'
138     client.RF_settmac(0x424541434F);
139     
140     #Set packet length of 16.
141     client.RF_setpacketlen(16);
142     
143     #Power radio, prime for RX, checksum.
144     client.poke(0x00,0x70|0x03|0x08);
145     
146     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
147                                            client.RF_getfreq()/10**6);
148     #Now we're ready to get packets.
149     
150     while 1:
151         packet=None;
152         while packet==None:
153             #time.sleep(0.1);
154             packet=client.RF_rxpacket();
155         printpacket(packet);
156         sys.stdout.flush();
157
158 if(sys.argv[1]=="sniff"):
159     #client.poke(0x00,0x00); #Stop nRF
160     client.poke(0x07,0x78); #Reset status register
161     
162     #Power radio, prime for RX, checksum.
163     client.poke(0x00,0x70|0x03|0x08);
164     
165     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
166                                            client.RF_getfreq()/10**6);
167     #Now we're ready to get packets.
168     
169     while 1:
170         packet=None;
171         while packet==None:
172             #time.sleep(0.1);
173             packet=client.RF_rxpacket();
174         printpacket(packet);
175         sys.stdout.flush();