nrf: machine: Add mechanism to starve the watchdog

A soft reset doesn't reconfigure the watchdog which means if previous
software on the device has set a bad timeout then we are stuck without
until the battery runs flat or a watchdog reset takes place. Add a
mechanism to stop feeding the dog so that we can wait for it to trigger.

Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
wasp-os
Daniel Thompson 2020-07-26 20:57:53 +01:00
parent 9d5e23fc71
commit 89f48aca20
3 changed files with 31 additions and 3 deletions

View File

@ -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

View File

@ -25,7 +25,12 @@
#ifndef __MICROPY_INCLUDED_LIB_WDT_H__
#define __MICROPY_INCLUDED_LIB_WDT_H__
#include <stdbool.h>
extern bool wdt_starve;
void wdt_init(void);
void wdt_feed(bool isr);
#endif // __MICROPY_INCLUDED_LIB_WDT_H__

View File

@ -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) },