Edit online

SPI NAND 配置

27 Nov 2024
Read time: 2 minute(s)

配置驱动层次关系

SPI NAND 属于 SPI 的从设备,在内核中相关驱动通过 SPI MEM 对接到 SPI 子系统。
  1. SPI 控制器初始化

    在初始化过程中,SPI 驱动会检查 SPI 控制器下是否有挂载的 SPI NAND 设备。如有,则将 SPI NAND 设备添加到 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 中
  2. 设备匹配与驱动加载:

    在调用 spi_add_device 的过程中,会查找和匹配对应设备的驱动程序。如发现对应的驱动程序未被添加到系统中,则先将设备添加到 BUS,等到对应驱动程序被添加至系统中后再次进行匹配。

    SPI NAND 模块的驱动源码路径为 source/linux-5.10/drivers/mtd/nand/spi/

修改 DTS

要在实际项目中使用 SPI NAND 设备,还需要修改 DTS 配置文件,详细流程如下所示:
  1. board.dts 中具体的 SPI 控制器下添加 spi-nand 设备。
    &spi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&spi1_pins_a>;
        status = "okay";
        spi-max-frequency = <100000000>;
        spi-flash@0 {
            #address-cells = <1>;
            #size-cells = <1>;
            compatible = "spi-nand";         //固定值,所有 SPINand 驱动均声明此
            spi-max-frequency = <100000000>; //最大频率,固定值
            spi-tx-bus-width = <4>;
            spi-rx-bus-width = <4>;
            reg = <0>;                       //固定值,一般不需修改
            status = "okay";
        };
    };
  2. board-u-boot.dtsi 文件中,将添加的 spi-nand 设备标记为 u-boot,dm-pre-reloc,确保 SPL 能够识别和使用该设备。
    &spi1 {
        u-boot,dm-pre-reloc;
        spi-flash@0 {
            u-boot,dm-pre-reloc;
        };
    };

配置 Bus Width

根据 SPI NAND 芯片的总线宽度,正确设置 spi-tx-bus-widthspi-rx-bus-width
  • 标准 SPI NAND 配置为 1

  • Dual SPI NAND 配置为 2

  • Quad SPI NAND 配置为 4

宽总线的 SPI NAND 芯片可以在窄总线下工作,虽然宽总线设备会出现读写速度损失。例如,对于 Quad SPI NAND,配置示例如下:
spi-tx-bus-width = <4>;
spi-rx-bus-width = <4>;
注: 窄总线设备无法在宽总线模式下工作。