diff --git a/cpu/atmega_common/Kconfig b/cpu/atmega_common/Kconfig index 0d9261b538..5311f0db60 100644 --- a/cpu/atmega_common/Kconfig +++ b/cpu/atmega_common/Kconfig @@ -14,6 +14,7 @@ config CPU_COMMON_ATMEGA select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_PM + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_TIMER_PERIODIC select HAS_PERIPH_WDT select HAS_PUF_SRAM diff --git a/cpu/atmega_common/Makefile.features b/cpu/atmega_common/Makefile.features index a2d93c21ae..a90abb1aa5 100644 --- a/cpu/atmega_common/Makefile.features +++ b/cpu/atmega_common/Makefile.features @@ -8,6 +8,7 @@ FEATURES_PROVIDED += periph_cpuid FEATURES_PROVIDED += periph_eeprom FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_pm +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_timer_periodic FEATURES_PROVIDED += periph_wdt FEATURES_PROVIDED += puf_sram diff --git a/cpu/cc2538/Kconfig b/cpu/cc2538/Kconfig index 68300b2e73..c60d306680 100644 --- a/cpu/cc2538/Kconfig +++ b/cpu/cc2538/Kconfig @@ -16,6 +16,7 @@ config CPU_FAM_CC2538 select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_HWRNG + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_UART_MODECFG select HAS_PERIPH_UART_NONBLOCKING select HAS_PERIPH_WDT diff --git a/cpu/cc2538/Makefile.features b/cpu/cc2538/Makefile.features index 1fca8a7ced..cafaf3ec9a 100644 --- a/cpu/cc2538/Makefile.features +++ b/cpu/cc2538/Makefile.features @@ -6,6 +6,7 @@ FEATURES_PROVIDED += periph_flashpage FEATURES_PROVIDED += periph_flashpage_pagewise FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_hwrng +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_uart_modecfg FEATURES_PROVIDED += periph_uart_nonblocking FEATURES_PROVIDED += periph_wdt diff --git a/cpu/efm32/Kconfig b/cpu/efm32/Kconfig index 2bb539e5f1..b807643e82 100644 --- a/cpu/efm32/Kconfig +++ b/cpu/efm32/Kconfig @@ -13,6 +13,7 @@ config CPU_COMMON_EFM32 select HAS_PERIPH_FLASHPAGE_PAGEWISE select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_WDT config CPU_EFM32_SERIES0 diff --git a/cpu/efm32/Makefile.features b/cpu/efm32/Makefile.features index 8f369cefec..2f6363f8f9 100644 --- a/cpu/efm32/Makefile.features +++ b/cpu/efm32/Makefile.features @@ -13,6 +13,7 @@ FEATURES_PROVIDED += periph_cpuid FEATURES_PROVIDED += periph_flashpage FEATURES_PROVIDED += periph_flashpage_pagewise FEATURES_PROVIDED += periph_gpio periph_gpio_irq +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_wdt FEATURES_CONFLICT += periph_rtc:periph_rtt diff --git a/cpu/esp32/Kconfig b/cpu/esp32/Kconfig index 8bee0c55c1..e3c15435df 100644 --- a/cpu/esp32/Kconfig +++ b/cpu/esp32/Kconfig @@ -10,14 +10,15 @@ config CPU_CORE_XTENSA_LX6 config CPU_FAM_ESP32 bool - select CPU_CORE_XTENSA_LX6 select CPU_COMMON_ESP + select CPU_CORE_XTENSA_LX6 select HAS_ARCH_ESP32 select HAS_CPU_ESP32 select HAS_ESP_WIFI_ENTERPRISE select HAS_PERIPH_ADC_CTRL select HAS_PERIPH_RTC select HAS_PERIPH_RTT + select HAS_PERIPH_RTT_SET_COUNTER ## CPU Models config CPU_MODEL_ESP32_WROOM_32 diff --git a/cpu/esp32/Makefile.features b/cpu/esp32/Makefile.features index 455772f86f..699f7b2126 100644 --- a/cpu/esp32/Makefile.features +++ b/cpu/esp32/Makefile.features @@ -9,3 +9,4 @@ FEATURES_PROVIDED += esp_wifi_enterprise FEATURES_PROVIDED += periph_adc_ctrl FEATURES_PROVIDED += periph_rtc FEATURES_PROVIDED += periph_rtt +FEATURES_PROVIDED += periph_rtt_set_counter diff --git a/cpu/esp8266/Kconfig b/cpu/esp8266/Kconfig index 363945efe9..f04a07cc21 100644 --- a/cpu/esp8266/Kconfig +++ b/cpu/esp8266/Kconfig @@ -10,12 +10,13 @@ config CPU_CORE_XTENSA_L106 config CPU_FAM_ESP8266 bool - select CPU_CORE_XTENSA_L106 select CPU_COMMON_ESP + select CPU_CORE_XTENSA_L106 select HAS_ARCH_ESP8266 select HAS_CPU_ESP8266 - select HAS_PERIPH_RTT select HAS_PERIPH_RTC + select HAS_PERIPH_RTT + select HAS_PERIPH_RTT_SET_COUNTER ## CPU Models config CPU_MODEL_ESP8266EX diff --git a/cpu/esp8266/Makefile.features b/cpu/esp8266/Makefile.features index 899fbfa891..a927f8502e 100644 --- a/cpu/esp8266/Makefile.features +++ b/cpu/esp8266/Makefile.features @@ -7,3 +7,4 @@ include $(RIOTCPU)/esp_common/Makefile.features FEATURES_PROVIDED += arch_esp8266 FEATURES_PROVIDED += periph_rtt FEATURES_PROVIDED += periph_rtc +FEATURES_PROVIDED += periph_rtt_set_counter diff --git a/cpu/fe310/Kconfig b/cpu/fe310/Kconfig index a7323ad209..a768f0161d 100644 --- a/cpu/fe310/Kconfig +++ b/cpu/fe310/Kconfig @@ -13,6 +13,7 @@ config CPU_FAM_FE310 select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_PM + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_WDT config CPU_MODEL_FE310_G000 diff --git a/cpu/fe310/Makefile.features b/cpu/fe310/Makefile.features index b4998dd7b5..0d8c7eca27 100644 --- a/cpu/fe310/Makefile.features +++ b/cpu/fe310/Makefile.features @@ -1,6 +1,7 @@ FEATURES_PROVIDED += periph_cpuid FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_pm +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_wdt include $(RIOTCPU)/riscv_common/Makefile.features diff --git a/cpu/kinetis/Kconfig b/cpu/kinetis/Kconfig index de64add3ed..8ba10bbc46 100644 --- a/cpu/kinetis/Kconfig +++ b/cpu/kinetis/Kconfig @@ -8,9 +8,10 @@ config CPU_COMMON_KINETIS bool select HAS_CPU_KINETIS select HAS_PERIPH_CPUID - select HAS_PERIPH_PM select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ + select HAS_PERIPH_PM + select HAS_PERIPH_RTT_SET_COUNTER config CPU_FAM_EA bool diff --git a/cpu/kinetis/Makefile.features b/cpu/kinetis/Makefile.features index 33484b682f..853bb78bb5 100644 --- a/cpu/kinetis/Makefile.features +++ b/cpu/kinetis/Makefile.features @@ -14,6 +14,7 @@ endif FEATURES_PROVIDED += periph_gpio FEATURES_PROVIDED += periph_gpio_irq +FEATURES_PROVIDED += periph_rtt_set_counter # Parse parameters from CPU_MODEL using the kinetis-info.mk script in the same # directory as this Makefile. diff --git a/cpu/nrf5x_common/Kconfig b/cpu/nrf5x_common/Kconfig index b4968096ac..10e1815be9 100644 --- a/cpu/nrf5x_common/Kconfig +++ b/cpu/nrf5x_common/Kconfig @@ -6,18 +6,19 @@ config CPU_COMMON_NRF5X bool + select HAS_BLE_NIMBLE select HAS_PERIPH_CPUID select HAS_PERIPH_FLASHPAGE select HAS_PERIPH_FLASHPAGE_PAGEWISE select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_HWRNG + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_TEMPERATURE select HAS_PERIPH_TIMER_PERIODIC select HAS_PERIPH_UART_MODECFG select HAS_PERIPH_WDT select HAS_PERIPH_WDT_CB - select HAS_BLE_NIMBLE select HAS_RADIO_NRFBLE select HAS_RADIO_NRFMIN diff --git a/cpu/nrf5x_common/Makefile.features b/cpu/nrf5x_common/Makefile.features index 30f8cf3aa7..270dfbc80a 100644 --- a/cpu/nrf5x_common/Makefile.features +++ b/cpu/nrf5x_common/Makefile.features @@ -4,6 +4,7 @@ FEATURES_PROVIDED += periph_flashpage FEATURES_PROVIDED += periph_flashpage_pagewise FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_hwrng +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_temperature FEATURES_PROVIDED += periph_timer_periodic FEATURES_PROVIDED += periph_uart_modecfg diff --git a/cpu/sam0_common/Kconfig b/cpu/sam0_common/Kconfig index 35afd5edff..24942c4cdb 100644 --- a/cpu/sam0_common/Kconfig +++ b/cpu/sam0_common/Kconfig @@ -14,6 +14,7 @@ config CPU_COMMON_SAM0 select HAS_PERIPH_GPIO select HAS_PERIPH_GPIO_IRQ select HAS_PERIPH_I2C_RECONFIGURE + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_SPI_RECONFIGURE select HAS_PERIPH_TIMER_PERIODIC select HAS_PERIPH_UART_MODECFG diff --git a/cpu/sam0_common/Makefile.features b/cpu/sam0_common/Makefile.features index 02dd8d1258..51d75bdd26 100644 --- a/cpu/sam0_common/Makefile.features +++ b/cpu/sam0_common/Makefile.features @@ -12,6 +12,7 @@ FEATURES_PROVIDED += periph_flashpage_pagewise FEATURES_PROVIDED += periph_flashpage_rwee FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_i2c_reconfigure +FEATURES_PROVIDED += periph_rtt_set_counter FEATURES_PROVIDED += periph_spi_reconfigure FEATURES_PROVIDED += periph_timer_periodic # implements timer_set_periodic() FEATURES_PROVIDED += periph_uart_modecfg diff --git a/cpu/stm32/Makefile.features b/cpu/stm32/Makefile.features index b294249711..ac635c9b11 100644 --- a/cpu/stm32/Makefile.features +++ b/cpu/stm32/Makefile.features @@ -28,6 +28,7 @@ endif ifeq (f1,$(CPU_FAM)) FEATURES_CONFLICT += periph_rtc:periph_rtt FEATURES_CONFLICT_MSG += "On the STM32F1, the RTC and RTT map to the same hardware peripheral." + FEATURES_PROVIDED += periph_rtt_set_counter endif # Not all F4 and L0 parts implement a RNG. diff --git a/cpu/stm32/kconfigs/f1/Kconfig b/cpu/stm32/kconfigs/f1/Kconfig index 01e9848dbb..bbbc8c6fb5 100644 --- a/cpu/stm32/kconfigs/f1/Kconfig +++ b/cpu/stm32/kconfigs/f1/Kconfig @@ -7,15 +7,16 @@ config CPU_FAM_F1 bool - select CPU_STM32 + select CLOCK_HAS_NO_MCO_PRE select CPU_CORE_CORTEX_M3 + select CPU_STM32 + select HAS_BOOTLOADER_STM32 select HAS_CPU_STM32F1 select HAS_PERIPH_FLASHPAGE select HAS_PERIPH_FLASHPAGE_PAGEWISE select HAS_PERIPH_FLASHPAGE_RAW + select HAS_PERIPH_RTT_SET_COUNTER select HAS_PERIPH_WDT - select HAS_BOOTLOADER_STM32 - select CLOCK_HAS_NO_MCO_PRE if CPU_FAM_F1 diff --git a/cpu/stm32/periph/rtt_all.c b/cpu/stm32/periph/rtt_all.c index 1b62bdfd6f..9e4ff785ab 100644 --- a/cpu/stm32/periph/rtt_all.c +++ b/cpu/stm32/periph/rtt_all.c @@ -185,6 +185,11 @@ void rtt_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg) irq_restore(is); } +uint32_t rtt_get_alarm(void) +{ + return LPTIM1->CMP; +} + void rtt_clear_alarm(void) { to_cb = NULL; diff --git a/drivers/include/periph/rtt.h b/drivers/include/periph/rtt.h index 6d0cab57a9..59a0a3dfe8 100644 --- a/drivers/include/periph/rtt.h +++ b/drivers/include/periph/rtt.h @@ -191,9 +191,11 @@ void rtt_clear_overflow_cb(void); uint32_t rtt_get_counter(void); /** - * @brief Set the RTT counter to a specified value. + * @brief Set the RTT counter to a specified value. * * @param[in] counter The value to set the RTT to. + * + * @note This function is only provided when the feature `periph_rtt_set_counter` is provided */ void rtt_set_counter(uint32_t counter); diff --git a/drivers/periph_common/Kconfig b/drivers/periph_common/Kconfig index c131b0e1a6..a1b958375e 100644 --- a/drivers/periph_common/Kconfig +++ b/drivers/periph_common/Kconfig @@ -122,6 +122,10 @@ config MODULE_PERIPH_RTT depends on HAS_PERIPH_RTT select MODULE_PERIPH_COMMON +config MODULE_PERIPH_RTT_SET_COUNTER + bool "rtc_set_counter() implementation in the RTT peripheral driver" + depends on HAS_PERIPH_RTT_SET_COUNTER && MODULE_PERIPH_RTT + config MODULE_PERIPH_INIT_RTT bool "Auto initialize RTT peripheral" default y if MODULE_PERIPH_INIT diff --git a/kconfigs/Kconfig.features b/kconfigs/Kconfig.features index f3d46df872..f60b8bb940 100644 --- a/kconfigs/Kconfig.features +++ b/kconfigs/Kconfig.features @@ -251,6 +251,11 @@ config HAS_PERIPH_RTT help Indicates that an RTT peripheral is present. +config HAS_PERIPH_RTT_SET_COUNTER + bool + help + Indicates that the RTT peripheral implements rtt_set_counter(). + config HAS_PERIPH_SPI bool help diff --git a/tests/periph_rtt/Kconfig b/tests/periph_rtt/Kconfig new file mode 100644 index 0000000000..a2d35dbf35 --- /dev/null +++ b/tests/periph_rtt/Kconfig @@ -0,0 +1,12 @@ +# Copyright (C) 2021 Otto-von-Guericke-Universität Magdeburg +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. +# + +config APPLICATION + bool + default y + imply MODULE_PERIPH_RTT_SET_COUNTER + depends on TEST_KCONFIG diff --git a/tests/periph_rtt/Makefile b/tests/periph_rtt/Makefile index 08887559e5..72bb287f2b 100644 --- a/tests/periph_rtt/Makefile +++ b/tests/periph_rtt/Makefile @@ -2,6 +2,7 @@ BOARD ?= samr21-xpro include ../Makefile.tests_common FEATURES_REQUIRED = periph_rtt +FEATURES_OPTIONAL += periph_rtt_set_counter DISABLE_MODULE += periph_init_rtt diff --git a/tests/periph_rtt/main.c b/tests/periph_rtt/main.c index 96e10a5e65..8e9ac8de0f 100644 --- a/tests/periph_rtt/main.c +++ b/tests/periph_rtt/main.c @@ -75,10 +75,32 @@ int main(void) uint32_t now = rtt_get_counter(); printf("RTT now: %" PRIu32 "\n", now); + if (IS_USED(MODULE_PERIPH_RTT_SET_COUNTER)) { + puts("Setting RTT timer to 1337"); + rtt_set_counter(1337); + now = rtt_get_counter(); + printf("RTT now: %" PRIu32 "\n", now); + if ((now < 1337) || (now > 1337 + (1 * RTT_FREQUENCY + 999) / 1000)) { + puts("ERROR: rtt_set_counter() failed (off by more than 1 ms)"); + return 1; + } + else { + puts("rtt_set_counter() PASSED"); + } + } + last = (now + TICKS_TO_WAIT) & RTT_MAX_VALUE; printf("Setting initial alarm to now + 5 s (%" PRIu32 ")\n", last); rtt_set_alarm(last, cb, 0); + if (rtt_get_alarm() != last) { + puts("Error: rtt_get_alarm() not working"); + return 1; + } + else { + puts("rtt_get_alarm() PASSED"); + } + puts("Done setting up the RTT, wait for many Hellos"); return 0; } diff --git a/tests/periph_rtt/tests/01-run.py b/tests/periph_rtt/tests/01-run.py index 494ecec330..2990071a1b 100755 --- a/tests/periph_rtt/tests/01-run.py +++ b/tests/periph_rtt/tests/01-run.py @@ -25,8 +25,8 @@ def testfunc(child): child.expect(r'RTT now: \d+') child.expect(r'Setting initial alarm to now \+ {} s \(\d+\)' .format(period)) - child.expect_exact('Done setting up the RTT, wait for many Hellos') start = time.time() + child.expect_exact('Done setting up the RTT, wait for many Hellos') for _ in range(MAX_HELLOS): child.expect_exact('Hello\r\n', timeout=period + 1)