From: travisutk Date: Sun, 23 May 2010 00:43:51 +0000 (+0000) Subject: Register names for NRF. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=7d033e4958693f8a618679d49eeae0ed735f996b Register names for NRF. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@554 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETNRF.py b/client/GoodFETNRF.py index 8de2993..007ae0f 100644 --- a/client/GoodFETNRF.py +++ b/client/GoodFETNRF.py @@ -40,14 +40,22 @@ class GoodFETNRF(GoodFET): for i in range(0,bytes): toret=toret|(ord(self.data[i+1])<<(8*i)); return toret; - def poke(self,reg,val,bytes=1): + def poke(self,reg,val,bytes=-1): """Write an NRF Register.""" data=[reg]; + + #Automatically calibrate the len. + if bytes==-1: + bytes=1; + if reg==0x0a or reg==0x0b or reg==0x10: bytes=5; + for i in range(0,bytes): data=data+[(val>>(8*i))&0xFF]; self.writecmd(self.NRFAPP,0x03,len(data),data); if self.peek(reg,bytes)!=val and reg!=0x07: - print "Warning, failed to set register %02x." %reg; + print "Warning, failed to set r%02x=%02x, got %02x." %(reg, + val, + self.peek(reg,bytes)); return; def status(self): @@ -56,6 +64,34 @@ class GoodFETNRF(GoodFET): print "Status=%02x" % status; #Radio stuff begins here. + def RF_setenc(self,code="GFSK"): + """Set the encoding type.""" + if code!=GFSK: + return "%s not supported by the NRF24L01. Try GFSK." + return; + def RF_getenc(self): + """Get the encoding type.""" + return "GFSK"; + def RF_getrate(self): + rate=self.peek(0x06)&0x28; + if rate==0x28: + rate=250*10**3; #256kbps + elif rate==0x08: + rate=2*10**6; #2Mbps + elif rate==0x00: + rate=1*10**6; #1Mbps + return rate; + def RF_setrate(self,rate=2*10**6): + r6=self.peek(0x06); #RF_SETUP register + r6=r6&(~0x28); #Clear rate fields. + if rate==2*10**6: + r6=r6|0x08; + elif rate==1*10**6: + r6=r6; + elif rate==250*10**3: + r6=r6|0x20; + print "Setting r6=%02x." % r6; + self.poke(0x06,r6); #Write new setting. def RF_setfreq(self,frequency): """Set the frequency in Hz.""" diff --git a/client/goodfet.nrf b/client/goodfet.nrf index 54f816e..117a272 100755 --- a/client/goodfet.nrf +++ b/client/goodfet.nrf @@ -21,17 +21,21 @@ def printpacket(packet): print "%s" %s; def printconfig(): - print "SMAC 0x%010x" % client.RF_getsmac(); - print "TMAC 0x%010x" % client.RF_gettmac(); + print "Encoding %s" % client.RF_getenc(); print "Freq %10i MHz" % (client.RF_getfreq()/10**6); + print "Rate %10i kbps" % (client.RF_getrate()/1000); print "PacketLen %02i bytes" % client.RF_getpacketlen(); print "MacLen %2i bytes" % client.RF_getmaclen(); + print "SMAC 0x%010x" % client.RF_getsmac(); + print "TMAC 0x%010x" % client.RF_gettmac(); + if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0]; print "%s info" % sys.argv[0]; print "%s test" % sys.argv[0]; print "%s regs" % sys.argv[0]; + print "%s sniff\n\tSniffs packets by current config." % sys.argv[0]; print "%s sniffob\n\tSniffs OpenBeacon traffic." % sys.argv[0]; print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0]; sys.exit(); @@ -46,21 +50,32 @@ if(sys.argv[1]=="info"): printconfig(); if(sys.argv[1]=="test"): + print "Old registers:" + printconfig(); + # Set PWR_UP=1 and PRIM_RX=0 in CONFIG. client.poke(0x00,2); #Delay of 1.5ms by round-trip. - # Set CONT_WAVE, PLL_LOCK, and 0dBm in RF_SETUP - client.poke(0x06,8+10+4+2); - client.RF_setfreq(2480 * 10**6); - #Print registers, just for fun. - printconfig(); + print "\n\n"; + #Try all data rates + for foo in [250*10**3, + 1*10**6, + 2*10**6]: + client.RF_setrate(foo); + if(client.RF_getrate()!=foo): + print "ERROR Rate %i not supported. Got %i instead." % (foo, + client.RF_getrate()); + + print "\n\n"; client.poke(0x0A,0xDEADBEEF,5); #print "SMAC set to %010x" % client.RF_getsmac(); if client.RF_getsmac()!=0xdeadbeef: print "ERROR: Failed to set MAC address."; - + print "Final registers:" + printconfig(); + if(sys.argv[1]=="carrier"): if len(sys.argv)>2: client.RF_setfreq(eval(sys.argv[2])); @@ -70,8 +85,39 @@ if(sys.argv[1]=="carrier"): while(1): time.sleep(1); if(sys.argv[1]=="regs"): + regnames=["CONFIG","EN_AA","EN_RXADDR","SETUP_AW","SETUP_RET", + "RF_CH","RF_SETUP","STATUS","OBSERVE_TX","RPD", + "RX_ADDR_P0","RX_ADDR_P1","RX_ADDR_P2","RX_ADDR_P3","RX_ADDR_P4","RX_ADDR_P5", + "TX_ADDR", + "RX_PW_P0","RX_PW_P1","RX_PW_P2","RX_PW_P3","RX_PW_P4","RX_PW_P5", + "FIFO_STATUS","?", + "?","?","DYNPD","?","?","?","?","?", + "?","?","?","?","?","?","?","?"]; for r in range(0,0x20): - print "r[0x%02x]=0x%010x" % (r,client.peek(r)); + print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]); + +if(sys.argv[1]=="peek"): + start=0x0000; + if(len(sys.argv)>2): + start=int(sys.argv[2],16); + stop=start; + if(len(sys.argv)>3): + stop=int(sys.argv[3],16); + print "Peeking from %02x to %02x." % (start,stop); + while start<=stop: + print "%02x: %010x" % (start,client.peek(start)); + start=start+1; +if(sys.argv[1]=="poke"): + start=0x0000; + val=0x00; + if(len(sys.argv)>2): + start=int(sys.argv[2],16); + if(len(sys.argv)>3): + val=int(sys.argv[3],16); + print "Poking %02x to become %010x." % (start,val); + + client.poke(start,val); + print "Poked to %04x" % client.peek(start); if(sys.argv[1]=="sniffob"): #Reversal of transmitter code from nRF_CMD.c of OpenBeacon @@ -108,3 +154,22 @@ if(sys.argv[1]=="sniffob"): packet=client.RF_rxpacket(); printpacket(packet); sys.stdout.flush(); + +if(sys.argv[1]=="sniff"): + #client.poke(0x00,0x00); #Stop nRF + client.poke(0x07,0x78); #Reset status register + + #Power radio, prime for RX, checksum. + client.poke(0x00,0x70|0x03|0x08); + + print "Listening as %010x on %i MHz" % (client.RF_getsmac(), + client.RF_getfreq()/10**6); + #Now we're ready to get packets. + + while 1: + packet=None; + while packet==None: + #time.sleep(0.1); + packet=client.RF_rxpacket(); + printpacket(packet); + sys.stdout.flush();