SPI NAND 配置
驱动层次关系
SPI NAND 属于 SPI 的从设备,在内核中相关驱动通过
SPI MEM 对接到 SPI 子系统。 在 SPI
控制器初始化时,SPI 驱动会检查该控制器下是否有挂载的 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 中在调用 spi_add_device 的过程中,会查找和匹配对应设备的驱动程序(如果这时候对
应的驱动程序还没有被添加到系统中,则在这里先将设备添加到 Bus,等到对应驱动程序 被添加进来时,再进行匹配。)
| 模块 | 驱动源码路径 |
|---|---|
| SPI NAND | source/linux-5.10/drivers/mtd/nand/spi/ |
修改 DTS
要在实际项目中使用 SPI NAND 设备,还需要修改 DTS 配置。
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";
};
};同时还需在
board-u-boot.dtsi 文件中,将该设备标记为
u-boot,dm-pre-reloc ,不然 SPL
无法识别和使用。&spi1 {
u-boot,dm-pre-reloc;
spi-flash@0 {
u-boot,dm-pre-reloc;
};
};Bus Width
宽总线的 SPI NAND 芯片可以工作在窄总线下,如 4 线的 SPI NAND 配置为 1 线也可以工作,但读写速度损失, 但窄总线设备无法工作在宽总线模式下,因此 spi-tx-bus-width 要正确设置
-
标准 SPI NAND 配置为 1
-
Dual SPI NAND 配置为 2
-
Quad SPI NAND 配置为 4
