【学习笔记】RT-Thread中flash管理 — [SFUD组件 和 FAL驱动组件介绍]

简介

RT-Thread中,对flash的操作采用了sfud和fal组件来封装底层,从而兼容不同厂商的flash的差异,避免项目因 Flash 缺货、Flash 停产或产品扩容而带来的风险**,统一的接口来操作flash**。SFUDFAL 组件是github上的开源组件,均是可以独立出来的组件,无论是在裸机系统或者操作系统中都可以轻松移植。

By the way ,这两款组件的主要作者都是armink,这位作者自己还有一些对于flash操作的特殊项目。


sfud架构

在这里插入图片描述

在RT-Thread中,flash操作的框架如图所示,从下到上依次是:

  • flash硬件层:不同厂商不同容量的flash硬件设备
  • SPI操作层:SPI操作有SPI控制器来控制收发操作,通过开放一个通用的读写接口给sfud操作。
  • Sfud通用驱动库:sfud通用驱动库中通过一个table,支持了不同的flash,通过port的初始化衔接控制spi操作。
  • FAL flash抽象层:fal抽象层分为两部分,fal_dev设备和mtd分区,mtd层中根据分区表,把每一个分区抽象层一个设备。

1.sfud

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

  • 主要特点:支持 SPI/QSPI 接口、面向对象(同时支持多个 Flash 对象)、可灵活裁剪、扩展性强、支持 4 字节地址
  • 使用 SFUD 即可避免,在相同功能的软件平台基础下,无法适配不同 Flash 种类的硬件平台的问题,提高软件的可重用性;
  • 简化软件流程,降低开发难度。现在只需要配置好 SPI 通信,即可畅快的开始玩串行 Flash 了;
sfud API 说明

sfud api说明

sfud 配置

/sfud/inc/sfud_def.h 中,是sfud中的一些配置,主要的是定义了sfud主要使用的一个结构体一个支持sfud组件的flash厂商表格

  • 结构体 sfud_flash

    typedef struct {
         
        ...
        char *name;                                  /**< serial flash name */
        size_t index;                                /**< index of flash device information table  @see flash_table */
        sfud_flash_chip chip;                        /**< flash chip information */
        sfud_spi spi;                                /**< SPI device */
        bool init_ok;                                /**< initialize OK flag */
        bool addr_in_4_byte;                         /**< flash is in 4-Byte 
        void *user_data;                             /**< some user data */
    
    #ifdef SFUD_USING_QSPI
        sfud_qspi_read_cmd_format read_cmd_format;   /**< fast read cmd format */
    #endif
        unsigned int erase_block_size;
        ...
    } sfud_flash, *sfud_flash_t;
    

    每个 SPI Flash 会对应一个该结构体,该结构体指针下面统称为 Flash 设备对象。初始化成功后在 sfud_flash->chip 结构体中会存放 SPI Flash 芯片的常见参数。

    typedef struct {
         
        char *name;                                  /**< flash chip name */
        uint8_t mf_id;                               /**< manufacturer ID */
        uint8_t type_id;                             /**< memory type ID */
        uint8_t capacity_id;                         /**< capacity ID */
        uint32_t capacity;                           /**< flash capacity (bytes) */
        uint16_t write_mode;                         /**< write mode @see sfud_write_mode */
        uint32_t erase_gran;                         /**< erase granularity (bytes) */
        uint8_t erase_gran_cmd;                      /**< erase granularity size block command */
    } sfud_flash_chip;
    
  • 以上的芯片chip信息,是用来匹配sfud组件所支持的flash的表格 SFUD_USING_FLASH_INFO_TABLE

    如果使用的flash不支持sfud组件,在 /sfud/inc/sfud_flash_def.h 中添加需要使用的flash信息即可。

    格式:| name | mf_id | type_id | capacity_id | capacity | write_mode | erase_gran | erase_gran_cmd |

    #define SFUD_FLASH_CHIP_TABLE       
    {
                                              
        {
         "AT45DB161E", SFUD_MF_ID_ATMEL, 0x26, 0x00, 2L
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值