#include "Timer.h"
-module CC2420ControlP {
+module CC2420ControlP @safe() {
provides interface Init;
provides interface Resource;
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 ****************/
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;
}
}
/**
- * @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;
+ }
}
/**
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
}
event void RssiResource.granted() {
- uint16_t data;
+ uint16_t data = 0;
call CSN.clr();
call RSSI.read(&data);
call CSN.set();
/**
* Write the MDMCTRL0 register
+ * Disabling hardware address recognition improves acknowledgment success
+ * rate and low power communications reliability by causing the local node
+ * to do work while the real destination node of the packet is acknowledging.
*/
void writeMdmctrl0() {
atomic {
call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) |
- ( addressRecognition << CC2420_MDMCTRL0_ADR_DECODE ) |
+ ( (addressRecognition && hwAddressRecognition) << CC2420_MDMCTRL0_ADR_DECODE ) |
( 2 << CC2420_MDMCTRL0_CCA_HYST ) |
( 3 << CC2420_MDMCTRL0_CCA_MOD ) |
( 1 << CC2420_MDMCTRL0_AUTOCRC ) |