802.15.4 Atmel RF driver update

Sync with master version v3.3.4
pull/14164/head
Arto Kinnunen 2021-01-18 14:20:58 +02:00
parent a9d72466b9
commit 37ef68b188
1 changed files with 38 additions and 7 deletions

View File

@ -30,9 +30,24 @@
#include <Timer.h> #include <Timer.h>
#include "Timeout.h" #include "Timeout.h"
#include "SPI.h" #include "SPI.h"
#include "platform/mbed_version.h"
#define TRACE_GROUP "AtRF" #define TRACE_GROUP "AtRF"
#if (MBED_VERSION > MBED_ENCODE_VERSION(6, 0, 0))
/* Mbed OS 6.0 introduces support for chrono time management */
using namespace std::chrono_literals;
#define ATMEL_RF_TIME_65MS 65ms
#define ATMEL_RF_TIME_1US 1us
#define ATMEL_RF_ATTACH(timer_ref, signal_ref, timeout_ref) timer_ref.attach(signal_ref, timeout_ref)
#define ATMEL_RF_DRIVER_CHRONO_SUPPORTED
#else
#define ATMEL_RF_TIME_65MS 65000
#define ATMEL_RF_TIME_1US 1
#define ATMEL_RF_ATTACH(timer_ref, signal_ref, timeout_ref) timer_ref.attach_us(signal_ref, timeout_ref)
#endif
#define RF_MTU_15_4_2011 127 #define RF_MTU_15_4_2011 127
#define RF_MTU_15_4G_2012 2047 #define RF_MTU_15_4G_2012 2047
@ -196,7 +211,11 @@ static Se2435Pins *se2435_pa_pins = NULL;
static uint32_t rf_get_timestamp(void) static uint32_t rf_get_timestamp(void)
{ {
#ifdef ATMEL_RF_DRIVER_CHRONO_SUPPORTED
return (uint32_t)rf->tx_timer.elapsed_time().count();
#else
return (uint32_t)rf->tx_timer.read_us(); return (uint32_t)rf->tx_timer.read_us();
#endif
} }
static void rf_lock(void) static void rf_lock(void)
@ -485,7 +504,7 @@ static void rf_init_registers(rf_modules_e module)
// Set low frequency offset bit // Set low frequency offset bit
rf_write_bbc_register_field(BBC_OFDMC, module, LFO, 0); rf_write_bbc_register_field(BBC_OFDMC, module, LFO, 0);
// Configure using bandwidth option // Configure using bandwidth option
rf_configure_by_ofdm_bandwidth_option(4, 300000, module); rf_configure_by_ofdm_bandwidth_option(phy_current_config.ofdm_option, phy_current_config.datarate, module);
// Set Gain control settings // Set Gain control settings
rf_write_rf_register_field(RF_AGCC, module, AVGS, AVGS_8_SAMPLES); rf_write_rf_register_field(RF_AGCC, module, AVGS, AVGS_8_SAMPLES);
rf_write_rf_register_field(RF_AGCC, module, AGCI, 0); rf_write_rf_register_field(RF_AGCC, module, AGCI, 0);
@ -564,17 +583,21 @@ static int8_t rf_start_csma_ca(uint8_t *data_ptr, uint16_t data_length, uint8_t
mac_tx_handle = tx_handle; mac_tx_handle = tx_handle;
if (tx_time) { if (tx_time) {
#ifdef ATMEL_RF_DRIVER_CHRONO_SUPPORTED
std::chrono::microseconds backoff_time(tx_time - rf_get_timestamp());
#else
uint32_t backoff_time = tx_time - rf_get_timestamp(); uint32_t backoff_time = tx_time - rf_get_timestamp();
#endif
// Max. time to TX can be 65ms, otherwise time has passed already -> send immediately // Max. time to TX can be 65ms, otherwise time has passed already -> send immediately
if (backoff_time <= 65000) { if (backoff_time <= ATMEL_RF_TIME_65MS) {
rf->cca_timer.attach_us(rf_csma_ca_timer_signal, backoff_time); ATMEL_RF_ATTACH(rf->cca_timer, rf_csma_ca_timer_signal, backoff_time);
TEST_CSMA_STARTED TEST_CSMA_STARTED
rf_unlock(); rf_unlock();
return 0; return 0;
} }
} }
// Short timeout to start CCA immediately. // Short timeout to start CCA immediately.
rf->cca_timer.attach_us(rf_csma_ca_timer_signal, 1); ATMEL_RF_ATTACH(rf->cca_timer, rf_csma_ca_timer_signal, ATMEL_RF_TIME_1US);
TEST_CSMA_STARTED TEST_CSMA_STARTED
rf_unlock(); rf_unlock();
return 0; return 0;
@ -607,12 +630,16 @@ static void rf_handle_cca_ed_done(void)
if (cca_prepare_status == PHY_RESTART_CSMA) { if (cca_prepare_status == PHY_RESTART_CSMA) {
device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_OK, 0, 0); device_driver.phy_tx_done_cb(rf_radio_driver_id, mac_tx_handle, PHY_LINK_CCA_OK, 0, 0);
if (tx_time) { if (tx_time) {
#ifdef ATMEL_RF_DRIVER_CHRONO_SUPPORTED
std::chrono::microseconds backoff_time(tx_time - rf_get_timestamp());
#else
uint32_t backoff_time = tx_time - rf_get_timestamp(); uint32_t backoff_time = tx_time - rf_get_timestamp();
#endif
// Max. time to TX can be 65ms, otherwise time has passed already -> send immediately // Max. time to TX can be 65ms, otherwise time has passed already -> send immediately
if (backoff_time > 65000) { if (backoff_time > ATMEL_RF_TIME_65MS) {
backoff_time = 1; backoff_time = ATMEL_RF_TIME_1US;
} }
rf->cca_timer.attach_us(rf_csma_ca_timer_signal, backoff_time); ATMEL_RF_ATTACH(rf->cca_timer, rf_csma_ca_timer_signal, backoff_time);
TEST_CSMA_STARTED TEST_CSMA_STARTED
} }
return; return;
@ -994,7 +1021,11 @@ static uint32_t rf_backup_timer_start(uint16_t bytes, uint32_t time_us)
time_us = (uint32_t)(8000000 / phy_current_config.datarate) * bytes + PACKET_PROCESSING_TIME; time_us = (uint32_t)(8000000 / phy_current_config.datarate) * bytes + PACKET_PROCESSING_TIME;
} }
// Using cal_timer as backup timer // Using cal_timer as backup timer
#ifdef ATMEL_RF_DRIVER_CHRONO_SUPPORTED
rf->cal_timer.attach(rf_backup_timer_signal, std::chrono::microseconds(time_us));
#else
rf->cal_timer.attach_us(rf_backup_timer_signal, time_us); rf->cal_timer.attach_us(rf_backup_timer_signal, time_us);
#endif
return (rf_get_timestamp() + time_us); return (rf_get_timestamp() + time_us);
} }