5.3.1. 配置指南¶
5.3.1.1. 驱动层次关系¶
SPI NOR 属于 SPI 的从设备,在内核中相关驱动通过 SPI MEM 对接到 SPI子系统。
在 SPI 控制器初始化时,SPI 驱动会检查该控制器下是否有挂载的 SPI NOR,有则添加到 SPI BUS 中。
aic_spi_probe(dev);
|-> spi_register_controller(ctlr);/spi_register_master(ctlr);// spi_register_master 是一个宏
    |-> of_register_spi_devices(ctlr);
        |-> spi = of_register_spi_device(ctlr, nc);
            |-> spi = spi_alloc_device(ctlr);
            |-> of_spi_parse_dt(ctlr, spi, nc);
            |-> rc = spi_add_device(spi);
                // 将 SPI device 添加到 SPI 总线 spi_bus_type 中
在调用 spi_add_device 的过程中,会查找和匹配对应设备的驱动程序(如果这时候对
应的驱动程序还没有被添加到系统中,则在这里先将设备添加到 Bus,等到对应驱动程序
被添加进来时,再进行匹配。)
| 模块 | 驱动源码路径 | 
|---|---|
| Linux | source/linux-5.10/drivers/mtd/spi-nor/ | 
| Uboot | source/uboot-2021.10/drivers/mtd/spi/ | 
5.3.1.2. 修改 DTS¶
要在实际项目中使用 SPI NOR 设备,还需要修改 DTS 配置。
board.dts 应在具体的 SPI 控制器下添加 jedec,spi-nor 设备。
&spi0 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins_a>;
    status = "okay";
    spi-max-frequency = <100000000>;
    spi-flash@0 {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "jedec,spi-nor";    //固定值,所有基于 dts 的 SPI NOR 均声明此
        spi-max-frequency = <100000000>; //最大频率,固定值
        spi-tx-bus-width = <4>;
        spi-rx-bus-width = <4>;
        reg = <0>;                       //固定值,一般不需修改
        status = "okay";
    };
};
同时还需在 board-u-boot.dtsi 文件中,将该设备标记为 u-boot,dm-pre-reloc ,不然 SPL 无法识别和使用。
&spi0 {
    u-boot,dm-pre-reloc;
    spi-flash@0 {
        u-boot,dm-pre-reloc;
    };
};
5.3.1.3. Bus Width¶
宽总线的 SPI NOR 芯片可以工作在窄总线下,如4线的 SPI NOR 配置为1线也可以工作,但读写速度损失, 但窄总线设备无法工作在宽总线模式下,因此 spi-tx-bus-width 要正确设置
- 标准 SPI NOR 配置为1 
- Dual SPI NOR 配置为2 
- Quad SPI NOR 配置为4