diff --git a/ports/nrf/drivers/wdt.c b/ports/nrf/drivers/wdt.c index 73ce51647..f04bfee69 100644 --- a/ports/nrf/drivers/wdt.c +++ b/ports/nrf/drivers/wdt.c @@ -28,8 +28,11 @@ #if MICROPY_PY_MACHINE_WDT +#include "wdt.h" #include "nrf_wdt.h" +bool wdt_starve; + #if MICROPY_HW_HAS_WDT_BUTTON static void button_init(void) { @@ -85,11 +88,17 @@ void wdt_feed(bool isr) * implementing a (reasonably robust) long-press reset button. */ #if MICROPY_HW_HAS_WDT_BUTTON - if (!button_pressed()) + if (button_pressed()) + return; #else - if (!isr) + if (isr) + return; #endif - nrf_wdt_reload_request_set(0); + + if (wdt_starve) + return; + + nrf_wdt_reload_request_set(0); } #endif // MICROPY_PY_MACHINE_WDT diff --git a/ports/nrf/drivers/wdt.h b/ports/nrf/drivers/wdt.h index 094df0854..ac397b18e 100644 --- a/ports/nrf/drivers/wdt.h +++ b/ports/nrf/drivers/wdt.h @@ -25,7 +25,12 @@ #ifndef __MICROPY_INCLUDED_LIB_WDT_H__ #define __MICROPY_INCLUDED_LIB_WDT_H__ +#include + +extern bool wdt_starve; + void wdt_init(void); void wdt_feed(bool isr); + #endif // __MICROPY_INCLUDED_LIB_WDT_H__ diff --git a/ports/nrf/modules/machine/modmachine.c b/ports/nrf/modules/machine/modmachine.c index 0b0c4887d..ad910b372 100644 --- a/ports/nrf/modules/machine/modmachine.c +++ b/ports/nrf/modules/machine/modmachine.c @@ -54,6 +54,9 @@ #if MICROPY_PY_MACHINE_RTCOUNTER #include "rtcounter.h" #endif +#if MICROPY_PY_MACHINE_WDT +#include "wdt.h" +#endif #define PYB_RESET_HARD (0) #define PYB_RESET_WDT (1) @@ -163,6 +166,14 @@ STATIC mp_obj_t machine_enter_serial_dfu(void) { MP_DEFINE_CONST_FUN_OBJ_0(machine_enter_serial_dfu_obj, machine_enter_serial_dfu); #endif +#if MICROPY_PY_MACHINE_WDT +STATIC mp_obj_t machine_starve_wdt(void) { + wdt_starve = true; + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_0(machine_starve_wdt_obj, machine_starve_wdt); +#endif + STATIC mp_obj_t machine_soft_reset(void) { pyexec_system_exit = PYEXEC_FORCED_EXIT; nlr_raise(mp_obj_new_exception(&mp_type_SystemExit)); @@ -214,6 +225,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { #if MICROPY_PY_MACHINE_DFU_BOOTLOADER { MP_ROM_QSTR(MP_QSTR_enter_ota_dfu), MP_ROM_PTR(&machine_enter_ota_dfu_obj) }, { MP_ROM_QSTR(MP_QSTR_enter_serial_dfu), MP_ROM_PTR(&machine_enter_serial_dfu_obj) }, +#endif +#if MICROPY_PY_MACHINE_WDT + { MP_ROM_QSTR(MP_QSTR_starve_wdt), MP_ROM_PTR(&machine_starve_wdt_obj) }, #endif { MP_ROM_QSTR(MP_QSTR_soft_reset), MP_ROM_PTR(&machine_soft_reset_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },