From 1a103a9a5eb92418eab6f5f92d05b32cdf1c70bc Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 19 Nov 2021 20:16:06 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15115 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- os/vfs/include/vfssystem.h | 45 +++++++++++++++++- os/vfs/src/vfssystem.c | 96 ++++++++++++++++++++++++++++++++++++++ os/vfs/vfs.mk | 2 +- 3 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 os/vfs/src/vfssystem.c diff --git a/os/vfs/include/vfssystem.h b/os/vfs/include/vfssystem.h index 2eeba61f3..9dcd59204 100644 --- a/os/vfs/include/vfssystem.h +++ b/os/vfs/include/vfssystem.h @@ -21,7 +21,7 @@ * @file vfs/include/vfssystem.h * @brief VFS system header file. * - * @addtogroup VFS_NODES + * @addtogroup VFS_SYSTEM * @{ */ @@ -44,6 +44,14 @@ /* Module data structures and types. */ /*===========================================================================*/ +/** + * @brief Type of a VFS error code. + */ +typedef enum { + VFS_RET_SUCCESS = 0, /**< VFS_RET_SUCCESS */ + VFS_RET_NO_RESOURCE = -1/**< VFS_RET_NO_RESOURCE */ +} vfserr_t; + /** * @brief @p vfs_system_node_t specific methods. */ @@ -78,24 +86,57 @@ typedef struct vfs_system_node { * @brief Type of a structure representing the VFS system. */ typedef struct vfs_system { +#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__) + /** + * @brief VFS access mutex. + */ + mutex_t mtx; +#else + /** + * @brief VFS access fallback semaphore. + */ + semaphore_t sem; +#endif /** * @brief Absolute root node. */ vfs_node_t *root_node; + /** + * @brief Next registration slot. + */ + vfs_driver_t **next_driver; + /** + * @brief Registration slots. + */ + vfs_driver_t *drivers[VFS_CFG_MAX_DRIVERS]; } vfs_system_t; /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ +/* + * Defaults on the best synchronization mechanism available. + */ +#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__) +#define VFS_LOCK() chMtxLock(&vfs.mtx) +#define VFS_UNLOCK() chMtxUnlock(&vfs.mtx) +#else +#define VFS_LOCK() (void) chSemWait(&vfs.sem) +#define VFS_UNLOCK() chSemSignal(&vfs.sem) +#endif + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ +extern vfs_system_t vfs; + #ifdef __cplusplus extern "C" { #endif - + void vfsInit(void); + vfserr_t vfsRegisterDriver(vfs_driver_t *vdp); #ifdef __cplusplus } #endif diff --git a/os/vfs/src/vfssystem.c b/os/vfs/src/vfssystem.c new file mode 100644 index 000000000..d36f9ec94 --- /dev/null +++ b/os/vfs/src/vfssystem.c @@ -0,0 +1,96 @@ +/* + ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014, + 2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation version 3 of the License. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file vfs/src/chsystem.c + * @brief VFS system code. + * + * @addtogroup VFS_SYSTEM + * @{ + */ + +#include "vfs.h" + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/** + * @brief Global VFS state. + */ +vfs_system_t vfs; + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + + +/** + * @brief VFS initialization. + * + * @special + */ +void vfsInit(void) { + + vfs.next_driver = &vfs.drivers[0]; + +#if (CH_CFG_USE_MUTEXES == TRUE) || defined(__DOXYGEN__) + chMtxObjectInit(&vfs.mtx); +#else + chSemObjectInit(&vfs.sem, (cnt_t)1); +#endif +} + +/** + * @brief Registers a file system driver on VFS. + * + * @param[in] vdp pointer to a @p vfs_driver_t structure + * @return The operation result. + */ +vfserr_t vfsRegisterDriver(vfs_driver_t *vdp) { + vfserr_t err; + + VFS_LOCK(); + + if (vfs.next_driver >= &vfs.drivers[VFS_CFG_MAX_DRIVERS]) { + err = VFS_RET_NO_RESOURCE; + } + else { + *vfs.next_driver++ = vdp; + err = VFS_RET_SUCCESS; + } + + VFS_UNLOCK(); + + return err; +} + +/** @} */ diff --git a/os/vfs/vfs.mk b/os/vfs/vfs.mk index 22f3f413e..2bdd483ee 100644 --- a/os/vfs/vfs.mk +++ b/os/vfs/vfs.mk @@ -1,5 +1,5 @@ # List of all the ChibiOS/VFS files. -VFSSRC := #$(CHIBIOS)/os/vfs/src/vfs.c +VFSSRC := $(CHIBIOS)/os/vfs/src/vfssystem.c # Required include directories VFSINC := $(CHIBIOS)/os/vfs/include