Patched FatFS, revised mount/unmount code for VFS FatFS driver.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15155 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2021-11-30 09:18:00 +00:00
parent 1b3d34696d
commit 4bd621b1cb
6 changed files with 54 additions and 55 deletions

View File

@ -111,13 +111,6 @@
#define DRV_CFG_FATFS_FILE_NODES_NUM 2
#endif
/**
* @brief Mount mode for FatFS.
*/
#if !defined(DRV_CFG_FATFS_MOUNT_MODE) || defined(__DOXYGEN__)
#define DRV_CFG_FATFS_MOUNT_MODE 1
#endif
/** @} */
#endif /* VFSCONF_H */

View File

@ -111,13 +111,6 @@
#define DRV_CFG_FATFS_FILE_NODES_NUM 2
#endif
/**
* @brief Mount mode for FatFS.
*/
#if !defined(DRV_CFG_FATFS_MOUNT_MODE) || defined(__DOXYGEN__)
#define DRV_CFG_FATFS_MOUNT_MODE 1
#endif
/** @} */
#endif /* VFSCONF_H */

Binary file not shown.

View File

@ -87,8 +87,10 @@ static const struct vfs_fatfs_file_node_vmt file_node_vmt = {
.file_getsize = node_file_getsize
};
static vfs_fatfs_dir_node_t drv_dir_nodes[DRV_CFG_FATFS_DIR_NODES_NUM];
static vfs_fatfs_file_node_t drv_file_nodes[DRV_CFG_FATFS_FILE_NODES_NUM];
/**
* @brief Single FatFS driver instance.
*/
vfs_fatfs_driver_t vfs_fatfs;
/*===========================================================================*/
/* Module local functions. */
@ -333,47 +335,59 @@ static vfs_offset_t node_file_getsize(void *instance) {
*
* @api
*/
vfs_driver_t *drvFatFSObjectInit(vfs_fatfs_driver_t *ffdp,
const char *rootname) {
vfs_driver_t *drvFatFSInit(const char *rootname) {
ffdp->vmt = &driver_vmt;
ffdp->rootname = rootname;
vfs_fatfs.vmt = &driver_vmt;
vfs_fatfs.rootname = rootname;
/* Initializing pools.*/
chPoolObjectInit(&ffdp->dir_nodes_pool,
chPoolObjectInit(&vfs_fatfs.dir_nodes_pool,
sizeof (vfs_fatfs_dir_node_t),
chCoreAllocAligned);
chPoolObjectInit(&ffdp->file_nodes_pool,
chPoolObjectInit(&vfs_fatfs.file_nodes_pool,
sizeof (vfs_fatfs_file_node_t),
chCoreAllocAligned);
chPoolObjectInit(&ffdp->info_nodes_pool,
chPoolObjectInit(&vfs_fatfs.info_nodes_pool,
sizeof (FILINFO),
chCoreAllocAligned);
chPoolObjectInit(&vfs_fatfs.fs_nodes_pool,
sizeof (FATFS),
chCoreAllocAligned);
/* Preloading pools.*/
chPoolLoadArray(&ffdp->dir_nodes_pool,
drv_dir_nodes,
chPoolLoadArray(&vfs_fatfs.dir_nodes_pool,
&vfs_fatfs.drv_dir_nodes[0],
DRV_CFG_FATFS_DIR_NODES_NUM);
chPoolLoadArray(&ffdp->file_nodes_pool,
drv_file_nodes,
chPoolLoadArray(&vfs_fatfs.file_nodes_pool,
&vfs_fatfs.drv_file_nodes[0],
DRV_CFG_FATFS_FILE_NODES_NUM);
return (vfs_driver_t *)ffdp;
return (vfs_driver_t *)&vfs_fatfs;
}
/**
* @brief Mounts a FatFS volume.
*
* @param[in] ffdp pointer to a @p vfs_fatfs_driver_t structure
* @param[in] name name to be assigned to the volume, see FatFS
* @p f_mount() documentation because there are several
* options
* @param[in] mountnow immediate mount option
* @return The operation result.
*
* @api
*/
msg_t drvFatFSMount(vfs_fatfs_driver_t *ffdp) {
msg_t drvFatFSMount(const char *name, bool mountnow) {
FATFS *fs;
return translate_error(f_mount(&ffdp->fs,
ffdp->rootname,
DRV_CFG_FATFS_MOUNT_MODE));
fs = f_getfs(name);
if (fs == NULL) {
fs = chPoolAlloc(&vfs_fatfs.fs_nodes_pool);
if (fs == NULL) {
return VFS_RET_NO_RESOURCE;
}
}
return translate_error(f_mount(fs, name, (BYTE)(mountnow ? 1 : 0)));
}
/**
@ -384,9 +398,20 @@ msg_t drvFatFSMount(vfs_fatfs_driver_t *ffdp) {
*
* @api
*/
msg_t drvFatFSUnmount(vfs_fatfs_driver_t *ffdp) {
msg_t drvFatFSUnmount(const char *name) {
FATFS *fs;
FRESULT res;
return translate_error(f_unmount(ffdp->rootname));
fs = f_getfs(name);
if (fs == NULL) {
return VFS_RET_MEDIA_ERROR;
}
res = f_unmount(name);
chPoolFree(&vfs_fatfs.fs_nodes_pool, (void *)fs);
return translate_error(res);
}
/** @} */

View File

@ -51,10 +51,6 @@
#error "DRV_CFG_FATFS_FILE_NODES_NUM not defined in vfsconf.h"
#endif
#if !defined(DRV_CFG_FATFS_MOUNT_MODE)
#error "DRV_CFG_FATFS_MOUNT_MODE not defined in vfsconf.h"
#endif
#if DRV_CFG_FATFS_DIR_NODES_NUM < 1
#error "invalid value for DRV_CFG_FATFS_DIR_NODES_NUM"
#endif
@ -63,10 +59,6 @@
#error "invalid value for DRV_CFG_FATFS_FILE_NODES_NUM"
#endif
#if (DRV_CFG_FATFS_MOUNT_MODE < 0) || (DRV_CFG_FATFS_MOUNT_MODE > 1)
#error "invalid value for DRV_CFG_FATFS_MOUNT_MODE"
#endif
/*===========================================================================*/
/* Module data structures and types. */
/*===========================================================================*/
@ -148,7 +140,9 @@ typedef struct vfs_fatfs_file_node {
memory_pool_t file_nodes_pool; \
memory_pool_t dir_nodes_pool; \
memory_pool_t info_nodes_pool; \
FATFS fs;
memory_pool_t fs_nodes_pool; \
vfs_fatfs_dir_node_t drv_dir_nodes[DRV_CFG_FATFS_DIR_NODES_NUM]; \
vfs_fatfs_file_node_t drv_file_nodes[DRV_CFG_FATFS_FILE_NODES_NUM];
/**
* @brief @p vfs_fatfs_driver_t virtual methods table.
@ -176,13 +170,14 @@ typedef struct vfs_drv_streams {
/* External declarations. */
/*===========================================================================*/
extern vfs_fatfs_driver_t vfs_fatfs;
#ifdef __cplusplus
extern "C" {
#endif
vfs_driver_t *drvFatFSObjectInit(vfs_fatfs_driver_t *ffdp,
const char *rootname);
msg_t drvFatFSMount(vfs_fatfs_driver_t *ffdp);
msg_t drvFatFSUnmount(vfs_fatfs_driver_t *ffdp);
vfs_driver_t *drvFatFSInit(const char *rootname);
msg_t drvFatFSMount(const char *name, bool mountnow);
msg_t drvFatFSUnmount(const char *name);
#ifdef __cplusplus
}
#endif

View File

@ -111,13 +111,6 @@
#define DRV_CFG_FATFS_FILE_NODES_NUM 2
#endif
/**
* @brief Mount mode for FatFS.
*/
#if !defined(DRV_CFG_FATFS_MOUNT_MODE) || defined(__DOXYGEN__)
#define DRV_CFG_FATFS_MOUNT_MODE 1
#endif
/** @} */
#endif /* VFSCONF_H */