一、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) |