From 3045a47a29e280b3043f914f61713d29cf2d2a0b Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 01:01:41 -0700 Subject: [PATCH 01/10] cc2538-rf: As per the user's guide, RFCORE_XREG_FSCAL1 needs updating, too --- arch/cpu/cc2538/dev/cc2538-rf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index f33e87131..e287efe57 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -490,6 +490,7 @@ init(void) REG(RFCORE_XREG_TXFILTCFG) = 0x09; /** TX anti-aliasing filter bandwidth */ REG(RFCORE_XREG_AGCCTRL1) = 0x15; /** AGC target value */ REG(ANA_REGS_IVCTRL) = 0x0B; /** Bias currents */ + REG(RFCORE_XREG_FSCAL1) = 0x01; /** Tune frequency calibration */ /* * Defaults: From c919975d41712cf8cf3b400360d5164b9dd746e0 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 01:08:45 -0700 Subject: [PATCH 02/10] cc2538-rf: I see no point in flushing twice --- arch/cpu/cc2538/dev/cc2538-rf.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.h b/arch/cpu/cc2538/dev/cc2538-rf.h index b89738436..e22f9c080 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.h +++ b/arch/cpu/cc2538/dev/cc2538-rf.h @@ -113,7 +113,6 @@ */ #define CC2538_RF_CSP_ISFLUSHRX() do { \ REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISFLUSHRX; \ - REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISFLUSHRX; \ } while(0) /** @@ -121,7 +120,6 @@ */ #define CC2538_RF_CSP_ISFLUSHTX() do { \ REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISFLUSHTX; \ - REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISFLUSHTX; \ } while(0) /*---------------------------------------------------------------------------*/ /** The NETSTACK data structure for the cc2538 RF driver */ From a1fddeb0f7ae7a7a805ca0d2dea9d531cba4ef22 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 01:23:12 -0700 Subject: [PATCH 03/10] cc2538-rf: After init, we are not in receive mode --- arch/cpu/cc2538/dev/cc2538-rf.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index e287efe57..c87e80ed5 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -546,8 +546,6 @@ init(void) rf_flags |= RF_ON; - ENERGEST_ON(ENERGEST_TYPE_LISTEN); - return 1; } /*---------------------------------------------------------------------------*/ From 34997f60f6fb6a205666314ff182bf82f9ebd16e Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 01:27:30 -0700 Subject: [PATCH 04/10] cc2538-rf: Removed unused function "cc2538_rf_set_promiscous_mode" --- arch/cpu/cc2538/dev/cc2538-rf.c | 7 +------ arch/cpu/cc2538/dev/cc2538-rf.h | 10 ---------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index c87e80ed5..ced919a09 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -1096,10 +1096,5 @@ cc2538_rf_err_isr(void) process_poll(&cc2538_rf_process); } /*---------------------------------------------------------------------------*/ -void -cc2538_rf_set_promiscous_mode(char p) -{ - set_frame_filtering(p); -} -/*---------------------------------------------------------------------------*/ + /** @} */ diff --git a/arch/cpu/cc2538/dev/cc2538-rf.h b/arch/cpu/cc2538/dev/cc2538-rf.h index e22f9c080..ffd8a6c08 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.h +++ b/arch/cpu/cc2538/dev/cc2538-rf.h @@ -136,16 +136,6 @@ extern const struct radio_driver cc2538_rf_driver; */ void cc2538_rf_set_addr(uint16_t pan); -/** - * \brief Turn promiscous mode on or off - * \param p If promiscous mode should be on (1) or off (0) - * - * This function turns promiscous mode on or off. In promiscous mode, - * every received frame is returned from the RF core. In - * non-promiscous mode, only broadcast frames or frames with our - * address as the receive address are returned from the RF core. - */ -void cc2538_rf_set_promiscous_mode(char p); /*---------------------------------------------------------------------------*/ #endif /* CC2538_RF_H__ */ From 9c1fefa7a74922eff6c3b0371c3f983b56ff9f89 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 02:16:13 -0700 Subject: [PATCH 05/10] cc2538-rf: More compact implementation of getting RSSIs --- arch/cpu/cc2538/dev/cc2538-rf.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index ced919a09..a1aee0582 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -86,6 +86,7 @@ #define LQI_BIT_MASK 0x7F /* RSSI Offset */ #define RSSI_OFFSET 73 +#define RSSI_INVALID -128 /* 192 usec off -> on interval (RX Callib -> SFD Wait). We wait a bit more */ #define ONOFF_TIME RTIMER_ARCH_SECOND / 3125 @@ -244,10 +245,11 @@ get_rssi(void) on(); } - /* Wait on RSSI_VALID */ - while((REG(RFCORE_XREG_RSSISTAT) & RFCORE_XREG_RSSISTAT_RSSI_VALID) == 0); - - rssi = (int8_t)(REG(RFCORE_XREG_RSSI) & RFCORE_XREG_RSSI_RSSI_VAL) - RSSI_OFFSET; + /* Wait for a valid RSSI reading */ + do { + rssi = REG(RFCORE_XREG_RSSI); + } while(rssi == RSSI_INVALID); + rssi -= RSSI_OFFSET; /* If we were off, turn back off */ if(was_off) { From f8091cb87c99b08c9b37ba0ad550db66946b677e Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 05:32:43 -0700 Subject: [PATCH 06/10] cc2538-rf: Use logging API --- arch/cpu/cc2538/dev/cc2538-rf.c | 59 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index a1aee0582..27b6c3061 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -68,13 +68,10 @@ */ #define UDMA_RX_SIZE_THRESHOLD 3 /*---------------------------------------------------------------------------*/ -#include -#define DEBUG 0 -#if DEBUG -#define PRINTF(...) printf(__VA_ARGS__) -#else -#define PRINTF(...) -#endif +/* Log configuration */ +#include "sys/log.h" +#define LOG_MODULE "cc2538-rf" +#define LOG_LEVEL LOG_LEVEL_NONE /*---------------------------------------------------------------------------*/ /* Local RF Flags */ #define RX_ACTIVE 0x80 @@ -174,7 +171,7 @@ set_channel(uint8_t channel) { uint8_t was_on = 0; - PRINTF("RF: Set Channel\n"); + LOG_INFO("Set Channel\n"); if((channel < CC2538_RF_CHANNEL_MIN) || (channel > CC2538_RF_CHANNEL_MAX)) { return CC2538_RF_CHANNEL_SET_ERROR; @@ -405,7 +402,7 @@ channel_clear(void) int cca; uint8_t was_off = 0; - PRINTF("RF: CCA\n"); + LOG_INFO("CCA\n"); /* If we are off, turn on first */ if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) == 0) { @@ -433,7 +430,7 @@ channel_clear(void) static int on(void) { - PRINTF("RF: On\n"); + LOG_INFO("On\n"); if(!(rf_flags & RX_ACTIVE)) { CC2538_RF_CSP_ISFLUSHRX(); @@ -449,7 +446,7 @@ on(void) static int off(void) { - PRINTF("RF: Off\n"); + LOG_INFO("Off\n"); /* Wait for ongoing TX to complete (e.g. this could be an outgoing ACK) */ while(REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_TX_ACTIVE); @@ -472,7 +469,7 @@ off(void) static int init(void) { - PRINTF("RF: Init\n"); + LOG_INFO("Init\n"); if(rf_flags & RF_ON) { return 0; @@ -556,7 +553,7 @@ prepare(const void *payload, unsigned short payload_len) { uint8_t i; - PRINTF("RF: Prepare 0x%02x bytes\n", payload_len + CHECKSUM_LEN); + LOG_INFO("Prepare 0x%02x bytes\n", payload_len + CHECKSUM_LEN); /* * When we transmit in very quick bursts, make sure previous transmission @@ -570,12 +567,12 @@ prepare(const void *payload, unsigned short payload_len) CC2538_RF_CSP_ISFLUSHTX(); - PRINTF("RF: data = "); + LOG_INFO("data = "); /* Send the phy length byte first */ REG(RFCORE_SFR_RFDATA) = payload_len + CHECKSUM_LEN; if(CC2538_RF_CONF_TX_USE_DMA) { - PRINTF(""); + LOG_INFO_(""); /* Set the transfer source's end address */ udma_set_channel_src(CC2538_RF_CONF_TX_DMA_CHAN, @@ -599,10 +596,10 @@ prepare(const void *payload, unsigned short payload_len) } else { for(i = 0; i < payload_len; i++) { REG(RFCORE_SFR_RFDATA) = ((unsigned char *)(payload))[i]; - PRINTF("%02x", ((unsigned char *)(payload))[i]); + LOG_INFO_("%02x", ((unsigned char *)(payload))[i]); } } - PRINTF("\n"); + LOG_INFO_("\n"); return 0; } @@ -615,7 +612,7 @@ transmit(unsigned short transmit_len) rtimer_clock_t t0; uint8_t was_off = 0; - PRINTF("RF: Transmit\n"); + LOG_INFO("Transmit\n"); if(!(rf_flags & RX_ACTIVE)) { t0 = RTIMER_NOW(); @@ -650,7 +647,7 @@ transmit(unsigned short transmit_len) } if(!(REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_TX_ACTIVE)) { - PRINTF("RF: TX never active.\n"); + LOG_ERR("TX never active.\n"); CC2538_RF_CSP_ISFLUSHTX(); ret = RADIO_TX_ERR; } else { @@ -680,7 +677,7 @@ read(void *buf, unsigned short bufsize) uint8_t i; uint8_t len; - PRINTF("RF: Read\n"); + LOG_INFO("Read\n"); if((REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_FIFOP) == 0) { return 0; @@ -692,33 +689,33 @@ read(void *buf, unsigned short bufsize) /* Check for validity */ if(len > CC2538_RF_MAX_PACKET_LEN) { /* Oops, we must be out of sync. */ - PRINTF("RF: bad sync\n"); + LOG_ERR("RF: bad sync\n"); CC2538_RF_CSP_ISFLUSHRX(); return 0; } if(len <= CC2538_RF_MIN_PACKET_LEN) { - PRINTF("RF: too short\n"); + LOG_ERR("RF: too short\n"); CC2538_RF_CSP_ISFLUSHRX(); return 0; } if(len - CHECKSUM_LEN > bufsize) { - PRINTF("RF: too long\n"); + LOG_ERR("RF: too long\n"); CC2538_RF_CSP_ISFLUSHRX(); return 0; } /* If we reach here, chances are the FIFO is holding a valid frame */ - PRINTF("RF: read (0x%02x bytes) = ", len); + LOG_INFO("read (0x%02x bytes) = ", len); len -= CHECKSUM_LEN; /* Don't bother with uDMA for short frames (e.g. ACKs) */ if(CC2538_RF_CONF_RX_USE_DMA && len > UDMA_RX_SIZE_THRESHOLD) { - PRINTF(""); + LOG_INFO_(""); /* Set the transfer destination's end address */ udma_set_channel_dst(CC2538_RF_CONF_RX_DMA_CHAN, @@ -739,7 +736,7 @@ read(void *buf, unsigned short bufsize) } else { for(i = 0; i < len; ++i) { ((unsigned char *)(buf))[i] = REG(RFCORE_SFR_RFDATA); - PRINTF("%02x", ((unsigned char *)(buf))[i]); + LOG_INFO_("%02x", ((unsigned char *)(buf))[i]); } } @@ -747,14 +744,14 @@ read(void *buf, unsigned short bufsize) rssi = ((int8_t)REG(RFCORE_SFR_RFDATA)) - RSSI_OFFSET; crc_corr = REG(RFCORE_SFR_RFDATA); - PRINTF("%02x%02x\n", (uint8_t)rssi, crc_corr); + LOG_INFO_("%02x%02x\n", (uint8_t)rssi, crc_corr); /* MS bit CRC OK/Not OK, 7 LS Bits, Correlation value */ if(crc_corr & CRC_BIT_MASK) { packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi); packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, crc_corr & LQI_BIT_MASK); } else { - PRINTF("RF: Bad CRC\n"); + LOG_ERR("Bad CRC\n"); CC2538_RF_CSP_ISFLUSHRX(); return 0; } @@ -776,7 +773,7 @@ read(void *buf, unsigned short bufsize) static int receiving_packet(void) { - PRINTF("RF: Receiving\n"); + LOG_INFO("Receiving\n"); /* * SFD high while transmitting and receiving. @@ -792,7 +789,7 @@ receiving_packet(void) static int pending_packet(void) { - PRINTF("RF: Pending\n"); + LOG_INFO("Pending\n"); return REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_FIFOP; } @@ -1086,7 +1083,7 @@ cc2538_rf_rx_tx_isr(void) void cc2538_rf_err_isr(void) { - PRINTF("RF Error: 0x%08lx\n", REG(RFCORE_SFR_RFERRF)); + LOG_ERR("Error 0x%08lx occurred\n", REG(RFCORE_SFR_RFERRF)); /* If the error is not an RX FIFO overflow, set a flag */ if(REG(RFCORE_SFR_RFERRF) != RFCORE_SFR_RFERRF_RXOVERF) { From 34f697adf7038bc0d06eb7db4627d760134dddcc Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 05:44:18 -0700 Subject: [PATCH 07/10] cc2538-rf: Support for disabling the SHR search --- arch/cpu/cc2538/dev/cc2538-rf.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index 27b6c3061..39aa1f5ed 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -321,6 +321,16 @@ set_frame_filtering(uint8_t enable) } /*---------------------------------------------------------------------------*/ static void +set_shr_search(int enable) +{ + if(enable) { + REG(RFCORE_XREG_FRMCTRL0) &= ~RFCORE_XREG_FRMCTRL0_RX_MODE; + } else { + REG(RFCORE_XREG_FRMCTRL0) |= RFCORE_XREG_FRMCTRL0_RX_MODE; + } +} +/*---------------------------------------------------------------------------*/ +static void mac_timer_init(void) { CLOCK_STABLE(); @@ -513,6 +523,9 @@ init(void) set_channel(rf_channel); + /* Enable SHR search */ + set_shr_search(1); + /* Acknowledge all RF Error interrupts */ REG(RFCORE_XREG_RFERRM) = RFCORE_XREG_RFERRM_RFERRM; NVIC_EnableIRQ(RF_ERR_IRQn); @@ -922,6 +935,9 @@ set_value(radio_param_t param, radio_value_t value) case RADIO_PARAM_CCA_THRESHOLD: set_cca_threshold(value); return RADIO_RESULT_OK; + case RADIO_PARAM_SHR_SEARCH: + set_shr_search(value); + return RADIO_RESULT_OK; default: return RADIO_RESULT_NOT_SUPPORTED; } From 9f78836219c3bebad6329c31efb1d0b944dcee5f Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 2 Aug 2018 05:46:34 -0700 Subject: [PATCH 08/10] cc2538-rf: Simplified get_channel --- arch/cpu/cc2538/dev/cc2538-rf.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index 39aa1f5ed..804870a47 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -154,10 +154,7 @@ PROCESS(cc2538_rf_process, "cc2538 RF driver"); static uint8_t get_channel() { - uint8_t chan = REG(RFCORE_XREG_FREQCTRL) & RFCORE_XREG_FREQCTRL_FREQ; - - return (chan - CC2538_RF_CHANNEL_MIN) / CC2538_RF_CHANNEL_SPACING - + CC2538_RF_CHANNEL_MIN; + return rf_channel; } /*---------------------------------------------------------------------------*/ /** From 501ce04f0510a98aecb52009623bc002e93ed0aa Mon Sep 17 00:00:00 2001 From: kkrentz Date: Fri, 3 Aug 2018 03:12:00 -0700 Subject: [PATCH 09/10] cc2538-rf: Simplified set_channel --- arch/cpu/cc2538/dev/cc2538-rf.c | 14 ++------------ arch/cpu/cc2538/dev/cc2538-rf.h | 1 - 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/arch/cpu/cc2538/dev/cc2538-rf.c b/arch/cpu/cc2538/dev/cc2538-rf.c index 804870a47..eea715653 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.c +++ b/arch/cpu/cc2538/dev/cc2538-rf.c @@ -160,20 +160,14 @@ get_channel() /** * \brief Set the current operating channel * \param channel The desired channel as a value in [11,26] - * \return Returns a value in [11,26] representing the current channel - * or a negative value if \e channel was out of bounds */ -static int8_t +static void set_channel(uint8_t channel) { uint8_t was_on = 0; LOG_INFO("Set Channel\n"); - if((channel < CC2538_RF_CHANNEL_MIN) || (channel > CC2538_RF_CHANNEL_MAX)) { - return CC2538_RF_CHANNEL_SET_ERROR; - } - /* Changes to FREQCTRL take effect after the next recalibration */ /* If we are off, save state, otherwise switch off and save state */ @@ -190,8 +184,6 @@ set_channel(uint8_t channel) } rf_channel = channel; - - return (int8_t)channel; } /*---------------------------------------------------------------------------*/ static radio_value_t @@ -894,9 +886,7 @@ set_value(radio_param_t param, radio_value_t value) value > CC2538_RF_CHANNEL_MAX) { return RADIO_RESULT_INVALID_VALUE; } - if(set_channel(value) == CC2538_RF_CHANNEL_SET_ERROR) { - return RADIO_RESULT_ERROR; - } + set_channel(value); return RADIO_RESULT_OK; case RADIO_PARAM_PAN_ID: set_pan_id(value & 0xffff); diff --git a/arch/cpu/cc2538/dev/cc2538-rf.h b/arch/cpu/cc2538/dev/cc2538-rf.h index ffd8a6c08..958221783 100644 --- a/arch/cpu/cc2538/dev/cc2538-rf.h +++ b/arch/cpu/cc2538/dev/cc2538-rf.h @@ -56,7 +56,6 @@ #define CC2538_RF_CHANNEL_MIN 11 #define CC2538_RF_CHANNEL_MAX 26 #define CC2538_RF_CHANNEL_SPACING 5 -#define CC2538_RF_CHANNEL_SET_ERROR -1 #define CC2538_RF_MAX_PACKET_LEN 127 #define CC2538_RF_MIN_PACKET_LEN 4 #define CC2538_RF_CCA_CLEAR 1 From 11a2fb14b124df97091260b9e495aaa3f4e63263 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Tue, 2 Oct 2018 07:56:23 -0700 Subject: [PATCH 10/10] radio.h: Added RADIO_PARAM_SHR_SEARCH --- os/dev/radio.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/os/dev/radio.h b/os/dev/radio.h index 982acc51d..9bbef9619 100644 --- a/os/dev/radio.h +++ b/os/dev/radio.h @@ -170,6 +170,9 @@ enum { * it needs to be used with radio.get_object()/set_object(). */ RADIO_PARAM_LAST_PACKET_TIMESTAMP, + /* For enabling and disabling the SHR search */ + RADIO_PARAM_SHR_SEARCH, + /* Constants (read only) */ /* The lowest radio channel. */