Add changes needed for contikimac

This commit is contained in:
David Kopf 2011-08-13 11:38:38 -04:00
parent ea1345d3fe
commit 50d1086553
6 changed files with 208 additions and 79 deletions

View file

@ -22,12 +22,12 @@ volatile unsigned long radioontime;
extern uint8_t RF230_receive_on; extern uint8_t RF230_receive_on;
#endif #endif
/* Set RADIOCALIBRATE for periodic calibration of the PLL during extended radio on time. /* Set RADIO_CONF_CALIBRATE_INTERVAL for periodic calibration of the PLL during extended radio on time.
* The data sheet suggests every 5 minutes if the temperature is fluctuating. * The RF230 data sheet suggests every 5 minutes if the temperature is fluctuating.
* Using an eight bit counter gives 256 second calibrations. * At present the specified interval is ignored, and an 8 bit counter gives 256 second intervals.
* Actual calibration is done by the driver on the next transmit request. * Actual calibration is done by the driver on the next transmit request.
*/ */
#if RADIOCALIBRATE #if RADIO_CONF_CALIBRATE_INTERVAL
extern volatile uint8_t rf230_calibrate; extern volatile uint8_t rf230_calibrate;
static uint8_t calibrate_interval; static uint8_t calibrate_interval;
#endif #endif
@ -65,7 +65,7 @@ ISR(AVR_OUTPUT_COMPARE_INT)
scount = 0; scount = 0;
seconds++; seconds++;
} }
#if RADIOCALIBRATE #if RADIO_CONF_CALIBRATE_INTERVAL
if (++calibrate_interval==0) { if (++calibrate_interval==0) {
rf230_calibrate=1; rf230_calibrate=1;
} }

View file

@ -41,6 +41,7 @@
* Registers can be read with a macro, but the args for subregisters don't expand properly so the actual address * Registers can be read with a macro, but the args for subregisters don't expand properly so the actual address
* is used with explicit _SFR_MEM8 in the subregister read/write routines. * is used with explicit _SFR_MEM8 in the subregister read/write routines.
*/ */
#define RG_TRX_STATUS TRX_STATUS
#define SR_TRX_STATUS 0x141, 0x1f, 0 #define SR_TRX_STATUS 0x141, 0x1f, 0
#define SR_TRX_CMD 0x142, 0x1f, 0 #define SR_TRX_CMD 0x142, 0x1f, 0
#define STATE_TRANSITION (31) #define STATE_TRANSITION (31)

View file

@ -80,27 +80,37 @@
/* RF230_CONF_CHECKSUM=0 for automatic hardware checksum */ /* RF230_CONF_CHECKSUM=0 for automatic hardware checksum */
#ifndef RF230_CONF_CHECKSUM #ifndef RF230_CONF_CHECKSUM
#define RF230_CONF_CHECKSUM 0 #define RF230_CONF_CHECKSUM 0
#endif /* RF230_CONF_CHECKSUM */ #endif
/* Autoack setting ignored in non-extended mode */
#ifndef RF230_CONF_AUTOACK #ifndef RF230_CONF_AUTOACK
#define RF230_CONF_AUTOACK 1 #define RF230_CONF_AUTOACK 1
#endif /* RF230_CONF_AUTOACK */ #endif
/* We need to turn off autoack in promiscuous mode */
#if RF230_CONF_AUTOACK #if RF230_CONF_AUTOACK
static bool is_promiscuous; static bool is_promiscuous;
#endif #endif
/* RF230_CONF_AUTORETRIES is 1 plus the number written to the hardware. */
/* Valid range 1-16, zero disables extended mode. */
#ifndef RF230_CONF_AUTORETRIES #ifndef RF230_CONF_AUTORETRIES
#define RF230_CONF_AUTORETRIES 2 #define RF230_CONF_AUTORETRIES 3
#endif /* RF230_CONF_AUTOACK */ #endif
/* RF230_CONF_CSMARETRIES is number of random-backoff/CCA retries. */
/* The hardware will accept 0-7, but 802.15.4-2003 only allows 5 maximum */
#ifndef RF230_CONF_CSMARETRIES
#define RF230_CONF_CSMARETRIES 5
#endif
//Automatic and manual CRC both append 2 bytes to packets //Automatic and manual CRC both append 2 bytes to packets
#if RF230_CONF_CHECKSUM || defined(RF230BB_HOOK_TX_PACKET) #if RF230_CONF_CHECKSUM || defined(RF230BB_HOOK_TX_PACKET)
#include "lib/crc16.h" #include "lib/crc16.h"
#endif /* RF230_CONF_CHECKSUM */ #endif
#define CHECKSUM_LEN 2 #define CHECKSUM_LEN 2
/* Note the AUC_LEN is equal to the CHECKSUM_LEN in any tested configurations to date! */ /* Note the AUX_LEN is equal to the CHECKSUM_LEN in any tested configurations to date! */
#define AUX_LEN (CHECKSUM_LEN + TIMESTAMP_LEN + FOOTER_LEN) #define AUX_LEN (CHECKSUM_LEN + TIMESTAMP_LEN + FOOTER_LEN)
#if AUX_LEN != CHECKSUM_LEN #if AUX_LEN != CHECKSUM_LEN
#warning RF230 Untested Configuration! #warning RF230 Untested Configuration!
@ -114,7 +124,8 @@ struct timestamp {
#define FOOTER1_CRC_OK 0x80 #define FOOTER1_CRC_OK 0x80
#define FOOTER1_CORRELATION 0x7f #define FOOTER1_CORRELATION 0x7f
/* Leave radio on for testing low power protocols */ /* Leave radio on when USB powered or for testing low power protocols */
/* This allows DEBUGFLOW indication of packets received when the radio is "off" */
#if JACKDAW #if JACKDAW
#define RADIOALWAYSON 1 #define RADIOALWAYSON 1
#else #else
@ -122,7 +133,7 @@ struct timestamp {
#define RADIOSLEEPSWHENOFF 1 #define RADIOSLEEPSWHENOFF 1
#endif #endif
//RS232 delays will cause 6lowpan fragment overruns! /* RS232 delays will cause 6lowpan fragment overruns! Use DEBUGFLOW instead. */
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
#define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
@ -138,7 +149,6 @@ struct timestamp {
* we just add two zero bytes to the packet dump. Don't forget to enable wireshark * we just add two zero bytes to the packet dump. Don't forget to enable wireshark
* 802.15.4 dissection even when the checksum is wrong! * 802.15.4 dissection even when the checksum is wrong!
*/ */
//int wireshark_offset;
#endif #endif
/* See clock.c and httpd-cgi.c for RADIOSTATS code */ /* See clock.c and httpd-cgi.c for RADIOSTATS code */
@ -149,14 +159,15 @@ struct timestamp {
uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail; uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail;
#endif #endif
#if RADIOCALIBRATE #if RADIO_CONF_CALIBRATE_INTERVAL
/* Set in clock.c every 256 seconds */ /* Set in clock.c every 256 seconds */
/* The calibration is automatic when the radio turns on, so not needed when duty cycling */
uint8_t rf230_calibrate; uint8_t rf230_calibrate;
uint8_t rf230_calibrated; //for debugging, prints from main loop when calibration occurs uint8_t rf230_calibrated; //for debugging, prints from main loop when calibration occurs
#endif #endif
/* Track flow through driver, see contiki-raven-main.c for example of use */ /* Track flow through driver, see contiki-raven-main.c for example of use */
//#define DEBUGFLOWSIZE 64 //#define DEBUGFLOWSIZE 128
#if DEBUGFLOWSIZE #if DEBUGFLOWSIZE
uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
#define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c #define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c
@ -173,7 +184,7 @@ int rf230_authority_level_of_sender;
static rtimer_clock_t setup_time_for_transmission; static rtimer_clock_t setup_time_for_transmission;
static unsigned long total_time_for_transmission, total_transmission_len; static unsigned long total_time_for_transmission, total_transmission_len;
static int num_transmissions; static int num_transmissions;
#endif /* RF230_CONF_TIMESTAMPS */ #endif
static uint8_t volatile pending; static uint8_t volatile pending;
@ -225,7 +236,7 @@ const struct radio_driver rf230_driver =
rf230_off rf230_off
}; };
uint8_t RF230_receive_on,RF230_sleeping; uint8_t RF230_receive_on;
static uint8_t channel; static uint8_t channel;
/* Received frames are buffered to rxframe in the interrupt routine in hal.c */ /* Received frames are buffered to rxframe in the interrupt routine in hal.c */
@ -288,6 +299,7 @@ radio_get_trx_state(void)
* states. * states.
* \retval false The radio transceiver is not sleeping. * \retval false The radio transceiver is not sleeping.
*/ */
#if 0
static bool radio_is_sleeping(void) static bool radio_is_sleeping(void)
{ {
bool sleeping = false; bool sleeping = false;
@ -300,7 +312,7 @@ static bool radio_is_sleeping(void)
return sleeping; return sleeping;
} }
#endif
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
/** \brief This function will reset the state machine (to TRX_OFF) from any of /** \brief This function will reset the state machine (to TRX_OFF) from any of
* its states, except for the SLEEP state. * its states, except for the SLEEP state.
@ -318,6 +330,10 @@ static char
rf230_isidle(void) rf230_isidle(void)
{ {
uint8_t radio_state; uint8_t radio_state;
if (hal_get_slptr()) {
DEBUGFLOW(']');
return 1;
} else {
radio_state = hal_subregister_read(SR_TRX_STATUS); radio_state = hal_subregister_read(SR_TRX_STATUS);
if (radio_state != BUSY_TX_ARET && if (radio_state != BUSY_TX_ARET &&
radio_state != BUSY_RX_AACK && radio_state != BUSY_RX_AACK &&
@ -329,6 +345,7 @@ rf230_isidle(void)
// printf(".%u",radio_state); // printf(".%u",radio_state);
return(0); return(0);
} }
}
} }
static void static void
@ -372,7 +389,7 @@ radio_set_trx_state(uint8_t new_state)
return RADIO_INVALID_ARGUMENT; return RADIO_INVALID_ARGUMENT;
} }
if (radio_is_sleeping() == true){ if (hal_get_slptr()) {
return RADIO_WRONG_STATE; return RADIO_WRONG_STATE;
} }
@ -477,51 +494,60 @@ on(void)
RF230BB_HOOK_RADIO_ON(); RF230BB_HOOK_RADIO_ON();
#endif #endif
if (RF230_sleeping) { if (hal_get_slptr()) {
uint8_t sreg = SREG;
cli();
// DEBUGFLOW('0');
hal_set_slptr_low(); hal_set_slptr_low();
delay_us(TIME_SLEEP_TO_TRX_OFF); delay_us(TIME_SLEEP_TO_TRX_OFF);
// delay_us(TIME_SLEEP_TO_TRX_OFF);//extra delay for now, wake time depends on board capacitance delay_us(TIME_SLEEP_TO_TRX_OFF);
RF230_sleeping=0; delay_us(TIME_SLEEP_TO_TRX_OFF);//extra delay for now, wake time depends on board capacitance
SREG=sreg;
} }
rf230_waitidle(); rf230_waitidle();
#if RF230_CONF_AUTOACK #if RF230_CONF_AUTOACK
// radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON); // radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON);
radio_set_trx_state(RX_AACK_ON); radio_set_trx_state(RX_AACK_ON);
//DEBUGFLOW('a');
#else #else
radio_set_trx_state(RX_ON); radio_set_trx_state(RX_ON);
DEBUGFLOW('b');
#endif #endif
// flushrx(); // flushrx();
// DEBUGFLOW('O');
RF230_receive_on = 1; RF230_receive_on = 1;
} }
static void static void
off(void) off(void)
{ {
// rtimer_set(&rt, RTIMER_NOW()+ RTIMER_ARCH_SECOND*1UL, 1,(void *) rtimercycle, NULL);
RF230_receive_on = 0; RF230_receive_on = 0;
#ifdef RF230BB_HOOK_RADIO_OFF #ifdef RF230BB_HOOK_RADIO_OFF
RF230BB_HOOK_RADIO_OFF(); RF230BB_HOOK_RADIO_OFF();
#endif #endif
// DEBUGFLOW('F');
#if !RADIOALWAYSON
/* Wait any transmission to end */ /* Wait any transmission to end */
rf230_waitidle(); rf230_waitidle();
#if RADIOALWAYSON
/* Do not transmit autoacks when stack thinks radio is off */
radio_set_trx_state(RX_ON);
//DEBUGFLOW('c');
#else
/* Force the device into TRX_OFF. */ /* Force the device into TRX_OFF. */
radio_reset_state_machine(); radio_reset_state_machine();
#if RADIOSLEEPSWHENOFF #if RADIOSLEEPSWHENOFF
/* Sleep Radio */ /* Sleep Radio */
hal_set_slptr_high(); hal_set_slptr_high();
RF230_sleeping = 1; // DEBUGFLOW('d');
delay_us(TIME_SLEEP_TO_TRX_OFF); //?
#else
// DEBUGFLOW('e');
#endif #endif
#endif /* !RADIOALWAYSON */ #endif /* RADIOALWAYSON */
ENERGEST_OFF(ENERGEST_TYPE_LISTEN); ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
} }
@ -545,9 +571,11 @@ set_txpower(uint8_t power)
if (power > TX_PWR_17_2DBM){ if (power > TX_PWR_17_2DBM){
power=TX_PWR_17_2DBM; power=TX_PWR_17_2DBM;
} }
if (radio_is_sleeping() ==true) { if (hal_get_slptr()) {
DEBUGFLOW('f');
PRINTF("rf230_set_txpower:Sleeping"); //happens with cxmac PRINTF("rf230_set_txpower:Sleeping"); //happens with cxmac
} else { } else {
DEBUGFLOW('g');
hal_subregister_write(SR_TX_PWR, power); hal_subregister_write(SR_TX_PWR, power);
} }
} }
@ -663,7 +691,7 @@ int
rf230_init(void) rf230_init(void)
{ {
uint8_t i; uint8_t i;
DEBUGFLOW('I'); DEBUGFLOW('i');
/* Wait in case VCC just applied */ /* Wait in case VCC just applied */
delay_us(TIME_TO_ENTER_P_ON); delay_us(TIME_TO_ENTER_P_ON);
@ -784,21 +812,22 @@ rf230_transmit(unsigned short payload_len)
#endif /* RF230_CONF_TIMESTAMPS */ #endif /* RF230_CONF_TIMESTAMPS */
GET_LOCK(); GET_LOCK();
// DEBUGFLOW('T');
/* Save receiver state */ /* Save receiver state */
radiowason=RF230_receive_on; radiowason=RF230_receive_on;
/* If radio is sleeping we have to turn it on first */ /* If radio is sleeping we have to turn it on first */
/* This automatically does the PLL calibrations */ /* This automatically does the PLL calibrations */
if (RF230_sleeping) { if (hal_get_slptr()) {
hal_set_slptr_low(); hal_set_slptr_low();
// delay_us(TIME_SLEEP_TO_TRX_OFF); DEBUGFLOW('j');
RF230_sleeping=0; delay_us(TIME_SLEEP_TO_TRX_OFF);
delay_us(TIME_SLEEP_TO_TRX_OFF);
} else { } else {
#if RADIOCALIBRATE #if RADIO_CONF_CALIBRATE_INTERVAL
/* If on, do periodic calibration. See clock.c */ /* If nonzero, do periodic calibration. See clock.c */
if (rf230_calibrate) { if (rf230_calibrate) {
DEBUGFLOW('k');
hal_subregister_write(SR_PLL_CF_START,1); //takes 80us max hal_subregister_write(SR_PLL_CF_START,1); //takes 80us max
hal_subregister_write(SR_PLL_DCU_START,1); //takes 6us, concurrently hal_subregister_write(SR_PLL_DCU_START,1); //takes 6us, concurrently
rf230_calibrate=0; rf230_calibrate=0;
@ -814,8 +843,10 @@ rf230_transmit(unsigned short payload_len)
/* Prepare to transmit */ /* Prepare to transmit */
#if RF230_CONF_AUTORETRIES #if RF230_CONF_AUTORETRIES
radio_set_trx_state(TX_ARET_ON); radio_set_trx_state(TX_ARET_ON);
DEBUGFLOW('t');
#else #else
radio_set_trx_state(PLL_ON); radio_set_trx_state(PLL_ON);
DEBUGFLOW('T');
#endif #endif
txpower = 0; txpower = 0;
@ -889,7 +920,7 @@ rf230_transmit(unsigned short payload_len)
/* Restore receive mode */ /* Restore receive mode */
if(radiowason) { if(radiowason) {
// DEBUGFLOW('m'); DEBUGFLOW('l');
on(); on();
} }
@ -921,10 +952,14 @@ rf230_transmit(unsigned short payload_len)
if (tx_result==1) { //success, data pending from adressee if (tx_result==1) { //success, data pending from adressee
tx_result=0; //Just show success? tx_result=0; //Just show success?
} else if (tx_result==3) { //CSMA channel access failure } else if (tx_result==3) { //CSMA channel access failure
DEBUGFLOW('m');
RIMESTATS_ADD(contentiondrop); RIMESTATS_ADD(contentiondrop);
PRINTF("rf230_transmit: Transmission never started\n"); PRINTF("rf230_transmit: Transmission never started\n");
//} else if (tx_result==5) { //Expected ACK, none received } else if (tx_result==5) { //Expected ACK, none received
//} else if (tx_result==7) { //Invalid (Can't happen since waited for idle above?) DEBUGFLOW('n');
// tx_result=0;
} else if (tx_result==7) { //Invalid (Can't happen since waited for idle above?)
DEBUGFLOW('o');
} }
return tx_result; return tx_result;
@ -943,7 +978,7 @@ rf230_prepare(const void *payload, unsigned short payload_len)
#endif /* RF230_CONF_CHECKSUM */ #endif /* RF230_CONF_CHECKSUM */
GET_LOCK(); GET_LOCK();
// DEBUGFLOW('P'); DEBUGFLOW('p');
// PRINTF("rf230: sending %d bytes\n", payload_len); // PRINTF("rf230: sending %d bytes\n", payload_len);
// PRINTSHORT("s%d ",payload_len); // PRINTSHORT("s%d ",payload_len);
@ -952,7 +987,7 @@ rf230_prepare(const void *payload, unsigned short payload_len)
#if RF230_CONF_CHECKSUM #if RF230_CONF_CHECKSUM
checksum = crc16_data(payload, payload_len, 0); checksum = crc16_data(payload, payload_len, 0);
#endif /* RF230_CONF_CHECKSUM */ #endif
/* Copy payload to RAM buffer */ /* Copy payload to RAM buffer */
total_len = payload_len + AUX_LEN; total_len = payload_len + AUX_LEN;
@ -973,14 +1008,14 @@ rf230_prepare(const void *payload, unsigned short payload_len)
#if RF230_CONF_CHECKSUM #if RF230_CONF_CHECKSUM
memcpy(pbuf,&checksum,CHECKSUM_LEN); memcpy(pbuf,&checksum,CHECKSUM_LEN);
pbuf+=CHECKSUM_LEN; pbuf+=CHECKSUM_LEN;
#endif /* RF230_CONF_CHECKSUM */ #endif
#if RF230_CONF_TIMESTAMPS #if RF230_CONF_TIMESTAMPS
timestamp.authority_level = timesynch_authority_level(); timestamp.authority_level = timesynch_authority_level();
timestamp.time = timesynch_time(); timestamp.time = timesynch_time();
memcpy(pbuf,&timestamp,TIMESTAMP_LEN); memcpy(pbuf,&timestamp,TIMESTAMP_LEN);
pbuf+=TIMESTAMP_LEN; pbuf+=TIMESTAMP_LEN;
#endif /* RF230_CONF_TIMESTAMPS */ #endif
/*------------------------------------------------------------*/ /*------------------------------------------------------------*/
#ifdef RF230BB_HOOK_TX_PACKET #ifdef RF230BB_HOOK_TX_PACKET
@ -1060,11 +1095,12 @@ int
rf230_on(void) rf230_on(void)
{ {
if(RF230_receive_on) { if(RF230_receive_on) {
DEBUGFLOW('q');
return 1; return 1;
} }
if(locked) { if(locked) {
DEBUGFLOW('L');
lock_on = 1; lock_on = 1;
DEBUGFLOW('r');
return 1; return 1;
} }
@ -1265,6 +1301,15 @@ rf230_read(void *buf, unsigned short bufsize)
#if RADIOALWAYSON #if RADIOALWAYSON
if (RF230_receive_on) { if (RF230_receive_on) {
#else
if (hal_get_slptr()) {
DEBUGFLOW('!');
return 0;
}
if (!RF230_receive_on) {
DEBUGFLOW('[');
return 0;
}
#endif #endif
#if RF230_CONF_TIMESTAMPS #if RF230_CONF_TIMESTAMPS
@ -1293,7 +1338,7 @@ if (RF230_receive_on) {
//if(len > RF230_MAX_PACKET_LEN) { //if(len > RF230_MAX_PACKET_LEN) {
if(len > RF230_MAX_TX_FRAME_LENGTH) { if(len > RF230_MAX_TX_FRAME_LENGTH) {
/* Oops, we must be out of sync. */ /* Oops, we must be out of sync. */
DEBUGFLOW('y'); DEBUGFLOW('u');
flushrx(); flushrx();
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
// RELEASE_LOCK(); // RELEASE_LOCK();
@ -1310,7 +1355,7 @@ if (RF230_receive_on) {
} }
if(len - AUX_LEN > bufsize) { if(len - AUX_LEN > bufsize) {
DEBUGFLOW('b'); DEBUGFLOW('v');
PRINTF("len - AUX_LEN > bufsize\n"); PRINTF("len - AUX_LEN > bufsize\n");
flushrx(); flushrx();
RIMESTATS_ADD(toolong); RIMESTATS_ADD(toolong);
@ -1343,7 +1388,7 @@ if (RF230_receive_on) {
#endif #endif
#if RF230_CONF_CHECKSUM #if RF230_CONF_CHECKSUM
if(checksum != crc16_data(buf, len - AUX_LEN, 0)) { if(checksum != crc16_data(buf, len - AUX_LEN, 0)) {
DEBUGFLOW('K'); DEBUGFLOW('w');
PRINTF("checksum failed 0x%04x != 0x%04x\n", PRINTF("checksum failed 0x%04x != 0x%04x\n",
checksum, crc16_data(buf, len - AUX_LEN, 0)); checksum, crc16_data(buf, len - AUX_LEN, 0));
} }
@ -1390,7 +1435,7 @@ if (RF230_receive_on) {
#if RF230_CONF_CHECKSUM #if RF230_CONF_CHECKSUM
#if FOOTER_LEN #if FOOTER_LEN
} else { } else {
DEBUGFLOW('X'); DEBUGFLOW('x');
PRINTF("bad crc"); PRINTF("bad crc");
RIMESTATS_ADD(badcrc); RIMESTATS_ADD(badcrc);
len = AUX_LEN; len = AUX_LEN;
@ -1407,7 +1452,7 @@ if (RF230_receive_on) {
#if RADIOALWAYSON #if RADIOALWAYSON
} else { } else {
DEBUGFLOW('R'); //Stack thought radio was off DEBUGFLOW('y'); //Stack thought radio was off
return 0; return 0;
} }
#endif #endif
@ -1425,7 +1470,7 @@ uint8_t
rf230_get_txpower(void) rf230_get_txpower(void)
{ {
uint8_t power = TX_PWR_UNDEFINED; uint8_t power = TX_PWR_UNDEFINED;
if (radio_is_sleeping()) { if (hal_get_slptr()) {
PRINTF("rf230_get_txpower:Sleeping"); PRINTF("rf230_get_txpower:Sleeping");
} else { } else {
power = hal_subregister_read(SR_TX_PWR); power = hal_subregister_read(SR_TX_PWR);
@ -1481,15 +1526,26 @@ rf230_cca(void)
clear (i.e., no packet is currently being transmitted by a clear (i.e., no packet is currently being transmitted by a
neighbor). */ neighbor). */
if(locked) { if(locked) {
DEBUGFLOW('1');
return 1; return 1;
} }
if(!RF230_receive_on) { /* Turn radio on if necessary. If radio is currently busy return busy channel */
/* This may happen when testing radio duty cycling with RADIOALWAYSON */
if(RF230_receive_on) {
if (hal_get_slptr()) {
DEBUGFLOW('<');
return 0;
} else {
if (!rf230_isidle()) {DEBUGFLOW('2');return 0;}
}
} else {
DEBUGFLOW('3');
radio_was_off = 1; radio_was_off = 1;
rf230_on(); rf230_on();
} }
DEBUGFLOW('c');
/* CCA Mode Mode 1=Energy above threshold 2=Carrier sense only 3=Both 0=Either (RF231 only) */ /* CCA Mode Mode 1=Energy above threshold 2=Carrier sense only 3=Both 0=Either (RF231 only) */
/* Use the current mode. Note triggering a manual CCA is not recommended in extended mode */ /* Use the current mode. Note triggering a manual CCA is not recommended in extended mode */
//hal_subregister_write(SR_CCA_MODE,1); //hal_subregister_write(SR_CCA_MODE,1);
@ -1505,27 +1561,37 @@ rf230_cca(void)
if(radio_was_off) { if(radio_was_off) {
rf230_off(); rf230_off();
} }
// if (cca & 0x40) {/*DEBUGFLOW('3')*/;} else {pending=1;DEBUGFLOW('4');}
if (cca & 0x70) return 1; else return 0; if (cca & 0x40) {
// DEBUGFLOW('5');
return 1;
} else {
// DEBUGFLOW('6');
return 0;
}
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int
rf230_receiving_packet(void) rf230_receiving_packet(void)
{ {
uint8_t radio_state; uint8_t radio_state;
if (hal_get_slptr()) {
DEBUGFLOW('7');
} else {
radio_state = hal_subregister_read(SR_TRX_STATUS); radio_state = hal_subregister_read(SR_TRX_STATUS);
if ((radio_state==BUSY_RX) || (radio_state==BUSY_RX_AACK)) { if ((radio_state==BUSY_RX) || (radio_state==BUSY_RX_AACK)) {
DEBUGFLOW('B'); DEBUGFLOW('8');
pending=1;
return 1; return 1;
} else {
return 0;
} }
}
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int
pending_packet(void) pending_packet(void)
{ {
if (pending) DEBUGFLOW('p'); if (pending) DEBUGFLOW('9');
return pending; return pending;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/

View file

@ -191,14 +191,18 @@ unsigned long clock_seconds(void);
#define UIP_CONF_WAIT_TIMEOUT 20 #define UIP_CONF_WAIT_TIMEOUT 20
#elif 1 /* Contiki-mac radio cycling */ #elif 1 /* Contiki-mac radio cycling */
//#define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_MAC csma_driver //#define NETSTACK_CONF_MAC csma_driver
#define NETSTACK_CONF_RDC contikimac_driver #define NETSTACK_CONF_RDC contikimac_driver
#define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver #define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26 #define CHANNEL_802_15_4 26
#define RF230_CONF_AUTOACK 0 /* The radio needs to interrupt during an rtimer interrupt */
#define RF230_CONF_AUTORETRIES 0 #define RTIMER_CONF_NESTED_INTERRUPTS 1
#define RF230_CONF_AUTOACK 1
#define RF230_CONF_AUTORETRIES 1
#define RF230_CONF_CSMARETRIES 1
#define CONTIKIMAC_CONF_RADIO_ALWAYS_ON 0
#define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 3 #define SICSLOWPAN_CONF_MAXAGE 3
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 #define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8

View file

@ -94,9 +94,16 @@ unsigned long clock_seconds(void);
/* Starting address for code received via the codeprop facility. Not tested on Raven */ /* Starting address for code received via the codeprop facility. Not tested on Raven */
//#define EEPROMFS_ADDR_CODEPROP 0x8000 //#define EEPROMFS_ADDR_CODEPROP 0x8000
/* RADIO_CONF_CALIBRATE_INTERVAL is used in rf230bb and clock.c. If nonzero a 256 second interval is used */
/* Calibration is automatic when the radio wakes so is not necessary when the radio periodically sleeps */
//#define RADIO_CONF_CALIBRATE_INTERVAL 256
/* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */
#define RADIOSTATS 1 #define RADIOSTATS 1
/* Possible watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */
//#define WATCHDOG_CONF_TIMEOUT -1
/* Network setup. The new NETSTACK interface requires RF230BB (as does ip4) */ /* Network setup. The new NETSTACK interface requires RF230BB (as does ip4) */
#if RF230BB #if RF230BB
#undef PACKETBUF_CONF_HDR_SIZE //Use the packetbuf default for header size #undef PACKETBUF_CONF_HDR_SIZE //Use the packetbuf default for header size
@ -178,12 +185,19 @@ unsigned long clock_seconds(void);
#define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver #define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26 #define CHANNEL_802_15_4 26
#define RADIO_CONF_CALIBRATE_INTERVAL 256
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */ /* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
#define RF230_CONF_AUTOACK 1 #define RF230_CONF_AUTOACK 1
/* Request 802.15.4 ACK on all packets sent (else autoretry). This is primarily for testing. */ /* Request 802.15.4 ACK on all packets sent (else autoretry). This is primarily for testing. */
#define SICSLOWPAN_CONF_ACK_ALL 0 #define SICSLOWPAN_CONF_ACK_ALL 0
/* Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode with CCA) */ /* Number of auto retry attempts+1, 1-16. Set zero to disable extended TX_ARET_ON mode with CCA) */
#define RF230_CONF_AUTORETRIES 2 #define RF230_CONF_AUTORETRIES 3
/* Number of CSMA attempts 0-7. 802.15.4 2003 standard max is 5. */
#define RF230_CONF_CSMARETRIES 5
/* CCA theshold energy -91 to -61 dBm (default -77). Set this smaller than the expected minimum rssi to avoid packet collisions */
/* The Jackdaw menu 'm' command is helpful for determining the smallest ever received rssi */
#define RF230_CONF_CCA_THRES -85
/* Allow 6lowpan fragments (needed for large TCP maximum segment size) */
#define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_FRAG 1
/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */ /* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */
#define SICSLOWPAN_CONF_MAXAGE 3 #define SICSLOWPAN_CONF_MAXAGE 3
@ -191,14 +205,18 @@ unsigned long clock_seconds(void);
#define UIP_CONF_WAIT_TIMEOUT 5 #define UIP_CONF_WAIT_TIMEOUT 5
#elif 1 /* Contiki-mac radio cycling */ #elif 1 /* Contiki-mac radio cycling */
//#define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_MAC csma_driver //#define NETSTACK_CONF_MAC csma_driver
#define NETSTACK_CONF_RDC contikimac_driver #define NETSTACK_CONF_RDC contikimac_driver
#define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver #define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26 #define CHANNEL_802_15_4 26
#define RF230_CONF_AUTOACK 0 /* The radio needs to interrupt during an rtimer interrupt */
#define RF230_CONF_AUTORETRIES 0 #define RTIMER_CONF_NESTED_INTERRUPTS 1
#define RF230_CONF_AUTOACK 1
#define RF230_CONF_AUTORETRIES 1
#define RF230_CONF_CSMARETRIES 1
#define CONTIKIMAC_CONF_RADIO_ALWAYS_ON 0
#define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 3 #define SICSLOWPAN_CONF_MAXAGE 3
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 #define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8

View file

@ -102,6 +102,16 @@ unsigned long clock_seconds(void);
/* Simple stack monitor. Status is displayed from the USB menu with 'm' command */ /* Simple stack monitor. Status is displayed from the USB menu with 'm' command */
#define CONFIG_STACK_MONITOR 1 #define CONFIG_STACK_MONITOR 1
/* RADIO_CONF_CALIBRATE_INTERVAL is used in rf230bb and clock.c. If nonzero a 256 second interval is used */
/* Calibration is automatic when the radio wakes so is not necessary when the radio periodically sleeps */
//#define RADIO_CONF_CALIBRATE_INTERVAL 256
/* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */
//#define RADIOSTATS 1
/* Possible watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */
//#define WATCHDOG_CONF_TIMEOUT -1
/* ************************************************************************** */ /* ************************************************************************** */
//#pragma mark USB Ethernet Hooks //#pragma mark USB Ethernet Hooks
/* ************************************************************************** */ /* ************************************************************************** */
@ -263,16 +273,20 @@ extern void mac_log_802_15_4_rx(const uint8_t* buffer, size_t total_len);
#define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver #define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26 #define CHANNEL_802_15_4 26
/* If nonzero an interval of 256 seconds is used at present */
#define RADIO_CONF_CALIBRATE_INTERVAL 256
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */ /* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
#define RF230_CONF_AUTOACK 1 #define RF230_CONF_AUTOACK 1
/* Request 802.15.4 ACK on all packets sent by sicslowpan.c (else autoretry) */ /* Request 802.15.4 ACK on all packets sent by sicslowpan.c (else autoretry) */
/* Broadcasts will be duplicated by the retry count, since no one will ACK them! */ /* Broadcasts will be duplicated by the retry count, since no one will ACK them! */
#define SICSLOWPAN_CONF_ACK_ALL 0 #define SICSLOWPAN_CONF_ACK_ALL 0
/* Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode with CCA) */ /* Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode with CCA) */
#define RF230_CONF_AUTORETRIES 1 #define RF230_CONF_AUTORETRIES 2
/* CCA theshold energy -91 to -61 dBm (default -77). Set this smaller than the expected minimum rssi to avoid packet collisions */ /* CCA theshold energy -91 to -61 dBm (default -77). Set this smaller than the expected minimum rssi to avoid packet collisions */
/* The Jackdaw menu 'm' command is helpful for determining the smallest ever received rssi */ /* The Jackdaw menu 'm' command is helpful for determining the smallest ever received rssi */
#define RF230_CONF_CCA_THRES -85 #define RF230_CONF_CCA_THRES -85
/* Number of CSMA attempts 0-7. 802.15.4 2003 standard max is 5. */
#define RF230_CONF_CSMARETRIES 5
/* Allow sneeze command from jackdaw menu. Useful for testing CCA on other radios */ /* Allow sneeze command from jackdaw menu. Useful for testing CCA on other radios */
/* During sneezing, any access to an RF230 register will hang the MCU and cause a watchdog reset */ /* During sneezing, any access to an RF230 register will hang the MCU and cause a watchdog reset */
/* The host interface, jackdaw menu and rf230_send routines are temporarily disabled to prevent this */ /* The host interface, jackdaw menu and rf230_send routines are temporarily disabled to prevent this */
@ -286,16 +300,42 @@ extern void mac_log_802_15_4_rx(const uint8_t* buffer, size_t total_len);
/* Allow sneeze command from jackdaw menu */ /* Allow sneeze command from jackdaw menu */
#define RF230_CONF_SNEEZE 1 #define RF230_CONF_SNEEZE 1
#elif 0 /* Contiki-mac radio cycling */ #elif 1 /* Contiki-mac radio cycling */
#define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_MAC nullmac_driver
//#define NETSTACK_CONF_MAC csma_driver
#define NETSTACK_CONF_RDC contikimac_driver #define NETSTACK_CONF_RDC contikimac_driver
#define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver #define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26 #define CHANNEL_802_15_4 26
#define RF230_CONF_AUTOACK 0 /* Enable extended mode with autoack, but no csma/autoretry */
#define RF230_CONF_AUTORETRIES 0 #define RF230_CONF_AUTORETRIES 1
#define RF230_CONF_AUTOACK 1
#define RF230_CONF_CSMARETRIES 0
#define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 3 #define SICSLOWPAN_CONF_MAXAGE 3
/* Jackdaw has USB power, can be always listening */
#define CONTIKIMAC_CONF_RADIO_ALWAYS_ON 1
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
/* Contiki-mac is a memory hog */
#define PROCESS_CONF_NO_PROCESS_NAMES 1
#undef QUEUEBUF_CONF_NUM
#define QUEUEBUF_CONF_NUM 2
#undef QUEUEBUF_CONF_REF_NUM
#define QUEUEBUF_CONF_REF_NUM 1
#undef UIP_CONF_TCP_SPLIT
#define UIP_CONF_TCP_SPLIT 0
#undef UIP_CONF_STATISTICS
#define UIP_CONF_STATISTICS 0
#undef UIP_CONF_IPV6_QUEUE_PKT
#define UIP_CONF_IPV6_QUEUE_PKT 0
#define UIP_CONF_PINGADDRCONF 0
#define UIP_CONF_LOGGING 0
#undef UIP_CONF_MAX_CONNECTIONS
#define UIP_CONF_MAX_CONNECTIONS 2
#undef UIP_CONF_MAX_LISTENPORTS
#define UIP_CONF_MAX_LISTENPORTS 2
#define UIP_CONF_UDP_CONNS 6
#elif 1 /* cx-mac radio cycling */ #elif 1 /* cx-mac radio cycling */
#define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_MAC nullmac_driver