1. Linux SPI驱动开发概述
SPI(Serial Peripheral Interface)作为嵌入式系统中最常用的串行通信协议之一,在Linux驱动开发中占据重要地位。最近在调试NUC980系列芯片的SPI-NAND启动时,发现SPI驱动的注册流程直接影响设备初始化,这促使我重新梳理了Linux内核中SPI子系统的架构。
SPI驱动开发主要涉及三个核心结构体:spi_master(SPI控制器驱动)、spi_device(SPI设备描述)和spi_driver(SPI设备驱动)。其中spi4这类编号通常代表SoC中的第四个SPI控制器,在设备树中对应为spi@xxxx节点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SPI驱动注册流程深度解析
2.1 SPI控制器(master)注册
SPI控制器的注册是整套驱动的基础,以NUC980为例,其SPI4控制器的注册流程如下:
c复制static int nuc980_spi_probe(struct platform_device *pdev)
{
struct spi_master *master;
struct nuc980_spi *nspi;
// 1. 申请spi_master资源
master = spi_alloc_master(&pdev->dev, sizeof(*nspi));
// 2. 配置master参数
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
master->dev.of_node = pdev->dev.of_node;
master->bus_num = pdev->id; // 对应spi4的bus number
master->num_chipselect = 1;
master->setup = nuc980_spi_setup;
master->transfer_one = nuc980_spi_transfer_one;
// 3. 注册到内核
ret = spi_register_master(master);
}
关键点说明:
bus_num需要与设备树中的编号一致,spi4通常对应数字3(从0开始计数)num_chipselect要根据实际硬件CS引脚数量配置- 必须实现
transfer_one等回调函数完成实际数据传输
2.2 SPI设备(device)注册
SPI设备可以通过设备树静态定义或动态注册。以STM32CubeMX生成的配置为例:
dts复制&spi4 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi4_pins>;
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>; // CS0
