简介
在RT-Thread中,对flash的操作采用了sfud和fal组件来封装底层,从而兼容不同厂商的flash的差异,避免项目因 Flash 缺货、Flash 停产或产品扩容而带来的风险**,统一的接口来操作flash**。SFUD 和 FAL 组件是github上的开源组件,均是可以独立出来的组件,无论是在裸机系统或者操作系统中都可以轻松移植。
By the way ,这两款组件的主要作者都是armink,这位作者自己还有一些对于flash操作的特殊项目。
在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 配置
在 /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