3 #GoodFET SPI Flash Client
11 from GoodFETNRF import GoodFETNRF;
12 from intelhex import IntelHex;
14 def printpacket(packet):
19 if i>client.packetlen: break;
20 s="%s %02x" % (s,ord(foo));
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();
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];
43 #Initialize FET and set baud rate
49 if(sys.argv[1]=="info"):
52 if(sys.argv[1]=="test"):
53 print "Old registers:"
56 # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
58 #Delay of 1.5ms by round-trip.
63 for foo in [250*10**3,
66 client.RF_setrate(foo);
67 if(client.RF_getrate()!=foo):
68 print "ERROR Rate %i not supported. Got %i instead." % (foo,
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:"
79 if(sys.argv[1]=="carrier"):
81 client.RF_setfreq(eval(sys.argv[2]));
84 print "\nHolding a carrier wave.";
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",
92 "RX_PW_P0","RX_PW_P1","RX_PW_P2","RX_PW_P3","RX_PW_P4","RX_PW_P5",
94 "?","?","DYNPD","?","?","?","?","?",
95 "?","?","?","?","?","?","?","?"];
96 for r in range(0,0x20):
97 print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]);
99 if(sys.argv[1]=="peek"):
102 start=int(sys.argv[2],16);
105 stop=int(sys.argv[3],16);
106 print "Peeking from %02x to %02x." % (start,stop);
108 print "%02x: %010x" % (start,client.peek(start));
110 if(sys.argv[1]=="poke"):
114 start=int(sys.argv[2],16);
116 val=int(sys.argv[3],16);
117 print "Poking %02x to become %010x." % (start,val);
119 client.poke(start,val);
120 print "Poked to %04x" % client.peek(start);
122 if(sys.argv[1]=="sniffob"):
123 #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
124 #TODO remove all poke() calls.
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
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);
140 #Set packet length of 16.
141 client.RF_setpacketlen(16);
143 #Power radio, prime for RX, checksum.
144 client.poke(0x00,0x70|0x03|0x08);
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.
154 packet=client.RF_rxpacket();
158 if(sys.argv[1]=="sniff"):
159 #client.poke(0x00,0x00); #Stop nRF
160 client.poke(0x07,0x78); #Reset status register
162 #Power radio, prime for RX, checksum.
163 client.poke(0x00,0x70|0x03|0x08);
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.
173 packet=client.RF_rxpacket();