参考资料
- Linux 内核文档:
Documentation/spi/spi-summary.rstDocumentation/spi/spidev.rst
- Linux 内核驱动程序示例:
drivers/spi/spidev.ctools/spi/spidev_test.c
驱动编写流程
下面以
spidev.c 为例,分析标准 SPI 协议驱动的组成。spidev 的作用不是理解某颗器件的协议,而是把 SPI 传输能力通过字符设备开放给用户空间。- 定义驱动基本信息
- 定义设备匹配表
新内核不建议设备树直接写通用的
compatible = "spidev"。正式产品应使用真实器件 compatible,并由对应设备驱动或允许列表完成绑定。- 定义私有数据结构
- 实现 probe 函数
- 实现消息传输
- ioctl 解析
SPI_IOC_MESSAGE
主要流程说明:
- 驱动框架:
- 定义
spi_driver和 probe/remove 回调 - 通过 OF、ACPI 等匹配 SPI 设备
- probe 中创建字符设备节点并保存
spi_device
- 设备操作:
- open 时分配收发缓冲区
- read/write 构造单个
spi_transfer - ioctl 支持 mode、频率、位宽和多段 message
- 并发与热拔插:
buf_lock串行化用户缓冲区操作spi_lock保护设备指针- remove 后让后续操作返回
-ESHUTDOWN
- 关键认识:
spi_transfer描述一段保持或切换片选的传输spi_message把多段 transfer 组织成一个不可被其他设备消息插入的事务- SPI 本身是全双工;“只读”通常仍需发送 dummy 字节产生时钟
这个驱动展示了 SPI 协议驱动如何把用户请求转换为
spi_message。真正的器件驱动应在此框架上增加寄存器协议、数据校验、电源管理和所属子系统接口,而不是把所有产品逻辑都塞进 spidev。


