Originally the file cache used a mem_pool, but that data structure has been deprecated and replaced by a heap that includes metadata in the heap area. As a result attempts to allocate all blocks will fail because some of the reservation intended for cache data is now holding metadata instead. It's not immediately clear how to adjust the required heap size to support this metadata as it depends on heap chunk units and data structures that are not visible to the application. Experimentally a value of 24 bytes works, while smaller values do not. Further the previous Kconfig API to configure the allocation pool is completely inappropriate with the new heap data structure which has such different behavior. So: Deprecate the old Kconfig API. Add a new Kconfig option to directly control the cache size. Infer a default cache size that works with the old mem_pool parameters assuming a per-block overhead. But to avoid wasted memory use the heap allocation only when the application customizes the size, and use a slab in other cases. Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
107 lines
3.5 KiB
C
107 lines
3.5 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 */
|
|
uint8_t *read_buffer;
|
|
|
|
/* Must be cfg.cache_size */
|
|
uint8_t *prog_buffer;
|
|
|
|
/* Mustbe 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;
|
|
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
|
|
* :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 @option{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 @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 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_ */
|