]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/cc2420/control/CC2420ControlP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / chips / cc2420 / control / CC2420ControlP.nc
index 7d44f731d551661581dc0f344e54f346185cecd6..c6fdd8c2bc7fb70ef4da70353df6fdf33ea13795 100644 (file)
@@ -38,7 +38,7 @@
 
 #include "Timer.h"
 
-module CC2420ControlP {
+module CC2420ControlP @safe() {
 
   provides interface Init;
   provides interface Resource;
@@ -94,12 +94,18 @@ implementation {
   
   bool m_sync_busy;
   
+  /** TRUE if acknowledgments are enabled */
   bool autoAckEnabled;
   
+  /** TRUE if acknowledgments are generated in hardware only */
   bool hwAutoAckDefault;
   
+  /** TRUE if software or hardware address recognition is enabled */
   bool addressRecognition;
   
+  /** TRUE if address recognition should also be performed in hardware */
+  bool hwAddressRecognition;
+  
   norace cc2420_control_state_t m_state = S_VREG_STOPPED;
   
   /***************** Prototypes ****************/
@@ -122,24 +128,34 @@ implementation {
     m_tx_power = CC2420_DEF_RFPOWER;
     m_channel = CC2420_DEF_CHANNEL;
     
+    
+#if defined(CC2420_NO_ADDRESS_RECOGNITION)
+    addressRecognition = FALSE;
+#else
+    addressRecognition = TRUE;
+#endif
+    
+#if defined(CC2420_HW_ADDRESS_RECOGNITION)
+    hwAddressRecognition = TRUE;
+#else
+    hwAddressRecognition = FALSE;
+#endif
+    
+    
 #if defined(CC2420_NO_ACKNOWLEDGEMENTS)
     autoAckEnabled = FALSE;
 #else
     autoAckEnabled = TRUE;
 #endif
-
+    
 #if defined(CC2420_HW_ACKNOWLEDGEMENTS)
     hwAutoAckDefault = TRUE;
+    hwAddressRecognition = TRUE;
 #else
     hwAutoAckDefault = FALSE;
 #endif
-
-#if defined(CC2420_NO_ADDRESS_RECOGNITION)
-    addressRecognition = FALSE;
-#else
-    addressRecognition = TRUE;
-#endif
-
+    
+    
     return SUCCESS;
   }
 
@@ -298,10 +314,16 @@ implementation {
   }
 
   /**
-   * @param on TRUE to turn address recognition on, FALSE to turn it off
+   * @param enableAddressRecognition TRUE to turn address recognition on
+   * @param useHwAddressRecognition TRUE to perform address recognition first
+   *     in hardware. This doesn't affect software address recognition. The
+   *     driver must sync with the chip after changing this value.
    */
-  command void CC2420Config.setAddressRecognition(bool on) {
-    atomic addressRecognition = on;
+  command void CC2420Config.setAddressRecognition(bool enableAddressRecognition, bool useHwAddressRecognition) {
+    atomic {
+      addressRecognition = enableAddressRecognition;
+      hwAddressRecognition = useHwAddressRecognition;
+    }
   }
   
   /**
@@ -311,6 +333,13 @@ implementation {
     atomic return addressRecognition;
   }
   
+  /**
+   * @return TRUE if address recognition is performed first in hardware.
+   */
+  async command bool CC2420Config.isHwAddressRecognitionDefault() {
+    atomic return hwAddressRecognition;
+  }
+  
   
   /**
    * Sync must be called for acknowledgement changes to take effect
@@ -364,7 +393,7 @@ implementation {
   }
 
   event void RssiResource.granted() { 
-    uint16_t data;
+    uint16_t data = 0;
     call CSN.clr();
     call RSSI.read(&data);
     call CSN.set();
@@ -444,7 +473,7 @@ implementation {
   void writeMdmctrl0() {
     atomic {
       call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) |
-          ( 0 << CC2420_MDMCTRL0_ADR_DECODE ) |
+          ( (addressRecognition && hwAddressRecognition) << CC2420_MDMCTRL0_ADR_DECODE ) |
           ( 2 << CC2420_MDMCTRL0_CCA_HYST ) |
           ( 3 << CC2420_MDMCTRL0_CCA_MOD ) |
           ( 1 << CC2420_MDMCTRL0_AUTOCRC ) |