Rewrote all busy waits with a new macro, which has a built-in timeout to ensure that busy waits won't hang the CPU
This commit is contained in:
parent
fb9c7607b0
commit
40ee35e8c8
1 changed files with 35 additions and 18 deletions
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* This file is part of the Contiki operating system.
|
* This file is part of the Contiki operating system.
|
||||||
*
|
*
|
||||||
* @(#)$Id: cc2420.c,v 1.58 2010/06/30 09:03:20 nifi Exp $
|
* @(#)$Id: cc2420.c,v 1.59 2010/09/22 22:01:53 adamdunkels Exp $
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This code is almost device independent and should be easy to port.
|
* This code is almost device independent and should be easy to port.
|
||||||
|
@ -110,6 +110,13 @@ int cc2420_packets_seen, cc2420_packets_read;
|
||||||
|
|
||||||
static uint8_t volatile pending;
|
static uint8_t volatile pending;
|
||||||
|
|
||||||
|
#define BUSYWAIT_UNTIL(cond, max_time) \
|
||||||
|
do { \
|
||||||
|
rtimer_clock_t t0; \
|
||||||
|
t0 = RTIMER_NOW(); \
|
||||||
|
while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
PROCESS(cc2420_process, "CC2420 driver");
|
PROCESS(cc2420_process, "CC2420 driver");
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -127,6 +134,7 @@ static int cc2420_send(const void *data, unsigned short len);
|
||||||
static int cc2420_receiving_packet(void);
|
static int cc2420_receiving_packet(void);
|
||||||
static int pending_packet(void);
|
static int pending_packet(void);
|
||||||
static int cc2420_cca(void);
|
static int cc2420_cca(void);
|
||||||
|
static int detected_energy(void);
|
||||||
|
|
||||||
signed char cc2420_last_rssi;
|
signed char cc2420_last_rssi;
|
||||||
uint8_t cc2420_last_correlation;
|
uint8_t cc2420_last_correlation;
|
||||||
|
@ -138,6 +146,8 @@ const struct radio_driver cc2420_driver =
|
||||||
cc2420_transmit,
|
cc2420_transmit,
|
||||||
cc2420_send,
|
cc2420_send,
|
||||||
cc2420_read,
|
cc2420_read,
|
||||||
|
cc2420_set_channel,
|
||||||
|
detected_energy,
|
||||||
cc2420_cca,
|
cc2420_cca,
|
||||||
cc2420_receiving_packet,
|
cc2420_receiving_packet,
|
||||||
pending_packet,
|
pending_packet,
|
||||||
|
@ -190,14 +200,14 @@ static uint8_t locked, lock_on, lock_off;
|
||||||
static void
|
static void
|
||||||
on(void)
|
on(void)
|
||||||
{
|
{
|
||||||
/* PRINTF("on\n");*/
|
|
||||||
receive_on = 1;
|
|
||||||
|
|
||||||
CC2420_ENABLE_FIFOP_INT();
|
CC2420_ENABLE_FIFOP_INT();
|
||||||
strobe(CC2420_SRXON);
|
strobe(CC2420_SRXON);
|
||||||
while(!(status() & (BV(CC2420_XOSC16M_STABLE))));
|
|
||||||
|
BUSYWAIT_UNTIL(status() & (BV(CC2420_XOSC16M_STABLE)), RTIMER_SECOND / 100);
|
||||||
|
|
||||||
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
|
||||||
LEDS_ON(LEDS_GREEN);
|
LEDS_ON(LEDS_GREEN);
|
||||||
|
receive_on = 1;
|
||||||
}
|
}
|
||||||
static void
|
static void
|
||||||
off(void)
|
off(void)
|
||||||
|
@ -206,7 +216,7 @@ off(void)
|
||||||
receive_on = 0;
|
receive_on = 0;
|
||||||
|
|
||||||
/* Wait for transmission to end before turning radio off. */
|
/* Wait for transmission to end before turning radio off. */
|
||||||
while(status() & BV(CC2420_TX_ACTIVE));
|
BUSYWAIT_UNTIL(!(status() & BV(CC2420_TX_ACTIVE)), RTIMER_SECOND / 10);
|
||||||
|
|
||||||
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
|
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
|
||||||
strobe(CC2420_SRFOFF);
|
strobe(CC2420_SRFOFF);
|
||||||
|
@ -366,7 +376,7 @@ cc2420_transmit(unsigned short payload_len)
|
||||||
|
|
||||||
#if WITH_SEND_CCA
|
#if WITH_SEND_CCA
|
||||||
strobe(CC2420_SRXON);
|
strobe(CC2420_SRXON);
|
||||||
while(!(status() & BV(CC2420_RSSI_VALID)));
|
BUSYWAIT_UNTIL(status() & BV(CC2420_RSSI_VALID), RTIMER_SECOND / 10);
|
||||||
strobe(CC2420_STXONCCA);
|
strobe(CC2420_STXONCCA);
|
||||||
#else /* WITH_SEND_CCA */
|
#else /* WITH_SEND_CCA */
|
||||||
strobe(CC2420_STXON);
|
strobe(CC2420_STXON);
|
||||||
|
@ -388,7 +398,7 @@ cc2420_transmit(unsigned short payload_len)
|
||||||
|
|
||||||
/* We wait until transmission has ended so that we get an
|
/* We wait until transmission has ended so that we get an
|
||||||
accurate measurement of the transmission time.*/
|
accurate measurement of the transmission time.*/
|
||||||
while(status() & BV(CC2420_TX_ACTIVE));
|
BUSYWAIT_UNTIL(!(status() & BV(CC2420_TX_ACTIVE)), RTIMER_SECOND / 10);
|
||||||
|
|
||||||
#ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS
|
#ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS
|
||||||
ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT,cc2420_get_txpower());
|
ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT,cc2420_get_txpower());
|
||||||
|
@ -521,7 +531,7 @@ cc2420_get_channel(void)
|
||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
int
|
||||||
cc2420_set_channel(int c)
|
cc2420_set_channel(int c)
|
||||||
{
|
{
|
||||||
uint16_t f;
|
uint16_t f;
|
||||||
|
@ -537,10 +547,10 @@ cc2420_set_channel(int c)
|
||||||
/*
|
/*
|
||||||
* Writing RAM requires crystal oscillator to be stable.
|
* Writing RAM requires crystal oscillator to be stable.
|
||||||
*/
|
*/
|
||||||
while(!(status() & (BV(CC2420_XOSC16M_STABLE))));
|
BUSYWAIT_UNTIL((status() & (BV(CC2420_XOSC16M_STABLE))), RTIMER_SECOND / 10);
|
||||||
|
|
||||||
/* Wait for any transmission to end. */
|
/* Wait for any transmission to end. */
|
||||||
while(status() & BV(CC2420_TX_ACTIVE));
|
BUSYWAIT_UNTIL(!(status() & BV(CC2420_TX_ACTIVE)), RTIMER_SECOND / 10);
|
||||||
|
|
||||||
setreg(CC2420_FSCTRL, f);
|
setreg(CC2420_FSCTRL, f);
|
||||||
|
|
||||||
|
@ -551,6 +561,7 @@ cc2420_set_channel(int c)
|
||||||
}
|
}
|
||||||
|
|
||||||
RELEASE_LOCK();
|
RELEASE_LOCK();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
|
@ -566,7 +577,7 @@ cc2420_set_pan_addr(unsigned pan,
|
||||||
/*
|
/*
|
||||||
* Writing RAM requires crystal oscillator to be stable.
|
* Writing RAM requires crystal oscillator to be stable.
|
||||||
*/
|
*/
|
||||||
while(!(status() & (BV(CC2420_XOSC16M_STABLE))));
|
BUSYWAIT_UNTIL(status() & (BV(CC2420_XOSC16M_STABLE)), RTIMER_SECOND / 10);
|
||||||
|
|
||||||
tmp[0] = pan & 0xff;
|
tmp[0] = pan & 0xff;
|
||||||
tmp[1] = pan >> 8;
|
tmp[1] = pan >> 8;
|
||||||
|
@ -764,15 +775,17 @@ cc2420_rssi(void)
|
||||||
int rssi;
|
int rssi;
|
||||||
int radio_was_off = 0;
|
int radio_was_off = 0;
|
||||||
|
|
||||||
|
if(locked) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
GET_LOCK();
|
GET_LOCK();
|
||||||
|
|
||||||
if(!receive_on) {
|
if(!receive_on) {
|
||||||
radio_was_off = 1;
|
radio_was_off = 1;
|
||||||
cc2420_on();
|
cc2420_on();
|
||||||
}
|
}
|
||||||
while(!(status() & BV(CC2420_RSSI_VALID))) {
|
BUSYWAIT_UNTIL(status() & BV(CC2420_RSSI_VALID), RTIMER_SECOND / 100);
|
||||||
/* printf("cc2420_rssi: RSSI not valid.\n");*/
|
|
||||||
}
|
|
||||||
|
|
||||||
rssi = (int)((signed char)getreg(CC2420_RSSI));
|
rssi = (int)((signed char)getreg(CC2420_RSSI));
|
||||||
|
|
||||||
|
@ -783,6 +796,12 @@ cc2420_rssi(void)
|
||||||
return rssi;
|
return rssi;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
detected_energy(void)
|
||||||
|
{
|
||||||
|
return cc2420_rssi();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
cc2420_cca_valid(void)
|
cc2420_cca_valid(void)
|
||||||
{
|
{
|
||||||
|
@ -822,9 +841,7 @@ cc2420_cca(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!(status() & BV(CC2420_RSSI_VALID))) {
|
BUSYWAIT_UNTIL(status() & BV(CC2420_RSSI_VALID), RTIMER_SECOND / 100);
|
||||||
/* printf("cc2420_rssi: RSSI not valid.\n"); */
|
|
||||||
}
|
|
||||||
|
|
||||||
cca = CC2420_CCA_IS_1;
|
cca = CC2420_CCA_IS_1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue