blob: 59991277e41b8e03b6bd46ec8ec526adacbfe3e7 [file] [log] [blame]
/* NVS: non volatile storage in flash
*
* Copyright (c) 2018 Laczen
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __NVS_H_
#define __NVS_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
/**
* @brief Non-volatile Storage
* @defgroup nvs Non-volatile 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 magic File system magic, repeated at start of each sector
* @param write_location Next write location for entry header
* @param offset File system offset in flash
* @param sector_id Counter for sector
* @param sector_size File system is divided into sectors each sector should be
* multiple of pagesize and also a power of 2
* @param free_space Indicator for available space in the filesystem
* @param max_len Maximum size of storage items
* @param sector_count Amount of sectors in the file systems
* @param entry_sector Oldest sector in used
* @param write_block_size Alignment size in bytes_to_copy
* @param nvs_lock Mutex
* @param flash_device Flash Device
*/
struct nvs_fs {
u32_t magic; /* filesystem magic, repeated at start of each sector */
off_t write_location; /* next write location for entry header */
off_t offset; /* filesystem offset in flash */
u16_t sector_id; /* sector id, a counter for each created sector */
u16_t sector_size; /* filesystem is divided into sectors,
* sector size should be multiple of pagesize
* and a power of 2
*/
u16_t free_space; /* Indicator for available space in the file system.
* Writes are only allowed if free_space is equal to
* max_len. Is set to zero when the file system is
* full. Deletes increase free_space.
*/
u16_t max_len; /* maximum size of stored item, set to sector_size/4 */
u8_t sector_count; /* how many sectors in the filesystem */
u8_t entry_sector; /* oldest sector in use */
u8_t write_block_size; /* write block size for alignment */
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
* @param magic Magic number used in file system
* @retval 0 Success
* @retval -ERRNO errno code if error
*/
int nvs_init(struct nvs_fs *fs, const char *dev_name, u32_t magic);
/**
* @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. Any other value, indicates an error. Will
* return -ERRNO code on error.
*/
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. Any other value, indicates an error. When
* the number of bytes read is larger than the number of bytes requested to
* read this indicates not all bytes were read, and more data is available.
* Return -ERRNO code on error.
*/
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. Any other value, indicates an error. When
* the number of bytes read is larger than the number of bytes requested to
* read this indicates not all bytes were read, and more data is available.
* Return -ERRNO code on error.
*/
ssize_t nvs_read_hist(struct nvs_fs *fs, u16_t id, void *data, size_t len,
u16_t cnt);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __NVS_H_ */