X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETCCSPI.py;h=0acbdb7b3f65d620748c0530799bb3f50cae8f49;hp=394c7f637f24d506bfddb2e918c70cfdc49760a5;hb=3ce193dd33e5e9e4c16989d85b8fb15715b139de;hpb=1f89a374af8020b2902b2a7b636fc05a18c6c16d diff --git a/client/GoodFETCCSPI.py b/client/GoodFETCCSPI.py index 394c7f6..0acbdb7 100644 --- a/client/GoodFETCCSPI.py +++ b/client/GoodFETCCSPI.py @@ -1,11 +1,11 @@ #!/usr/bin/env python # GoodFET Chipcon RF Radio Client # -# (C) 2009 Travis Goodspeed +# (C) 2009, 2012 Travis Goodspeed # # This code is being rewritten and refactored. You've been warned! -import sys, time, string, cStringIO, struct, glob, serial, os; +import sys, time, string, cStringIO, struct, glob, os; from GoodFET import GoodFET; @@ -20,11 +20,12 @@ class GoodFETCCSPI(GoodFET): #Set up the radio for ZigBee self.strobe(0x01); #SXOSCON self.strobe(0x02); #SCAL - self.poke(0x11, 0x0AC2); #MDMCTRL0 + self.poke(0x11, 0x0AC2 & (~0x0800)); #MDMCTRL0, promiscuous self.poke(0x12, 0x0500); #MDMCTRL1 self.poke(0x1C, 0x007F); #IOCFG0 self.poke(0x19, 0x01C4); #SECCTRL0, disabling crypto - self.RF_setsync(); + #self.poke(0x19, 0x0204); #SECCTRL0, as seen elsewhere. + #self.RF_setsync(); def ident(self): return self.peek(0x1E); #MANFIDL @@ -58,10 +59,10 @@ class GoodFETCCSPI(GoodFET): self.strobe(0x04); #0x05 for CCA def CC_RFST_RX(self): """Switch the radio to RX mode.""" - self.strobe(0x03); + self.strobe(0x03); #RX ON def CC_RFST_CAL(self): """Calibrate strobe the radio.""" - self.strobe(0x02); + self.strobe(0x02); #RX Calibrate def CC_RFST(self,state=0x00): self.strobe(state); return; @@ -84,12 +85,13 @@ class GoodFETCCSPI(GoodFET): """Write a CCSPI Register.""" data=[reg,(val>>8)&0xFF,val&0xFF]; self.writecmd(self.CCSPIAPP,0x03,len(data),data); - if self.peek(reg,bytes)!=val: + if self.peek(reg,bytes)!=val and reg!=0x18: print "Warning, failed to set r%02x=0x%04x, got %02x." %( reg, val, self.peek(reg,bytes)); - return; + return False; + return True; def status(self): """Read the status byte.""" @@ -132,16 +134,21 @@ class GoodFETCCSPI(GoodFET): def RF_setfreq(self,frequency): """Set the frequency in Hz.""" mhz=frequency/1000000; - fsctrl=0x8000; #self.peek(0x18)&(~0x3FF); + #fsctrl=0x8000; # + fsctrl=self.peek(0x18)&(~0x3FF); fsctrl=fsctrl+int(mhz-2048) self.poke(0x18,fsctrl); - self.strobe(0x02); + #self.CC_RFST_IDLE(); + self.strobe(0x02);#SCAL + time.sleep(0.01); + self.strobe(0x03);#SRXON def RF_getfreq(self): """Get the frequency in Hz.""" fsctrl=self.peek(0x18); mhz=2048+(fsctrl&0x3ff) return mhz*1000000; def RF_setchan(self,channel): + """Set the ZigBee/802.15.4 channel number.""" if channel < 11 or channel > 26: print "Only 802.15.4 channels 11 to 26 are currently supported."; else: @@ -159,7 +166,7 @@ class GoodFETCCSPI(GoodFET): """Set the target MAC address.""" return 0xdeadbeef; def RF_getrssi(self): - """Returns the received signal strenght, with a weird offset.""" + """Returns the received signal strength, with a weird offset.""" rssival=self.peek(0x13)&0xFF; #raw RSSI register return rssival^0x80; lastpacket=range(0,0xff); @@ -178,6 +185,8 @@ class GoodFETCCSPI(GoodFET): self.lastpacket=buffer; if(len(buffer)==0): return None; + #self.strobe(0x08); #SFLUSHRX + return buffer; def RF_txpacket(self,packet): """Send a packet through the radio.""" @@ -186,6 +195,20 @@ class GoodFETCCSPI(GoodFET): #self.strobe(0x09); return; + def RF_reflexjam(self,duration=0): + """Place the device into reflexive jamming mode.""" + data = [duration&0xff, + (duration>>8)&0xff]; + self.writecmd(self.CCSPIAPP,0xA0,len(data),data); + return; + + def RF_reflexjam_autoack(self): + """Place the device into reflexive jamming mode + and that also sends a forged ACK if needed.""" + data = ""; + self.writecmd(self.CCSPIAPP,0xA1,len(data),data); + print "Got:", data, "and", self.data + return; def RF_modulated_spectrum(self): """Hold a carrier wave on the present frequency.""" @@ -256,7 +279,22 @@ class GoodFETCCSPI(GoodFET): mdmctrl0=mdmctrl0|0x800; self.poke(0x11,mdmctrl0); return; - + def RF_autocrc(self,autocrc=1): + mdmctrl0=self.peek(0x11); + if autocrc==0: + mdmctrl0=mdmctrl0&(~0x0020); + else: + mdmctrl0=mdmctrl0|0x0020; + self.poke(0x11,mdmctrl0); + return; + def RF_autoack(self,autoack=1): + mdmctrl0=self.peek(0x11); + if autoack==0: + mdmctrl0=mdmctrl0&(~0x0010); + else: + mdmctrl0=mdmctrl0|0x0010; + self.poke(0x11,mdmctrl0); + return; packetlen=16; def RF_setpacketlen(self,len=16): """Set the number of bytes in the expected payload.""" @@ -281,12 +319,13 @@ class GoodFETCCSPI(GoodFET): choice=choices[len]; self.poke(0x03,choice); self.maclen=len; - def printpacket(self,packet): + def printpacket(self,packet,prefix="#"): s=""; i=0; for foo in packet: s="%s %02x" % (s,ord(foo)); - print "#%s" % s; + print "%s%s" % (prefix,s); + def printdissect(self,packet): try: from scapy.all import Dot15d4