RT-Thread使用 SFUD 操作 Flash挂载文件系统

在智龙上使用 SFUD 操作 Flash并挂载文件系统

参考在潘多拉上使用 SFUD 操作 Flash
及在 STM32F429 上应用文件系统

SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。

在使用 SFUD 时候需要进行移植,可以参考文件 sfud/port/sfud_port.c。本篇文档将说明如何在智龙开板上使用 SFUD 操作 Flash文件系统,本文准备资料如下:

  • 智龙 源码(4.0.2)
  • Env 工具
  • 板载 spi flash(W25Q256)的智龙开发板+底板

1. 打开连接flash 的 SPI总线

这里使用 “spi10” , 进入msh ,用 "list_device"查看,可看到设备。如图所示。

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第1张图片

驱动中添加代码如下 :

#ifdef RT_USING_SPI1    
    {
        static struct rt_spi_device spi_device0;
        static struct rt_spi_device spi_device1;
        static struct rt_spi_device spi_device2;
        static struct ls1c_spi_cs  spi_cs10;
        static struct ls1c_spi_cs  spi_cs11;
        static struct ls1c_spi_cs  spi_cs12;

        /* spi10: CS0  w25Q256*/
        spi_cs10.cs = LS1C_SPI_CS_0;
       rt_spi_bus_attach_device(&spi_device0, "spi10", "spi1", (void*)&spi_cs10);
        spi_cs11.cs = LS1C_SPI_CS_1;
       rt_spi_bus_attach_device(&spi_device1, "spi11", "spi1", (void*)&spi_cs11);
        spi_cs12.cs = LS1C_SPI_CS_2;
       rt_spi_bus_attach_device(&spi_device2, "spi12", "spi1", (void*)&spi_cs12);
    }
#endif

2. 开启 / 配置 DFS 框架

这部分内容在初始的工程中已经配好。 如图所示。

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第2张图片

注意要将文件系统的最大sector修改为4096。如图所示。

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第3张图片

其余的配置请参考上面的官网文档。

3.存储设备初始化

开启 SPI 设备驱动, 在 RT-Thread Components → Device Drivers 界面中选中 Using Serial Flash Universal Driver 选项,如图所示。

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第4张图片

4. 检查存储设备驱动

为了确保该驱动工作正常,可以使用 sf 命令对该设备做 benchmark 测试。该功能由 sfud 组件提供,可以通过检查存储设备的读、写和擦除功能来判断存储设备的驱动程序是否正常。 如果像下图一样提示成功,所示则认为该驱动工作正常。如果无法通过测试,则需要检查驱动程序,使用逻辑分析仪对存储设备的接口波形进行分析。测试过程如下图:

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第5张图片

5.创建存储设备

由于只有块设备类型的设备才能和文件系统对接,所以需要根据 SPI Device 找到 SPI Flash 设备,并创建与其对应的 Block Device。

这里需要使用到万能 SPI Flash 驱动库:SFUD ,RT-Thread 已经集成了该组件,在上面的配置过程中我们已经开启这个功能。此时只需要使用 SFUD 提供的 rt_sfud_flash_probe 函数即可。该函数将执行如下操作:

根据名为 spi10 的 SPI Device 设备找到对应的 Flash 存储设备。

初始化 Flash 设备。

在 Flash 存储设备上创建名为 W25Q256 的 Block Device。

如果开启了组件自动初始化功能,该函数会被自动执行,否则需要手动调用运行。启动时自动加载,同时挂载到根目录的SPI目录下,代码如下 :

#ifdef RT_USING_SFUD
#include "spi_flash_sfud.h"
static int rt_hw_spi_flash_init(void)
{

    if (RT_NULL == rt_sfud_flash_probe("W25Q256", "spi10"))
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

int mnt_init(void)
{
    if (dfs_mount("W25Q256", "/spi", "elm", 0, 0) == 0)
    {
        rt_kprintf("W25Q256 mount successful!\n");
    }
    else
    {
        rt_kprintf("W25Q256 mount failed!\n");
    }

    return RT_EOK;
}
INIT_APP_EXPORT(mnt_init);
#endif

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVI8RON2-1590906220720)(figures/出现设备w25q256.png)]

6. 文件系统初始化

由于第一次使用 spi flash, 没有文件系统存储设备, 会看到 spi flash mount to /spi failed! 的提示。这是因为此时在 SPI Flash 中还没有创建相应类型的文件系统,这就用到了创建文件系统 shell 命令:mkfs。

mkfs 命令的功能是在指定的存储设备上创建指定类型的文件系统。使用格式为:mkfs [-t type] device 。第一次挂载文件系统前需要使用 mkfs 命令在存储设备上创建相应的文件系统,否则就会挂载失败。如果要在 W25Q256 设备上创建 elm 类型的文件系统,就可以使用 mkfs -t elm W25Q256 命令,使用方法如下图:

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第6张图片

重启后,W25Q256 挂载成功:

RT-Thread使用 SFUD 操作 Flash挂载文件系统_第7张图片

你可能感兴趣的:(rt-thread)