mirror of https://github.com/rusefi/ChibiOS.git
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:
parent
1b3d34696d
commit
4bd621b1cb
|
@ -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 */
|
||||
|
|
|
@ -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.
|
@ -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);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue