Edit online

Baremetal 设计说明

Baremetal 源码说明

1.
相关模块 源码路径
Application bsp/examples_bare/mtd.c
mtd bsp/artinchip/drv_bare/mtd/
SFUD bsp/peripheral/spinor_sfudbsp/artinchip/drv_bare/spinor/sfud_port.c
qspi bsp/artinchip/hal/qspi/hal_qspi.c

用户可以参考 bsp/examples_bare/mtd.c , bsp/examples_bare/test-spinor/spinor.c 进行测试开发。

Baremetal 层次关系

../images/bar_spinor.png

用户开发项目,在 MTD 层上开发, SFUD 层上开发因为地址设置不当可能会破坏 spl、os 分区的数据。

Baremetal 关键流程

  • SPI NOR 初始化流程
    mtd_probe //bsp/artinchip/drv_bare/mtd/mtd_probe.c
    |-> sfud_probe(AIC_BOOTLOADER_SPINOR_QSPI_ID); //bsp/artinchip/drv_bare/spinor/sfud_port.c
        |-> get_qspi_by_index(spi_bus);   //获取 bus 对象
        |-> hal_qspi_master_init(&qspi->handle, &cfg);  //初始化 qspi 配置
        |-> hal_qspi_master_dma_config(&qspi->handle, &dmacfg); //初始化 DMA
        |-> hal_qspi_master_set_bus_freq(&qspi->handle, qspi->bus_hz);  //配置时钟
        |-> sfud_device_init(&qspi->attached_flash);  //bsp/peripheral/spinor_sfud/src/sfud.c
            |-> hardware_init(flash);
            |-> sfud_spi_port_init(flash); //bsp/artinchip/drv_bare/spinor/sfud_port.c
                |-> flash->spi.wr = spi_write_read; //提供读写接口
                |-> flash->spi.qspi_read = (void *)qspi_read; //提供快速读取接口
            |-> read_jedec_id(flash); //读取设备 id
            |-> sfud_read_sfdp(flash);  //自动识别 SPI NOR
        |-> sfud_qspi_fast_read_enable(&qspi->attached_flash, 4); //使能快速读取模式
        |-> part = mtd_parts_parse(NOR_MTD_PARTS); //解析分区信息
        |-> mtd->ops.erase = sfud_mtd_erase;
        |-> mtd->ops.read = sfud_mtd_read;
        |-> mtd->ops.write = sfud_mtd_write;
        |-> mtd_add_device(mtd);  //添加 mtd 分区
  • SPI NOR 读数据流程
    mtd_read //bsp/artinchip/drv_bare/mtd/mtdcore.c
      |-> sfud_mtd_read(); //bsp/artinchip/drv_bare/spinor/sfud_port.c
          |-> sfud_read(flash, start, dolen, data); //bsp/peripheral/spinor_sfud/src/sfud.c
              |-> sfud_read_data(flash, addr, dolen, p);
                  |-> qspi_read(); //bsp/artinchip/drv_bare/spinor/sfud_port.c

Baremetal 应用接口设计

2. mtd_probe
函数原型 int mtd_probe(void);
功能说明 初始化所有 mtd 设备
返回值 0: 成功;其他: 失败
注意事项 只有初始化 mtd 设备之后, 才能正常使用其它函数
3. mtd_add_device
函数原型 int mtd_add_device(struct mtd_dev *mtd);
功能说明 增加 mtd 设备
参数定义 struct mtd_dev *mtd:mtd 设备对象
返回值 0: 成功;其他: 失败
注意事项 -
4. mtd_get_device_count
函数原型 u32 mtd_get_device_count(void);
功能说明 获取注册的 mtd 设备个数
返回值 注册的 mtd 设备个数
注意事项 -
5. mtd_get_device_by_id
函数原型 struct mtd_dev *mtd_get_device_by_id(u32 id);
功能说明 通过索引号获取 mtd 设备句柄
返回值 mtd 设备句柄为空:失败
注意事项 -
6. mtd_get_device
函数原型 struct mtd_dev *mtd_get_device(const char *name);
功能说明 通过分区名获取 mtd 设备句柄
参数定义 char *namemtd 分区名
返回值 mtd 设备句柄为空:失败
注意事项 -
7. mtd_read
函数原型 int mtd_read(struct mtd_dev *mtd, u32 offset, u8 *data, u32 len);
功能说明 读取 mtd 分区数据到缓冲区上
参数定义 struct mtd_dev *mtd:mtd 分区设备句柄

u32 offset:偏移值

u8 *data:发送缓冲区地址

u32 len:擦除数据的长度

返回值 0: 成功;其他: 失败
注意事项 offset 与 page 对齐
8. mtd_erase
函数原型 int mtd_erase(struct mtd_dev *mtd, u32 offset, u32 len);
功能说明 擦除 mtd 分区某块区域的数据
参数定义 struct mtd_dev *mtd:mtd 分区设备句柄

u32 offset:偏移值

u8 *data:发送缓冲区地址

u32 len:擦除数据的长度

返回值 0: 成功;其他: 失败
注意事项 offset 必须与 block 对齐
9. mtd_write
函数原型 int mtd_write(struct mtd_dev *mtd, u32 offset, u8 *data, u32 len);
功能说明 写入缓冲区上的数据到 mtd 分区上
参数定义 struct mtd_dev *mtd:mtd 分区设备句柄

u32 offset:偏移值

u8 *data:发送缓冲区地址

u32 len:擦除数据的长度

返回值 0: 成功;其他: 失败
注意事项 offset 与 page 对齐