Script for sniffing OpenBeacon packets with 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 if(len(sys.argv)==1):
15     print "Usage: %s verb [objects]\n" % sys.argv[0];
16     print "%s info" % sys.argv[0];
17     print "%s test" % sys.argv[0];
18     sys.exit();
19
20 #Initialize FET and set baud rate
21 client=GoodFETNRF();
22 print "Connecting."
23 client.serInit()
24
25 print "Connected."
26 client.NRFsetup();
27 print "Setup."
28 client.status();
29
30
31 if(sys.argv[1]=="test"):
32     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
33     client.poke(0x00,2);
34     #Delay of 1.5ms by round-trip.
35     # Set CONT_WAVE, PLL_LOCK, and 0dBm in RF_SETUP
36     client.poke(0x06,8+10+4+2); 
37     client.RF_freq(2480 * 10**6);
38     
39     #Print registers, just for fun.
40     print "SMAC was %010x" % client.RF_getsmac();
41     
42     client.poke(0x0A,0xDEADBEEF,5);
43     print "SMAC set to %010x" % client.RF_getsmac();
44     if client.RF_getsmac()!=0xdeadbeef:
45         print "ERROR: Failed to set MAC address.";
46
47 if(sys.argv[1]=="regs"):
48     for r in range(0,30):
49         print "r[0x%02x]=0x%02x" % (r,client.peek(r));
50
51 if(sys.argv[1]=="sniffob"):
52     #Reversal of transmitter code from nRF_CMD.c
53     client.poke(0x00,0x00); #Stop nRF
54     client.poke(0x01,0x00); #Disable Shockburst
55     client.poke(0x02,0x01); #Set RX Pipe 0
56     client.poke(0x03,0x03); #SETUP_AW for 5-byte addresses.
57     client.RF_freq(2481 * 10**6);
58     client.poke(0x06,0x09); #2MBps, -18dBm in RF_SETUP
59     client.poke(0x07,0x78); #Reset status register
60     
61     #OpenBeacon defines these in little endian as follows.
62     #0x01, 0x02, 0x03, 0x02, 0x01
63     client.RF_setsmac(0x0102030201);
64     #'O', 'C', 'A', 'E', 'B'
65     client.RF_settmac(0x424541434F);
66     
67     #Set packet length of 16.
68     client.poke(0x11,16);
69     
70     client.status();
71     #Power radio, prime for RX, checksum.
72     client.poke(0x00,0x70|0x03|0x08);
73     
74     
75     print "Listening as %010x on channel %03i" % (client.RF_getsmac(),client.peek(0x05));
76     #Now we're ready to get packets.
77     
78     while 1:
79         packet=None;
80         while packet==None:
81             time.sleep(0.1);
82             client.status();
83             packet=client.RF_rxpacket();
84         s="";
85         for foo in packet:
86             s="%s %02x" % (s,ord(foo));
87         print "Got %s" %s;