Line data Source code
1 0 : /*
2 : * Copyright (c) 2019 Bolt Innovation Management, LLC
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_FS_LITTLEFS_H_
8 : #define ZEPHYR_INCLUDE_FS_LITTLEFS_H_
9 :
10 : #include <zephyr/types.h>
11 : #include <zephyr/kernel.h>
12 : #include <zephyr/storage/flash_map.h>
13 :
14 : #include <lfs.h>
15 :
16 : #ifdef __cplusplus
17 : extern "C" {
18 : #endif
19 :
20 : /**
21 : * @brief Get the major part of the littlefs disk version
22 : *
23 : * @param disk_version The disk version of littlefs partition
24 : * @return The major part of the littlefs disk version.
25 : */
26 1 : #define FS_LITTLEFS_DISK_VERSION_MAJOR_GET(disk_version) FIELD_GET(GENMASK(31, 16), disk_version)
27 :
28 : /**
29 : * @brief Get the minor part of the littlefs disk version
30 : *
31 : * @param disk_version The disk version of littlefs partition
32 : * @return The minor part of the littlefs disk version.
33 : */
34 1 : #define FS_LITTLEFS_DISK_VERSION_MINOR_GET(disk_version) FIELD_GET(GENMASK(15, 0), disk_version)
35 :
36 : /** @brief Filesystem info structure for LittleFS mount */
37 1 : struct fs_littlefs {
38 : /* Defaulted in driver, customizable before mount. */
39 0 : struct lfs_config cfg;
40 :
41 : /* Must be cfg.cache_size */
42 0 : uint8_t *read_buffer;
43 :
44 : /* Must be cfg.cache_size */
45 0 : uint8_t *prog_buffer;
46 :
47 : /* Must be cfg.lookahead_size/4 elements, and
48 : * cfg.lookahead_size must be a multiple of 8.
49 : */
50 0 : uint32_t *lookahead_buffer[CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE / sizeof(uint32_t)];
51 :
52 : /* These structures are filled automatically at mount. */
53 0 : struct lfs lfs;
54 0 : void *backend;
55 0 : struct k_mutex mutex;
56 : };
57 :
58 : /** @brief Define a littlefs configuration with customized size
59 : * characteristics.
60 : *
61 : * This defines static arrays required for caches, and initializes the
62 : * littlefs configuration structure to use the provided values instead
63 : * of the global Kconfig defaults. A pointer to the named object must
64 : * be stored in the @ref fs_mount_t.fs_data field of a @ref fs_mount_t object.
65 : *
66 : * To define an instance for the Kconfig defaults, use
67 : * @ref FS_LITTLEFS_DECLARE_DEFAULT_CONFIG.
68 : *
69 : * To completely control file system configuration the application can
70 : * directly define and initialize a @ref fs_littlefs
71 : * object. The application is responsible for ensuring the configured
72 : * values are consistent with littlefs requirements.
73 : *
74 : * @note If you use a non-default configuration for cache size, you
75 : * must also select @kconfig{CONFIG_FS_LITTLEFS_FC_HEAP_SIZE} to relax
76 : * the size constraints on per-file cache allocations.
77 : *
78 : * @param name the name for the structure. The defined object has
79 : * file scope.
80 : * @param alignment needed alignment for read/prog buffer for specific device
81 : * @param read_sz see @kconfig{CONFIG_FS_LITTLEFS_READ_SIZE}
82 : * @param prog_sz see @kconfig{CONFIG_FS_LITTLEFS_PROG_SIZE}
83 : * @param cache_sz see @kconfig{CONFIG_FS_LITTLEFS_CACHE_SIZE}
84 : * @param lookahead_sz see @kconfig{CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE}
85 : */
86 : #define FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, alignment, read_sz, prog_sz, cache_sz, \
87 1 : lookahead_sz) \
88 : static uint8_t __aligned(alignment) name ## _read_buffer[cache_sz]; \
89 : static uint8_t __aligned(alignment) name ## _prog_buffer[cache_sz]; \
90 : static uint32_t name ## _lookahead_buffer[(lookahead_sz) / sizeof(uint32_t)]; \
91 : static struct fs_littlefs name = { \
92 : .cfg = { \
93 : .read_size = (read_sz), \
94 : .prog_size = (prog_sz), \
95 : .cache_size = (cache_sz), \
96 : .lookahead_size = (lookahead_sz), \
97 : .read_buffer = name ## _read_buffer, \
98 : .prog_buffer = name ## _prog_buffer, \
99 : .lookahead_buffer = name ## _lookahead_buffer, \
100 : }, \
101 : }
102 :
103 : /** @brief Define a littlefs configuration with default characteristics.
104 : *
105 : * This defines static arrays and initializes the littlefs
106 : * configuration structure to use the default size configuration
107 : * provided by Kconfig.
108 : *
109 : * @param name the name for the structure. The defined object has
110 : * file scope.
111 : */
112 1 : #define FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(name) \
113 : FS_LITTLEFS_DECLARE_CUSTOM_CONFIG(name, \
114 : 4, \
115 : CONFIG_FS_LITTLEFS_READ_SIZE, \
116 : CONFIG_FS_LITTLEFS_PROG_SIZE, \
117 : CONFIG_FS_LITTLEFS_CACHE_SIZE, \
118 : CONFIG_FS_LITTLEFS_LOOKAHEAD_SIZE)
119 :
120 : #ifdef __cplusplus
121 : }
122 : #endif
123 :
124 : #endif /* ZEPHYR_INCLUDE_FS_LITTLEFS_H_ */
|