STM32F407移植OpenHarmony笔记7

继上一篇笔记,成功启动了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,参考代码:

cpp 复制代码
#include <stdio.h>
#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<fnctl.h>使用open,read,write,close函数就可以了。

相关推荐
爱桥代码的程序媛7 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
OH五星上将2 天前
OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南(一)
嵌入式硬件·移动开发·harmonyos·openharmony·鸿蒙开发·鸿蒙移植
让开,我要吃人了2 天前
OpenHarmony鸿蒙( Beta5.0)摄像头实践开发详解
驱动开发·华为·移动开发·harmonyos·鸿蒙·鸿蒙系统·openharmony
OH五星上将3 天前
如何编译OpenHarmony SDK API
嵌入式硬件·移动开发·api·sdk·harmonyos·openharmony·鸿蒙开发
OH五星上将3 天前
如何更换OpenHarmony SDK API 10
驱动开发·嵌入式硬件·sdk·harmonyos·openharmony·鸿蒙开发
Android技术栈4 天前
鸿蒙开发(NEXT/API 12)【使用fetchsync发送同步网络请求 (C/C++)】 远场通信服务
c语言·网络·c++·信息与通信·harmonyos·鸿蒙系统·openharmony
OH五星上将4 天前
OpenHarmony(鸿蒙南向开发)——标准系统移植指南(一)
harmonyos·移植·openharmony·鸿蒙开发·鸿蒙内核·子系统
让开,我要吃人了5 天前
OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解
驱动开发·嵌入式硬件·华为·移动开发·harmonyos·鸿蒙·openharmony
OH五星上将5 天前
OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南(二)
驱动开发·移动开发·harmonyos·内存管理·openharmony·鸿蒙内核·鸿蒙移植
OH五星上将5 天前
OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)
嵌入式硬件·移动开发·harmonyos·openharmony·鸿蒙开发·系统移植