CCSPI port can now packet sniff 802.15.4!
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 6 Feb 2011 22:04:42 +0000 (22:04 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 6 Feb 2011 22:04:42 +0000 (22:04 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@896 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFETCCSPI.py
client/goodfet.ccspi

index 2dfaa7e..2e69d46 100644 (file)
@@ -50,7 +50,7 @@ class GoodFETCCSPI(GoodFET):
         return ord(self.data[0]);
     def CC_RFST_IDLE(self):
         """Switch the radio to idle mode, clearing overflows and errors."""
-        self.strobe(0x00); #SNOP?
+        self.strobe(0x06); #SRXOFF
     def CC_RFST_TX(self):
         """Switch the radio to TX mode."""
         self.strobe(0x04);  #0x05 for CCA
@@ -132,10 +132,30 @@ class GoodFETCCSPI(GoodFET):
         """Returns the received signal strenght, with a weird offset."""
         rssival=self.peek(0x13)&0xFF; #raw RSSI register, should normalize this
         return rssival^0x80;
+    lastpacket=range(0,0xff);
     def RF_rxpacket(self):
-        """Get a packet from the radio.  Returns None if none is waiting."""
-        print "Don't know how to get a packet.";
-        return None;
+        """Get a packet from the radio.  Returns None if none is waiting.  In
+        order to not require the SFD, FIFO, or FIFOP lines, this
+        implementation works by comparing the buffer to the older
+        contents.
+        """
+        self.strobe(0x03); #SRXON
+        self.strobe(0x08); #SFLUSHRX
+        
+        buffer=range(0,0xff);
+        buffer[0]=0x3F | 0x40; #RXFIFO
+        buffer=self.trans(buffer);
+        
+        new=False;
+        for foo in range(2,20):
+            if buffer[foo]!=self.lastpacket[foo]:
+                new=True;
+        if not new:
+            return None;
+        
+        
+        self.lastpacket=buffer;
+        return buffer;
     def RF_carrier(self):
         """Hold a carrier wave on the present frequency."""
         print "Don't know how to hold a carrier.";
index fb89dcf..b487a6c 100755 (executable)
@@ -12,6 +12,17 @@ import array, time;
 
 from GoodFETCCSPI import GoodFETCCSPI;
 
+def printpacket(packet):
+    s="";
+    i=0;
+    for foo in packet:
+        i=i+1;
+        if i>ord(packet[1])+2: break;
+        if i<2: continue;
+        s="%s %02x" % (s,ord(foo));
+    print "%s" % s;
+
+
 if(len(sys.argv)==1):
     print "Usage: %s verb [objects]\n" % sys.argv[0];
     print "%s regs" % sys.argv[0];
@@ -60,7 +71,24 @@ if(sys.argv[1]=="rssi"):
         for foo in range(0,rssi>>2):
             string=("%s."%string);
         print "%02x %04i %s" % (rssi,rssi, string); 
-
+if(sys.argv[1]=="sniff"):
+    #if len(sys.argv)>2:
+        #print "Set MAC to %s" % sys.argv[2];
+        #client.tune(sys.argv[2]);
+        #client.RF_setmaclen(5);
+        
+    client.CC_RFST_RX();
+    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();
 if(sys.argv[1]=="peek"):
     start=0x0000;
     if(len(sys.argv)>2):