*/
/**
+ * Slightly modified version of CC2420 stack that does not do address
+ * decoding so a base station can receive packets addressed to other
+ * nodes.
+ *
* @author Jonathan Hui <jhui@archrock.com>
+ * @author Philip Levis
* @version $Revision$ $Date$
*/
uses interface CC2420Register as IOCFG1;
uses interface CC2420Register as MDMCTRL0;
uses interface CC2420Register as MDMCTRL1;
+ uses interface CC2420Register as RXCTRL1;
uses interface CC2420Strobe as SRXON;
uses interface CC2420Strobe as SRFOFF;
uses interface CC2420Strobe as SXOSCOFF;
S_XOSC_STARTED,
} cc2420_control_state_t;
- uint8_t channel = CC2420_DEF_CHANNEL;
- uint8_t txPower = CC2420_DEF_RFPOWER;
- uint16_t pan = TOS_AM_GROUP;
- uint16_t shortAddress;
- bool syncBusy;
- task void syncDoneTask();
+ uint8_t m_channel = CC2420_DEF_CHANNEL;
+ uint8_t m_tx_power = CC2420_DEF_RFPOWER;
+ uint16_t m_pan = TOS_AM_GROUP;
+ uint16_t m_short_addr;
+ bool m_sync_busy;
+ task void syncDone_task();
- norace cc2420_control_state_t state = S_VREG_STOPPED;
+ norace cc2420_control_state_t m_state = S_VREG_STOPPED;
command error_t Init.init() {
call CSN.makeOutput();
call RSTN.makeOutput();
call VREN.makeOutput();
- shortAddress = call AMPacket.address();
+ m_short_addr = call AMPacket.address();
return SUCCESS;
}
async command error_t CC2420Power.startVReg() {
atomic {
- if ( state != S_VREG_STOPPED )
+ if ( m_state != S_VREG_STOPPED )
return FAIL;
- state = S_VREG_STARTING;
+ m_state = S_VREG_STARTING;
}
call VREN.set();
call StartupTimer.start( CC2420_TIME_VREN );
}
async event void StartupTimer.fired() {
- if ( state == S_VREG_STARTING ) {
- state = S_VREG_STARTED;
+ if ( m_state == S_VREG_STARTING ) {
+ m_state = S_VREG_STARTED;
call RSTN.clr();
call RSTN.set();
signal CC2420Power.startVRegDone();
}
async command error_t CC2420Power.stopVReg() {
- state = S_VREG_STOPPED;
+ m_state = S_VREG_STOPPED;
call RSTN.clr();
call VREN.clr();
call RSTN.set();
async command error_t CC2420Power.startOscillator() {
atomic {
- if ( state != S_VREG_STARTED )
+ if ( m_state != S_VREG_STARTED )
return FAIL;
- state = S_XOSC_STARTING;
+ m_state = S_XOSC_STARTING;
call IOCFG1.write( CC2420_SFDMUX_XOSC16M_STABLE <<
CC2420_IOCFG1_CCAMUX );
call InterruptCCA.enableRisingEdge();
call IOCFG0.write( ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) |
( 127 << CC2420_IOCFG0_FIFOP_THR ) );
call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) |
- ( ( (channel - 11)*5+357 )
+ ( ( (m_channel - 11)*5+357 )
<< CC2420_FSCTRL_FREQ ) );
call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) |
( 2 << CC2420_MDMCTRL0_CCA_HYST ) |
( 3 << CC2420_MDMCTRL0_CCA_MOD ) |
( 1 << CC2420_MDMCTRL0_AUTOCRC ) |
( 2 << CC2420_MDMCTRL0_PREAMBLE_LENGTH ) );
+ call RXCTRL1.write( ( 1 << CC2420_RXCTRL1_RXBPF_LOCUR ) |
+ ( 1 << CC2420_RXCTRL1_LOW_LOWGAIN ) |
+ ( 1 << CC2420_RXCTRL1_HIGH_HGM ) |
+ ( 1 << CC2420_RXCTRL1_LNA_CAP_ARRAY ) |
+ ( 1 << CC2420_RXCTRL1_RXMIX_TAIL ) |
+ ( 1 << CC2420_RXCTRL1_RXMIX_VCM ) |
+ ( 2 << CC2420_RXCTRL1_RXMIX_CURRENT ) );
}
return SUCCESS;
}
async event void InterruptCCA.fired() {
nxle_uint16_t id[ 2 ];
- state = S_XOSC_STARTED;
- id[ 0 ] = pan;
- id[ 1 ] = shortAddress;
+ m_state = S_XOSC_STARTED;
+ id[ 0 ] = m_pan;
+ id[ 1 ] = m_short_addr;
call InterruptCCA.disable();
call IOCFG1.write( 0 );
call PANID.write( 0, (uint8_t*)&id, 4 );
async command error_t CC2420Power.stopOscillator() {
atomic {
- if ( state != S_XOSC_STARTED )
+ if ( m_state != S_XOSC_STARTED )
return FAIL;
- state = S_VREG_STARTED;
+ m_state = S_VREG_STARTED;
call SXOSCOFF.strobe();
}
return SUCCESS;
async command error_t CC2420Power.rxOn() {
atomic {
- if ( state != S_XOSC_STARTED )
+ if ( m_state != S_XOSC_STARTED )
return FAIL;
call SRXON.strobe();
}
async command error_t CC2420Power.rfOff() {
atomic {
- if ( state != S_XOSC_STARTED )
+ if ( m_state != S_XOSC_STARTED )
return FAIL;
call SRFOFF.strobe();
}
}
command uint8_t CC2420Config.getChannel() {
- atomic return channel;
+ atomic return m_channel;
}
- command void CC2420Config.setChannel( uint8_t chan ) {
- atomic channel = chan;
+ command void CC2420Config.setChannel( uint8_t channel ) {
+ atomic m_channel = channel;
}
command uint16_t CC2420Config.getShortAddr() {
- atomic return shortAddress;
+ atomic return m_short_addr;
}
command void CC2420Config.setShortAddr( uint16_t addr ) {
- atomic shortAddress = addr;
+ atomic m_short_addr = addr;
}
command uint16_t CC2420Config.getPanAddr() {
- return pan;
+ return m_pan;
}
- command void CC2420Config.setPanAddr( uint16_t p ) {
- atomic pan = p;
+ command void CC2420Config.setPanAddr( uint16_t pan ) {
+ atomic m_pan = pan;
}
command error_t CC2420Config.sync() {
atomic {
- if ( syncBusy )
+ if ( m_sync_busy )
return FAIL;
- syncBusy = TRUE;
- if ( state == S_XOSC_STARTED )
+ m_sync_busy = TRUE;
+ if ( m_state == S_XOSC_STARTED )
call SyncResource.request();
else
- post syncDoneTask();
+ post syncDone_task();
}
return SUCCESS;
}
event void SyncResource.granted() {
nxle_uint16_t id[ 2 ];
- uint8_t chan;
+ uint8_t channel;
atomic {
- chan = channel;
- id[ 0 ] = pan;
- id[ 1 ] = shortAddress;
+ channel = m_channel;
+ id[ 0 ] = m_pan;
+ id[ 1 ] = m_short_addr;
}
call CSN.clr();
+ call SRFOFF.strobe();
call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) |
- ( ( (chan - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) );
+ ( ( (channel - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) );
call PANID.write( 0, (uint8_t*)id, sizeof( id ) );
call CSN.set();
+ call CSN.clr();
+ call SRXON.strobe();
+ call CSN.set();
call SyncResource.release();
- post syncDoneTask();
+ post syncDone_task();
}
- task void syncDoneTask() {
- atomic syncBusy = FALSE;
+ task void syncDone_task() {
+ atomic m_sync_busy = FALSE;
signal CC2420Config.syncDone( SUCCESS );
}