Lazy loaded image
SPI 驱动专题01 - 设备驱动 spidev.c 源码分析
Words 605Read Time≈ 2 min
2026-9-12
 
参考资料
  • Linux 内核文档:
    • Documentation/spi/spi-summary.rst
    • Documentation/spi/spidev.rst
  • Linux 内核驱动程序示例:
    • drivers/spi/spidev.c
    • tools/spi/spidev_test.c

驱动编写流程

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

            Comments
            Loading...