stmhal: On boot, mount all available partitions of the SD card.
The first partition is mounted as "/sd" and subsequent partitions are mounted as "/sd<part_num>". This is backwards compatible with the previous behaviour, which just mounted the first partition on "/sd". At this point, only FatFs filesystems are mounted.
This commit is contained in:
parent
326343feeb
commit
3667ee1b88
125
stmhal/main.c
125
stmhal/main.c
@ -261,6 +261,85 @@ MP_NOINLINE STATIC void init_flash_fs(uint reset_mode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC void init_sdcard_fs(bool first_soft_reset) {
|
||||||
|
bool first_part = true;
|
||||||
|
for (int part_num = 1; part_num <= 4; ++part_num) {
|
||||||
|
// create vfs object
|
||||||
|
fs_user_mount_t *vfs_fat = m_new_obj_maybe(fs_user_mount_t);
|
||||||
|
mp_vfs_mount_t *vfs = m_new_obj_maybe(mp_vfs_mount_t);
|
||||||
|
if (vfs == NULL || vfs_fat == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vfs_fat->str = NULL;
|
||||||
|
vfs_fat->len = 0;
|
||||||
|
vfs_fat->flags = FSUSER_FREE_OBJ;
|
||||||
|
sdcard_init_vfs(vfs_fat, part_num);
|
||||||
|
|
||||||
|
// try to mount the partition
|
||||||
|
FRESULT res = f_mount(&vfs_fat->fatfs);
|
||||||
|
|
||||||
|
if (res != FR_OK) {
|
||||||
|
// couldn't mount
|
||||||
|
m_del_obj(fs_user_mount_t, vfs_fat);
|
||||||
|
m_del_obj(mp_vfs_mount_t, vfs);
|
||||||
|
} else {
|
||||||
|
// mounted via FatFs, now mount the SD partition in the VFS
|
||||||
|
if (first_part) {
|
||||||
|
// the first available partition is traditionally called "sd" for simplicity
|
||||||
|
vfs->str = "/sd";
|
||||||
|
vfs->len = 3;
|
||||||
|
} else {
|
||||||
|
// subsequent partitions are numbered by their index in the partition table
|
||||||
|
if (part_num == 2) {
|
||||||
|
vfs->str = "/sd2";
|
||||||
|
} else if (part_num == 2) {
|
||||||
|
vfs->str = "/sd3";
|
||||||
|
} else {
|
||||||
|
vfs->str = "/sd4";
|
||||||
|
}
|
||||||
|
vfs->len = 4;
|
||||||
|
}
|
||||||
|
vfs->obj = MP_OBJ_FROM_PTR(vfs_fat);
|
||||||
|
vfs->next = NULL;
|
||||||
|
for (mp_vfs_mount_t **m = &MP_STATE_VM(vfs_mount_table);; m = &(*m)->next) {
|
||||||
|
if (*m == NULL) {
|
||||||
|
*m = vfs;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_part) {
|
||||||
|
// TODO these should go before the /flash entries in the path
|
||||||
|
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_sd));
|
||||||
|
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_sd_slash_lib));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_soft_reset) {
|
||||||
|
// use SD card as medium for the USB MSD
|
||||||
|
#if defined(USE_DEVICE_MODE)
|
||||||
|
pyb_usb_storage_medium = PYB_USB_STORAGE_MEDIUM_SDCARD;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(USE_DEVICE_MODE)
|
||||||
|
// only use SD card as current directory if that's what the USB medium is
|
||||||
|
if (pyb_usb_storage_medium == PYB_USB_STORAGE_MEDIUM_SDCARD)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (first_part) {
|
||||||
|
// use SD card as current directory
|
||||||
|
MP_STATE_PORT(vfs_cur) = vfs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
first_part = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_part) {
|
||||||
|
printf("PYB: can't mount SD card\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
STATIC uint update_reset_mode(uint reset_mode) {
|
STATIC uint update_reset_mode(uint reset_mode) {
|
||||||
#if MICROPY_HW_HAS_SWITCH
|
#if MICROPY_HW_HAS_SWITCH
|
||||||
if (switch_get()) {
|
if (switch_get()) {
|
||||||
@ -478,51 +557,7 @@ soft_reset:
|
|||||||
#if MICROPY_HW_HAS_SDCARD
|
#if MICROPY_HW_HAS_SDCARD
|
||||||
// if an SD card is present then mount it on /sd/
|
// if an SD card is present then mount it on /sd/
|
||||||
if (sdcard_is_present()) {
|
if (sdcard_is_present()) {
|
||||||
// create vfs object
|
init_sdcard_fs(first_soft_reset);
|
||||||
fs_user_mount_t *vfs_fat = m_new_obj_maybe(fs_user_mount_t);
|
|
||||||
mp_vfs_mount_t *vfs = m_new_obj_maybe(mp_vfs_mount_t);
|
|
||||||
if (vfs == NULL || vfs_fat == NULL) {
|
|
||||||
goto no_mem_for_sd;
|
|
||||||
}
|
|
||||||
vfs_fat->str = NULL;
|
|
||||||
vfs_fat->len = 0;
|
|
||||||
vfs_fat->flags = FSUSER_FREE_OBJ;
|
|
||||||
sdcard_init_vfs(vfs_fat);
|
|
||||||
|
|
||||||
FRESULT res = f_mount(&vfs_fat->fatfs);
|
|
||||||
if (res != FR_OK) {
|
|
||||||
printf("PYB: can't mount SD card\n");
|
|
||||||
m_del_obj(fs_user_mount_t, vfs_fat);
|
|
||||||
m_del_obj(mp_vfs_mount_t, vfs);
|
|
||||||
} else {
|
|
||||||
// mount the sd device after the internal flash
|
|
||||||
vfs->str = "/sd";
|
|
||||||
vfs->len = 3;
|
|
||||||
vfs->obj = MP_OBJ_FROM_PTR(vfs_fat);
|
|
||||||
vfs->next = NULL;
|
|
||||||
MP_STATE_VM(vfs_mount_table)->next = vfs;
|
|
||||||
|
|
||||||
// TODO these should go before the /flash entries in the path
|
|
||||||
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_sd));
|
|
||||||
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_sd_slash_lib));
|
|
||||||
|
|
||||||
if (first_soft_reset) {
|
|
||||||
// use SD card as medium for the USB MSD
|
|
||||||
#if defined(USE_DEVICE_MODE)
|
|
||||||
pyb_usb_storage_medium = PYB_USB_STORAGE_MEDIUM_SDCARD;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(USE_DEVICE_MODE)
|
|
||||||
// only use SD card as current directory if that's what the USB medium is
|
|
||||||
if (pyb_usb_storage_medium == PYB_USB_STORAGE_MEDIUM_SDCARD)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
// use SD card as current directory
|
|
||||||
MP_STATE_PORT(vfs_cur) = vfs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
no_mem_for_sd:;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -443,11 +443,11 @@ const mp_obj_type_t pyb_sdcard_type = {
|
|||||||
.locals_dict = (mp_obj_t)&pyb_sdcard_locals_dict,
|
.locals_dict = (mp_obj_t)&pyb_sdcard_locals_dict,
|
||||||
};
|
};
|
||||||
|
|
||||||
void sdcard_init_vfs(fs_user_mount_t *vfs) {
|
void sdcard_init_vfs(fs_user_mount_t *vfs, int part) {
|
||||||
vfs->base.type = &mp_fat_vfs_type;
|
vfs->base.type = &mp_fat_vfs_type;
|
||||||
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
|
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
|
||||||
vfs->fatfs.drv = vfs;
|
vfs->fatfs.drv = vfs;
|
||||||
vfs->fatfs.part = 0; // autodetect partition
|
vfs->fatfs.part = part;
|
||||||
vfs->readblocks[0] = (mp_obj_t)&pyb_sdcard_readblocks_obj;
|
vfs->readblocks[0] = (mp_obj_t)&pyb_sdcard_readblocks_obj;
|
||||||
vfs->readblocks[1] = (mp_obj_t)&pyb_sdcard_obj;
|
vfs->readblocks[1] = (mp_obj_t)&pyb_sdcard_obj;
|
||||||
vfs->readblocks[2] = (mp_obj_t)sdcard_read_blocks; // native version
|
vfs->readblocks[2] = (mp_obj_t)sdcard_read_blocks; // native version
|
||||||
|
@ -41,4 +41,4 @@ extern const struct _mp_obj_type_t pyb_sdcard_type;
|
|||||||
extern const struct _mp_obj_base_t pyb_sdcard_obj;
|
extern const struct _mp_obj_base_t pyb_sdcard_obj;
|
||||||
|
|
||||||
struct _fs_user_mount_t;
|
struct _fs_user_mount_t;
|
||||||
void sdcard_init_vfs(struct _fs_user_mount_t *vfs);
|
void sdcard_init_vfs(struct _fs_user_mount_t *vfs, int part);
|
||||||
|
Loading…
Reference in New Issue
Block a user