177 lines
4.8 KiB
C
177 lines
4.8 KiB
C
/* 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 uint32_t:
|
|
* high 2 bytes correspond to the sector, low 2 bytes are the offset in the sector
|
|
* @param data_wra Data write address
|
|
* @param sector_size File system is split into sectors, each sector must be multiple of pagesize
|
|
* @param sector_count Number of sectors in the file systems
|
|
* @param ready Flag indicating if the filesystem is initialized
|
|
* @param nvs_lock Mutex
|
|
* @param flash_device Flash Device runtime structure
|
|
* @param flash_parameters Flash memory parameters structure
|
|
*/
|
|
struct nvs_fs {
|
|
off_t offset;
|
|
uint32_t ate_wra;
|
|
uint32_t data_wra;
|
|
uint16_t sector_size;
|
|
uint16_t sector_count;
|
|
bool ready;
|
|
struct k_mutex nvs_lock;
|
|
const struct device *flash_device;
|
|
const struct flash_parameters *flash_parameters;
|
|
};
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @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. When a rewrite of the same data already stored is attempted, nothing is written
|
|
* to flash, thus 0 is returned. On error, returns negative value of errno.h defined error codes.
|
|
*/
|
|
ssize_t nvs_write(struct nvs_fs *fs, uint16_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, uint16_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 negative
|
|
* value of errno.h defined error codes.
|
|
*/
|
|
ssize_t nvs_read(struct nvs_fs *fs, uint16_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 negative
|
|
* value of errno.h defined error codes.
|
|
*/
|
|
ssize_t nvs_read_hist(struct nvs_fs *fs, uint16_t id, void *data, size_t len, uint16_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 negative value of errno.h defined error codes.
|
|
*/
|
|
ssize_t nvs_calc_free_space(struct nvs_fs *fs);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_FS_NVS_H_ */
|