/* * Copyright (c) 2017 Oticon A/S * * SPDX-License-Identifier: Apache-2.0 */ /** * Driver for the timer model of the POSIX native_posix board * It provides the interfaces required by the kernel and the sanity testcases * It also provides a custom k_busy_wait() which can be used with the * POSIX arch and InfClock SOC */ #include "zephyr/types.h" #include "irq.h" #include "device.h" #include "drivers/system_timer.h" #include "timer_model.h" #include "soc.h" /** * Return the current HW cycle counter * (number of microseconds since boot in 32bits) */ u32_t _timer_cycle_get_32(void) { return hwm_get_time(); } #ifdef CONFIG_TICKLESS_IDLE void _timer_idle_enter(int32_t sys_ticks) { hwtimer_set_silent_ticks(sys_ticks); } void _timer_idle_exit(void) { hwtimer_set_silent_ticks(0); } #endif static void sp_timer_isr(void *arg) { ARG_UNUSED(arg); _sys_clock_tick_announce(); } int _sys_clock_driver_init(struct device *device) { ARG_UNUSED(device); IRQ_CONNECT(TIMER_TICK_IRQ, 1, sp_timer_isr, 0, 0); irq_enable(TIMER_TICK_IRQ); return 0; } #if defined(CONFIG_ARCH_HAS_CUSTOM_BUSY_WAIT) /** * Replacement to the kernel k_busy_wait() * Will block this thread (and therefore the whole zephyr) during usec_to_wait * * Note that interrupts may be received in the meanwhile and that therefore this * thread may loose context */ void k_busy_wait(u32_t usec_to_wait) { u64_t time_end = hwm_get_time() + usec_to_wait; while (hwm_get_time() < time_end) { /*There may be wakes due to other interrupts*/ hwtimer_wake_in_time(time_end); posix_halt_cpu(); } } #endif