From 1b3d34696dcc4d7cc4154a8dc53ffb95cf380790 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Mon, 29 Nov 2021 15:32:00 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15154 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- .../cfg/stm32g474re_nucleo64/vfsconf.h | 7 ++ .../cfg/stm32l4r9ai_discovery/vfsconf.h | 7 ++ demos/STM32/RT-VFS-FATFS/main.c | 2 +- os/vfs/drivers/fatfs/drvfatfs.c | 98 +++++++------------ os/vfs/drivers/fatfs/drvfatfs.h | 17 +++- os/vfs/templates/vfsconf.h | 7 ++ 6 files changed, 73 insertions(+), 65 deletions(-) diff --git a/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h b/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h index bf08e04e5..26b002ed2 100644 --- a/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h +++ b/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h @@ -111,6 +111,13 @@ #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 */ diff --git a/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h b/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h index bf08e04e5..26b002ed2 100644 --- a/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h +++ b/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h @@ -111,6 +111,13 @@ #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 */ diff --git a/demos/STM32/RT-VFS-FATFS/main.c b/demos/STM32/RT-VFS-FATFS/main.c index 4fd94b28e..132b147e9 100644 --- a/demos/STM32/RT-VFS-FATFS/main.c +++ b/demos/STM32/RT-VFS-FATFS/main.c @@ -229,7 +229,7 @@ int main(void) { sdStart(&PORTAB_SD1, NULL); nullObjectInit(&nullstream); - /* Initializing an overlay VFS object as a root, bo overlaid driver, + /* Initializing an overlay VFS object as a root, no overlaid driver, no need for a name.*/ drvOverlayObjectInit(&vfs_root, NULL, ""); diff --git a/os/vfs/drivers/fatfs/drvfatfs.c b/os/vfs/drivers/fatfs/drvfatfs.c index 8ae30764e..959e9c447 100644 --- a/os/vfs/drivers/fatfs/drvfatfs.c +++ b/os/vfs/drivers/fatfs/drvfatfs.c @@ -34,58 +34,6 @@ /* Module local definitions. */ /*===========================================================================*/ -/** - * @brief Number of directory nodes pre-allocated in the pool. - */ -#define DRV_DIR_NODES_NUM 1 - -/** - * @brief Number of file nodes pre-allocated in the pool. - */ -#define DRV_FILE_NODES_NUM 2 - -/** - * @brief @p vfs_fatfs_driver_t specific methods. - */ -#define __vfs_fatfs_driver_methods \ - __vfs_driver_methods - -/** - * @brief @p vfs_fatfs_driver_t specific data. - */ -#define __vfs_fatfs_driver_data \ - __vfs_driver_data \ - memory_pool_t file_nodes_pool; \ - memory_pool_t dir_nodes_pool; \ - memory_pool_t info_nodes_pool; - -/** - * @brief @p vfs_fatfs_dir_node_t specific methods. - */ -#define __vfs_fatfs_dir_node_methods \ - __vfs_directory_node_methods - -/** - * @brief @p vfs_fatfs_dir_node_t specific data. - */ -#define __vfs_fatfs_dir_node_data \ - __vfs_directory_node_data \ - DIR dir; - -/** - * @brief @p vfs_fatfs_file_node_t specific methods. - */ -#define __vfs_fatfs_file_node_methods \ - __vfs_file_node_methods - -/** - * @brief @p vfs_fatfs_file_node_t specific data. - */ -#define __vfs_fatfs_file_node_data \ - __vfs_file_node_data \ - FIL file; \ - BaseSequentialStream *stream; - /*===========================================================================*/ /* Module exported variables. */ /*===========================================================================*/ @@ -139,8 +87,8 @@ 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_DIR_NODES_NUM]; -static vfs_fatfs_file_node_t drv_file_nodes[DRV_FILE_NODES_NUM]; +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]; /*===========================================================================*/ /* Module local functions. */ @@ -335,19 +283,19 @@ static void node_file_release(void *instance) { static BaseSequentialStream *node_file_get_stream(void *instance) { vfs_fatfs_file_node_t *fffnp = (vfs_fatfs_file_node_t *)instance; - return fffnp->stream; + return &fffnp->stream; } static ssize_t node_file_read(void *instance, uint8_t *buf, size_t n) { vfs_fatfs_file_node_t *fffnp = (vfs_fatfs_file_node_t *)instance; - return streamRead(fffnp->stream, buf, n); + return streamRead(&fffnp->stream, buf, n); } static ssize_t node_file_write(void *instance, const uint8_t *buf, size_t n) { vfs_fatfs_file_node_t *fffnp = (vfs_fatfs_file_node_t *)instance; - return streamWrite(fffnp->stream, buf, n); + return streamWrite(&fffnp->stream, buf, n); } static msg_t node_file_setpos(void *instance, vfs_offset_t offset) { @@ -379,13 +327,13 @@ static vfs_offset_t node_file_getsize(void *instance) { /** * @brief VFS FatFS object initialization. * - * @param[out] vodp pointer to a @p vfs_fatfs_driver_t structure + * @param[out] ffdp pointer to a @p vfs_fatfs_driver_t structure * @param[in] rootname name to be attributed to this object * @return A pointer to this initialized object. * * @api */ -vfs_driver_t *drvFatfsObjectInit(vfs_fatfs_driver_t *ffdp, +vfs_driver_t *drvFatFSObjectInit(vfs_fatfs_driver_t *ffdp, const char *rootname) { ffdp->vmt = &driver_vmt; @@ -405,12 +353,40 @@ vfs_driver_t *drvFatfsObjectInit(vfs_fatfs_driver_t *ffdp, /* Preloading pools.*/ chPoolLoadArray(&ffdp->dir_nodes_pool, drv_dir_nodes, - DRV_DIR_NODES_NUM); + DRV_CFG_FATFS_DIR_NODES_NUM); chPoolLoadArray(&ffdp->file_nodes_pool, drv_file_nodes, - DRV_FILE_NODES_NUM); + DRV_CFG_FATFS_FILE_NODES_NUM); return (vfs_driver_t *)ffdp; } +/** + * @brief Mounts a FatFS volume. + * + * @param[in] ffdp pointer to a @p vfs_fatfs_driver_t structure + * @return The operation result. + * + * @api + */ +msg_t drvFatFSMount(vfs_fatfs_driver_t *ffdp) { + + return translate_error(f_mount(&ffdp->fs, + ffdp->rootname, + DRV_CFG_FATFS_MOUNT_MODE)); +} + +/** + * @brief Unmounts a FatFS volume. + * + * @param[in] ffdp pointer to a @p vfs_fatfs_driver_t structure + * @return The operation result. + * + * @api + */ +msg_t drvFatFSUnmount(vfs_fatfs_driver_t *ffdp) { + + return translate_error(f_unmount(ffdp->rootname)); +} + /** @} */ diff --git a/os/vfs/drivers/fatfs/drvfatfs.h b/os/vfs/drivers/fatfs/drvfatfs.h index d91cee1a8..73caf9e19 100644 --- a/os/vfs/drivers/fatfs/drvfatfs.h +++ b/os/vfs/drivers/fatfs/drvfatfs.h @@ -51,6 +51,10 @@ #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 @@ -59,6 +63,10 @@ #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. */ /*===========================================================================*/ @@ -106,7 +114,7 @@ typedef struct vfs_fatfs_dir_node { #define __vfs_fatfs_file_node_data \ __vfs_file_node_data \ FIL file; \ - BaseSequentialStream *stream; + BaseSequentialStream stream; /** * @brief @p vfs_fatfs_file_node_t virtual methods table. @@ -139,7 +147,8 @@ typedef struct vfs_fatfs_file_node { __vfs_driver_data \ memory_pool_t file_nodes_pool; \ memory_pool_t dir_nodes_pool; \ - memory_pool_t info_nodes_pool; + memory_pool_t info_nodes_pool; \ + FATFS fs; /** * @brief @p vfs_fatfs_driver_t virtual methods table. @@ -170,8 +179,10 @@ typedef struct vfs_drv_streams { #ifdef __cplusplus extern "C" { #endif - vfs_driver_t *drvFatfsObjectInit(vfs_fatfs_driver_t *ffdp, + 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); #ifdef __cplusplus } #endif diff --git a/os/vfs/templates/vfsconf.h b/os/vfs/templates/vfsconf.h index bf08e04e5..26b002ed2 100644 --- a/os/vfs/templates/vfsconf.h +++ b/os/vfs/templates/vfsconf.h @@ -111,6 +111,13 @@ #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 */