diff options
| author | danicampora <danicampora@gmail.com> | 2025-02-21 14:41:03 +0100 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2025-03-05 13:22:22 +1100 |
| commit | 859b6efce52b0ca605681e3b10e2304577942a9a (patch) | |
| tree | 59e9dd9c8d3c0590cbd28556a76680b6e7f9af28 | |
| parent | f5b4545761dbbce0c00dec6d90d180663a61eaa4 (diff) | |
zephyr/machine_wdt: Add watchdog timer implementation.
Simple implementation in-line with the rest of the MicroPython ports
Tested on the nRF52832 and the nRF5340.
Signed-off-by: danicampora <danicampora@gmail.com>
| -rw-r--r-- | ports/zephyr/machine_wdt.c | 92 | ||||
| -rw-r--r-- | ports/zephyr/mpconfigport.h | 4 | ||||
| -rw-r--r-- | ports/zephyr/prj.conf | 3 |
3 files changed, 99 insertions, 0 deletions
diff --git a/ports/zephyr/machine_wdt.c b/ports/zephyr/machine_wdt.c new file mode 100644 index 000000000..7c5e6337c --- /dev/null +++ b/ports/zephyr/machine_wdt.c @@ -0,0 +1,92 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2025 Daniel Campora on behalf of REMOTE TECH LTD + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +// This file is never compiled standalone, it's included directly from +// extmod/machine_wdt.c via MICROPY_PY_MACHINE_WDT_INCLUDEFILE. + +#include <zephyr/kernel.h> +#include <zephyr/device.h> +#include <zephyr/drivers/watchdog.h> +#include <zephyr/sys/printk.h> +#include <stdbool.h> + +#include "py/mperrno.h" + +typedef struct _machine_wdt_obj_t { + mp_obj_base_t base; + struct device *wdt; + int32_t channel_id; +} machine_wdt_obj_t; + +static machine_wdt_obj_t wdt_default = { + {&machine_wdt_type}, NULL, -1 +}; + +static machine_wdt_obj_t *mp_machine_wdt_make_new_instance(mp_int_t id, mp_int_t timeout_ms) { + if (id != 0) { + mp_raise_ValueError(MP_ERROR_TEXT("invalid WDT id")); + } + + if (timeout_ms <= 0) { + mp_raise_ValueError(MP_ERROR_TEXT("watchdog timeout too short")); + } + + wdt_default.wdt = (struct device *)DEVICE_DT_GET(DT_ALIAS(watchdog0)); + + if (!device_is_ready(wdt_default.wdt)) { + mp_raise_OSError(MP_ENODEV); + } + + struct wdt_timeout_cfg wdt_config = { + /* Reset SoC when watchdog timer expires. */ + .flags = WDT_FLAG_RESET_SOC, + + /* Expire watchdog after max window */ + .window.min = 0, + .window.max = timeout_ms, + }; + + wdt_default.channel_id = wdt_install_timeout(wdt_default.wdt, &wdt_config); + + if (wdt_default.channel_id < 0) { + mp_raise_OSError(-wdt_default.channel_id); + } + + mp_int_t rs_code = wdt_setup(wdt_default.wdt, WDT_OPT_PAUSE_IN_SLEEP | WDT_OPT_PAUSE_HALTED_BY_DBG); + + if (rs_code < 0) { + mp_raise_OSError(-rs_code); + } + + return &wdt_default; +} + +static void mp_machine_wdt_feed(machine_wdt_obj_t *self) { + mp_int_t rs_code = wdt_feed(self->wdt, self->channel_id); + if (rs_code < 0) { + mp_raise_OSError(-rs_code); + } +} diff --git a/ports/zephyr/mpconfigport.h b/ports/zephyr/mpconfigport.h index a2e74e692..c4fa6c5b9 100644 --- a/ports/zephyr/mpconfigport.h +++ b/ports/zephyr/mpconfigport.h @@ -68,6 +68,10 @@ #define MICROPY_PY_MACHINE_PIN_MAKE_NEW mp_pin_make_new #define MICROPY_PY_MACHINE_UART (1) #define MICROPY_PY_MACHINE_UART_INCLUDEFILE "ports/zephyr/machine_uart.c" +#ifdef CONFIG_WATCHDOG +#define MICROPY_PY_MACHINE_WDT (1) +#define MICROPY_PY_MACHINE_WDT_INCLUDEFILE "ports/zephyr/machine_wdt.c" +#endif #define MICROPY_PY_STRUCT (0) #ifdef CONFIG_NETWORKING // If we have networking, we likely want errno comfort diff --git a/ports/zephyr/prj.conf b/ports/zephyr/prj.conf index eac04216c..ae37c3ff0 100644 --- a/ports/zephyr/prj.conf +++ b/ports/zephyr/prj.conf @@ -79,3 +79,6 @@ CONFIG_NET_BUF_POOL_USAGE=y CONFIG_MICROPY_CONFIGFILE="mpconfigport.h" CONFIG_MICROPY_VFS_FAT=y CONFIG_MICROPY_VFS_LFS2=y + +CONFIG_WATCHDOG=y +CONFIG_WDT_DISABLE_AT_BOOT=y |
