Add support for USB writeable, MicroPython read-only volumes.

This prevents file system corruption due to two systems mutating
it at once.
This commit is contained in:
Scott Shawcroft 2016-10-21 15:18:05 -07:00
parent eb62d03e33
commit 9eb86e8015
4 changed files with 11 additions and 6 deletions

View File

@ -278,7 +278,7 @@ const mp_obj_type_t internal_flash_type = {
};
void flash_init_vfs(fs_user_mount_t *vfs) {
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL | FSUSER_USB_WRITEABLE;
vfs->readblocks[0] = (mp_obj_t)&internal_flash_obj_readblocks_obj;
vfs->readblocks[1] = (mp_obj_t)&internal_flash_obj;
vfs->readblocks[2] = (mp_obj_t)internal_flash_read_blocks; // native version

View File

@ -609,7 +609,7 @@ const mp_obj_type_t spi_flash_type = {
};
void flash_init_vfs(fs_user_mount_t *vfs) {
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL | FSUSER_USB_WRITEABLE;
vfs->readblocks[0] = (mp_obj_t)&spi_flash_obj_readblocks_obj;
vfs->readblocks[1] = (mp_obj_t)&spi_flash_obj;
vfs->readblocks[2] = (mp_obj_t)spi_flash_read_blocks; // native version

View File

@ -28,9 +28,11 @@
#include "py/obj.h"
// these are the values for fs_user_mount_t.flags
#define FSUSER_NATIVE (0x0001) // readblocks[2]/writeblocks[2] contain native func
#define FSUSER_FREE_OBJ (0x0002) // fs_user_mount_t obj should be freed on umount
#define FSUSER_HAVE_IOCTL (0x0004) // new protocol with ioctl
#define FSUSER_NATIVE (0x0001) // readblocks[2]/writeblocks[2] contain native func
#define FSUSER_FREE_OBJ (0x0002) // fs_user_mount_t obj should be freed on umount
#define FSUSER_HAVE_IOCTL (0x0004) // new protocol with ioctl
// Device is write-able over USB and read-only to MicroPython.
#define FSUSER_USB_WRITEABLE (0x0008)
// constants for block protocol ioctl
#define BP_IOCTL_INIT (1)

View File

@ -98,7 +98,10 @@ DSTATUS disk_status (
return STA_NOINIT;
}
if (vfs->writeblocks[0] == MP_OBJ_NULL) {
// This is used to determine the writeability of the disk from MicroPython.
// So, if its USB writeable we make it read-only from MicroPython.
if (vfs->writeblocks[0] == MP_OBJ_NULL ||
(vfs->flags & FSUSER_USB_WRITEABLE) != 0) {
return STA_PROTECT;
} else {
return 0;