stm32/boardctrl: Add constants for reset mode values.

And use the same boardctrl.h header for both the application and mboot so
these constants are consistent.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2021-04-28 10:30:17 +10:00
parent 647fa63f9c
commit a72b8443ca
4 changed files with 26 additions and 13 deletions

View File

@ -57,8 +57,8 @@ STATIC uint update_reset_mode(uint reset_mode) {
}
mp_hal_delay_ms(20);
if (i % 30 == 29) {
if (++reset_mode > 3) {
reset_mode = 1;
if (++reset_mode > BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM) {
reset_mode = BOARDCTRL_RESET_MODE_NORMAL;
}
led_state(2, reset_mode & 1);
led_state(3, reset_mode & 2);
@ -97,8 +97,8 @@ STATIC uint update_reset_mode(uint reset_mode) {
if (!switch_get()) {
break;
}
if (++reset_mode > 3) {
reset_mode = 1;
if (++reset_mode > BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM) {
reset_mode = BOARDCTRL_RESET_MODE_NORMAL;
}
}
// Flash the selected reset mode
@ -124,7 +124,7 @@ void boardctrl_before_soft_reset_loop(boardctrl_state_t *state) {
#if !MICROPY_HW_USES_BOOTLOADER
// Update the reset_mode via the default
// method which uses the board switch/button and LEDs.
state->reset_mode = update_reset_mode(1);
state->reset_mode = update_reset_mode(BOARDCTRL_RESET_MODE_NORMAL);
#endif
}
@ -142,7 +142,8 @@ void boardctrl_top_soft_reset_loop(boardctrl_state_t *state) {
}
int boardctrl_run_boot_py(boardctrl_state_t *state) {
bool run_boot_py = state->reset_mode == 1 || state->reset_mode == 3;
bool run_boot_py = state->reset_mode == BOARDCTRL_RESET_MODE_NORMAL
|| state->reset_mode == BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM;
if (run_boot_py) {
// Run boot.py, if it exists.
@ -174,7 +175,8 @@ int boardctrl_run_boot_py(boardctrl_state_t *state) {
}
int boardctrl_run_main_py(boardctrl_state_t *state) {
bool run_main_py = (state->reset_mode == 1 || state->reset_mode == 3)
bool run_main_py = (state->reset_mode == BOARDCTRL_RESET_MODE_NORMAL
|| state->reset_mode == BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM)
&& pyexec_mode_kind == PYEXEC_MODE_FRIENDLY_REPL;
if (run_main_py) {
@ -205,5 +207,5 @@ void boardctrl_start_soft_reset(boardctrl_state_t *state) {
void boardctrl_end_soft_reset(boardctrl_state_t *state) {
// Set reset_mode to normal boot.
state->reset_mode = 1;
state->reset_mode = BOARDCTRL_RESET_MODE_NORMAL;
}

View File

@ -60,11 +60,20 @@
#define MICROPY_BOARD_END_SOFT_RESET boardctrl_end_soft_reset
#endif
// Constants to return from boardctrl_run_boot_py, boardctrl_run_main_py.
enum {
BOARDCTRL_CONTINUE,
BOARDCTRL_GOTO_SOFT_RESET_EXIT,
};
// Constants for boardctrl_state_t.reset_mode.
enum {
BOARDCTRL_RESET_MODE_NORMAL = 1,
BOARDCTRL_RESET_MODE_SAFE_MODE = 2,
BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM = 3,
BOARDCTRL_RESET_MODE_BOOTLOADER = 4,
};
typedef struct _boardctrl_state_t {
uint8_t reset_mode;
bool log_soft_reset;

View File

@ -156,7 +156,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(pyb_main_obj, 1, pyb_main);
#if MICROPY_HW_FLASH_MOUNT_AT_BOOT
// avoid inlining to avoid stack usage within main()
MP_NOINLINE STATIC bool init_flash_fs(uint reset_mode) {
if (reset_mode == 3) {
if (reset_mode == BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM) {
// Asked by user to reset filesystem
factory_reset_create_filesystem();
}
@ -210,7 +210,8 @@ MP_NOINLINE STATIC bool init_flash_fs(uint reset_mode) {
mp_obj_t mount_point = MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash);
ret = mp_vfs_mount_and_chdir_protected(bdev, mount_point);
if (ret == -MP_ENODEV && bdev == MP_OBJ_FROM_PTR(&pyb_flash_obj) && reset_mode != 3) {
if (ret == -MP_ENODEV && bdev == MP_OBJ_FROM_PTR(&pyb_flash_obj)
&& reset_mode != BOARDCTRL_RESET_MODE_FACTORY_FILESYSTEM) {
// No filesystem, bdev is still the default (so didn't detect a possibly corrupt littlefs),
// and didn't already create a filesystem, so try to create a fresh one now.
ret = factory_reset_create_filesystem();

View File

@ -29,6 +29,7 @@
#include "py/mphal.h"
#include "extmod/crypto-algorithms/sha256.c"
#include "boardctrl.h"
#include "usbd_core.h"
#include "storage.h"
#include "flash.h"
@ -1289,7 +1290,7 @@ static int pyb_usbdd_shutdown(void) {
static int get_reset_mode(void) {
usrbtn_init();
int reset_mode = 1;
int reset_mode = BOARDCTRL_RESET_MODE_NORMAL;
if (usrbtn_state()) {
// Cycle through reset modes while USR is held
// Timeout is roughly 20s, where reset_mode=1
@ -1299,7 +1300,7 @@ static int get_reset_mode(void) {
for (int i = 0; i < (RESET_MODE_NUM_STATES * RESET_MODE_TIMEOUT_CYCLES + 1) * 32; i++) {
if (i % 32 == 0) {
if (++reset_mode > RESET_MODE_NUM_STATES) {
reset_mode = 1;
reset_mode = BOARDCTRL_RESET_MODE_NORMAL;
}
uint8_t l = RESET_MODE_LED_STATES >> ((reset_mode - 1) * 4);
led_state_all(l);
@ -1396,7 +1397,7 @@ void stm32_main(int initial_r0) {
int reset_mode = get_reset_mode();
uint32_t msp = *(volatile uint32_t*)APPLICATION_ADDR;
if (reset_mode != 4 && (msp & APP_VALIDITY_BITS) == 0) {
if (reset_mode != BOARDCTRL_RESET_MODE_BOOTLOADER && (msp & APP_VALIDITY_BITS) == 0) {
// not DFU mode so jump to application, passing through reset_mode
// undo our DFU settings
// TODO probably should disable all IRQ sources first