diff --git a/boards/adi/apard32690/apard32690_max32690_m4.yaml b/boards/adi/apard32690/apard32690_max32690_m4.yaml index 3649ee474261e..f3f842b66b2f2 100644 --- a/boards/adi/apard32690/apard32690_max32690_m4.yaml +++ b/boards/adi/apard32690/apard32690_max32690_m4.yaml @@ -15,5 +15,6 @@ supported: - serial - spi - trng + - counter ram: 1024 flash: 3072 diff --git a/boards/adi/apard32690/doc/index.rst b/boards/adi/apard32690/doc/index.rst index b73ef3ec71465..192f0bba814ad 100644 --- a/boards/adi/apard32690/doc/index.rst +++ b/boards/adi/apard32690/doc/index.rst @@ -115,6 +115,8 @@ Below interfaces are supported by Zephyr on APARD32690. +-----------+------------+------------------------------------+ | TRNG | on-chip | entropy | +-----------+------------+------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+------------------------------------+ Connections and IOs diff --git a/boards/adi/max32655evkit/doc/index.rst b/boards/adi/max32655evkit/doc/index.rst index 060f070c17840..d052dba938a03 100644 --- a/boards/adi/max32655evkit/doc/index.rst +++ b/boards/adi/max32655evkit/doc/index.rst @@ -99,6 +99,8 @@ Below are the interfaces supported by Zephyr on MAX32655EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs =================== diff --git a/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml b/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml index f70d10eb2c781..0a870489a2248 100644 --- a/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml +++ b/boards/adi/max32655evkit/max32655evkit_max32655_m4.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 128 flash: 512 diff --git a/boards/adi/max32655fthr/doc/index.rst b/boards/adi/max32655fthr/doc/index.rst index 493611c428c11..3c9efcfb67596 100644 --- a/boards/adi/max32655fthr/doc/index.rst +++ b/boards/adi/max32655fthr/doc/index.rst @@ -112,6 +112,8 @@ Below are the interfaces supported by Zephyr on MAX32655FTHR. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Push Buttons ************ diff --git a/boards/adi/max32655fthr/max32655fthr_max32655_m4.yaml b/boards/adi/max32655fthr/max32655fthr_max32655_m4.yaml index 14010a720a801..e361e18e24f11 100644 --- a/boards/adi/max32655fthr/max32655fthr_max32655_m4.yaml +++ b/boards/adi/max32655fthr/max32655fthr_max32655_m4.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 128 flash: 512 diff --git a/boards/adi/max32662evkit/doc/index.rst b/boards/adi/max32662evkit/doc/index.rst index fdf80e6c24266..6471801570675 100644 --- a/boards/adi/max32662evkit/doc/index.rst +++ b/boards/adi/max32662evkit/doc/index.rst @@ -109,6 +109,8 @@ Below interfaces are supported by Zephyr on MAX32662EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs =================== diff --git a/boards/adi/max32662evkit/max32662evkit.yaml b/boards/adi/max32662evkit/max32662evkit.yaml index 5f5bb20a2082e..f4577c7bcab1b 100644 --- a/boards/adi/max32662evkit/max32662evkit.yaml +++ b/boards/adi/max32662evkit/max32662evkit.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 80 flash: 256 diff --git a/boards/adi/max32666evkit/doc/index.rst b/boards/adi/max32666evkit/doc/index.rst index 5bb017435a3ad..528a8026ca1e0 100644 --- a/boards/adi/max32666evkit/doc/index.rst +++ b/boards/adi/max32666evkit/doc/index.rst @@ -120,6 +120,8 @@ Below interfaces are supported by Zephyr on MAX32666EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs diff --git a/boards/adi/max32666evkit/max32666evkit_max32666_cpu0.yaml b/boards/adi/max32666evkit/max32666evkit_max32666_cpu0.yaml index 63af677e9ac46..45320dd73074d 100644 --- a/boards/adi/max32666evkit/max32666evkit_max32666_cpu0.yaml +++ b/boards/adi/max32666evkit/max32666evkit_max32666_cpu0.yaml @@ -15,5 +15,6 @@ supported: - trng - watchdog - adc + - counter ram: 560 flash: 1024 diff --git a/boards/adi/max32666fthr/doc/index.rst b/boards/adi/max32666fthr/doc/index.rst index 906a4452f77ce..df762d373f58b 100644 --- a/boards/adi/max32666fthr/doc/index.rst +++ b/boards/adi/max32666fthr/doc/index.rst @@ -121,6 +121,8 @@ Below interfaces are supported by Zephyr on MAX32666FTHR. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs =================== diff --git a/boards/adi/max32666fthr/max32666fthr_max32666_cpu0.yaml b/boards/adi/max32666fthr/max32666fthr_max32666_cpu0.yaml index 47ed0f1d8f625..f70a32e68cfbb 100644 --- a/boards/adi/max32666fthr/max32666fthr_max32666_cpu0.yaml +++ b/boards/adi/max32666fthr/max32666fthr_max32666_cpu0.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 560 flash: 1024 diff --git a/boards/adi/max32670evkit/doc/index.rst b/boards/adi/max32670evkit/doc/index.rst index a27915d6035e8..3a03283975ee6 100644 --- a/boards/adi/max32670evkit/doc/index.rst +++ b/boards/adi/max32670evkit/doc/index.rst @@ -116,6 +116,8 @@ Below interfaces are supported by Zephyr on MAX32670EVKIT. +-----------+------------+-------------------------------------+ | SPI | on-chip | spi | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs =================== diff --git a/boards/adi/max32670evkit/max32670evkit.yaml b/boards/adi/max32670evkit/max32670evkit.yaml index d4b49d1d2a45e..f455018662818 100644 --- a/boards/adi/max32670evkit/max32670evkit.yaml +++ b/boards/adi/max32670evkit/max32670evkit.yaml @@ -15,5 +15,6 @@ supported: - dma - watchdog - spi + - counter ram: 160 flash: 384 diff --git a/boards/adi/max32672evkit/doc/index.rst b/boards/adi/max32672evkit/doc/index.rst index ea7c1baa16366..2ad07382fc412 100644 --- a/boards/adi/max32672evkit/doc/index.rst +++ b/boards/adi/max32672evkit/doc/index.rst @@ -111,6 +111,8 @@ Below interfaces are supported by Zephyr on MAX32672EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs diff --git a/boards/adi/max32672evkit/max32672evkit.yaml b/boards/adi/max32672evkit/max32672evkit.yaml index 65dda7715cb71..276acbe28f840 100644 --- a/boards/adi/max32672evkit/max32672evkit.yaml +++ b/boards/adi/max32672evkit/max32672evkit.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 200 flash: 1024 diff --git a/boards/adi/max32672fthr/doc/index.rst b/boards/adi/max32672fthr/doc/index.rst index e60b622c14b98..d773c4ceb95f8 100644 --- a/boards/adi/max32672fthr/doc/index.rst +++ b/boards/adi/max32672fthr/doc/index.rst @@ -113,6 +113,8 @@ Below interfaces are supported by Zephyr on MAX32672FTHR. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs diff --git a/boards/adi/max32672fthr/max32672fthr.yaml b/boards/adi/max32672fthr/max32672fthr.yaml index 2cadf6aea7040..68ba3c8b8a6ee 100644 --- a/boards/adi/max32672fthr/max32672fthr.yaml +++ b/boards/adi/max32672fthr/max32672fthr.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 200 flash: 1024 diff --git a/boards/adi/max32680evkit/doc/index.rst b/boards/adi/max32680evkit/doc/index.rst index c38bb21b82748..4663894d58a36 100644 --- a/boards/adi/max32680evkit/doc/index.rst +++ b/boards/adi/max32680evkit/doc/index.rst @@ -122,6 +122,8 @@ Below interfaces are supported by Zephyr on MAX32680EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs =================== diff --git a/boards/adi/max32680evkit/max32680evkit_max32680_m4.yaml b/boards/adi/max32680evkit/max32680evkit_max32680_m4.yaml index 20f1ed551269b..604d39352229e 100644 --- a/boards/adi/max32680evkit/max32680evkit_max32680_m4.yaml +++ b/boards/adi/max32680evkit/max32680evkit_max32680_m4.yaml @@ -16,5 +16,6 @@ supported: - watchdog - spi - adc + - counter ram: 128 flash: 512 diff --git a/boards/adi/max32690evkit/doc/index.rst b/boards/adi/max32690evkit/doc/index.rst index 219e38cb3564d..5f4fe41e158d8 100644 --- a/boards/adi/max32690evkit/doc/index.rst +++ b/boards/adi/max32690evkit/doc/index.rst @@ -121,6 +121,8 @@ Below interfaces are supported by Zephyr on MAX32690EVKIT. +-----------+------------+-------------------------------------+ | ADC | on-chip | adc | +-----------+------------+-------------------------------------+ +| Timer | on-chip | counter | ++-----------+------------+-------------------------------------+ Connections and IOs diff --git a/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml b/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml index 00b9dc1819232..bd7e017dd3047 100644 --- a/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml +++ b/boards/adi/max32690evkit/max32690evkit_max32690_m4.yaml @@ -16,5 +16,6 @@ supported: - dma - watchdog - adc + - counter ram: 1024 flash: 3072 diff --git a/drivers/counter/CMakeLists.txt b/drivers/counter/CMakeLists.txt index bdb7f88c9bdfc..0189a77641177 100644 --- a/drivers/counter/CMakeLists.txt +++ b/drivers/counter/CMakeLists.txt @@ -49,4 +49,5 @@ zephyr_library_sources_ifdef(CONFIG_COUNTER_TIMER_GD32 counter_gd32_tim zephyr_library_sources_ifdef(CONFIG_COUNTER_SNPS_DW counter_dw_timer.c) zephyr_library_sources_ifdef(CONFIG_COUNTER_SHELL counter_timer_shell.c) zephyr_library_sources_ifdef(CONFIG_COUNTER_TIMER_RPI_PICO counter_rpi_pico_timer.c) +zephyr_library_sources_ifdef(CONFIG_COUNTER_TIMER_MAX32 counter_max32_timer.c) zephyr_library_sources_ifdef(CONFIG_COUNTER_NXP_MRT counter_nxp_mrt.c) diff --git a/drivers/counter/Kconfig b/drivers/counter/Kconfig index 803ba05b85044..952c43aa5ab0c 100644 --- a/drivers/counter/Kconfig +++ b/drivers/counter/Kconfig @@ -96,6 +96,8 @@ source "drivers/counter/Kconfig.dw" source "drivers/counter/Kconfig.rpi_pico" +source "drivers/counter/Kconfig.max32_timer" + source "drivers/counter/Kconfig.nxp_mrt" endif # COUNTER diff --git a/drivers/counter/Kconfig.max32_timer b/drivers/counter/Kconfig.max32_timer new file mode 100644 index 0000000000000..394ee38d8ac28 --- /dev/null +++ b/drivers/counter/Kconfig.max32_timer @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Analog Devices, Inc. +# SPDX-License-Identifier: Apache-2.0 + +config COUNTER_TIMER_MAX32 + bool "MAX32xxx counter driver" + default y + depends on DT_HAS_ADI_MAX32_COUNTER_ENABLED + help + Enable the counter driver for MAX32 MCUs. diff --git a/drivers/counter/counter_max32_timer.c b/drivers/counter/counter_max32_timer.c new file mode 100644 index 0000000000000..f666d38a58a2d --- /dev/null +++ b/drivers/counter/counter_max32_timer.c @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define DT_DRV_COMPAT adi_max32_counter + +#include +#include +#include +#include + +#include + +/** MAX32 MCUs does not have multiple channels */ +#define MAX32_TIMER_CH 1U + +struct max32_tmr_data { + counter_top_callback_t top_callback; + void *top_user_data; + uint32_t guard_period; +}; + +struct max32_tmr_ch_data { + counter_alarm_callback_t callback; + void *user_data; +}; + +struct max32_tmr_config { + struct counter_config_info info; + struct max32_tmr_ch_data *ch_data; + mxc_tmr_regs_t *regs; + const struct device *clock; + struct max32_perclk perclk; + int clock_source; + int prescaler; + void (*irq_func)(const struct device *dev); + bool wakeup_source; +}; + +static int api_start(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + + Wrap_MXC_TMR_EnableInt(cfg->regs); + MXC_TMR_Start(cfg->regs); + + return 0; +} + +static int api_stop(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + + Wrap_MXC_TMR_DisableInt(cfg->regs); + MXC_TMR_Stop(cfg->regs); + + return 0; +} + +static int api_get_value(const struct device *dev, uint32_t *ticks) +{ + const struct max32_tmr_config *cfg = dev->config; + + *ticks = MXC_TMR_GetCount(cfg->regs); + return 0; +} + +static int api_set_top_value(const struct device *dev, const struct counter_top_cfg *counter_cfg) +{ + const struct max32_tmr_config *cfg = dev->config; + + if (counter_cfg->ticks == 0) { + return -EINVAL; + } + + if (counter_cfg->ticks != cfg->info.max_top_value) { + return -ENOTSUP; + } + + return 0; +} + +static uint32_t api_get_pending_int(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + + return Wrap_MXC_TMR_GetPendingInt(cfg->regs); +} + +static uint32_t api_get_top_value(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + + return cfg->info.max_top_value; +} + +static uint32_t api_get_freq(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + + return cfg->info.freq; +} + +static int set_cc(const struct device *dev, uint8_t id, uint32_t val, uint32_t flags) +{ + const struct max32_tmr_config *config = dev->config; + struct max32_tmr_data *data = dev->data; + mxc_tmr_regs_t *regs = config->regs; + + bool absolute = flags & COUNTER_ALARM_CFG_ABSOLUTE; + uint32_t top = api_get_top_value(dev); + int err = 0; + uint32_t now; + uint32_t diff; + uint32_t max_rel_val = top; + bool irq_on_late = 0; + + now = MXC_TMR_GetCount(regs); + MXC_TMR_ClearFlags(regs); + + if (absolute) { + max_rel_val = top - data->guard_period; + irq_on_late = flags & COUNTER_ALARM_CFG_EXPIRE_WHEN_LATE; + } else { + val = now + val; + } + + MXC_TMR_SetCompare(regs, val); + now = MXC_TMR_GetCount(regs); + + diff = (val - now); + if (diff > max_rel_val) { + if (absolute) { + err = -ETIME; + } + + /* Interrupt is triggered always for relative alarm and + * for absolute depending on the flag. + */ + if (irq_on_late) { + NVIC_SetPendingIRQ(MXC_TMR_GET_IRQ(MXC_TMR_GET_IDX(regs))); + } else { + config->ch_data[id].callback = NULL; + } + } else { + api_start(dev); + } + + return err; +} + +static int api_set_alarm(const struct device *dev, uint8_t chan, + const struct counter_alarm_cfg *alarm_cfg) +{ + const struct max32_tmr_config *cfg = dev->config; + struct max32_tmr_ch_data *chdata = &cfg->ch_data[chan]; + + if (alarm_cfg->ticks > api_get_top_value(dev)) { + return -EINVAL; + } + + if (chdata->callback) { + return -EBUSY; + } + + chdata->callback = alarm_cfg->callback; + chdata->user_data = alarm_cfg->user_data; + + return set_cc(dev, chan, alarm_cfg->ticks, alarm_cfg->flags); +} + +static int api_cancel_alarm(const struct device *dev, uint8_t chan) +{ + const struct max32_tmr_config *cfg = dev->config; + + MXC_TMR_Stop(cfg->regs); + MXC_TMR_SetCount(cfg->regs, 0); + MXC_TMR_SetCompare(cfg->regs, cfg->info.max_top_value); + Wrap_MXC_TMR_DisableInt(cfg->regs); + cfg->ch_data[chan].callback = NULL; + + return 0; +} + +static uint32_t api_get_guard_period(const struct device *dev, uint32_t flags) +{ + struct max32_tmr_data *data = dev->data; + + ARG_UNUSED(flags); + + return data->guard_period; +} + +static int api_set_guard_period(const struct device *dev, uint32_t ticks, uint32_t flags) +{ + struct max32_tmr_data *data = dev->data; + + ARG_UNUSED(flags); + + if (ticks > api_get_top_value(dev)) { + return -EINVAL; + } + + data->guard_period = ticks; + return 0; +} + +static void max32_alarm_irq_handle(const struct device *dev, uint32_t id) +{ + const struct max32_tmr_config *cfg = dev->config; + struct max32_tmr_ch_data *chdata; + counter_alarm_callback_t cb; + + chdata = &cfg->ch_data[id]; + cb = chdata->callback; + chdata->callback = NULL; + + if (cb) { + cb(dev, id, MXC_TMR_GetCount(cfg->regs), chdata->user_data); + } +} + +static void counter_max32_isr(const struct device *dev) +{ + const struct max32_tmr_config *cfg = dev->config; + struct max32_tmr_data *data = dev->data; + + MXC_TMR_ClearFlags(cfg->regs); + Wrap_MXC_TMR_ClearWakeupFlags(cfg->regs); + + max32_alarm_irq_handle(dev, 0); + + if (data->top_callback) { + data->top_callback(dev, data->top_user_data); + } +} + +static int max32_counter_init(const struct device *dev) +{ + int ret = 0; + const struct max32_tmr_config *cfg = dev->config; + mxc_tmr_regs_t *regs = cfg->regs; + wrap_mxc_tmr_cfg_t tmr_cfg; + int prescaler_index; + + prescaler_index = LOG2(cfg->prescaler); + if (prescaler_index == 0) { + tmr_cfg.pres = TMR_PRES_1; /* TMR_PRES_1 is 0 */ + } else { + /* TMR_PRES_2 is 1<info.max_top_value; + tmr_cfg.bitMode = 0; /* Timer Mode 32 bit */ + tmr_cfg.pol = 0; + + tmr_cfg.clock = Wrap_MXC_TMR_GetClockIndex(cfg->clock_source); + if (tmr_cfg.clock < 0) { + return -ENOTSUP; + } + + MXC_TMR_Shutdown(regs); + + /* enable clock */ + ret = clock_control_on(cfg->clock, (clock_control_subsys_t)&cfg->perclk); + if (ret) { + return ret; + } + + ret = Wrap_MXC_TMR_Init(regs, &tmr_cfg); + if (ret != E_NO_ERROR) { + return ret; + } + + /* Set preload and actually pre-load the counter */ + MXC_TMR_SetCompare(regs, cfg->info.max_top_value); + + cfg->irq_func(dev); + + if (cfg->wakeup_source) { + /* Clear Wakeup status */ + MXC_LP_ClearWakeStatus(); + /* Enable Timer wake-up source */ + Wrap_MXC_TMR_EnableWakeup(regs, &tmr_cfg); + } + + return 0; +} + +static const struct counter_driver_api counter_max32_driver_api = { + .start = api_start, + .stop = api_stop, + .get_value = api_get_value, + .set_top_value = api_set_top_value, + .get_pending_int = api_get_pending_int, + .get_top_value = api_get_top_value, + .get_freq = api_get_freq, + .set_alarm = api_set_alarm, + .cancel_alarm = api_cancel_alarm, + .get_guard_period = api_get_guard_period, + .set_guard_period = api_set_guard_period, +}; + +#define TIMER(_num) DT_INST_PARENT(_num) +#define MAX32_TIM(idx) ((mxc_tmr_regs_t *)DT_REG_ADDR(TIMER(idx))) + +#define COUNTER_MAX32_DEFINE(_num) \ + static struct max32_tmr_ch_data counter##_num##_ch_data[MAX32_TIMER_CH]; \ + static void max32_tmr_irq_init_##_num(const struct device *dev) \ + { \ + IRQ_CONNECT(DT_IRQN(TIMER(_num)), DT_IRQ(TIMER(_num), priority), \ + counter_max32_isr, DEVICE_DT_INST_GET(_num), 0); \ + irq_enable(DT_IRQN(TIMER(_num))); \ + }; \ + static const struct max32_tmr_config max32_tmr_config_##_num = { \ + .info = \ + { \ + .max_top_value = WRAP_MXC_IS_32B_TIMER(MAX32_TIM(_num)) \ + ? UINT32_MAX \ + : UINT16_MAX, \ + .freq = ADI_MAX32_GET_PRPH_CLK_FREQ( \ + DT_PROP(TIMER(_num), clock_source)) / \ + DT_PROP(TIMER(_num), prescaler), \ + .flags = COUNTER_CONFIG_INFO_COUNT_UP, \ + .channels = MAX32_TIMER_CH, \ + }, \ + .regs = (mxc_tmr_regs_t *)DT_REG_ADDR(TIMER(_num)), \ + .clock = DEVICE_DT_GET(DT_CLOCKS_CTLR(TIMER(_num))), \ + .perclk.bus = DT_CLOCKS_CELL(TIMER(_num), offset), \ + .perclk.bit = DT_CLOCKS_CELL(TIMER(_num), bit), \ + .clock_source = DT_PROP(TIMER(_num), clock_source), \ + .prescaler = DT_PROP(TIMER(_num), prescaler), \ + .irq_func = max32_tmr_irq_init_##_num, \ + .ch_data = counter##_num##_ch_data, \ + .wakeup_source = DT_PROP(TIMER(_num), wakeup_source), \ + }; \ + static struct max32_tmr_data max32_tmr_data##_num; \ + DEVICE_DT_INST_DEFINE(_num, &max32_counter_init, NULL, &max32_tmr_data##_num, \ + &max32_tmr_config_##_num, PRE_KERNEL_1, \ + CONFIG_COUNTER_INIT_PRIORITY, &counter_max32_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(COUNTER_MAX32_DEFINE) diff --git a/dts/arm/adi/max32/max32655.dtsi b/dts/arm/adi/max32/max32655.dtsi index fbc362441d2e4..e39417d358bc5 100644 --- a/dts/arm/adi/max32/max32655.dtsi +++ b/dts/arm/adi/max32/max32655.dtsi @@ -95,5 +95,33 @@ interrupts = <16 0>; status = "disabled"; }; + + lptimer0: timer@40080c00 { + compatible = "adi,max32-timer"; + reg = <0x40080c00 0x400>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 2>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + lptimer1: timer@40081000 { + compatible = "adi,max32-timer"; + reg = <0x40081000 0x400>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 3>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32662.dtsi b/dts/arm/adi/max32/max32662.dtsi index 49090a8054f0d..51a4e8201eba2 100644 --- a/dts/arm/adi/max32/max32662.dtsi +++ b/dts/arm/adi/max32/max32662.dtsi @@ -22,6 +22,8 @@ /delete-node/ &uart2; +/delete-node/ &timer3; + &adc { compatible = "adi,max32-adc-sar", "adi,max32-adc"; clock-source = ; @@ -100,5 +102,19 @@ interrupts = <17 0>; status = "disabled"; }; + + lptimer0: timer@40113000 { + compatible = "adi,max32-timer"; + reg = <0x40113000 0x2000>; + interrupts = <8 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 0>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32666.dtsi b/dts/arm/adi/max32/max32666.dtsi index 0b452e3f09d20..1287ef539805f 100644 --- a/dts/arm/adi/max32/max32666.dtsi +++ b/dts/arm/adi/max32/max32666.dtsi @@ -146,5 +146,25 @@ interrupts = <17 0>; status = "disabled"; }; + + timer4: timer@40014000 { + compatible = "adi,max32-timer"; + reg = <0x40014000 0x1000>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 19>; + clock-source = ; + prescaler = <1>; + }; + + timer5: timer@40015000 { + compatible = "adi,max32-timer"; + reg = <0x40015000 0x1000>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 20>; + clock-source = ; + prescaler = <1>; + }; }; }; diff --git a/dts/arm/adi/max32/max32670.dtsi b/dts/arm/adi/max32/max32670.dtsi index 3015533dbbafb..c15e860ea9a21 100644 --- a/dts/arm/adi/max32/max32670.dtsi +++ b/dts/arm/adi/max32/max32670.dtsi @@ -115,5 +115,33 @@ interrupts = <18 0>; status = "disabled"; }; + + lptimer0: timer@40114000 { + compatible = "adi,max32-timer"; + reg = <0x40114000 0x1000>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 0>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + lptimer1: timer@40115000 { + compatible = "adi,max32-timer"; + reg = <0x40115000 0x1000>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 1>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32672.dtsi b/dts/arm/adi/max32/max32672.dtsi index 4b920df83e53a..6fbd471ad9cca 100644 --- a/dts/arm/adi/max32/max32672.dtsi +++ b/dts/arm/adi/max32/max32672.dtsi @@ -145,5 +145,33 @@ interrupts = <18 0>; status = "disabled"; }; + + lptimer0: timer@40114000 { + compatible = "adi,max32-timer"; + reg = <0x40114000 0x1000>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 0>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + lptimer1: timer@40115000 { + compatible = "adi,max32-timer"; + reg = <0x40115000 0x1000>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 1>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32675.dtsi b/dts/arm/adi/max32/max32675.dtsi index 5c16ae58f905d..6bb2562771d0a 100644 --- a/dts/arm/adi/max32/max32675.dtsi +++ b/dts/arm/adi/max32/max32675.dtsi @@ -80,5 +80,15 @@ interrupts = <17 0>; status = "disabled"; }; + + lptimer0: timer@40114000 { + compatible = "adi,max32-timer"; + reg = <0x40114000 0x1000>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 0>; + clock-source = ; + prescaler = <1>; + }; }; }; diff --git a/dts/arm/adi/max32/max32680.dtsi b/dts/arm/adi/max32/max32680.dtsi index fb870491d503f..52841b94c89f4 100644 --- a/dts/arm/adi/max32/max32680.dtsi +++ b/dts/arm/adi/max32/max32680.dtsi @@ -95,5 +95,33 @@ interrupts = <16 0>; status = "disabled"; }; + + lptimer0: timer@40080c00 { + compatible = "adi,max32-timer"; + reg = <0x40080c00 0x400>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 2>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + lptimer1: timer@40081000 { + compatible = "adi,max32-timer"; + reg = <0x40081000 0x400>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 3>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32690.dtsi b/dts/arm/adi/max32/max32690.dtsi index 11aea7f9191e9..117f526af0ed5 100644 --- a/dts/arm/adi/max32/max32690.dtsi +++ b/dts/arm/adi/max32/max32690.dtsi @@ -196,5 +196,33 @@ clock-source = ; status = "disabled"; }; + + lptimer0: timer@40080c00 { + compatible = "adi,max32-timer"; + reg = <0x40080c00 0x400>; + interrupts = <9 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 2>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + lptimer1: timer@40081000 { + compatible = "adi,max32-timer"; + reg = <0x40081000 0x400>; + interrupts = <10 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS2 3>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/arm/adi/max32/max32xxx.dtsi b/dts/arm/adi/max32/max32xxx.dtsi index 6bc45991faeac..cc740090deec3 100644 --- a/dts/arm/adi/max32/max32xxx.dtsi +++ b/dts/arm/adi/max32/max32xxx.dtsi @@ -218,6 +218,62 @@ vref-mv = <1220>; status = "disabled"; }; + + timer0: timer@40010000 { + compatible = "adi,max32-timer"; + reg = <0x40010000 0x1000>; + interrupts = <5 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 15>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + timer1: timer@40011000 { + compatible = "adi,max32-timer"; + reg = <0x40011000 0x1000>; + interrupts = <6 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 16>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + timer2: timer@40012000 { + compatible = "adi,max32-timer"; + reg = <0x40012000 0x1000>; + interrupts = <7 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 17>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; + + timer3: timer@40013000 { + compatible = "adi,max32-timer"; + reg = <0x40013000 0x1000>; + interrupts = <8 0>; + status = "disabled"; + clocks = <&gcr ADI_MAX32_CLOCK_BUS0 18>; + clock-source = ; + prescaler = <1>; + counter { + compatible = "adi,max32-counter"; + status = "disabled"; + }; + }; }; }; diff --git a/dts/bindings/counter/adi,max32-counter.yaml b/dts/bindings/counter/adi,max32-counter.yaml new file mode 100644 index 0000000000000..97c269727bb62 --- /dev/null +++ b/dts/bindings/counter/adi,max32-counter.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Analog Devices, Inc. +# SPDX-License-Identifier: Apache-2.0 + +description: ADI MAX32 counter + +compatible: "adi,max32-counter" + +include: [base.yaml] diff --git a/dts/bindings/timer/adi,max32-timer.yaml b/dts/bindings/timer/adi,max32-timer.yaml new file mode 100644 index 0000000000000..3393457bf2ca4 --- /dev/null +++ b/dts/bindings/timer/adi,max32-timer.yaml @@ -0,0 +1,53 @@ +# Copyright (c) 2023-2024 Analog Devices, Inc. +# SPDX-License-Identifier: Apache-2.0 + +description: ADI MAX32 timer + +compatible: "adi,max32-timer" + +include: [base.yaml, reset-device.yaml] + +properties: + reg: + required: true + + clocks: + required: true + + clock-source: + type: int + enum: [0, 1, 2, 3, 4, 5, 6, 7] + description: | + Clock source to be used by the WDT peripheral. The following options + are available: + - 0: "ADI_MAX32_PRPH_CLK_SRC_PCLK" Peripheral clock + - 1: "ADI_MAX32_PRPH_CLK_SRC_EXTCLK" External Clock + - 2: "ADI_MAX32_PRPH_CLK_SRC_IBRO" Internal Baud Rate Oscillator + - 3: "ADI_MAX32_PRPH_CLK_SRC_ERFO" External Radio Frequency Oscillator + - 4: "ADI_MAX32_PRPH_CLK_SRC_ERTCO" External Real-Time Clock Oscillator + - 5: "ADI_MAX32_PRPH_CLK_SRC_INRO" Internal Ring Oscillator + - 6: "ADI_MAX32_PRPH_CLK_SRC_ISO" Internal Secondary Oscillator + - 7: "ADI_MAX32_PRPH_CLK_SRC_IBRO_DIV8" IBRO/8 + The target device might not support every option please take a look on + target device user guide + + prescaler: + type: int + required: true + enum: + - 1 + - 2 + - 4 + - 8 + - 16 + - 32 + - 64 + - 128 + - 256 + - 512 + - 1024 + - 2048 + - 4096 + description: | + The prescaler that divides the timers source clock to set the timers count clock as follows: + F_cnt_clk = F_clock_source / prescaler diff --git a/samples/drivers/counter/alarm/boards/apard32690_max32690_m4.overlay b/samples/drivers/counter/alarm/boards/apard32690_max32690_m4.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/apard32690_max32690_m4.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32655evkit_max32655_m4.overlay b/samples/drivers/counter/alarm/boards/max32655evkit_max32655_m4.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32655evkit_max32655_m4.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32655fthr_max32655_m4.overlay b/samples/drivers/counter/alarm/boards/max32655fthr_max32655_m4.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32655fthr_max32655_m4.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32662evkit.overlay b/samples/drivers/counter/alarm/boards/max32662evkit.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32662evkit.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32666evkit_max32666_cpu0.overlay b/samples/drivers/counter/alarm/boards/max32666evkit_max32666_cpu0.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32666evkit_max32666_cpu0.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32666fthr_max32666_cpu0.overlay b/samples/drivers/counter/alarm/boards/max32666fthr_max32666_cpu0.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32666fthr_max32666_cpu0.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32670evkit.overlay b/samples/drivers/counter/alarm/boards/max32670evkit.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32670evkit.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32672evkit.overlay b/samples/drivers/counter/alarm/boards/max32672evkit.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32672evkit.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32672fthr.overlay b/samples/drivers/counter/alarm/boards/max32672fthr.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32672fthr.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32680evkit_max32680_m4.overlay b/samples/drivers/counter/alarm/boards/max32680evkit_max32680_m4.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32680evkit_max32680_m4.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/max32690evkit_max32690_m4.overlay b/samples/drivers/counter/alarm/boards/max32690evkit_max32690_m4.overlay new file mode 100644 index 0000000000000..c06949da83768 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/max32690evkit_max32690_m4.overlay @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + counter0: counter { + status = "okay"; + }; +}; diff --git a/samples/drivers/counter/alarm/src/main.c b/samples/drivers/counter/alarm/src/main.c index e9fe0e67902fd..b34218d9f3ba3 100644 --- a/samples/drivers/counter/alarm/src/main.c +++ b/samples/drivers/counter/alarm/src/main.c @@ -53,6 +53,8 @@ struct counter_alarm_cfg alarm_cfg; #define TIMER DT_NODELABEL(timer0) #elif defined(CONFIG_COUNTER_TIMER_RPI_PICO) #define TIMER DT_NODELABEL(timer) +#elif defined(CONFIG_COUNTER_TIMER_MAX32) +#define TIMER DT_NODELABEL(counter0) #else #error Unable to find a counter device node in devicetree #endif diff --git a/tests/drivers/counter/counter_basic_api/boards/max32655evkit_max32655_m4.overlay b/tests/drivers/counter/counter_basic_api/boards/max32655evkit_max32655_m4.overlay new file mode 100644 index 0000000000000..084e67e33744a --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32655evkit_max32655_m4.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&lptimer0 { + status = "okay"; + clock-source = ; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32655fthr_max32655_m4.overlay b/tests/drivers/counter/counter_basic_api/boards/max32655fthr_max32655_m4.overlay new file mode 100644 index 0000000000000..084e67e33744a --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32655fthr_max32655_m4.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&lptimer0 { + status = "okay"; + clock-source = ; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32662evkit.overlay b/tests/drivers/counter/counter_basic_api/boards/max32662evkit.overlay new file mode 100644 index 0000000000000..d99114f8fe813 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32662evkit.overlay @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32666evkit_max32666_cpu0.overlay b/tests/drivers/counter/counter_basic_api/boards/max32666evkit_max32666_cpu0.overlay new file mode 100644 index 0000000000000..bc45feb52d0e9 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32666evkit_max32666_cpu0.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32666fthr_max32666_cpu0.overlay b/tests/drivers/counter/counter_basic_api/boards/max32666fthr_max32666_cpu0.overlay new file mode 100644 index 0000000000000..bc45feb52d0e9 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32666fthr_max32666_cpu0.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32670evkit.overlay b/tests/drivers/counter/counter_basic_api/boards/max32670evkit.overlay new file mode 100644 index 0000000000000..bc45feb52d0e9 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32670evkit.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32672evkit.overlay b/tests/drivers/counter/counter_basic_api/boards/max32672evkit.overlay new file mode 100644 index 0000000000000..bc45feb52d0e9 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32672evkit.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32672fthr.overlay b/tests/drivers/counter/counter_basic_api/boards/max32672fthr.overlay new file mode 100644 index 0000000000000..bc45feb52d0e9 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32672fthr.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32680evkit_max32680_m4.overlay b/tests/drivers/counter/counter_basic_api/boards/max32680evkit_max32680_m4.overlay new file mode 100644 index 0000000000000..084e67e33744a --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32680evkit_max32680_m4.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&lptimer0 { + status = "okay"; + clock-source = ; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/max32690evkit_max32690_m4.overlay b/tests/drivers/counter/counter_basic_api/boards/max32690evkit_max32690_m4.overlay new file mode 100644 index 0000000000000..084e67e33744a --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/max32690evkit_max32690_m4.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Analog Devices, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&timer0 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer1 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer2 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&timer3 { + status = "okay"; + prescaler = <2>; + counter { + status = "okay"; + }; +}; + +&lptimer0 { + status = "okay"; + clock-source = ; + counter { + status = "okay"; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/src/test_counter.c b/tests/drivers/counter/counter_basic_api/src/test_counter.c index 339fc1e9e6dbe..32543de20bfd7 100644 --- a/tests/drivers/counter/counter_basic_api/src/test_counter.c +++ b/tests/drivers/counter/counter_basic_api/src/test_counter.c @@ -35,6 +35,14 @@ static const struct device *const devices[] = { #ifdef CONFIG_COUNTER_NRF_RTC DEVS_FOR_DT_COMPAT(nordic_nrf_rtc) #endif +#ifdef CONFIG_COUNTER_TIMER_MAX32 +#define ADI_MAX32_COUNTER_DEV(idx) \ + DEVICE_DT_GET(DT_INST(idx, adi_max32_counter)), +#define DT_DRV_COMPAT adi_max32_counter + DT_INST_FOREACH_STATUS_OKAY(ADI_MAX32_COUNTER_DEV) +#undef DT_DRV_COMPAT +#undef ADI_MAX32_COUNTER_DEV +#endif #ifdef CONFIG_COUNTER_TIMER_STM32 #define STM32_COUNTER_DEV(idx) \ DEVICE_DT_GET(DT_INST(idx, st_stm32_counter)), @@ -966,6 +974,11 @@ static bool reliable_cancel_capable(const struct device *dev) return true; } #endif +#ifdef CONFIG_COUNTER_TIMER_MAX32 + if (single_channel_alarm_capable(dev)) { + return true; + } +#endif #ifdef CONFIG_COUNTER_TIMER_GD32 if (single_channel_alarm_capable(dev)) { return true;