From 2559e03b558305c2af12e07a3c66ac6f104f322e Mon Sep 17 00:00:00 2001 From: Kamil Sroka Date: Mon, 12 Mar 2018 19:23:02 +0100 Subject: [PATCH] [nrf52840] Add timer API for new radio driver in alarm.c (#2607) --- examples/platforms/nrf52840/Makefile.am | 2 +- examples/platforms/nrf52840/alarm.c | 87 +++++++++++++++++-- .../drivers/radio/nrf_802154.c | 2 + 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/examples/platforms/nrf52840/Makefile.am b/examples/platforms/nrf52840/Makefile.am index ad858b1aa..5a7bcb135 100644 --- a/examples/platforms/nrf52840/Makefile.am +++ b/examples/platforms/nrf52840/Makefile.am @@ -139,7 +139,7 @@ RADIO_DRIVER_SOURCES @top_builddir@/third_party/NordicSemiconductor/drivers/radio/fem/nrf_fem_control.c \ @top_builddir@/third_party/NordicSemiconductor/drivers/radio/mac_features/nrf_802154_filter.c \ @top_builddir@/third_party/NordicSemiconductor/drivers/radio/platform/clock/nrf_802154_clock_sdk.c \ - @top_builddir@/third_party/NordicSemiconductor/drivers/radio/platform/timer/nrf_802154_timer_none.c \ + @top_builddir@/third_party/NordicSemiconductor/drivers/radio/timer_scheduler/nrf_802154_timer_sched.c \ $(NULL) NORDICSEMI_SOURCES = \ diff --git a/examples/platforms/nrf52840/alarm.c b/examples/platforms/nrf52840/alarm.c index 8f10697f1..7e96e7d1e 100644 --- a/examples/platforms/nrf52840/alarm.c +++ b/examples/platforms/nrf52840/alarm.c @@ -51,6 +51,8 @@ #include "cmsis/core_cmFunc.h" #include +#include + #include #include @@ -67,7 +69,7 @@ #define MS_PER_S 1000UL // clang-format on -typedef enum { kMsTimer, kUsTimer, kNumTimers } AlarmIndex; +typedef enum { kMsTimer, kUsTimer, k802154Timer, kNumTimers } AlarmIndex; typedef struct { @@ -96,11 +98,18 @@ static const AlarmChannelData sChannelData[kNumTimers] = // .mCompareEvent = NRF_RTC_EVENT_COMPARE_0, .mCompareInt = NRF_RTC_INT_COMPARE0_MASK, }, - [kUsTimer] = { - .mChannelNumber = 1, - .mCompareEventMask = RTC_EVTEN_COMPARE1_Msk, - .mCompareEvent = NRF_RTC_EVENT_COMPARE_1, - .mCompareInt = NRF_RTC_INT_COMPARE1_MASK, + [kUsTimer] = + { + .mChannelNumber = 1, + .mCompareEventMask = RTC_EVTEN_COMPARE1_Msk, + .mCompareEvent = NRF_RTC_EVENT_COMPARE_1, + .mCompareInt = NRF_RTC_INT_COMPARE1_MASK, + }, + [k802154Timer] = { + .mChannelNumber = 2, + .mCompareEventMask = RTC_EVTEN_COMPARE2_Msk, + .mCompareEvent = NRF_RTC_EVENT_COMPARE_2, + .mCompareInt = NRF_RTC_INT_COMPARE2_MASK, }}; static uint32_t OverflowCounterGet(void); @@ -197,8 +206,15 @@ static void HandleCompareMatch(AlarmIndex aIndex, bool aSkipCheck) nrf_rtc_event_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareEventMask); nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[aIndex].mCompareInt); - sTimerData[aIndex].mFireAlarm = true; - PlatformEventSignalPending(); + if (aIndex == k802154Timer) + { + nrf_802154_timer_fired(); + } + else + { + sTimerData[aIndex].mFireAlarm = true; + PlatformEventSignalPending(); + } } } @@ -465,6 +481,61 @@ void otPlatAlarmMicroStop(otInstance *aInstance) AlarmStop(kUsTimer); } +/** + * Radio driver timer abstraction API + */ + +void nrf_802154_timer_init(void) +{ + // Intentionally empty +} + +void nrf_802154_timer_deinit(void) +{ + // Intentionally empty +} + +void nrf_802154_timer_critical_section_enter(void) +{ + nrf_rtc_int_disable(RTC_INSTANCE, sChannelData[k802154Timer].mCompareInt); + __DSB(); + __ISB(); +} + +void nrf_802154_timer_critical_section_exit(void) +{ + nrf_rtc_int_enable(RTC_INSTANCE, sChannelData[k802154Timer].mCompareInt); +} + +uint32_t nrf_802154_timer_time_get(void) +{ + return (uint32_t)nrf5AlarmGetCurrentTime(); +} + +uint32_t nrf_802154_timer_granularity_get(void) +{ + return US_PER_TICK; +} + +void nrf_802154_timer_start(uint32_t t0, uint32_t dt) +{ + AlarmStartAt(t0, dt, k802154Timer); +} + +void nrf_802154_timer_stop(void) +{ + AlarmStop(k802154Timer); +} + +bool nrf_802154_timer_is_running(void) +{ + return nrf_rtc_int_is_enabled(RTC_INSTANCE, sChannelData[k802154Timer].mCompareInt); +} + +/** + * RTC IRQ handler + */ + void RTC_IRQ_HANDLER(void) { // Handle overflow. diff --git a/third_party/NordicSemiconductor/drivers/radio/nrf_802154.c b/third_party/NordicSemiconductor/drivers/radio/nrf_802154.c index 57c6f4823..ca31d3fc7 100644 --- a/third_party/NordicSemiconductor/drivers/radio/nrf_802154.c +++ b/third_party/NordicSemiconductor/drivers/radio/nrf_802154.c @@ -165,11 +165,13 @@ void nrf_802154_init(void) nrf_802154_revision_init(); nrf_802154_rx_buffer_init(); nrf_802154_timer_init(); + nrf_802154_timer_sched_init(); nrf_raal_init(); } void nrf_802154_deinit(void) { + nrf_802154_timer_sched_deinit(); nrf_802154_timer_deinit(); nrf_802154_clock_deinit(); nrf_802154_core_deinit();