mirror of
https://github.com/espressif/openthread.git
synced 2026-07-30 23:57:47 +00:00
[nrf52840] Add timer API for new radio driver in alarm.c (#2607)
This commit is contained in:
committed by
Jonathan Hui
parent
ef17e914a9
commit
2559e03b55
@@ -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 = \
|
||||
|
||||
@@ -51,6 +51,8 @@
|
||||
#include "cmsis/core_cmFunc.h"
|
||||
|
||||
#include <drivers/clock/nrf_drv_clock.h>
|
||||
#include <drivers/radio/platform/timer/nrf_802154_timer.h>
|
||||
|
||||
#include <hal/nrf_rtc.h>
|
||||
|
||||
#include <openthread/config.h>
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user