一、编写一个框架程序1.1 设备树1.2 platform_driver1.3 probe 函数1.3.1 spi_controller 结构体1.3.2 transfer_one 示例二、模拟 SPI EEPROM / Loopback 设备2.1 编写传输状态机2.2 上机实验2.2.1 编译、替换设备树2.2.2 编译、安装驱动程序2.2.3 使用 spidev_test 测试
参考资料:
- Linux 内核文档:
Documentation/spi/spi-summary.rstDocumentation/devicetree/bindings/spi/spi-controller.yaml
- Linux 内核驱动:
drivers/spi/spi.cdrivers/spi/spi-imx.cdrivers/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 只能验证软件链路,不能证明真实板卡上的时钟边沿、片选时序、电平、电磁干扰和最高频率满足要求。最终仍需逻辑分析仪闭环。



