Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | /* NVS: non volatile storage in flash * * Copyright (c) 2018 Laczen * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_FS_NVS_H_ #define ZEPHYR_INCLUDE_FS_NVS_H_ #include <sys/types.h> #include <kernel.h> #include <device.h> #ifdef __cplusplus extern "C" { #endif /** * @brief Non-volatile Storage * @defgroup nvs Non-volatile Storage * @ingroup file_system_storage * @{ * @} */ /** * @brief Non-volatile Storage Data Structures * @defgroup nvs_data_structures Non-volatile Storage Data Structures * @ingroup nvs * @{ */ /** * @brief Non-volatile Storage File system structure * * @param offset File system offset in flash * @param ate_wra: Allocation table entry write address. Addresses are stored * as u32_t: high 2 bytes are sector, low 2 bytes are offset in sector, * @param data_wra: Data write address. * @param sector_size File system is divided into sectors each sector should be * multiple of pagesize * @param sector_count Amount of sectors in the file systems * @param write_block_size Alignment size * @param nvs_lock Mutex * @param flash_device Flash Device */ struct nvs_fs { off_t offset; /* filesystem offset in flash */ u32_t ate_wra; /* next alloc table entry write address */ u32_t data_wra; /* next data write address */ u16_t sector_size; /* filesystem is divided into sectors, * sector size should be multiple of pagesize */ u16_t sector_count; /* amount of sectors in the filesystem */ u8_t write_block_size; /* write block size for alignment */ bool ready; /* is the filesystem initialized ? */ struct k_mutex nvs_lock; struct device *flash_device; }; /** * @} */ /** * @brief Non-volatile Storage APIs * @defgroup nvs_high_level_api Non-volatile Storage APIs * @ingroup nvs * @{ */ /** * @brief nvs_init * * Initializes a NVS file system in flash. * * @param fs Pointer to file system * @param dev_name Pointer to flash device name * @retval 0 Success * @retval -ERRNO errno code if error */ int nvs_init(struct nvs_fs *fs, const char *dev_name); /** * @brief nvs_clear * * Clears the NVS file system from flash. * @param fs Pointer to file system * @retval 0 Success * @retval -ERRNO errno code if error */ int nvs_clear(struct nvs_fs *fs); /** * @brief nvs_write * * Write an entry to the file system. * * @param fs Pointer to file system * @param id Id of the entry to be written * @param data Pointer to the data to be written * @param len Number of bytes to be written * * @return Number of bytes written. On success, it will be equal to the number * of bytes requested to be written. On error returns -ERRNO code. */ ssize_t nvs_write(struct nvs_fs *fs, u16_t id, const void *data, size_t len); /** * @brief nvs_delete * * Delete an entry from the file system * * @param fs Pointer to file system * @param id Id of the entry to be deleted * @retval 0 Success * @retval -ERRNO errno code if error */ int nvs_delete(struct nvs_fs *fs, u16_t id); /** * @brief nvs_read * * Read an entry from the file system. * * @param fs Pointer to file system * @param id Id of the entry to be read * @param data Pointer to data buffer * @param len Number of bytes to be read * * @return Number of bytes read. On success, it will be equal to the number * of bytes requested to be read. When the return value is larger than the * number of bytes requested to read this indicates not all bytes were read, * and more data is available. On error returns -ERRNO code. */ ssize_t nvs_read(struct nvs_fs *fs, u16_t id, void *data, size_t len); /** * @brief nvs_read_hist * * Read a history entry from the file system. * * @param fs Pointer to file system * @param id Id of the entry to be read * @param data Pointer to data buffer * @param len Number of bytes to be read * @param cnt History counter: 0: latest entry, 1:one before latest ... * * @return Number of bytes read. On success, it will be equal to the number * of bytes requested to be read. When the return value is larger than the * number of bytes requested to read this indicates not all bytes were read, * and more data is available. On error returns -ERRNO code. */ ssize_t nvs_read_hist(struct nvs_fs *fs, u16_t id, void *data, size_t len, u16_t cnt); /** * @brief nvs_calc_free_space * * Calculate the available free space in the file system. * * @param fs Pointer to file system * * @return Number of bytes free. On success, it will be equal to the number * of bytes that can still be written to the file system. Calculating the * free space is a time consuming operation, especially on spi flash. * On error returns -ERRNO code. */ ssize_t nvs_calc_free_space(struct nvs_fs *fs); /** * @} */ #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_FS_NVS_H_ */ |