zephyr/modules/openthread/platform/alarm.c
Robert Lubos 815ebc316e net: openthread: Move glue code into module directory
Move OpenThread's glue code along with the Kconfig files that configure
OpenThread stack itself into module directory.

Update the maintainers file to reflect this change.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
2022-07-11 11:00:12 +02:00

134 lines
2.7 KiB
C

/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#define LOG_MODULE_NAME net_openthread_alarm
#define LOG_LEVEL CONFIG_OPENTHREAD_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include <zephyr/kernel.h>
#include <string.h>
#include <inttypes.h>
#include <openthread/platform/alarm-milli.h>
#include <openthread/platform/alarm-micro.h>
#include <openthread/platform/diag.h>
#include <openthread-system.h>
#include <stdio.h>
#include "platform-zephyr.h"
#include "openthread-core-zephyr-config.h"
static bool timer_ms_fired, timer_us_fired;
static int32_t time_offset_us;
static int32_t time_offset_ms;
static void ot_timer_ms_fired(struct k_timer *timer)
{
ARG_UNUSED(timer);
timer_ms_fired = true;
otSysEventSignalPending();
}
static void ot_timer_us_fired(struct k_timer *timer)
{
ARG_UNUSED(timer);
timer_us_fired = true;
otSysEventSignalPending();
}
K_TIMER_DEFINE(ot_ms_timer, ot_timer_ms_fired, NULL);
K_TIMER_DEFINE(ot_us_timer, ot_timer_us_fired, NULL);
void platformAlarmInit(void)
{
#if defined(CONFIG_NET_PKT_TXTIME)
time_offset_us =
(int32_t)((int64_t)otPlatAlarmMicroGetNow() - (uint32_t)otPlatRadioGetNow(NULL));
time_offset_ms = time_offset_us / 1000;
#endif
}
void platformAlarmProcess(otInstance *aInstance)
{
if (timer_ms_fired) {
timer_ms_fired = false;
#if defined(CONFIG_OPENTHREAD_DIAG)
if (otPlatDiagModeGet()) {
otPlatDiagAlarmFired(aInstance);
} else
#endif
{
otPlatAlarmMilliFired(aInstance);
}
}
#if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
if (timer_us_fired) {
timer_us_fired = false;
otPlatAlarmMicroFired(aInstance);
}
#endif
}
uint32_t otPlatAlarmMilliGetNow(void)
{
return k_uptime_get_32() - time_offset_ms;
}
void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
{
ARG_UNUSED(aInstance);
int32_t delta = (int32_t)(aT0 + aDt - otPlatAlarmMilliGetNow());
if (delta > 0) {
k_timer_start(&ot_ms_timer, K_MSEC(delta), K_NO_WAIT);
} else {
ot_timer_ms_fired(NULL);
}
}
void otPlatAlarmMilliStop(otInstance *aInstance)
{
ARG_UNUSED(aInstance);
k_timer_stop(&ot_ms_timer);
}
void otPlatAlarmMicroStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
{
ARG_UNUSED(aInstance);
int32_t delta = (int32_t)(aT0 + aDt - otPlatAlarmMicroGetNow());
if (delta > 0) {
k_timer_start(&ot_us_timer, K_USEC(delta), K_NO_WAIT);
} else {
ot_timer_us_fired(NULL);
}
}
void otPlatAlarmMicroStop(otInstance *aInstance)
{
ARG_UNUSED(aInstance);
k_timer_stop(&ot_us_timer);
}
uint32_t otPlatAlarmMicroGetNow(void)
{
return (uint32_t)(k_ticks_to_us_floor64(k_uptime_ticks()) - time_offset_us);
}
uint16_t otPlatTimeGetXtalAccuracy(void)
{
return otPlatRadioGetCslAccuracy(NULL);
}