Removed non-functional time synchronization code; added some experimental code for CCA checks (enabled CCA mode 1, a temporary development function for setting the CCA threshold); enable the possibility to switch off radio even if a packet is currently arriving

This commit is contained in:
adamdunkels 2010-02-23 18:24:49 +00:00
parent c4c4e8164d
commit 1ee32c3074
2 changed files with 37 additions and 88 deletions

View File

@ -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.39 2010/02/18 23:52:34 adamdunkels Exp $ * @(#)$Id: cc2420.c,v 1.40 2010/02/23 18:24:49 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.
@ -58,12 +58,6 @@
#define WITH_SEND_CCA 0 #define WITH_SEND_CCA 0
#if CC2420_CONF_TIMESTAMPS
#include "net/rime/timesynch.h"
#define TIMESTAMP_LEN 3
#else /* CC2420_CONF_TIMESTAMPS */
#define TIMESTAMP_LEN 0
#endif /* CC2420_CONF_TIMESTAMPS */
#define FOOTER_LEN 2 #define FOOTER_LEN 2
#ifndef CC2420_CONF_CHECKSUM #ifndef CC2420_CONF_CHECKSUM
@ -81,12 +75,7 @@
#define CHECKSUM_LEN 0 #define CHECKSUM_LEN 0
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
#define AUX_LEN (CHECKSUM_LEN + TIMESTAMP_LEN + FOOTER_LEN) #define AUX_LEN (CHECKSUM_LEN + FOOTER_LEN)
struct timestamp {
uint16_t time;
uint8_t authority_level;
};
#define FOOTER1_CRC_OK 0x80 #define FOOTER1_CRC_OK 0x80
@ -106,12 +95,6 @@ rtimer_clock_t cc2420_time_of_arrival, cc2420_time_of_departure;
int cc2420_authority_level_of_sender; int cc2420_authority_level_of_sender;
#if CC2420_CONF_TIMESTAMPS
static rtimer_clock_t setup_time_for_transmission;
static unsigned long total_time_for_transmission, total_transmission_len;
static int num_transmissions;
#endif /* CC2420_CONF_TIMESTAMPS */
int cc2420_packets_seen, cc2420_packets_read; int cc2420_packets_seen, cc2420_packets_read;
static uint8_t volatile pending; static uint8_t volatile pending;
@ -213,15 +196,17 @@ on(void)
static void static void
off(void) off(void)
{ {
leds_on(LEDS_GREEN);
PRINTF("off\n"); PRINTF("off\n");
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)); // while(status() & BV(CC2420_TX_ACTIVE));
strobe(CC2420_SRFOFF); strobe(CC2420_SRFOFF);
DISABLE_FIFOP_INT(); DISABLE_FIFOP_INT();
ENERGEST_OFF(ENERGEST_TYPE_LISTEN); ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
leds_off(LEDS_GREEN);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#define GET_LOCK() locked = 1 #define GET_LOCK() locked = 1
@ -294,6 +279,9 @@ cc2420_init(void)
/* Turn on/off automatic packet acknowledgment and address decoding. */ /* Turn on/off automatic packet acknowledgment and address decoding. */
reg = getreg(CC2420_MDMCTRL0); reg = getreg(CC2420_MDMCTRL0);
reg |= 0x40; /* XXX CCA mode 1 */
#if CC2420_CONF_AUTOACK #if CC2420_CONF_AUTOACK
reg |= AUTOACK | ADR_DECODE; reg |= AUTOACK | ADR_DECODE;
#else #else
@ -328,9 +316,6 @@ cc2420_transmit(unsigned short payload_len)
{ {
int i, txpower; int i, txpower;
uint8_t total_len; uint8_t total_len;
#if CC2420_CONF_TIMESTAMPS
struct timestamp timestamp;
#endif /* CC2420_CONF_TIMESTAMPS */
#if CC2420_CONF_CHECKSUM #if CC2420_CONF_CHECKSUM
uint16_t checksum; uint16_t checksum;
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
@ -370,10 +355,12 @@ cc2420_transmit(unsigned short payload_len)
for(i = LOOP_20_SYMBOLS; i > 0; i--) { for(i = LOOP_20_SYMBOLS; i > 0; i--) {
if(SFD_IS_1) { if(SFD_IS_1) {
#if CC2420_CONF_TIMESTAMPS if(!(status() & BV(CC2420_TX_ACTIVE))) {
rtimer_clock_t txtime = timesynch_time(); /* SFD went high but we are not transmitting. This means that
#endif /* CC2420_CONF_TIMESTAMPS */ we just started receiving a packet, so we drop the
transmission. */
return RADIO_TX_ERR;
}
if(receive_on) { if(receive_on) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN); ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
} }
@ -383,16 +370,6 @@ cc2420_transmit(unsigned short payload_len)
accurate measurement of the transmission time.*/ accurate measurement of the transmission time.*/
while(status() & BV(CC2420_TX_ACTIVE)); while(status() & BV(CC2420_TX_ACTIVE));
#if CC2420_CONF_TIMESTAMPS
setup_time_for_transmission = txtime - timestamp.time;
if(num_transmissions < 10000) {
total_time_for_transmission += timesynch_time() - txtime;
total_transmission_len += total_len;
num_transmissions++;
}
#endif /* CC2420_CONF_TIMESTAMPS */
#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());
@ -412,7 +389,7 @@ cc2420_transmit(unsigned short payload_len)
} }
RELEASE_LOCK(); RELEASE_LOCK();
return 0; return RADIO_TX_OK;
} }
} }
@ -427,16 +404,13 @@ cc2420_transmit(unsigned short payload_len)
} }
RELEASE_LOCK(); RELEASE_LOCK();
return -3; /* Transmission never started! */ return RADIO_TX_ERR; /* Transmission never started! */
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int static int
cc2420_prepare(const void *payload, unsigned short payload_len) cc2420_prepare(const void *payload, unsigned short payload_len)
{ {
uint8_t total_len; uint8_t total_len;
#if CC2420_CONF_TIMESTAMPS
struct timestamp timestamp;
#endif /* CC2420_CONF_TIMESTAMPS */
#if CC2420_CONF_CHECKSUM #if CC2420_CONF_CHECKSUM
uint16_t checksum; uint16_t checksum;
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
@ -447,7 +421,7 @@ cc2420_prepare(const void *payload, unsigned short payload_len)
RIMESTATS_ADD(lltx); RIMESTATS_ADD(lltx);
/* Wait for any previous transmission to finish. */ /* Wait for any previous transmission to finish. */
while(status() & BV(CC2420_TX_ACTIVE)); /* while(status() & BV(CC2420_TX_ACTIVE));*/
/* Write packet to TX FIFO. */ /* Write packet to TX FIFO. */
strobe(CC2420_SFLUSHTX); strobe(CC2420_SFLUSHTX);
@ -462,12 +436,6 @@ cc2420_prepare(const void *payload, unsigned short payload_len)
FASTSPI_WRITE_FIFO(&checksum, CHECKSUM_LEN); FASTSPI_WRITE_FIFO(&checksum, CHECKSUM_LEN);
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
#if CC2420_CONF_TIMESTAMPS
timestamp.authority_level = timesynch_authority_level();
timestamp.time = timesynch_time();
FASTSPI_WRITE_FIFO(&timestamp, TIMESTAMP_LEN);
#endif /* CC2420_CONF_TIMESTAMPS */
RELEASE_LOCK(); RELEASE_LOCK();
return 0; return 0;
} }
@ -498,7 +466,7 @@ cc2420_off(void)
we don't actually switch the radio off now, but signal that the we don't actually switch the radio off now, but signal that the
driver should switch off the radio once the packet has been driver should switch off the radio once the packet has been
received and processed, by setting the 'lock_off' variable. */ received and processed, by setting the 'lock_off' variable. */
if(SFD_IS_1) { if(status() & BV(CC2420_TX_ACTIVE)) {
lock_off = 1; lock_off = 1;
return 1; return 1;
} }
@ -585,10 +553,6 @@ cc2420_set_pan_addr(unsigned pan,
/* /*
* Interrupt leaves frame intact in FIFO. * Interrupt leaves frame intact in FIFO.
*/ */
#if CC2420_CONF_TIMESTAMPS
static volatile rtimer_clock_t interrupt_time;
static volatile int interrupt_time_set;
#endif /* CC2420_CONF_TIMESTAMPS */
#if CC2420_TIMETABLE_PROFILING #if CC2420_TIMETABLE_PROFILING
#define cc2420_timetable_size 16 #define cc2420_timetable_size 16
TIMETABLE(cc2420_timetable); TIMETABLE(cc2420_timetable);
@ -597,11 +561,6 @@ TIMETABLE_AGGREGATE(aggregate_time, 10);
int int
cc2420_interrupt(void) cc2420_interrupt(void)
{ {
#if CC2420_CONF_TIMESTAMPS
interrupt_time = timesynch_time();
interrupt_time_set = 1;
#endif /* CC2420_CONF_TIMESTAMPS */
CLEAR_FIFOP_INT(); CLEAR_FIFOP_INT();
process_poll(&cc2420_process); process_poll(&cc2420_process);
#if CC2420_TIMETABLE_PROFILING #if CC2420_TIMETABLE_PROFILING
@ -657,24 +616,12 @@ cc2420_read(void *buf, unsigned short bufsize)
#if CC2420_CONF_CHECKSUM #if CC2420_CONF_CHECKSUM
uint16_t checksum; uint16_t checksum;
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
#if CC2420_CONF_TIMESTAMPS
struct timestamp t;
#endif /* CC2420_CONF_TIMESTAMPS */
if(!FIFOP_IS_1) { if(!FIFOP_IS_1) {
/* If FIFOP is 0, there is no packet in the RXFIFO. */ /* If FIFOP is 0, there is no packet in the RXFIFO. */
return 0; return 0;
} }
#if CC2420_CONF_TIMESTAMPS
if(interrupt_time_set) {
cc2420_time_of_arrival = interrupt_time;
interrupt_time_set = 0;
} else {
cc2420_time_of_arrival = 0;
}
cc2420_time_of_departure = 0;
#endif /* CC2420_CONF_TIMESTAMPS */
GET_LOCK(); GET_LOCK();
cc2420_packets_read++; cc2420_packets_read++;
@ -690,7 +637,6 @@ cc2420_read(void *buf, unsigned short bufsize)
} }
if(len <= AUX_LEN) { if(len <= AUX_LEN) {
printf("len <= AUX_LEN\n");
flushrx(); flushrx();
RIMESTATS_ADD(tooshort); RIMESTATS_ADD(tooshort);
RELEASE_LOCK(); RELEASE_LOCK();
@ -698,7 +644,6 @@ cc2420_read(void *buf, unsigned short bufsize)
} }
if(len - AUX_LEN > bufsize) { if(len - AUX_LEN > bufsize) {
printf("len - AUX_LEN > bufsize\n");
flushrx(); flushrx();
RIMESTATS_ADD(toolong); RIMESTATS_ADD(toolong);
RELEASE_LOCK(); RELEASE_LOCK();
@ -709,9 +654,6 @@ cc2420_read(void *buf, unsigned short bufsize)
#if CC2420_CONF_CHECKSUM #if CC2420_CONF_CHECKSUM
getrxdata(&checksum, CHECKSUM_LEN); getrxdata(&checksum, CHECKSUM_LEN);
#endif /* CC2420_CONF_CHECKSUM */ #endif /* CC2420_CONF_CHECKSUM */
#if CC2420_CONF_TIMESTAMPS
getrxdata(&t, TIMESTAMP_LEN);
#endif /* CC2420_CONF_TIMESTAMPS */
getrxdata(footer, FOOTER_LEN); getrxdata(footer, FOOTER_LEN);
#if CC2420_CONF_CHECKSUM #if CC2420_CONF_CHECKSUM
@ -734,17 +676,6 @@ cc2420_read(void *buf, unsigned short bufsize)
RIMESTATS_ADD(llrx); RIMESTATS_ADD(llrx);
#if CC2420_CONF_TIMESTAMPS
cc2420_time_of_departure =
t.time +
setup_time_for_transmission +
(total_time_for_transmission * (len - 2)) / total_transmission_len;
cc2420_authority_level_of_sender = t.authority_level;
packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP, t.time);
#endif /* CC2420_CONF_TIMESTAMPS */
} else { } else {
RIMESTATS_ADD(badcrc); RIMESTATS_ADD(badcrc);
len = AUX_LEN; len = AUX_LEN;
@ -807,6 +738,12 @@ cc2420_rssi(void)
return rssi; return rssi;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int
cc2420_cca_valid(void)
{
return !!(status() & BV(CC2420_RSSI_VALID));
}
/*---------------------------------------------------------------------------*/
static int static int
cc2420_cca(void) cc2420_cca(void)
{ {
@ -824,7 +761,10 @@ cc2420_cca(void)
if(!receive_on) { if(!receive_on) {
radio_was_off = 1; radio_was_off = 1;
cc2420_on(); cc2420_on();
} }
while(!(status() & BV(CC2420_RSSI_VALID))) { while(!(status() & BV(CC2420_RSSI_VALID))) {
/* printf("cc2420_rssi: RSSI not valid.\n"); */ /* printf("cc2420_rssi: RSSI not valid.\n"); */
} }
@ -871,3 +811,10 @@ cc2420_ugly_hack_send_only_one_symbol(void)
return; return;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void
cc2420_set_cca_threshold(int value)
{
uint16_t shifted = value << 8;
setreg(CC2420_RSSI, shifted);
}
/*---------------------------------------------------------------------------*/

View File

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* $Id: cc2420.h,v 1.8 2010/02/18 21:48:39 adamdunkels Exp $ * $Id: cc2420.h,v 1.9 2010/02/23 18:24:49 adamdunkels Exp $
*/ */
/** /**
@ -84,4 +84,6 @@ extern int cc2420_authority_level_of_sender;
int cc2420_on(void); int cc2420_on(void);
int cc2420_off(void); int cc2420_off(void);
void cc2420_set_cca_threshold(int value);
#endif /* __CC2420_H__ */ #endif /* __CC2420_H__ */