1. SPI子系统概述与核心价值
在嵌入式开发领域,SPI(Serial Peripheral Interface)总线因其全双工、高速、简单的硬件连接特性,成为传感器、存储芯片、显示模块等外设的优选通信方案。我在实际项目中遇到过这样的场景:当我们需要为一块定制开发板移植触摸屏驱动时,发现内核已有该型号IC的驱动源码,却始终无法正常加载。经过三天排查,最终发现问题出在设备树匹配环节。这个经历让我深刻意识到理解SPI子系统匹配机制的重要性。
SPI子系统作为Linux内核中结构清晰的框架,其设计遵循"分离思想"——将控制器驱动(controller driver)、协议驱动(protocol driver)和设备匹配机制解耦。这种架构带来的直接好处是:
- 新增设备时只需关注设备特性,无需修改控制器代码
- 相同协议设备(如不同厂家的flash芯片)可复用核心驱动逻辑
- 热插拔支持通过标准接口实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SPI子系统架构分层解析
2.1 硬件抽象层(HAL)
由spi_controller结构体描述,包含硬件相关的传输函数集(如spi_transfer、spi_message等)。在RK3568平台的实际案例中,我们需要特别注意dma_alignment参数的设置,错误的配置会导致DMA传输失败。典型实现如下:
c复制static const struct spi_controller_mem_ops rk_spi_mem_ops = {
.exec_op = rk_spi_exec_op_mem,
.dma_map_mem_op_data = rk_spi_dma_map_mem_op_data,
};
static int rk_spi_probe(struct platform_device *pdev) {
ctlr->bus_num = pdev->id;
ctlr->mem_ops = &rk_spi_mem_ops;
ctlr->dma_alignment = 4; // 必须与硬件DMA对齐要求一致
}
2.2 核心层(Core)
提供spi_device和spi_driver两个核心结构体。其中spi_device代表具体的物理设备,包含时钟极性(CPO
