mirror of https://github.com/ARMmbed/mbed-os.git
parent
a9d72466b9
commit
37ef68b188
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue