From 7fbd1ae36986797a12f81a108e160c9da46a8334 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Tue, 22 Mar 2022 08:32:36 +0000 Subject: [PATCH] FatFS now functional on STM32H7xx, added a target to the VFS demo. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15551 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- .../cfg/vfsconf.h | 7 +++++++ .../cfg/vfsconf.h | 7 +++++++ .../cfg/vfsconf.h | 7 +++++++ .../cfg/vfsconf.h | 7 +++++++ .../cfg/stm32g474re_nucleo64/vfsconf.h | 7 +++++++ .../cfg/stm32h735ig_discovery/vfsconf.h | 7 +++++++ .../cfg/stm32l4r9ai_discovery/vfsconf.h | 7 +++++++ os/vfs/drivers/fatfs/drvfatfs.c | 20 +++++++++++++++++-- os/vfs/drivers/fatfs/drvfatfs.h | 4 ++++ os/vfs/templates/vfsconf.h | 7 +++++++ 10 files changed, 78 insertions(+), 2 deletions(-) diff --git a/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_DYNAMIC/cfg/vfsconf.h b/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_DYNAMIC/cfg/vfsconf.h index aee43bf70..7795d37ad 100644 --- a/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_DYNAMIC/cfg/vfsconf.h +++ b/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_DYNAMIC/cfg/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ diff --git a/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_STATIC/cfg/vfsconf.h b/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_STATIC/cfg/vfsconf.h index aee43bf70..7795d37ad 100644 --- a/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_STATIC/cfg/vfsconf.h +++ b/demos/STM32/RT-STM32G474RE-NUCLEO64-SB_HOST_STATIC/cfg/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ diff --git a/demos/STM32/RT-STM32L4R9-DISCOVERY-RAM_SB_HOST_DYNAMIC/cfg/vfsconf.h b/demos/STM32/RT-STM32L4R9-DISCOVERY-RAM_SB_HOST_DYNAMIC/cfg/vfsconf.h index c11cc733f..355d5e8d7 100644 --- a/demos/STM32/RT-STM32L4R9-DISCOVERY-RAM_SB_HOST_DYNAMIC/cfg/vfsconf.h +++ b/demos/STM32/RT-STM32L4R9-DISCOVERY-RAM_SB_HOST_DYNAMIC/cfg/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ diff --git a/demos/STM32/RT-STM32L4R9-DISCOVERY-SB_HOST_STATIC/cfg/vfsconf.h b/demos/STM32/RT-STM32L4R9-DISCOVERY-SB_HOST_STATIC/cfg/vfsconf.h index c11cc733f..355d5e8d7 100644 --- a/demos/STM32/RT-STM32L4R9-DISCOVERY-SB_HOST_STATIC/cfg/vfsconf.h +++ b/demos/STM32/RT-STM32L4R9-DISCOVERY-SB_HOST_STATIC/cfg/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ 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 aee43bf70..7795d37ad 100644 --- a/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h +++ b/demos/STM32/RT-VFS-FATFS/cfg/stm32g474re_nucleo64/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ diff --git a/demos/STM32/RT-VFS-FATFS/cfg/stm32h735ig_discovery/vfsconf.h b/demos/STM32/RT-VFS-FATFS/cfg/stm32h735ig_discovery/vfsconf.h index c11cc733f..355d5e8d7 100644 --- a/demos/STM32/RT-VFS-FATFS/cfg/stm32h735ig_discovery/vfsconf.h +++ b/demos/STM32/RT-VFS-FATFS/cfg/stm32h735ig_discovery/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ 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 c11cc733f..355d5e8d7 100644 --- a/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h +++ b/demos/STM32/RT-VFS-FATFS/cfg/stm32l4r9ai_discovery/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */ diff --git a/os/vfs/drivers/fatfs/drvfatfs.c b/os/vfs/drivers/fatfs/drvfatfs.c index 5f4e03b70..f4ecfde38 100644 --- a/os/vfs/drivers/fatfs/drvfatfs.c +++ b/os/vfs/drivers/fatfs/drvfatfs.c @@ -216,6 +216,13 @@ static struct { vfs_fatfs_file_node_c file_nodes[DRV_CFG_FATFS_FILE_NODES_NUM]; } vfs_fatfs_driver_static; +/** + * @brief Static members of @p vfs_fatfs_driver_c (non-cached). + */ +static struct { + FATFS fs[DRV_CFG_FATFS_FS_NUM]; +} __nocache_vfs_fatfs_driver_static; + /*===========================================================================*/ /* Module local functions. */ /*===========================================================================*/ @@ -816,7 +823,7 @@ void __drv_fatfs_init(void) { chCoreAllocAlignedI); chPoolObjectInit(&vfs_fatfs_driver_static.fs_nodes_pool, sizeof (FATFS), - chCoreAllocAlignedI); + NULL); /* Preloading pools.*/ chPoolLoadArray(&vfs_fatfs_driver_static.dir_nodes_pool, @@ -825,6 +832,9 @@ void __drv_fatfs_init(void) { chPoolLoadArray(&vfs_fatfs_driver_static.file_nodes_pool, &vfs_fatfs_driver_static.file_nodes[0], DRV_CFG_FATFS_FILE_NODES_NUM); + chPoolLoadArray(&vfs_fatfs_driver_static.fs_nodes_pool, + &__nocache_vfs_fatfs_driver_static.fs[0], + DRV_CFG_FATFS_FS_NUM); } /** @@ -855,6 +865,7 @@ vfs_driver_c *drvFatFSObjectInit(vfs_fatfs_driver_c *vffdp) { */ msg_t drvFatFSMount(const char *name, bool mountnow) { FATFS *fs; + FRESULT res; fs = f_getfs(name); if (fs == NULL) { @@ -864,7 +875,12 @@ msg_t drvFatFSMount(const char *name, bool mountnow) { } } - return translate_error(f_mount(fs, name, (BYTE)(mountnow ? 1 : 0))); + res = f_mount(fs, name, (BYTE)(mountnow ? 1 : 0)); + if (res != FR_OK) { + chPoolFree(&vfs_fatfs_driver_static.fs_nodes_pool, (void *)fs); + } + + return translate_error(res); } /** diff --git a/os/vfs/drivers/fatfs/drvfatfs.h b/os/vfs/drivers/fatfs/drvfatfs.h index e1c38226c..0ca311224 100644 --- a/os/vfs/drivers/fatfs/drvfatfs.h +++ b/os/vfs/drivers/fatfs/drvfatfs.h @@ -43,6 +43,10 @@ /*===========================================================================*/ /* Configuration options checks.*/ +#if !defined(DRV_CFG_FATFS_FS_NUM) +#error "DRV_CFG_FATFS_FS_NUM not defined in vfsconf.h" +#endif + #if !defined(DRV_CFG_FATFS_DIR_NODES_NUM) #error "DRV_CFG_FATFS_DIR_NODES_NUM not defined in vfsconf.h" #endif diff --git a/os/vfs/templates/vfsconf.h b/os/vfs/templates/vfsconf.h index c11cc733f..355d5e8d7 100644 --- a/os/vfs/templates/vfsconf.h +++ b/os/vfs/templates/vfsconf.h @@ -141,6 +141,13 @@ */ /*===========================================================================*/ +/** + * @brief Maximum number of FatFS file systems mounted. + */ +#if !defined(DRV_CFG_FATFS_FS_NUM) || defined(__DOXYGEN__) +#define DRV_CFG_FATFS_FS_NUM 1 +#endif + /** * @brief Number of directory nodes pre-allocated in the pool. */