diff --git a/Makefile.dep b/Makefile.dep index 882bb15404..90a57eed17 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -675,14 +675,6 @@ ifneq (,$(filter arduino_pwm,$(FEATURES_USED))) FEATURES_REQUIRED += periph_pwm endif -ifneq (,$(filter xtimer,$(USEMODULE))) - ifeq (,$(filter ztimer_xtimer_compat,$(USEMODULE))) - DEFAULT_MODULE += auto_init_xtimer - FEATURES_REQUIRED += periph_timer - USEMODULE += div - endif -endif - ifneq (,$(filter saul,$(USEMODULE))) USEMODULE += phydat endif @@ -1015,10 +1007,28 @@ ifneq (,$(filter periph_uart_nonblocking,$(USEMODULE))) FEATURES_REQUIRED += periph_uart endif +# include ztimer dependencies ifneq (,$(filter ztimer%,$(USEMODULE))) include $(RIOTBASE)/sys/ztimer/Makefile.dep endif +# handle xtimer's deps. Needs to be done *after* ztimer +ifneq (,$(filter xtimer,$(USEMODULE))) + ifeq (,$(filter ztimer_xtimer_compat,$(USEMODULE))) + # xtimer is used, ztimer xtimer wrapper is not + DEFAULT_MODULE += auto_init_xtimer + USEMODULE += div + ifeq (,$(filter xtimer_on_ztimer,$(USEMODULE))) + # ztimer is not used, so use *periph_timer as low-level timer*. + FEATURES_REQUIRED += periph_timer + else + # will use *ztimer_usec as low-level timer* + endif + else + # ztimer_xtimer_compat is used, all of *xtimer's API will be mapped on ztimer.* + endif +endif + # Enable periph_gpio when periph_gpio_irq is enabled ifneq (,$(filter periph_gpio_irq,$(USEMODULE))) FEATURES_REQUIRED += periph_gpio diff --git a/sys/include/xtimer.h b/sys/include/xtimer.h index e75b91d270..bd1e1c50a3 100644 --- a/sys/include/xtimer.h +++ b/sys/include/xtimer.h @@ -42,8 +42,10 @@ #include "ztimer/xtimer_compat.h" #else +#ifndef MODULE_XTIMER_ON_ZTIMER #include "board.h" #include "periph_conf.h" +#endif #ifdef __cplusplus extern "C" { diff --git a/sys/include/xtimer/implementation.h b/sys/include/xtimer/implementation.h index cc61ada24a..78ac653adb 100644 --- a/sys/include/xtimer/implementation.h +++ b/sys/include/xtimer/implementation.h @@ -27,9 +27,15 @@ #error "Do not include this file directly! Use xtimer.h instead" #endif +#ifdef MODULE_XTIMER_ON_ZTIMER +#include "ztimer.h" +#else #include "periph/timer.h" +#endif + #include "irq.h" + #ifdef __cplusplus extern "C" { #endif @@ -46,7 +52,12 @@ extern volatile uint64_t _xtimer_current_time; */ static inline uint32_t _xtimer_lltimer_now(void) { +#ifndef MODULE_XTIMER_ON_ZTIMER return timer_read(XTIMER_DEV); +#else + return ztimer_now(ZTIMER_USEC); +#endif + } /** diff --git a/sys/xtimer/xtimer_core.c b/sys/xtimer/xtimer_core.c index 58e8acc1c3..cdc34ffcac 100644 --- a/sys/xtimer/xtimer_core.c +++ b/sys/xtimer/xtimer_core.c @@ -24,9 +24,12 @@ #include #include + +#ifndef MODULE_XTIMER_ON_ZTIMER #include "board.h" #include "periph/timer.h" #include "periph_conf.h" +#endif #include "xtimer.h" #include "irq.h" @@ -50,12 +53,20 @@ static inline void _update_long_timers(uint64_t *now); static inline void _schedule_earliest_lltimer(uint32_t now); static void _timer_callback(void); + +#ifndef MODULE_XTIMER_ON_ZTIMER static void _periph_timer_callback(void *arg, int chan); +#else +static void _ztimer_callback(void *arg); +static ztimer_t _ztimer = { .callback=_ztimer_callback }; +#endif void xtimer_init(void) { +#ifndef MODULE_XTIMER_ON_ZTIMER /* initialize low-level timer */ timer_init(XTIMER_DEV, XTIMER_HZ, _periph_timer_callback, NULL); +#endif /* register initial overflow tick */ _schedule_earliest_lltimer(_xtimer_now()); @@ -107,12 +118,20 @@ void _xtimer_set64(xtimer_t *timer, uint32_t offset, uint32_t long_offset) irq_restore(state); } +#ifndef MODULE_XTIMER_ON_ZTIMER static void _periph_timer_callback(void *arg, int chan) { (void)arg; (void)chan; _timer_callback(); } +#else +static void _ztimer_callback(void *arg) +{ + (void)arg; + _timer_callback(); +} +#endif static void _shoot(xtimer_t *timer) { @@ -141,7 +160,11 @@ static inline void _schedule_earliest_lltimer(uint32_t now) } DEBUG("_schedule_earliest_lltimer(): setting %" PRIu32 "\n", _xtimer_lltimer_mask(target)); +#ifndef MODULE_XTIMER_ON_ZTIMER timer_set_absolute(XTIMER_DEV, XTIMER_CHAN, _xtimer_lltimer_mask(target)); +#else + ztimer_set(ZTIMER_USEC, &_ztimer, target - ztimer_now(ZTIMER_USEC)); +#endif _lltimer_ongoing = true; } diff --git a/sys/ztimer/Makefile.dep b/sys/ztimer/Makefile.dep index fcfc495b60..1ccc74b298 100644 --- a/sys/ztimer/Makefile.dep +++ b/sys/ztimer/Makefile.dep @@ -2,7 +2,6 @@ # ztimer dependencies # - # "ztimer" is the default meta-module of ztimer ifneq (,$(filter ztimer,$(USEMODULE))) USEMODULE += ztimer_core @@ -24,8 +23,23 @@ ifneq (,$(filter ztimer,$(USEMODULE))) endif endif +# unless ztimer_xtimer_compat is used, make xtimer use ztimer as backend. +ifneq (,$(filter ztimer,$(USEMODULE))) + ifneq (,$(filter xtimer,$(USEMODULE))) + ifeq (,$(filter ztimer_xtimer_compat,$(USEMODULE))) + USEMODULE += xtimer_on_ztimer + endif + endif +endif + +# make xtimer use ztimer_usec as low level timer +ifneq (,$(filter xtimer_on_ztimer,$(USEMODULE))) + USEMODULE += ztimer_usec + PSEUDOMODULES += xtimer_on_ztimer +endif + # "ztimer_xtimer_compat" is a wrapper of the xtimer API on ztimer_used -# (it is currently incomplete) +# (it is currently incomplete). Unless doing testing, use "xtimer_on_ztimer". ifneq (,$(filter ztimer_xtimer_compat,$(USEMODULE))) USEMODULE += div USEMODULE += ztimer_usec @@ -41,11 +55,11 @@ ifneq (,$(filter ztimer_convert_%,$(USEMODULE))) USEMODULE += ztimer_convert endif -ifneq (,$(filter ztimer_periph,$(USEMODULE))) +ifneq (,$(filter ztimer_periph_timer,$(USEMODULE))) FEATURES_REQUIRED += periph_timer endif -ifneq (,$(filter ztimer_rtt,$(USEMODULE))) +ifneq (,$(filter ztimer_periph_rtt,$(USEMODULE))) FEATURES_REQUIRED += periph_rtt endif @@ -55,7 +69,7 @@ endif ifneq (,$(filter ztimer_usec,$(USEMODULE))) USEMODULE += ztimer - USEMODULE += ztimer_periph + USEMODULE += ztimer_periph_timer endif ifneq (,$(filter ztimer_msec,$(USEMODULE)))