Skip to content

Commit b875651

Browse files
committed
Rework safe mode so we can trigger on all resets
1 parent 837d3f5 commit b875651

File tree

3 files changed

+15
-15
lines changed

3 files changed

+15
-15
lines changed

ports/atmel-samd/common-hal/microcontroller/__init__.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,29 +63,24 @@ void common_hal_mcu_enable_interrupts(void) {
6363
__enable_irq();
6464
}
6565

66-
static mcu_runmode_t next_reset;
67-
6866
void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
69-
if (runmode == RUNMODE_BOOTLOADER && !bootloader_available()) {
70-
mp_raise_ValueError(translate("Cannot reset into bootloader because no bootloader is present."));
71-
}
72-
next_reset = runmode;
73-
}
74-
75-
void common_hal_mcu_reset(void) {
76-
if (next_reset == RUNMODE_BOOTLOADER) {
67+
if (runmode == RUNMODE_BOOTLOADER) {
68+
if (!bootloader_available()) {
69+
mp_raise_ValueError(translate("Cannot reset into bootloader because no bootloader is present."));
70+
}
7771
// Pretend to be the first of the two reset presses needed to enter the
7872
// bootloader. That way one reset will end in the bootloader.
7973
_bootloader_dbl_tap = DBL_TAP_MAGIC;
8074
} else {
8175
// Set up the default.
8276
_bootloader_dbl_tap = DBL_TAP_MAGIC_QUICK_BOOT;
8377
}
84-
85-
if (next_reset == RUNMODE_SAFE_MODE) {
86-
reset_into_safe_mode(PROGRAMMATIC_SAFE_MODE);
87-
return; // Doesn't actually return but it's here to make it clear.
78+
if (runmode == RUNMODE_SAFE_MODE) {
79+
safe_mode_on_next_reset(PROGRAMMATIC_SAFE_MODE);
8880
}
81+
}
82+
83+
void common_hal_mcu_reset(void) {
8984
reset();
9085
}
9186

supervisor/shared/safe_mode.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ safe_mode_t wait_for_safe_mode_reset(void) {
7676
return NO_SAFE_MODE;
7777
}
7878

79+
void safe_mode_on_next_reset(safe_mode_t reason) {
80+
port_set_saved_word(SAFE_MODE_DATA_GUARD | (reason << 8));
81+
}
82+
7983
// Don't inline this so it's easy to break on it from GDB.
8084
void __attribute__((noinline,)) reset_into_safe_mode(safe_mode_t reason) {
8185
if (current_safe_mode > BROWNOUT && reason > BROWNOUT) {
@@ -85,7 +89,7 @@ void __attribute__((noinline,)) reset_into_safe_mode(safe_mode_t reason) {
8589
}
8690
}
8791

88-
port_set_saved_word(SAFE_MODE_DATA_GUARD | (reason << 8));
92+
safe_mode_on_next_reset(reason);
8993
reset_cpu();
9094
}
9195

supervisor/shared/safe_mode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ typedef enum {
4242

4343
safe_mode_t wait_for_safe_mode_reset(void);
4444

45+
void safe_mode_on_next_reset(safe_mode_t reason);
4546
void reset_into_safe_mode(safe_mode_t reason);
4647

4748
void print_safe_mode_message(safe_mode_t reason);

0 commit comments

Comments
 (0)