一、Zephyr storage 存储子系统能做什么?
统一管理磁盘操作方便应用层使用存储,如格式化、读数据、写数据。
二、应用层操作
官方给的demo:
https://github.com/zephyrproject-rtos/zephyr/blob/main/samples/subsys/nvs/src/main.c
序号 |
介质 |
访问方式 |
功能 |
API接口 |
备注 |
1 |
Non-Volatile Storage(EEPROM) |
binary blobs, strings, integers, longs |
计算文件系统中的可用空间 |
ssize_t nvs_calc_free_space(struct nvs_fs *fs) |
|
从文件系统中读取历史记录条目 |
ssize_t nvs_read_hist(struct nvs_fs *fs, uint16_t id, void *data, size_t Len, uint16_t CNT) |
||||
从文件系统中读取条目 |
ssize_t nvs_read(struct nvs_fs *fs, uint16_t id, void *data, size_t len) |
||||
从文件系统中删除条目 |
int nvs_delete(struct nvs_fs *fs, uint16_t id) |
||||
将条目写入文件系统 |
ssize_t nvs_write(struct nvs_fs *fs, uint16_t id, const void *data, size_t len) |
||||
从闪存中清除 NVS 文件系统 |
int nvs_clear(struct nvs_fs *fs) |
||||
2 |
EMMC/SD |
sector uint8_t |
初始化 |
int disk_access_init(const char *pdrv) |
|
获取磁盘的状态 |
int disk_access_status(const char *pdrv) |
||||
从磁盘读取数据 |
int disk_access_read(const char *pdrv, uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector) |
||||
将数据写入磁盘 |
int disk_access_write(const char *pdrv, const uint8_t *data_buf, uint32_t start_sector, uint32_t num_sector) |
||||
获取/配置磁盘参数 |
int disk_access_ioctl(const char *pdrv, uint8_t cmd, void *buff) |
||||
注册磁盘 |
int disk_access_register(struct disk_info *disk) |
||||
3 |
Stream Flash(Nand&Nor) |
page |
初始化流写入闪存所需的上下文,把读写状态回调函数传入 |
int stream_flash_init(struct stream_flash_ctx *ctx, const struct device *fdev, uint8_t *buf, size_t buf_len, size_t offset, size_t size, stream_flash_callback_t cb) |
|
按字节写入存储 |
size_t stream_flash_bytes_written(struct stream_flash_ctx *ctx) |
||||
按缓冲区写入flash |
int stream_flash_buffered_write(struct stream_flash_ctx *ctx, const uint8_t *data, size_t len, bool flush) |
||||
擦除给定偏移所属的闪存页面 |
int stream_flash_erase_page(struct stream_flash_ctx *ctx, off_t off) |
||||
使用键值加载 |
int stream_flash_progress_load(struct stream_flash_ctx *ctx, const char *settings_key) |
||||
使用键值保存 |
int stream_flash_progress_save(struct stream_flash_ctx *ctx, const char *settings_key) |
||||
使用键值擦除 |
int stream_flash_progress_clear(struct stream_flash_ctx *ctx, const char *settings_key) |
||||
4 |
分区读写 |
分区 |
打开分区 |
int flash_area_open(uint8_t id, const struct flash_area **fa) |
|
关闭分区 |
void flash_area_close(const struct flash_area *fa) |
||||
写入分区 |
int flash_area_write(const struct flash_area *fa, off_t off, const void *src, size_t len) |
||||
擦除分区 |
int flash_area_erase(const struct flash_area *fa, off_t off, size_t len) |
||||
获取分区 |
uint32_t flash_area_align(const struct flash_area *fa) |
||||
通过分区获取扇区 |
int flash_area_get_sectors(int fa_id, uint32_t *count, struct flash_sector *sectors) |
||||
遍历分区 |
void flash_area_foreach(flash_area_cb_t user_cb, void *user_data) |
||||
通过分区获取设备 |
const struct device *flash_area_get_device(const struct flash_area *fa) |
||||
擦除分区 |
uint8_t flash_area_erased_val(const struct flash_area *fa) |
||||
查询分区有没有支持的驱动 |
int flash_area_has_driver(const struct flash_area *fa) |
||||
5 |
Flash Circular Buffer |
entrie |
初始化 |
int fcb_init(int f_area_id, struct fcb *fcb) |
|
追加数据 |
int fcb_append(struct fcb *fcb, uint16_t len, struct fcb_entry *loc) |
||||
是否是空的 |
int fcb_is_empty(struct fcb *fcb) |
||||
清空数据 |
int fcb_clear(struct fcb *fcb) |
||||
追加完成 |
int fcb_append_finish(struct fcb *fcb, struct fcb_entry *append_loc) |
||||
获取下一个值 |
int fcb_getnext(struct fcb *fcb, struct fcb_entry *loc) |
||||
翻转存储数据的顺序 |
int fcb_rotate(struct fcb *fcb) |
||||
获取空闲扇区数量 |
int fcb_free_sector_cnt(struct fcb *fcb) |
||||
浏览所有entries |
int fcb_walk(struct fcb *fcb, struct flash_sector *sector, fcb_walk_cb cb, void *cb_arg) |