diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2019-05-09 10:15:28 -0700 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2019-05-09 10:15:28 -0700 |
| commit | b87565138ea2027625e69aee4cf1170606e1f40a (patch) | |
| tree | 6f96ce043bf635593b60bd3cde9f2584515fc6d8 | |
| parent | 837d3f57eefe8189969dda6512f278b4fb76af55 (diff) | |
Rework safe mode so we can trigger on all resets
| -rw-r--r-- | ports/atmel-samd/common-hal/microcontroller/__init__.c | 23 | ||||
| -rw-r--r-- | supervisor/shared/safe_mode.c | 6 | ||||
| -rw-r--r-- | supervisor/shared/safe_mode.h | 1 |
3 files changed, 15 insertions, 15 deletions
diff --git a/ports/atmel-samd/common-hal/microcontroller/__init__.c b/ports/atmel-samd/common-hal/microcontroller/__init__.c index 525da5fa4..cb0751ace 100644 --- a/ports/atmel-samd/common-hal/microcontroller/__init__.c +++ b/ports/atmel-samd/common-hal/microcontroller/__init__.c @@ -63,17 +63,11 @@ void common_hal_mcu_enable_interrupts(void) { __enable_irq(); } -static mcu_runmode_t next_reset; - void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { - if (runmode == RUNMODE_BOOTLOADER && !bootloader_available()) { - mp_raise_ValueError(translate("Cannot reset into bootloader because no bootloader is present.")); - } - next_reset = runmode; -} - -void common_hal_mcu_reset(void) { - if (next_reset == RUNMODE_BOOTLOADER) { + if (runmode == RUNMODE_BOOTLOADER) { + if (!bootloader_available()) { + mp_raise_ValueError(translate("Cannot reset into bootloader because no bootloader is present.")); + } // Pretend to be the first of the two reset presses needed to enter the // bootloader. That way one reset will end in the bootloader. _bootloader_dbl_tap = DBL_TAP_MAGIC; @@ -81,11 +75,12 @@ void common_hal_mcu_reset(void) { // Set up the default. _bootloader_dbl_tap = DBL_TAP_MAGIC_QUICK_BOOT; } - - if (next_reset == RUNMODE_SAFE_MODE) { - reset_into_safe_mode(PROGRAMMATIC_SAFE_MODE); - return; // Doesn't actually return but it's here to make it clear. + if (runmode == RUNMODE_SAFE_MODE) { + safe_mode_on_next_reset(PROGRAMMATIC_SAFE_MODE); } +} + +void common_hal_mcu_reset(void) { reset(); } diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c index bb4b99f84..d8d3ab379 100644 --- a/supervisor/shared/safe_mode.c +++ b/supervisor/shared/safe_mode.c @@ -76,6 +76,10 @@ safe_mode_t wait_for_safe_mode_reset(void) { return NO_SAFE_MODE; } +void safe_mode_on_next_reset(safe_mode_t reason) { + port_set_saved_word(SAFE_MODE_DATA_GUARD | (reason << 8)); +} + // Don't inline this so it's easy to break on it from GDB. void __attribute__((noinline,)) reset_into_safe_mode(safe_mode_t reason) { if (current_safe_mode > BROWNOUT && reason > BROWNOUT) { @@ -85,7 +89,7 @@ void __attribute__((noinline,)) reset_into_safe_mode(safe_mode_t reason) { } } - port_set_saved_word(SAFE_MODE_DATA_GUARD | (reason << 8)); + safe_mode_on_next_reset(reason); reset_cpu(); } diff --git a/supervisor/shared/safe_mode.h b/supervisor/shared/safe_mode.h index b4ff1aa33..ee0723cff 100644 --- a/supervisor/shared/safe_mode.h +++ b/supervisor/shared/safe_mode.h @@ -42,6 +42,7 @@ typedef enum { safe_mode_t wait_for_safe_mode_reset(void); +void safe_mode_on_next_reset(safe_mode_t reason); void reset_into_safe_mode(safe_mode_t reason); void print_safe_mode_message(safe_mode_t reason); |
