【RTT】SPI Flash 与文件系统(3):DFS 和 EasyFlash

  
参考文档(国内):DFS 参考文档
参考文档(国内):EasyFlash 参考文档

  

一、DFS 概述

  DFS 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device File System,即设备虚拟文件系统。
  具体的描述可以查看上面的参考手册。

  

二、EasyFlash 概述

  EasyFlash 是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发。
  它让 Flash 变为 NoSQL(非关系型数据库)模型的小型键值(Key-Value)存储数据库。
  具体的描述可以查看上面的参考手册。

  

三、DFS 和 EasyFlash 关系

  如下图所示。
【RTT】SPI Flash 与文件系统(3):DFS 和 EasyFlash

  

四、DFS、EasyFlash、SD卡的使用

  

1、DFS 的使用

  因为我们使用的是 W25Q128 来挂载 DFS 的 elm FAT,elm FAT 默认的扇区大小是 512,然而 W25Q128 的扇区大小是 4096,所以需要进行相应的修改。
【RTT】SPI Flash 与文件系统(3):DFS 和 EasyFlash
   而且,DFS 也需要进行相应的修改。

/* components/dfs/include/dfs.h */

#ifndef SECTOR_SIZE
#define SECTOR_SIZE              4096	//512
#endif

  在 FAL 的文章中,我们在 “FAL 分区的使用” 这小结中介绍了 DFS 的挂载过程,这里就不再介绍了。
  注意:DFS 必须挂载到块设备上

  

2、EasyFlash 的使用

  EasyFlash 并不需要挂载到块设备上,它只需要找到 FAL 分区表中指定的分区,然后使用 FAL 提供的 API 直接对分区进行操作。
  所以,我们需要指定 EasyFlash 所要使用的分区。

/* bsp/stm32/stm32l475-atk-pandora/board/ports/ef_fal_port.c */

/* 使用的 FAL 中的 "easyflash" 分区 */
#define FAL_EF_PART_NAME               "easyflash"

  接下来,我们可以在 “DFS 的使用” 提供的代码上添加 EasyFlash 的初始化,就可以使用 EasyFlash 了。

#include <fal.h>
#include <dfs_fs.h>
#include <easyflash.h>

/* 挂载初始化 */
void mnt_init(void)
{
	struct rt_device *rootfs = RT_NULL;
	
	/* 使用 filesystem 分区创建块设备,块设备名称为 filesystem */
	rootfs = fal_blk_device_create("filesystem");
	if(rootfs == RT_NULL)
        return;

	/* 将 elm fat 文件系统挂载 W25Q128 的 filesystem 分区 */
	if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
    {
        rt_kprintf("file system initialization done!\n");
    }
    else
    {
        if(dfs_mkfs("elm", "filesystem") == 0)
        {
            if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
            {
                rt_kprintf("file system initialization done!\n");
            }
            else
            {
                rt_kprintf("file system initialization failed!\n");
            }
        }
    }
	
	/* easyflash 的初始化 */
    easyflash_init();
}

  

3、SD 卡的使用

  这里介绍一下思路:因为我们使用片外 Flash 的 “filesystem” 分区创建了对应的块设备,用来挂载根目录 /,所以这里在根目录 / 下创建一个 mnt 目录当作挂载点,用于挂载 SD 卡。
  在挂载之前,我们需要设置一下 DFS 支持挂载的文件系统数量(由 2 改为 3),不然会报错。
【RTT】SPI Flash 与文件系统(3):DFS 和 EasyFlash
  因为 RT-Thread 已经提供的 SD 卡的驱动代码,所以我们需要将 SD 卡驱动代码中的挂载部分给屏蔽掉,然后由我们自己来挂载。
  同样的,我们可以在 “EasyFlash 的使用” 提供的代码上添加 SD 卡的挂载。

void mnt_init(void)
{
    struct rt_device *rootfs = RT_NULL;

    /* FAL 初始化 */
    fal_init();

    /* 使用 filesystem 分区创建块设备,块设备名称为 filesystem */
    rootfs = fal_blk_device_create("filesystem");
    if(rootfs == RT_NULL)
        return;

	/* 将 elm fat 文件系统挂载 W25Q128 的 filesystem 分区 */
    if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
    {
        rt_kprintf("file system initialization done!\n");
    }
    else
    {
        if(dfs_mkfs("elm", "filesystem") == 0)
        {
            if (dfs_mount("filesystem", "/", "elm", 0, 0) == 0)
            {
                rt_kprintf("file system initialization done!\n");
            }
            else
            {
                rt_kprintf("file system initialization failed!\n");
            }
        }
    }

    /* easyflash 的初始化 */
    easyflash_init();

    /* 创建 /mnt 目录,用于挂载 SD 卡 */
    if (opendir("/mnt") == RT_NULL)
    {
        if (mkdir("mnt", 0x777) == -1)
            return;
    }    
        
    if(rt_device_find("sd0") == RT_NULL)
    {
        rt_kprintf("failed to find sd card device.\n");
        return;
    }

    if (dfs_mount("sd0", "/mnt", "elm", 0, 0) == RT_EOK)
    {
        rt_kprintf("sd card mount to '/mnt' success.\n");
    }
    else
    {
        rt_kprintf("sd card mount to '/mnt' failed!\n");
    }
}
上一篇:slab、slub内存管理与泄漏分析


下一篇:Suspense组件