桌面机器人 Linux 驱动层位于 MCU 固件和用户空间应用之间。驱动向上只暴露 Linux 标准子系统接口,向下绑定具体控制器、总线和板级资源;语义动作仍由上层 运行时产生,MCU 固件协议仍由固件模块维护。
用户空间 / ROS 2
|
| AF_CAN、termios、spidev 或 GPIO character device
v
Linux 子系统核心
|
+-- SocketCAN core -------------+
| |
| net_device
| |
+-- tty / SPI / GPIO ------------+
|
控制器驱动
(MMIO / IRQ / DMA)
|
PCB 外设资源
驱动不得向应用层泄漏硬件细节,也不得绕过内核子系统实现并行协议。设备节点、 网络接口、错误码和统计信息必须遵循对应内核子系统的既有语义。
每个硬件模块都应按以下顺序实现和审查:
probe:验证设备树/ACPI 资源、时钟、复位和中断;任何资源缺失都失败关闭。register:CAN 驱动完成alloc_candev后调用register_candev;TTY 和 SPI 驱动分别调用tty_register_driver和spi_register_driver等标准注册 API, 注册成功前不对外发布可用设备。open:清空硬件状态、建立 RX/TX 队列并启用 IRQ;失败时按反向顺序回滚。transfer:上半部只确认并屏蔽必要的中断,下半部或 NAPI 完成收包、DMA 回收 和统计更新;不可在 IRQ 上下文中睡眠。stop:停止新传输、排空或取消 DMA、屏蔽 IRQ;等待正在执行的 IRQ handler、 NAPI 和 work 完成后,再释放队列和状态。remove:先撤销用户可见接口,执行与stop相同的同步和排空路径;确认没有 IRQ、NAPI 或 work 正在运行后,再释放映射、时钟、DMA 和中断资源。
probe、open 和 remove 的错误路径必须幂等。半初始化状态不得留下网络接口、
字符设备或可继续访问的 MMIO 映射。
- 配置状态使用 mutex;IRQ、TX 完成和 RX/NAPI 共享的短状态使用 spinlock。
- DMA 描述符和缓冲区由驱动拥有,提交前执行
dma_map_*,回收后执行对应的dma_unmap_*;不得把 DMA 地址当作 CPU 指针。 - RX 缓冲区在交给网络栈前完成 cache 同步,网络栈释放后才能重新入队。
- TX 队列只有在硬件确认可用时唤醒;队列满返回
NETDEV_TX_BUSY,不能静默丢帧。 - 中断统计、错误计数和最后一次恢复原因必须使用内核原子/锁保护,并可通过
ethtool -S或子系统标准统计读取。
任务书中的 LINUX2 以 SocketCAN 为验收边界:
| 能力 | 内核边界 | 当前状态 |
|---|---|---|
| 标准帧与扩展帧 | struct can_frame、CAN_EFF_FLAG |
wbcan 已覆盖测试语义 |
| CAN FD | struct canfd_frame、CAN_CTRLMODE_FD |
等待控制器型号和线速确认 |
| 过滤 | CAN core/socket filter | 由 SocketCAN 统一处理 |
| 错误统计 | can_priv.can_stats、错误帧 |
wbcan 提供可重复的故障测试 |
| 延迟目标 | TX 提交到 RX 时间戳 | 必须在目标硬件上测量,不能用虚拟模块代替 |
wbcan 的 debugfs 故障注入只用于测试,不是生产控制 ABI。物理 CAN 驱动不得
复用该 debugfs 接口作为设备配置面;生产配置应走 SocketCAN、设备树和标准网络工具。
LINUX5/LINUX6 的实现必须在硬件资源确认后补充以下内容:
- IRQ:确认共享中断标志后再清中断;上半部只做确认和调度,下半部批量处理。
- DMA:预分配固定大小的环形描述符,限制单次批量;错误时停止队列并回收所有 在途缓冲区,恢复成功后才重新唤醒队列。
- 总线恢复:CAN bus-off 通过 CAN core 的 restart 语义暴露,不能自行伪造用户空间 状态;恢复失败必须保留错误计数并保持设备不可发送。
- 可观测性:至少提供标准网络统计、错误计数、IRQ/DMA 回收计数和最近一次恢复原因, 便于性能与故障证据注册。
在没有目标内核头文件或真实控制器之前,只能运行静态文档检查和 wbcan 软件测试。
物理驱动 PR 还必须附带:
- 目标内核版本、设备树/ACPI 资源和控制器数据手册版本;
make -C <module>、checkpatch.pl和模块加载/卸载输出;- SocketCAN 收发、错误恢复、并发卸载以及 DMA/IRQ 计数证据;
- 延迟、吞吐和 jitter 的原始采样,而不是规划值。
kernel/wbcan 是可重复的 SocketCAN 故障测试设备,不是目标板的物理 CAN 驱动,
不能作为真实吞吐、延迟或 jitter 的证据。后续驱动 PR 应先补齐目标控制器型号、
寄存器/设备树资源和内核版本,再分别实现 CAN、UART/SPI、GPIO、DMA 和 IRQ 模块,
并沿用本架构的错误回滚、数据所有权和证据要求。
LINUX6 的 IRQ 生命周期和 fake provider 位于 hardware/linux_drivers/irq/。它固化
共享线路、上半部确认、下半部 work、取消/flush 和停止同步测试,但不冻结真实 IRQ
资源、调度优先级、PREEMPT_RT 或物理 jitter 预算。
LINUX3 的 UART/SPI 软件契约和 fake transport 测试位于仓库的
hardware/linux_drivers/uart_spi/。该契约是 owner-gated 的提案:它固化边界、CRC、
序号、背压和重试测试,但不冻结物理控制器、pinmux、设备树、DMA 或 IRQ 参数。