/* * 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 LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include #include #include #include #include #include #include #include #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 OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE if (timer_us_fired) { timer_us_fired = false; otPlatAlarmMicroFired(aInstance); } #endif if (timer_ms_fired) { timer_ms_fired = false; #if defined(CONFIG_OPENTHREAD_DIAG) if (otPlatDiagModeGet()) { otPlatDiagAlarmFired(aInstance); } else #endif { otPlatAlarmMilliFired(aInstance); } } } 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); }