SPI NOR - NOR 存储器件
本文将讲述 SoC 搭配 SPI NOR 作为存储设备使用的相关配置,新物料支持等说明。SoC SPIF 控制器功能如下:
SPI Flash 控制器(SPiF)是一个同步的串行通信接口,允许以更少的软件中断进行快速的数据通信。与 SPI 不同,SPiF 通常设计用于更高速的 Flash 设备,并且仅在 Master 模式下工作。
- 支持多种 SPI 模式
- 标准 SPI
- 双输出/双输入 SPI 和双 I/O SPI
- 四输出/四输入 SPI、Quad I/O 和 QPI
- 可编程串行数据帧 长度
- 1 位到 32 位
- 支持单速率传输(STR)模式和双速率传输(DTR)模式
- 高速时钟频率
- 150 MHz(STR 模式)
- 100 MHz(DTR 模式)
- 软件写保护
- 通过软件实现对全部或部分存储区的写保护
- 顶部/底部块保护
- 可编程事务间延迟
- 支持模式 0 模式 1 模式 2 和模式 3
- 支持控制信号配置
- 一个片选信号支持多个外设
- 芯片选择(SPIF_CS)和 SPI 时钟(SPIF_CLK)的极性和相位可配置
SPI NOR 新物料适配
未适配 SPI NOR 物料的报错
U-Boot 未支持物料导致烧录失败:

Kernel 未支持物料导致启动失败:

了解新物料的特性
在拿到一款 SPI NOR 物料时,需要仔细阅读其手册。下图是 PY25Q256HB 物料的介绍页,可以看出支持 SPI,Dual SPI,QPI,DTR 模式,支持 4K 擦写。

换一个物料 BY25Q128ES,手册中没有提到 DTR,这款物料不支持 DTR 模式。

在文档后面电器参数章节,可以找到其运行的最高主频,在之后配置中需要小于这里的最高频率,切勿超频运行。

部分 NOR 手册中还会标明其不同模式下支持的速率,可以作为参考

- 在 DTR 模式下默认 80M,读指令10可以支持100M
一般在文档末尾可以找到 SPI NOR 物料的器件 ID,适配新物料时需要重点关注。

- ID 是
0x852019
还可以找到 NOR 物料的内存布局

- 每个存储设备有 32MByte 空间
- 每个块(扇区)有 64K(或者32K)
- 总共有512(或1024)个块(扇区)
一般使用 64K 模式,则 NOR 物料为 64K * 512 = 32MByte
适配 U-Boot 驱动
添加新物料,U-Boot 需要修改文件 brandy/brandy-2.0/u-boot-2018/drivers/mtd/spi/spi-nor-ids.c,U-Boot 使用一个列表存放支持的物料。我们只需要把新增的物料加入列表即可。
可以先找一下类型生产厂家的型号,例如这里找 PUYA 的型号,加上新物料 py25q256hb

这里通过 INFO 宏定义了一个设备的信息,包括设备名称、ID、扇区大小、扇区数量、页面大小和一些设备特性。还有一个 INFO6 宏,如果芯片的 EXT_ID 较多可以使用这个宏。
1. 宏定义部分
#define INFO(_name, _jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
INFO_NAME(_name) \
.id = { \
((_jedec_id) >> 16) & 0xff, \
((_jedec_id) >> 8) & 0xff, \
(_jedec_id) & 0xff, \
((_ext_id) >> 8) & 0xff, \
(_ext_id) & 0xff, \
}, \
.id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))), \
.sector_size = (_sector_size), \
.n_sectors = (_n_sectors), \
.page_size = 256, \
.flags = (_flags),
- INFO宏:这个宏用于定义设备的一些基本信息。它接受六个参数:
_name:设备名称。_jedec_id:设备的JEDEC ID。_ext_id:扩展ID。_sector_size:扇区大小。_n_sectors:扇区数量。_flags:标志,通常是 SPI NOR 的一些附加的配置或特性。
2. 宏中的内容
- INFO_NAME(_name)