go into safe mode if not CIRCUITPY available

This commit is contained in:
Dan Halbert 2021-12-27 18:58:24 -05:00
parent ea638c0401
commit 41d494df0b
8 changed files with 26 additions and 12 deletions

View File

@ -659,6 +659,10 @@ msgstr ""
msgid "CBC blocks must be multiples of 16 bytes" msgid "CBC blocks must be multiples of 16 bytes"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "CIRCUITPY drive could not be found or created."
msgstr ""
#: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/bindings/espidf/__init__.c ports/espressif/esp_error.c
msgid "CRC or checksum was invalid" msgid "CRC or checksum was invalid"
msgstr "" msgstr ""

6
main.c
View File

@ -811,7 +811,11 @@ int __attribute__((used)) main(void) {
// Create a new filesystem only if we're not in a safe mode. // Create a new filesystem only if we're not in a safe mode.
// A power brownout here could make it appear as if there's // A power brownout here could make it appear as if there's
// no SPI flash filesystem, and we might erase the existing one. // no SPI flash filesystem, and we might erase the existing one.
filesystem_init(safe_mode == NO_SAFE_MODE, false);
// Check whether CIRCUITPY is available. Don't check if it already hasn't been found.
if (safe_mode != NO_CIRCUITPY && !filesystem_init(safe_mode == NO_SAFE_MODE, false)) {
reset_into_safe_mode(NO_CIRCUITPY);
}
// displays init after filesystem, since they could share the flash SPI // displays init after filesystem, since they could share the flash SPI
board_init(); board_init();

View File

@ -271,7 +271,7 @@ void common_hal_storage_erase_filesystem(void) {
usb_disconnect(); usb_disconnect();
#endif #endif
mp_hal_delay_ms(1000); mp_hal_delay_ms(1000);
filesystem_init(false, true); // Force a re-format. (void)filesystem_init(false, true); // Force a re-format. Ignore failure.
common_hal_mcu_reset(); common_hal_mcu_reset();
// We won't actually get here, since we're resetting. // We won't actually get here, since we're resetting.
} }

View File

@ -35,7 +35,7 @@ extern volatile bool filesystem_flush_requested;
void filesystem_background(void); void filesystem_background(void);
void filesystem_tick(void); void filesystem_tick(void);
void filesystem_init(bool create_allowed, bool force_create); bool filesystem_init(bool create_allowed, bool force_create);
void filesystem_flush(void); void filesystem_flush(void);
bool filesystem_present(void); bool filesystem_present(void);
void filesystem_set_internal_writable_by_usb(bool usb_writable); void filesystem_set_internal_writable_by_usb(bool usb_writable);

View File

@ -86,7 +86,7 @@ static void make_sample_code_file(FATFS *fatfs) {
// we don't make this function static because it needs a lot of stack and we // we don't make this function static because it needs a lot of stack and we
// want it to be executed without using stack within main() function // want it to be executed without using stack within main() function
void filesystem_init(bool create_allowed, bool force_create) { bool filesystem_init(bool create_allowed, bool force_create) {
// init the vfs object // init the vfs object
fs_user_mount_t *vfs_fat = &_internal_vfs; fs_user_mount_t *vfs_fat = &_internal_vfs;
vfs_fat->blockdev.flags = 0; vfs_fat->blockdev.flags = 0;
@ -102,11 +102,11 @@ void filesystem_init(bool create_allowed, bool force_create) {
formats |= FM_EXFAT | FM_FAT32; formats |= FM_EXFAT | FM_FAT32;
#endif #endif
res = f_mkfs(&vfs_fat->fatfs, formats, 0, working_buf, sizeof(working_buf)); res = f_mkfs(&vfs_fat->fatfs, formats, 0, working_buf, sizeof(working_buf));
if (res != FR_OK) {
return false;
}
// Flush the new file system to make sure it's repaired immediately. // Flush the new file system to make sure it's repaired immediately.
supervisor_flash_flush(); supervisor_flash_flush();
if (res != FR_OK) {
return;
}
// set label // set label
#ifdef CIRCUITPY_DRIVE_LABEL #ifdef CIRCUITPY_DRIVE_LABEL
@ -115,13 +115,13 @@ void filesystem_init(bool create_allowed, bool force_create) {
res = f_setlabel(&vfs_fat->fatfs, "CIRCUITPY"); res = f_setlabel(&vfs_fat->fatfs, "CIRCUITPY");
#endif #endif
if (res != FR_OK) { if (res != FR_OK) {
return; return false;
} }
// inhibit file indexing on MacOS // inhibit file indexing on MacOS
res = f_mkdir(&vfs_fat->fatfs, "/.fseventsd"); res = f_mkdir(&vfs_fat->fatfs, "/.fseventsd");
if (res != FR_OK) { if (res != FR_OK) {
return; return false;
} }
make_empty_file(&vfs_fat->fatfs, "/.metadata_never_index"); make_empty_file(&vfs_fat->fatfs, "/.metadata_never_index");
make_empty_file(&vfs_fat->fatfs, "/.Trashes"); make_empty_file(&vfs_fat->fatfs, "/.Trashes");
@ -132,13 +132,13 @@ void filesystem_init(bool create_allowed, bool force_create) {
// create empty lib directory // create empty lib directory
res = f_mkdir(&vfs_fat->fatfs, "/lib"); res = f_mkdir(&vfs_fat->fatfs, "/lib");
if (res != FR_OK) { if (res != FR_OK) {
return; return false;
} }
// and ensure everything is flushed // and ensure everything is flushed
supervisor_flash_flush(); supervisor_flash_flush();
} else if (res != FR_OK) { } else if (res != FR_OK) {
return; return false;
} }
mp_vfs_mount_t *vfs = &_mp_vfs; mp_vfs_mount_t *vfs = &_mp_vfs;
vfs->str = "/"; vfs->str = "/";
@ -150,6 +150,8 @@ void filesystem_init(bool create_allowed, bool force_create) {
// The current directory is used as the boot up directory. // The current directory is used as the boot up directory.
// It is set to the internal flash filesystem by default. // It is set to the internal flash filesystem by default.
MP_STATE_PORT(vfs_cur) = vfs; MP_STATE_PORT(vfs_cur) = vfs;
return true;
} }
void filesystem_flush(void) { void filesystem_flush(void) {

View File

@ -175,6 +175,8 @@ void print_safe_mode_message(safe_mode_t reason) {
case WATCHDOG_RESET: case WATCHDOG_RESET:
message = translate("Watchdog timer expired."); message = translate("Watchdog timer expired.");
break; break;
case NO_CIRCUITPY:
message = translate("CIRCUITPY drive could not be found or created.");
default: default:
break; break;
} }

View File

@ -48,6 +48,7 @@ typedef enum {
USB_TOO_MANY_INTERFACE_NAMES, USB_TOO_MANY_INTERFACE_NAMES,
USB_BOOT_DEVICE_NOT_INTERFACE_ZERO, USB_BOOT_DEVICE_NOT_INTERFACE_ZERO,
NO_HEAP, NO_HEAP,
NO_CIRCUITPY,
} safe_mode_t; } safe_mode_t;
safe_mode_t wait_for_safe_mode_reset(void); safe_mode_t wait_for_safe_mode_reset(void);

View File

@ -26,9 +26,10 @@
#include "supervisor/filesystem.h" #include "supervisor/filesystem.h"
void filesystem_init(bool create_allowed, bool force_create) { bool filesystem_init(bool create_allowed, bool force_create) {
(void)create_allowed; (void)create_allowed;
(void)force_create; (void)force_create;
return true;
} }
void filesystem_flush(void) { void filesystem_flush(void) {