继上一篇笔记,成功启动了liteos_m内核,可以创建线程了,也能看到shell控制台了。
今天研究文件系统,让控制台相关文件命令如mkdir和ls能工作。
liteos_m内核支持fatfs和littlefs两个文件系统,
fatfs适用于SD卡,
littlefs适用于NORFLASH,如W25Qxx系列。
我的板子上刚好有W25Q64,试试接入littlefs文件系统。
基于之前的研究经验,进入make menuconfig看看文件系统相关选项,先把它选上:
当启用文件系统后,LOS_KernelInit会调用OsVfsInit进行初始化,
OsVfsInit又会调用LfsInit初始化littlefs,并把littlefs注册到vfs的类型列表。
那我们怎么使用它呢,怎么让littlefs读写我们的SPIFLASH呢?
经过调查,我们需要使用mount函数,进行挂载操作来绑定文件系统和FLASH设备。
那就在bsp目录新建littlefs.c,参考代码:
#include#include "spiflash.h" #include "lfs.h" #include "los_fs.h" static int LittlefsRead(int partition, UINT32 *offset, void *buf, UINT32 size) { spiflash_read(*offset, buf, size); return LFS_ERR_OK; } static int LittlefsProg(int partition, UINT32 *offset, const void *buf, UINT32 size) { spiflash_write(*offset, buf, size); return LFS_ERR_OK; } static int LittlefsErase(int partition, UINT32 offset, UINT32 size) { spiflash_erase(offset, size); return LFS_ERR_OK; } static void LittlefsPartiton(void) { int lens[1]={1024*1024}; int addr[1]={0}; LOS_DiskPartition("flash0", "littlefs", lens, addr, 1); } static void LittlefsMount(void) { int ret; struct PartitionCfg lfs_cfg; lfs_cfg.readFunc = LittlefsRead; lfs_cfg.writeFunc = LittlefsProg; lfs_cfg.eraseFunc = LittlefsErase; lfs_cfg.readSize = 64; lfs_cfg.writeSize = 256; lfs_cfg.blockSize = 4096; lfs_cfg.blockCount = 256; lfs_cfg.cacheSize = 4096; lfs_cfg.partNo = 0; lfs_cfg.lookaheadSize = 64; lfs_cfg.blockCycles = 100; ret = mount(NULL, "/flash", "littlefs", 0, &lfs_cfg); printf("LittlefsInit ret=%d\n", ret); } int LittlefsInit(void) { printf("LittlefsInit enter\n"); spiflash_init(); printf("SPIFLASH flash id=0x%x\n", spiflash_read_id()); LittlefsPartiton(); LittlefsMount(); return LFS_ERR_OK; }
LittlefsInit函数是初始化文件系统函数,在main里面完成LOS_KernelInit之后再调用。
spiflash_init是我们实现的W25QXX的驱动,W25QXX使用的是STM32F407的SPI接口。
使用HAL库完成SPI驱动,并用SPI读写W25QXX的部分就不在这里过多介绍了。
只要实现spiflash的init(初始化),read(读),write(写),erase(擦除)这4个函数就行。
LittlefsPartiton这个函数是定义1个磁盘分区,不然mount会失败。
具体原因是liteos_m适配的代码lfs_adapter.c里面,littlefs_block_xxx函数要用LfsGetStartAddr来寻找分区超始地址。LfsGetStartAddr会查找我们定义的分区表。
LittlefsMount函数则是调用mount函数,挂载littlefs分区,最后1个参数指定FLASH驱动参数。
mount函数最终会调用lfs_adapter.c里面的LfsMount函数。
LfsMount函数的最后1个参数会被LfsConfigAdapter((struct PartitionCfg *)data, cfg)转换为struct lfs_config结构传递给lfs_mount函数。
其它几个函数则就对FLASH读写操作进行封装就行了。
mount的第2个参数是挂载路径,可以自定义,但是用"/"我这里测试不行,只能是"/xxx"目录。
写完代码,按照之前的方法修改BUILD.gn,一切顺利的话编译通过。
下载到板子,可以看到LittlefsInit ret=0的日志。
敲ls命令,会报错,但是cd /flash切换目录后就没有问题了。
需要读写文件的话,#include
猜你喜欢
- 1月前(江西启动“唱游江西”计划)江西启动“唱游江西”计划
- 1月前(上海文旅产业发展高峰论坛)《上海打造文旅元宇宙新赛道行动方案》发布
- 1月前(瑞士大酒店-自助餐怎么样)瑞意心旅,以食为先 瑞士酒店开启全新"瑞士早餐计划"
- 1月前(三亚太阳湾柏悦度假酒店)三亚太阳湾柏悦酒店携手ROSEONLY诺誓缔造浪漫七夕
- 1月前(福朋喜来登酒店宴会厅)福朋喜来登品牌亮相北部湾城市群 阳江中心福朋喜来登酒店开业
- 1月前(云南南博会展馆)旅居云南馆亮相第9届南博会
- 1月前(澳涞坞是什么)从最美山庄到世界舞台:澳涞山庄见证世界十佳旅居城市评选
- 1月前(中国旅游集团旗下酒店)中国旅游集团酒店控股有限公司战略投资雅阁酒店集团
- 1月前(万豪旅享家活动2021)精彩上新,漫享夏日----跟随万豪旅享家新开酒店解锁夏日旅行灵感
- 1月前(世茂海峡大厦多高)巴西地产高管齐聚厦门世茂海峡大厦 共探超高层建筑锻造经验
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章