d63ea4c76ec5623cc0853c885cfa132dddf98751
[goodfet] / client / goodfet.ccspi
1 #!/usr/bin/env python
2
3 #GoodFET Chipcon SPI Client
4 # (C) 2011 Travis Goodspeed
5
6 #N.B.,
7 #Might be CC2420 Specific
8
9 import sys;
10 import binascii;
11 import array, time;
12
13 from GoodFETCCSPI import GoodFETCCSPI;
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s info" % sys.argv[0];
18     print "%s regs" % sys.argv[0];
19     print "%s test" % sys.argv[0];
20     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
21     print "%s poke 0x$adr 0x$val" % sys.argv[0];
22     print "%s txtest" % sys.argv[0];
23     
24     print "\n%s rssi" % sys.argv[0];
25     print "%s sniff [chan]" % sys.argv[0];
26     print "%s bsniff [chan]" % sys.argv[0];
27     print "%s sniffdissect" % sys.argv[0];
28     
29     sys.exit();
30
31 #Initialize FET and set baud rate
32 client=GoodFETCCSPI();
33 client.serInit()
34
35
36 client.setup();
37
38 #Dummy read.
39 #Might read as all ones if chip has a startup delay.
40
41 if(sys.argv[1]=="carrier"):
42     if len(sys.argv)>2:
43         client.RF_setfreq(eval(sys.argv[2]));
44     while 1:    
45         client.RF_carrier();
46     while(1):
47         time.sleep(1);
48
49 if(sys.argv[1]=="modulated_spectrum"):
50     if len(sys.argv)>2:
51         client.RF_setfreq(eval(sys.argv[2]));
52     while 1:
53         client.RF_modulated_spectrum();
54     while(1):
55         time.sleep(1);
56
57 if(sys.argv[1]=="info"):
58     print "Found   %s" % client.identstr();
59     print "Freq:   %05f MHz" % (client.RF_getfreq()/(10**6));
60     print "Status: %s" % client.status();
61 if(sys.argv[1]=="regs"):
62     for adr in range(0x10,0x40): #*1024):
63         val=client.peek(adr);
64         print "%04x:=0x%04x" % (adr,val);
65 if(sys.argv[1]=="test"):
66     data=client.trans([0x20, 0xde, 0xad]);
67     print "%02x %02x" % (ord(data[1]), ord(data[2]));
68     data=client.trans([0x40|0x20, 0xde, 0xad]);
69     print "%02x %02x" % (ord(data[1]), ord(data[2]));
70 if(sys.argv[1]=="rssi"):
71     if len(sys.argv)>2:
72         freq=eval(sys.argv[2]);
73         if freq>100:
74             client.RF_setfreq(freq);
75         else:
76             client.RF_setchan(freq);
77     print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6);
78         
79     client.strobe(0x02); #Calibrate
80     time.sleep(1);
81     
82     while 1:
83         client.CC_RFST_RX();
84         #client.strobe(0x03); #SRXON
85         rssi=client.RF_getrssi();
86         #client.CC_RFST_IDLE(); #idle
87         time.sleep(0.01);
88         string="";
89         for foo in range(0,rssi>>2):
90             string=("%s."%string);
91         print "%02x %04i %s" % (rssi,rssi, string); 
92 if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"):
93     #Promiscuous mode.
94     client.RF_promiscuity(1);
95     client.RF_autocrc(0);
96     
97     if len(sys.argv)>2:
98         freq=eval(sys.argv[2]);
99         if freq>100:
100             client.RF_setfreq(freq);
101         else:
102             client.RF_setchan(freq);
103     client.CC_RFST_RX();
104     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
105                                             client.RF_getfreq()/10**6);
106     #Now we're ready to get packets.
107     while 1:
108         packet=None;
109         while packet==None:
110             packet=client.RF_rxpacket();
111         if sys.argv[1]=="sniffdissect":
112             client.printdissect(packet);
113         else:
114             client.printpacket(packet);
115         sys.stdout.flush();
116 if(sys.argv[1]=="bsniff"):
117     #Just broadcast.
118     client.RF_promiscuity(0);
119     client.RF_setsmac(0xFFFFFFFF);
120     client.RF_autocrc(1);
121     
122     if len(sys.argv)>2:
123         freq=eval(sys.argv[2]);
124         if freq>100:
125             client.RF_setfreq(freq);
126         else:
127             client.RF_setchan(freq);
128     client.CC_RFST_RX();
129     print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
130                                             client.RF_getfreq()/10**6);
131     #Now we're ready to get packets.
132     while 1:
133         packet=None;
134         while packet==None:
135             packet=client.RF_rxpacket();
136         client.printpacket(packet);
137         sys.stdout.flush();
138
139 if(sys.argv[1]=="txtest"):
140     if len(sys.argv)>2:
141         freq=eval(sys.argv[2]);
142         if freq>100:
143             client.RF_setfreq(freq);
144         else:
145             client.RF_setchan(freq);
146     print "Transmitting DEADBEEF as %010x on %i MHz" % (
147         client.RF_getsmac(),
148         client.RF_getfreq()/10**6);
149     
150     while 1:
151         client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
152                             0xff, 0xff, 0xff, 0xff,
153                             0xde, 0xad, 0xbe, 0xef,
154                             0xba, 0xbe, 0xc0]);
155
156 if(sys.argv[1]=="txpiptest"):
157     if len(sys.argv)>2:
158         freq=eval(sys.argv[2]);
159         if freq>100:
160             client.RF_setfreq(freq);
161         else:
162             print "Channels not yet supported."
163     print "Transmitting on as %010x on %i MHz" % (
164         client.RF_getsmac(),
165         client.RF_getfreq()/10**6);
166     
167     client.RF_setsync(0xFFFF);
168     
169     while 1:
170         client.RF_txpacket([
171                 0x7f, 
172                 #Real header, must begin with SFD.
173                 0x00, 0x00, 0x00,
174                 0x00, 0xA7,
175                 
176                 #Length
177                 0x1f, 0x01, 0x08, 0x82,
178                 0xDF, 0xff, 0xff, 0xff,
179                 0xde, 0xad, 0xbe, 0xef,
180                 0xba, 0xbe, 0xc0,
181                 
182                 
183                 #Preamble
184                 0x00, 0x00, 0x00,
185                 #SFD
186                 0x00, 0xA7,  #CC2420 SFD
187                 #Packet In Packet
188                 0x0f, 0x01, 0x08, 0x82,
189                 0xff, 0xff, 0xff, 0xff,
190                 0xde, 0xad, 0xbe, 0xef,
191                 0xba, 0xbe, 0xc0,
192                 
193                 0xff, 0xff, 0xff, 0xff,
194                 0xff, 0xff, 0xff, 0xff,
195                 0xff, 0xff, 0xff, 0xff,
196                 0xff, 0xff, 0xff, 0xff,
197                 0xff, 0xff, 0xff, 0xff,
198                 0xff, 0xff, 0xff, 0xff,
199                 0xff, 0xff, 0xff, 0xff,
200                 ]);
201
202 if(sys.argv[1]=="peek"):
203     start=0x0000;
204     if(len(sys.argv)>2):
205         start=int(sys.argv[2],16);
206     stop=start;
207     if(len(sys.argv)>3):
208         stop=int(sys.argv[3],16);
209     print "Peeking from %04x to %04x." % (start,stop);
210     while start<=stop:
211         print "%04x: 0x%04x" % (start,client.peek(start));
212         start=start+1;
213 if(sys.argv[1]=="poke"):
214     start=0x0000;
215     val=0x00;
216     if(len(sys.argv)>2):
217         start=int(sys.argv[2],16);
218     if(len(sys.argv)>3):
219         val=int(sys.argv[3],16);
220     print "Poking r%02x to become 0x%04x." % (start,val);
221     
222     client.poke(start,val);
223