blob: ac18e89045683af260a6eb6c3eb90355f370fa8c [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 */
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_ */