Skip to content

Commit 9aabb6c

Browse files
committed
extmod: Factor out block-device struct to make independent of fatfs.
1 parent ece4e21 commit 9aabb6c

File tree

10 files changed

+83
-80
lines changed

10 files changed

+83
-80
lines changed

extmod/vfs.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@
3838
#define MP_S_IFDIR (0x4000)
3939
#define MP_S_IFREG (0x8000)
4040

41+
// these are the values for mp_vfs_blockdev_t.flags
42+
#define MP_BLOCKDEV_FLAG_NATIVE (0x0001) // readblocks[2]/writeblocks[2] contain native func
43+
#define MP_BLOCKDEV_FLAG_FREE_OBJ (0x0002) // fs_user_mount_t obj should be freed on umount
44+
#define MP_BLOCKDEV_FLAG_HAVE_IOCTL (0x0004) // new protocol with ioctl
45+
#define MP_BLOCKDEV_FLAG_NO_FILESYSTEM (0x0008) // the block device has no filesystem on it
46+
4147
// constants for block protocol ioctl
4248
#define BP_IOCTL_INIT (1)
4349
#define BP_IOCTL_DEINIT (2)
@@ -50,6 +56,20 @@ typedef struct _mp_vfs_proto_t {
5056
mp_import_stat_t (*import_stat)(void *self, const char *path);
5157
} mp_vfs_proto_t;
5258

59+
typedef struct _mp_vfs_blockdev_t {
60+
uint16_t flags;
61+
mp_obj_t readblocks[4];
62+
mp_obj_t writeblocks[4];
63+
// new protocol uses just ioctl, old uses sync (optional) and count
64+
union {
65+
mp_obj_t ioctl[4];
66+
struct {
67+
mp_obj_t sync[2];
68+
mp_obj_t count[2];
69+
} old;
70+
} u;
71+
} mp_vfs_blockdev_t;
72+
5373
typedef struct _mp_vfs_mount_t {
5474
const char *str; // mount point with leading /
5575
size_t len;

extmod/vfs_fat.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,27 +68,27 @@ STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_
6868
// create new object
6969
fs_user_mount_t *vfs = m_new_obj(fs_user_mount_t);
7070
vfs->base.type = type;
71-
vfs->flags = FSUSER_FREE_OBJ;
71+
vfs->blockdev.flags = MP_BLOCKDEV_FLAG_FREE_OBJ;
7272
vfs->fatfs.drv = vfs;
7373

7474
// load block protocol methods
75-
mp_load_method(args[0], MP_QSTR_readblocks, vfs->readblocks);
76-
mp_load_method_maybe(args[0], MP_QSTR_writeblocks, vfs->writeblocks);
77-
mp_load_method_maybe(args[0], MP_QSTR_ioctl, vfs->u.ioctl);
78-
if (vfs->u.ioctl[0] != MP_OBJ_NULL) {
75+
mp_load_method(args[0], MP_QSTR_readblocks, vfs->blockdev.readblocks);
76+
mp_load_method_maybe(args[0], MP_QSTR_writeblocks, vfs->blockdev.writeblocks);
77+
mp_load_method_maybe(args[0], MP_QSTR_ioctl, vfs->blockdev.u.ioctl);
78+
if (vfs->blockdev.u.ioctl[0] != MP_OBJ_NULL) {
7979
// device supports new block protocol, so indicate it
80-
vfs->flags |= FSUSER_HAVE_IOCTL;
80+
vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_HAVE_IOCTL;
8181
} else {
8282
// no ioctl method, so assume the device uses the old block protocol
83-
mp_load_method_maybe(args[0], MP_QSTR_sync, vfs->u.old.sync);
84-
mp_load_method(args[0], MP_QSTR_count, vfs->u.old.count);
83+
mp_load_method_maybe(args[0], MP_QSTR_sync, vfs->blockdev.u.old.sync);
84+
mp_load_method(args[0], MP_QSTR_count, vfs->blockdev.u.old.count);
8585
}
8686

8787
// mount the block device so the VFS methods can be used
8888
FRESULT res = f_mount(&vfs->fatfs);
8989
if (res == FR_NO_FILESYSTEM) {
9090
// don't error out if no filesystem, to let mkfs()/mount() create one if wanted
91-
vfs->flags |= FSUSER_NO_FILESYSTEM;
91+
vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_NO_FILESYSTEM;
9292
} else if (res != FR_OK) {
9393
mp_raise_OSError(fresult_to_errno_table[res]);
9494
}
@@ -380,19 +380,19 @@ STATIC mp_obj_t vfs_fat_mount(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t mkfs
380380
// 1. readonly=True keyword argument
381381
// 2. nonexistent writeblocks method (then writeblocks[0] == MP_OBJ_NULL already)
382382
if (mp_obj_is_true(readonly)) {
383-
self->writeblocks[0] = MP_OBJ_NULL;
383+
self->blockdev.writeblocks[0] = MP_OBJ_NULL;
384384
}
385385

386386
// check if we need to make the filesystem
387-
FRESULT res = (self->flags & FSUSER_NO_FILESYSTEM) ? FR_NO_FILESYSTEM : FR_OK;
387+
FRESULT res = (self->blockdev.flags & MP_BLOCKDEV_FLAG_NO_FILESYSTEM) ? FR_NO_FILESYSTEM : FR_OK;
388388
if (res == FR_NO_FILESYSTEM && mp_obj_is_true(mkfs)) {
389389
uint8_t working_buf[FF_MAX_SS];
390390
res = f_mkfs(&self->fatfs, FM_FAT | FM_SFD, 0, working_buf, sizeof(working_buf));
391391
}
392392
if (res != FR_OK) {
393393
mp_raise_OSError(fresult_to_errno_table[res]);
394394
}
395-
self->flags &= ~FSUSER_NO_FILESYSTEM;
395+
self->blockdev.flags &= ~MP_BLOCKDEV_FLAG_NO_FILESYSTEM;
396396

397397
return mp_const_none;
398398
}

extmod/vfs_fat.h

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,30 +26,13 @@
2626
#ifndef MICROPY_INCLUDED_EXTMOD_VFS_FAT_H
2727
#define MICROPY_INCLUDED_EXTMOD_VFS_FAT_H
2828

29-
#include "py/lexer.h"
3029
#include "py/obj.h"
3130
#include "lib/oofatfs/ff.h"
3231
#include "extmod/vfs.h"
3332

34-
// these are the values for fs_user_mount_t.flags
35-
#define FSUSER_NATIVE (0x0001) // readblocks[2]/writeblocks[2] contain native func
36-
#define FSUSER_FREE_OBJ (0x0002) // fs_user_mount_t obj should be freed on umount
37-
#define FSUSER_HAVE_IOCTL (0x0004) // new protocol with ioctl
38-
#define FSUSER_NO_FILESYSTEM (0x0008) // the block device has no filesystem on it
39-
4033
typedef struct _fs_user_mount_t {
4134
mp_obj_base_t base;
42-
uint16_t flags;
43-
mp_obj_t readblocks[4];
44-
mp_obj_t writeblocks[4];
45-
// new protocol uses just ioctl, old uses sync (optional) and count
46-
union {
47-
mp_obj_t ioctl[4];
48-
struct {
49-
mp_obj_t sync[2];
50-
mp_obj_t count[2];
51-
} old;
52-
} u;
35+
mp_vfs_blockdev_t blockdev;
5336
FATFS fatfs;
5437
} fs_user_mount_t;
5538

extmod/vfs_fat_diskio.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ DRESULT disk_read (
6969
return RES_PARERR;
7070
}
7171

72-
if (vfs->flags & FSUSER_NATIVE) {
73-
mp_uint_t (*f)(uint8_t*, uint32_t, uint32_t) = (void*)(uintptr_t)vfs->readblocks[2];
72+
if (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_NATIVE) {
73+
mp_uint_t (*f)(uint8_t*, uint32_t, uint32_t) = (void*)(uintptr_t)vfs->blockdev.readblocks[2];
7474
if (f(buff, sector, count) != 0) {
7575
return RES_ERROR;
7676
}
7777
} else {
7878
mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, count * SECSIZE(&vfs->fatfs), buff};
79-
vfs->readblocks[2] = MP_OBJ_NEW_SMALL_INT(sector);
80-
vfs->readblocks[3] = MP_OBJ_FROM_PTR(&ar);
81-
mp_call_method_n_kw(2, 0, vfs->readblocks);
79+
vfs->blockdev.readblocks[2] = MP_OBJ_NEW_SMALL_INT(sector);
80+
vfs->blockdev.readblocks[3] = MP_OBJ_FROM_PTR(&ar);
81+
mp_call_method_n_kw(2, 0, vfs->blockdev.readblocks);
8282
// TODO handle error return
8383
}
8484

@@ -101,21 +101,21 @@ DRESULT disk_write (
101101
return RES_PARERR;
102102
}
103103

104-
if (vfs->writeblocks[0] == MP_OBJ_NULL) {
104+
if (vfs->blockdev.writeblocks[0] == MP_OBJ_NULL) {
105105
// read-only block device
106106
return RES_WRPRT;
107107
}
108108

109-
if (vfs->flags & FSUSER_NATIVE) {
110-
mp_uint_t (*f)(const uint8_t*, uint32_t, uint32_t) = (void*)(uintptr_t)vfs->writeblocks[2];
109+
if (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_NATIVE) {
110+
mp_uint_t (*f)(const uint8_t*, uint32_t, uint32_t) = (void*)(uintptr_t)vfs->blockdev.writeblocks[2];
111111
if (f(buff, sector, count) != 0) {
112112
return RES_ERROR;
113113
}
114114
} else {
115115
mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, count * SECSIZE(&vfs->fatfs), (void*)buff};
116-
vfs->writeblocks[2] = MP_OBJ_NEW_SMALL_INT(sector);
117-
vfs->writeblocks[3] = MP_OBJ_FROM_PTR(&ar);
118-
mp_call_method_n_kw(2, 0, vfs->writeblocks);
116+
vfs->blockdev.writeblocks[2] = MP_OBJ_NEW_SMALL_INT(sector);
117+
vfs->blockdev.writeblocks[3] = MP_OBJ_FROM_PTR(&ar);
118+
mp_call_method_n_kw(2, 0, vfs->blockdev.writeblocks);
119119
// TODO handle error return
120120
}
121121

@@ -140,7 +140,7 @@ DRESULT disk_ioctl (
140140

141141
// First part: call the relevant method of the underlying block device
142142
mp_obj_t ret = mp_const_none;
143-
if (vfs->flags & FSUSER_HAVE_IOCTL) {
143+
if (vfs->blockdev.flags & MP_BLOCKDEV_FLAG_HAVE_IOCTL) {
144144
// new protocol with ioctl
145145
static const uint8_t op_map[8] = {
146146
[CTRL_SYNC] = BP_IOCTL_SYNC,
@@ -150,21 +150,21 @@ DRESULT disk_ioctl (
150150
};
151151
uint8_t bp_op = op_map[cmd & 7];
152152
if (bp_op != 0) {
153-
vfs->u.ioctl[2] = MP_OBJ_NEW_SMALL_INT(bp_op);
154-
vfs->u.ioctl[3] = MP_OBJ_NEW_SMALL_INT(0); // unused
155-
ret = mp_call_method_n_kw(2, 0, vfs->u.ioctl);
153+
vfs->blockdev.u.ioctl[2] = MP_OBJ_NEW_SMALL_INT(bp_op);
154+
vfs->blockdev.u.ioctl[3] = MP_OBJ_NEW_SMALL_INT(0); // unused
155+
ret = mp_call_method_n_kw(2, 0, vfs->blockdev.u.ioctl);
156156
}
157157
} else {
158158
// old protocol with sync and count
159159
switch (cmd) {
160160
case CTRL_SYNC:
161-
if (vfs->u.old.sync[0] != MP_OBJ_NULL) {
162-
mp_call_method_n_kw(0, 0, vfs->u.old.sync);
161+
if (vfs->blockdev.u.old.sync[0] != MP_OBJ_NULL) {
162+
mp_call_method_n_kw(0, 0, vfs->blockdev.u.old.sync);
163163
}
164164
break;
165165

166166
case GET_SECTOR_COUNT:
167-
ret = mp_call_method_n_kw(0, 0, vfs->u.old.count);
167+
ret = mp_call_method_n_kw(0, 0, vfs->blockdev.u.old.count);
168168
break;
169169

170170
case GET_SECTOR_SIZE:
@@ -211,7 +211,7 @@ DRESULT disk_ioctl (
211211
if (ret != mp_const_none && MP_OBJ_SMALL_INT_VALUE(ret) != 0) {
212212
// error initialising
213213
stat = STA_NOINIT;
214-
} else if (vfs->writeblocks[0] == MP_OBJ_NULL) {
214+
} else if (vfs->blockdev.writeblocks[0] == MP_OBJ_NULL) {
215215
stat = STA_PROTECT;
216216
} else {
217217
stat = 0;

ports/cc3200/mods/pybflash.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ const mp_obj_type_t pyb_flash_type = {
9696

9797
void pyb_flash_init_vfs(fs_user_mount_t *vfs) {
9898
vfs->base.type = &mp_fat_vfs_type;
99-
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
99+
vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_NATIVE | MP_BLOCKDEV_FLAG_HAVE_IOCTL;
100100
vfs->fatfs.drv = vfs;
101-
vfs->readblocks[0] = (mp_obj_t)&pyb_flash_readblocks_obj;
102-
vfs->readblocks[1] = (mp_obj_t)&pyb_flash_obj;
103-
vfs->readblocks[2] = (mp_obj_t)sflash_disk_read; // native version
104-
vfs->writeblocks[0] = (mp_obj_t)&pyb_flash_writeblocks_obj;
105-
vfs->writeblocks[1] = (mp_obj_t)&pyb_flash_obj;
106-
vfs->writeblocks[2] = (mp_obj_t)sflash_disk_write; // native version
107-
vfs->u.ioctl[0] = (mp_obj_t)&pyb_flash_ioctl_obj;
108-
vfs->u.ioctl[1] = (mp_obj_t)&pyb_flash_obj;
101+
vfs->blockdev.readblocks[0] = (mp_obj_t)&pyb_flash_readblocks_obj;
102+
vfs->blockdev.readblocks[1] = (mp_obj_t)&pyb_flash_obj;
103+
vfs->blockdev.readblocks[2] = (mp_obj_t)sflash_disk_read; // native version
104+
vfs->blockdev.writeblocks[0] = (mp_obj_t)&pyb_flash_writeblocks_obj;
105+
vfs->blockdev.writeblocks[1] = (mp_obj_t)&pyb_flash_obj;
106+
vfs->blockdev.writeblocks[2] = (mp_obj_t)sflash_disk_write; // native version
107+
vfs->blockdev.u.ioctl[0] = (mp_obj_t)&pyb_flash_ioctl_obj;
108+
vfs->blockdev.u.ioctl[1] = (mp_obj_t)&pyb_flash_obj;
109109
}

ports/cc3200/mptask.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ STATIC void mptask_init_sflash_filesystem (void) {
300300
// Initialise the local flash filesystem.
301301
// init the vfs object
302302
fs_user_mount_t *vfs_fat = sflash_vfs_fat;
303-
vfs_fat->flags = 0;
303+
vfs_fat->blockdev.flags = 0;
304304
pyb_flash_init_vfs(vfs_fat);
305305

306306
// Create it if needed, and mount in on /flash.

ports/nrf/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ pin_init0();
180180
}
181181
vfs->str = "/sd";
182182
vfs->len = 3;
183-
vfs->flags = FSUSER_FREE_OBJ;
183+
vfs->flags = MP_BLOCKDEV_FLAG_FREE_OBJ;
184184
sdcard_init_vfs(vfs);
185185

186186
// put the sd device in slot 1 (it will be unused at this point)

ports/stm32/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(pyb_main_obj, 1, pyb_main);
161161
MP_NOINLINE STATIC bool init_flash_fs(uint reset_mode) {
162162
// init the vfs object
163163
fs_user_mount_t *vfs_fat = &fs_user_mount_flash;
164-
vfs_fat->flags = 0;
164+
vfs_fat->blockdev.flags = 0;
165165
pyb_flash_init_vfs(vfs_fat);
166166

167167
// try to mount the flash
@@ -230,7 +230,7 @@ STATIC bool init_sdcard_fs(void) {
230230
if (vfs == NULL || vfs_fat == NULL) {
231231
break;
232232
}
233-
vfs_fat->flags = FSUSER_FREE_OBJ;
233+
vfs_fat->blockdev.flags = MP_BLOCKDEV_FLAG_FREE_OBJ;
234234
sdcard_init_vfs(vfs_fat, part_num);
235235

236236
// try to mount the partition

ports/stm32/sdcard.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -873,17 +873,17 @@ const mp_obj_type_t pyb_mmcard_type = {
873873
void sdcard_init_vfs(fs_user_mount_t *vfs, int part) {
874874
pyb_sdmmc_flags = (pyb_sdmmc_flags & PYB_SDMMC_FLAG_ACTIVE) | PYB_SDMMC_FLAG_SD; // force SD mode
875875
vfs->base.type = &mp_fat_vfs_type;
876-
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
876+
vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_NATIVE | MP_BLOCKDEV_FLAG_HAVE_IOCTL;
877877
vfs->fatfs.drv = vfs;
878878
vfs->fatfs.part = part;
879-
vfs->readblocks[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_readblocks_obj);
880-
vfs->readblocks[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
881-
vfs->readblocks[2] = MP_OBJ_FROM_PTR(sdcard_read_blocks); // native version
882-
vfs->writeblocks[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_writeblocks_obj);
883-
vfs->writeblocks[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
884-
vfs->writeblocks[2] = MP_OBJ_FROM_PTR(sdcard_write_blocks); // native version
885-
vfs->u.ioctl[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_ioctl_obj);
886-
vfs->u.ioctl[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
879+
vfs->blockdev.readblocks[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_readblocks_obj);
880+
vfs->blockdev.readblocks[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
881+
vfs->blockdev.readblocks[2] = MP_OBJ_FROM_PTR(sdcard_read_blocks); // native version
882+
vfs->blockdev.writeblocks[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_writeblocks_obj);
883+
vfs->blockdev.writeblocks[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
884+
vfs->blockdev.writeblocks[2] = MP_OBJ_FROM_PTR(sdcard_write_blocks); // native version
885+
vfs->blockdev.u.ioctl[0] = MP_OBJ_FROM_PTR(&pyb_sdcard_ioctl_obj);
886+
vfs->blockdev.u.ioctl[1] = MP_OBJ_FROM_PTR(&pyb_sdcard_obj);
887887
}
888888

889889
#endif // MICROPY_HW_ENABLE_SDCARD || MICROPY_HW_ENABLE_MMCARD

ports/stm32/storage.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -290,17 +290,17 @@ const mp_obj_type_t pyb_flash_type = {
290290

291291
void pyb_flash_init_vfs(fs_user_mount_t *vfs) {
292292
vfs->base.type = &mp_fat_vfs_type;
293-
vfs->flags |= FSUSER_NATIVE | FSUSER_HAVE_IOCTL;
293+
vfs->blockdev.flags |= MP_BLOCKDEV_FLAG_NATIVE | MP_BLOCKDEV_FLAG_HAVE_IOCTL;
294294
vfs->fatfs.drv = vfs;
295295
vfs->fatfs.part = 1; // flash filesystem lives on first partition
296-
vfs->readblocks[0] = MP_OBJ_FROM_PTR(&pyb_flash_readblocks_obj);
297-
vfs->readblocks[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
298-
vfs->readblocks[2] = MP_OBJ_FROM_PTR(storage_read_blocks); // native version
299-
vfs->writeblocks[0] = MP_OBJ_FROM_PTR(&pyb_flash_writeblocks_obj);
300-
vfs->writeblocks[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
301-
vfs->writeblocks[2] = MP_OBJ_FROM_PTR(storage_write_blocks); // native version
302-
vfs->u.ioctl[0] = MP_OBJ_FROM_PTR(&pyb_flash_ioctl_obj);
303-
vfs->u.ioctl[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
296+
vfs->blockdev.readblocks[0] = MP_OBJ_FROM_PTR(&pyb_flash_readblocks_obj);
297+
vfs->blockdev.readblocks[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
298+
vfs->blockdev.readblocks[2] = MP_OBJ_FROM_PTR(storage_read_blocks); // native version
299+
vfs->blockdev.writeblocks[0] = MP_OBJ_FROM_PTR(&pyb_flash_writeblocks_obj);
300+
vfs->blockdev.writeblocks[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
301+
vfs->blockdev.writeblocks[2] = MP_OBJ_FROM_PTR(storage_write_blocks); // native version
302+
vfs->blockdev.u.ioctl[0] = MP_OBJ_FROM_PTR(&pyb_flash_ioctl_obj);
303+
vfs->blockdev.u.ioctl[1] = MP_OBJ_FROM_PTR(&pyb_flash_obj);
304304
}
305305

306306
#endif

0 commit comments

Comments
 (0)