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

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

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

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

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

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

1. 打开链接flash 的 SPI总线

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

出现spi03设备.

驱动中添加代码以下 :svg

#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 框架

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

DFS配置

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

修改elm-chan's最大size.png

其他的配置请参考上面的官网文档。测试

3.存储设备初始化

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

打开nonflas

4. 检查存储设备驱动

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

测试flash

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 命令,使用方法以下图:

初始化文件系统.png

重启后,W25Q256 挂载成功:

挂载成功