blob: dff6ac1243c6cef2bf3c25d5b490ea25cdb86bb9 [file] [log] [blame]
/*
* 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 */
uint8_t *read_buffer;
/* Must be cfg.cache_size */
uint8_t *prog_buffer;
/* Must be cfg.lookahead_size/4 elements, and
* cfg.lookahead_size must be a multiple of 8.
*/
uint32_t *lookahead_buffer[CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE / sizeof(uint32_t)];
/* These structures are filled automatically at mount. */
struct lfs lfs;
void *backend;
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
* :c:macro:`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 @kconfig{CONFIG_FS_LITTLEFS_FC_HEAP_SIZE} 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 @kconfig{CONFIG_FS_LITTLEFS_READ_SIZE}
* @param prog_sz see @kconfig{CONFIG_FS_LITTLEFS_PROG_SIZE}
* @param cache_sz see @kconfig{CONFIG_FS_LITTLEFS_CACHE_SIZE}
* @param lookahead_sz see @kconfig{CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE}
*/
#define FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, read_sz, prog_sz, cache_sz, lookahead_sz) \
static uint8_t __aligned(4) name ## _read_buffer[cache_sz]; \
static uint8_t __aligned(4) name ## _prog_buffer[cache_sz]; \
static uint32_t name ## _lookahead_buffer[(lookahead_sz) / sizeof(uint32_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_ */