Lazy loaded image
SPI 驱动专题04 - SPI Controller 驱动框架与实例
Words 944Read Time≈ 3 min
2026-9-12
参考资料:
  • Linux 内核文档:
    • Documentation/spi/spi-summary.rst
    • Documentation/devicetree/bindings/spi/spi-controller.yaml
  • Linux 内核驱动:
    • drivers/spi/spi.c
    • drivers/spi/spi-imx.c
    • drivers/spi/spi-gpio.c

一、编写一个框架程序

1.1 设备树

在设备树根节点中构造一个虚拟 SPI Controller:

1.2 platform_driver

分配、设置并注册 platform_driver:

1.3 probe 函数

platform_driver 的 probe 需要完成:
  • 从设备树读取 controller 信息
  • 分配并设置 spi_controller
  • 指定片选数量、支持的 mode 和位宽
  • 实现 transfer_one_message 或 transfer_one
  • 注册 controller,让 SPI 核心创建子节点对应的 spi_device

1.3.1 spi_controller 结构体

  • 分配
    • 设置
      • 注册
        • 获取私有数据

          1.3.2 transfer_one 示例

          真实控制器的实现通常不是简单循环,而是:

          二、模拟 SPI EEPROM / Loopback 设备

          虚拟 Controller 的价值不是“假装有硬件”,而是把 SPI Core、协议驱动与测试路径解耦,验证 message/transfer 组织、片选边界和并发逻辑。

          2.1 编写传输状态机

          约定一个简化 EEPROM 协议:
          • 0x03 + addr:读取
          • 0x02 + addr + data...:写入
          • 片选释放后结束本次命令
           
          更严谨的实现应使用 prepare_message 初始化事务状态,在 unprepare_message 或 message 末尾复位状态,避免把 cs_change 错当成“消息结束”的唯一标志。

          2.2 上机实验

          2.2.1 编译、替换设备树

          • 将虚拟 controller 节点加入板级 DTS
          • 编译设备树
            • 更新 DTB 并重启

            2.2.2 编译、安装驱动程序

            检查 controller 和设备:

            2.2.3 使用 spidev_test 测试

            若子设备绑定到允许的 spidev compatible,可执行:
            回环预期:发送与接收字节一致。也可用 trace-cmd、ftrace 或动态调试观察 SPI 消息:
            注意:虚拟 controller 只能验证软件链路,不能证明真实板卡上的时钟边沿、片选时序、电平、电磁干扰和最高频率满足要求。最终仍需逻辑分析仪闭环。
             
            上一篇
            C++ String 常用操作
            下一篇
            嵌入式工程师习题集

            Comments
            Loading...