X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fcc2420%2Fcontrol%2FCC2420ControlP.nc;h=c6fdd8c2bc7fb70ef4da70353df6fdf33ea13795;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=290ad98ee974e5e5424f085044cdf8629d51ef5c;hpb=a7cdd4a46f004175d1cd95cd3176958378ac2756;p=tinyos-2.x.git diff --git a/tos/chips/cc2420/control/CC2420ControlP.nc b/tos/chips/cc2420/control/CC2420ControlP.nc index 290ad98e..c6fdd8c2 100644 --- a/tos/chips/cc2420/control/CC2420ControlP.nc +++ b/tos/chips/cc2420/control/CC2420ControlP.nc @@ -38,7 +38,7 @@ #include "Timer.h" -module CC2420ControlP { +module CC2420ControlP @safe() { provides interface Init; provides interface Resource; @@ -65,7 +65,6 @@ module CC2420ControlP { uses interface CC2420Strobe as SRFOFF; uses interface CC2420Strobe as SXOSCOFF; uses interface CC2420Strobe as SXOSCON; - uses interface AMPacket; uses interface Resource as SpiResource; uses interface Resource as RssiResource; @@ -95,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 ****************/ @@ -123,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; } @@ -299,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; + } } /** @@ -312,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 @@ -365,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(); @@ -438,11 +466,14 @@ implementation { /** * 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 ) |