modules: fs: Add reentrant zephyr support
This commit enables zephyr to configure the FatFs FF_FS_REENTRANT option and support fs actions from multiple threads. CONFIG_FS_FATFS_REENTRANT enables the option and provides zephyr mutex wrappers. Signed-off-by: Nicola Ochsenbein <Nicola.Ochsenbein@husqvarnagroup.com>
This commit is contained in:
parent
303eb76293
commit
eba73727ee
|
@ -18,9 +18,12 @@ if(CONFIG_FAT_FILESYSTEM_ELM)
|
||||||
|
|
||||||
zephyr_library_sources_ifdef(CONFIG_FS_FATFS_LFN
|
zephyr_library_sources_ifdef(CONFIG_FS_FATFS_LFN
|
||||||
${ZEPHYR_FATFS_MODULE_DIR}/option/ffunicode.c
|
${ZEPHYR_FATFS_MODULE_DIR}/option/ffunicode.c
|
||||||
${ZEPHYR_FATFS_MODULE_DIR}/option/ffsystem.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(DEFINED CONFIG_FS_FATFS_LFN OR DEFINED CONFIG_FS_FATFS_REENTRANT)
|
||||||
|
zephyr_library_sources(zfs_ffsystem.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
zephyr_library_link_libraries(ELMFAT)
|
zephyr_library_link_libraries(ELMFAT)
|
||||||
target_link_libraries(ELMFAT INTERFACE zephyr_interface)
|
target_link_libraries(ELMFAT INTERFACE zephyr_interface)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Nordic Semiconductor ASA
|
* Copyright (c) 2022 Nordic Semiconductor ASA
|
||||||
|
* Copyright (c) 2023 Husqvarna AB
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
@ -62,6 +63,14 @@
|
||||||
#define FF_FS_EXFAT CONFIG_FS_FATFS_EXFAT
|
#define FF_FS_EXFAT CONFIG_FS_FATFS_EXFAT
|
||||||
#endif /* defined(CONFIG_FS_FATFS_EXFAT) */
|
#endif /* defined(CONFIG_FS_FATFS_EXFAT) */
|
||||||
|
|
||||||
|
#if defined(CONFIG_FS_FATFS_REENTRANT)
|
||||||
|
#undef FF_FS_REENTRANT
|
||||||
|
#undef FF_FS_TIMEOUT
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
|
#define FF_FS_REENTRANT CONFIG_FS_FATFS_REENTRANT
|
||||||
|
#define FF_FS_TIMEOUT K_FOREVER
|
||||||
|
#endif /* defined(CONFIG_FS_FATFS_REENTRANT) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These options are override from default values, but have no Kconfig
|
* These options are override from default values, but have no Kconfig
|
||||||
* options.
|
* options.
|
||||||
|
|
69
modules/fatfs/zfs_ffsystem.c
Normal file
69
modules/fatfs/zfs_ffsystem.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* OS Dependent Functions for FatFs
|
||||||
|
*
|
||||||
|
* Copyright (c) 2023 Husqvarna AB
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
/* The file is based on template file by (C)ChaN, 2022, as
|
||||||
|
* available from FAT FS module source:
|
||||||
|
* https://github.com/zephyrproject-rtos/fatfs/blob/master/option/ffsystem.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ff.h>
|
||||||
|
|
||||||
|
#if FF_USE_LFN == 3 /* Dynamic memory allocation */
|
||||||
|
/* Allocate a memory block */
|
||||||
|
void *ff_memalloc(UINT msize)
|
||||||
|
{
|
||||||
|
return k_malloc(msize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free a memory block */
|
||||||
|
void ff_memfree(void *mblock)
|
||||||
|
{
|
||||||
|
k_free(mblock);
|
||||||
|
}
|
||||||
|
#endif /* FF_USE_LFN == 3 */
|
||||||
|
|
||||||
|
#if FF_FS_REENTRANT /* Mutual exclusion */
|
||||||
|
/* Table of Zephyr mutex. One for each volume and an extra one for the ff system.
|
||||||
|
* See also the template file used as reference. Link is available in the header of this file.
|
||||||
|
*/
|
||||||
|
static struct k_mutex fs_reentrant_mutex[FF_VOLUMES + 1];
|
||||||
|
|
||||||
|
/* Create a Mutex
|
||||||
|
* Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
|
||||||
|
* Returns 1: Succeeded or 0: Could not create the mutex
|
||||||
|
*/
|
||||||
|
int ff_mutex_create(int vol)
|
||||||
|
{
|
||||||
|
return (int)(k_mutex_init(&fs_reentrant_mutex[vol]) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Delete a Mutex
|
||||||
|
* Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
|
||||||
|
*/
|
||||||
|
void ff_mutex_delete(int vol)
|
||||||
|
{
|
||||||
|
/* (nothing to do) */
|
||||||
|
(void)vol;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Request Grant to Access the Volume
|
||||||
|
* Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
|
||||||
|
* Returns 1: Succeeded or 0: Timeout
|
||||||
|
*/
|
||||||
|
int ff_mutex_take(int vol)
|
||||||
|
{
|
||||||
|
return (int)(k_mutex_lock(&fs_reentrant_mutex[vol], FF_FS_TIMEOUT) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release Grant to Access the Volume
|
||||||
|
* Mutex ID vol: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES)
|
||||||
|
*/
|
||||||
|
void ff_mutex_give(int vol)
|
||||||
|
{
|
||||||
|
k_mutex_unlock(&fs_reentrant_mutex[vol]);
|
||||||
|
}
|
||||||
|
#endif /* FF_FS_REENTRANT */
|
|
@ -1,5 +1,6 @@
|
||||||
# Copyright (c) 2016 Intel Corporation
|
# Copyright (c) 2016 Intel Corporation
|
||||||
# Copyright (c) 2020 Nordic Semiconductor ASA
|
# Copyright (c) 2020 Nordic Semiconductor ASA
|
||||||
|
# Copyright (c) 2023 Husqvarna AB
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
config FAT_FILESYSTEM_ELM
|
config FAT_FILESYSTEM_ELM
|
||||||
|
@ -220,6 +221,14 @@ config FS_FATFS_WINDOW_ALIGNMENT
|
||||||
that, in worst scenario, value provided here may cause FATFS
|
that, in worst scenario, value provided here may cause FATFS
|
||||||
structure to have size of twice the value.
|
structure to have size of twice the value.
|
||||||
|
|
||||||
|
config FS_FATFS_REENTRANT
|
||||||
|
bool "FatFs reentrant"
|
||||||
|
depends on !FS_FATFS_LFN_MODE_BSS
|
||||||
|
help
|
||||||
|
Enable the FatFs re-entrancy (thread safe) option for file/directory
|
||||||
|
access for each volume. Will create a zephyr mutex object for each
|
||||||
|
FatFs volume and a FatFs system mutex.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
endif # FAT_FILESYSTEM_ELM
|
endif # FAT_FILESYSTEM_ELM
|
||||||
|
|
Loading…
Reference in a new issue