From 47c45d0e7fda10f4a62b7017d48ae452203b22f0 Mon Sep 17 00:00:00 2001 From: robert-hh Date: Mon, 22 Aug 2022 08:09:02 +0200 Subject: [PATCH] rp2/machine_wdt: Check for the maximum timeout value of watchdog. The value will be checked for timeout <= 8388. Notes were added to the documentation. --- docs/library/machine.WDT.rst | 5 +++-- docs/rp2/quickref.rst | 1 + ports/rp2/machine_wdt.c | 9 ++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/library/machine.WDT.rst b/docs/library/machine.WDT.rst index 8c81e10ea5..95893cec36 100644 --- a/docs/library/machine.WDT.rst +++ b/docs/library/machine.WDT.rst @@ -15,7 +15,7 @@ Example usage:: wdt = WDT(timeout=2000) # enable it with a timeout of 2s wdt.feed() -Availability of this class: pyboard, WiPy, esp8266, esp32. +Availability of this class: pyboard, WiPy, esp8266, esp32, rp2040, mimxrt. Constructors ------------ @@ -26,7 +26,8 @@ Constructors Once it is running the timeout cannot be changed and the WDT cannot be stopped either. Notes: On the esp32 the minimum timeout is 1 second. On the esp8266 a timeout - cannot be specified, it is determined by the underlying system. + cannot be specified, it is determined by the underlying system. On rp2040 devices, + the maximum timeout is 8388 ms. Methods ------- diff --git a/docs/rp2/quickref.rst b/docs/rp2/quickref.rst index 4824f390eb..430c130c6e 100644 --- a/docs/rp2/quickref.rst +++ b/docs/rp2/quickref.rst @@ -296,6 +296,7 @@ See :ref:`machine.WDT `. :: wdt = WDT(timeout=5000) wdt.feed() +The maximum value for timeout is 8388 ms. OneWire driver -------------- diff --git a/ports/rp2/machine_wdt.c b/ports/rp2/machine_wdt.c index 38e0597018..d6914a4f26 100644 --- a/ports/rp2/machine_wdt.c +++ b/ports/rp2/machine_wdt.c @@ -29,6 +29,9 @@ #include "hardware/watchdog.h" +// The maximum timeout in milliseconds is: 0xffffff / 2 / 1000 +#define WDT_TIMEOUT_MAX 8388 + typedef struct _machine_wdt_obj_t { mp_obj_base_t base; } machine_wdt_obj_t; @@ -53,7 +56,11 @@ STATIC mp_obj_t machine_wdt_make_new(const mp_obj_type_t *type, size_t n_args, s } // Start the watchdog (timeout is in milliseconds). - watchdog_enable(args[ARG_timeout].u_int, false); + uint32_t timeout = args[ARG_timeout].u_int; + if (timeout > WDT_TIMEOUT_MAX) { + mp_raise_ValueError(MP_ERROR_TEXT("timeout exceeds " MP_STRINGIFY(WDT_TIMEOUT_MAX))); + } + watchdog_enable(timeout, false); return MP_OBJ_FROM_PTR(&machine_wdt); }