1. SPI总线驱动基础概念
SPI(Serial Peripheral Interface)是嵌入式系统中最常用的同步串行通信协议之一。作为一名长期从事Linux驱动开发的工程师,我经常需要处理各种SPI设备的驱动问题。SPI总线采用主从架构,通信由主设备(通常是SoC或MCU)发起,从设备(如传感器、存储器等)响应。
在Linux内核中,SPI子系统采用典型的三层架构:
- 控制器驱动(spi_controller):负责具体SoC的SPI控制器硬件操作
- 核心层(SPI core):提供总线注册、设备匹配等基础设施
- 设备驱动(spi_driver):实现具体SPI设备的业务逻辑
今天我们要重点剖析的是设备驱动层中的关键机制——spi_device的注册流程和从设备驱动的绑定过程。这部分内容对于理解Linux SPI子系统的工作机制至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. spi_device注册流程深度解析
2.1 spi_device在内核中的表示
spi_device结构体定义在include/linux/spi/spi.h中,它代表了一个具体的SPI从设备。主要包含以下关键字段:
c复制struct spi_device {
struct device dev; // 内嵌的设备基类
struct spi_controller *controller; // 所属的SPI控制器
u32 max_speed_hz; // 最大通信频率
u8 chip_select; // 片选信号编号
u8 bits_per_word; // 每个字的位数
u16 mode; // SPI模式(CPOL/CPHA等)
int irq; // 中断号
// ...其他字段省略
};
2.2 设备树中的SPI节点定义
现代Linux系统通常通过设备树(DTS)来描述硬件配置。一个典型的SPI从设备节点定义如下:
code复制&spi1 {
status = "okay";
flash@0 {
