zephyr/include/fs/littlefs.h
Peter A. Bigot 167eb53e74 subsys/fs/littlefs: allow customization of file system configuration
There's desire to be able to customize parameters on a per-filesystem
basis, which means we need a way to override the Kconfig defaults which
are global.  This also means the littlefs data structure cannot own the
cache and lookahead buffers.

Switch to using a macro to define the littlefs data structure.  The
default version uses the Kconfig constants.  A custom one takes
arguments providing the most likely partition-specific parameters.
Finally the user is free to bypass the helper macros and set any
parameters desired, though validation is limited and only present when
CONFIG_DEBUG is enabled.

Extend the test suite with a performance module, which confirms that
these settings have an impact proportional to the log of changes to the
cache or IO sizes.

Signed-off-by: Peter A. Bigot <pab@pabigot.com>
2019-08-06 19:39:26 +02:00

107 lines
3.4 KiB
C

/*
* Copyright (c) 2019 Bolt Innovation Management, LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_FS_LITTLEFS_H_
#define ZEPHYR_INCLUDE_FS_LITTLEFS_H_
#include <zephyr/types.h>
#include <kernel.h>
#include <storage/flash_map.h>
#include <lfs.h>
#ifdef __cplusplus
extern "C" {
#endif
/** @brief Filesystem info structure for LittleFS mount */
struct fs_littlefs {
/* Defaulted in driver, customizable before mount. */
struct lfs_config cfg;
/* Must be cfg.cache_size */
u8_t *read_buffer;
/* Must be cfg.cache_size */
u8_t *prog_buffer;
/* Mustbe cfg.lookahead_size/4 elements, and
* cfg.lookahead_size must be a multiple of 8.
*/
u32_t *lookahead_buffer[CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE / sizeof(u32_t)];
/* These structures are filled automatically at mount. */
struct lfs lfs;
const struct flash_area *area;
struct k_mutex mutex;
};
/** @brief Define a littlefs configuration with customized size
* characteristics.
*
* This defines static arrays required for caches, and initializes the
* littlefs configuration structure to use the provided values instead
* of the global Kconfig defaults. A pointer to the named object must
* be stored in the ``.fs_data`` field of a :c:type:`struct fs_mount`
* object.
*
* To define an instance for the Kconfig defaults, use
* :cpp:func:`FS_LITTLEFS_DECLARE_DEFAULT_CONFIG`.
*
* To completely control file system configuration the application can
* directly define and initialize a :c:type:`struct fs_littlefs`
* object. The application is responsible for ensuring the configured
* values are consistent with littlefs requirements.
*
* @note If you use a non-default configuration for cache size, you
* must also select :option:`CONFIG_FS_LITTLEFS_FC_MEM_POOL` to relax
* the size constraints on per-file cache allocations.
*
* @param name the name for the structure. The defined object has
* file scope.
* @param read_sz see :option:`CONFIG_FS_LITTLEFS_READ_SIZE`
* @param prog_sz see :option:`CONFIG_FS_LITTLEFS_PROG_SIZE`
* @param cache_sz see :option:`CONFIG_FS_LITTLEFS_CACHE_SIZE`
* @param lookahead_sz see :option:`CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE`
*/
#define FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, read_sz, prog_sz, cache_sz, lookahead_sz) \
static u8_t name ## _read_buffer[cache_sz]; \
static u8_t name ## _prog_buffer[cache_sz]; \
static u32_t name ## _lookahead_buffer[(lookahead_sz) / sizeof(u32_t)]; \
static struct fs_littlefs name = { \
.cfg = { \
.read_size = (read_sz), \
.prog_size = (prog_sz), \
.cache_size = (cache_sz), \
.lookahead_size = (lookahead_sz), \
.read_buffer = name ## _read_buffer, \
.prog_buffer = name ## _prog_buffer, \
.lookahead_buffer = name ## _lookahead_buffer, \
}, \
}
/** @brief Define a littlefs configuration with default characteristics.
*
* This defines static arrays and initializes the littlefs
* configuration structure to use the default size configuration
* provided by Kconfig.
*
* @param name the name for the structure. The defined object has
* file scope.
*/
#define FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(name) \
FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, \
CONFIG_FS_LITTLEFS_READ_SIZE, \
CONFIG_FS_LITTLEFS_PROG_SIZE, \
CONFIG_FS_LITTLEFS_CACHE_SIZE, \
CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE)
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_FS_LITTLEFS_H_ */