RK3576 CANFD驱动优化:如何增强Bus-Off恢复与高负载接收能力?

武汉万象奥科
2026-07-20
来源:

导语:

CANFD具备较高的数据传输速率和更大的单帧载荷,可用于工业控制、机器人、车辆通信及数据采集等场景。RK3576在Linux系统下通过SocketCAN提供CAN/CANFD通信能力,用户可以使用can0等标准网络接口完成报文收发。

在实际应用中,CANFD驱动不仅要完成基本通信,还需要处理Bus-Off、接收缓存溢出、高负载连续接收和协议错误上报等问题。针对这些情况,万象奥科基于Rockchip原厂RK3576 CANFD驱动,对接收路径、Bus-Off恢复和错误诊断功能进行了修改优化。

本文根据《万象奥科RK3576 CANFD驱动修改优化开发说明》整理,主要介绍核心修改思路。完整源码修改位置、设备树参数及验证方法可查看文末原文链接。

01


RK3576 CANFD驱动可能面临哪些问题?


CAN控制器在发送或接收错误持续累积后,可能进入Bus-Off状态并停止参与总线通信。如果控制器硬件自动恢复与SocketCAN软件恢复缺少明确分工,可能出现重复恢复或状态不同步。RK3576 CANFD控制器通过内部RX Storage保存接收到的报文。在当前驱动采用的固定接收存储模式下,每个报文使用固定大小的RX Slot。


原厂驱动已经按照rx_max_data读取完整Slot;优化版本进一步根据FDF和DLC计算有效载荷长度,仅保存有效数据,并显式消费剩余占位word,同时增加FIFO剩余量检查。总线报文密度较高时,仍需重点处理RX中断与NAPI的协同、FIFO持续排空以及错误状态上报。

02


接收路径进行了哪些优化?




启动和异常后主动清理RX Storage

优化驱动增加了RX Storage清理机制。控制器启动、重新启动或发生接收溢出后,可主动复位接收存储区,减少残留数据对后续报文解析的影响。


启动配置期间,驱动先屏蔽中断并清除已有中断状态,完成位时序、接收模式和恢复机制等配置后,再统一开放中断,可减少控制器配置过程被旧中断或新中断打断的风险。



根据DLC提取有效载荷并保持Slot边界

当前驱动采用固定接收存储模式,一个RX Slot的长度由rx_max-data配置决定。原厂驱动已按固定长度读取完整Slot。


优化版本先根据FDF和DLC计算实际数据长度:Classical CAN按0至8字节处理,CANFD按DLC换算12、16、20、24、32、48或64字节长度;驱动只将有效载荷保存到SocketCAN帧,随后显式读取当前Slot中的剩余占位word。该处理保持了完整Slot消费规则,同时避免把占位数据当作有效载荷。



优化接收中断与NAPI协同处理

原厂驱动已经使用NAPI处理接收报文。优化版本主要调整RX中断屏蔽和恢复策略:接收中断触发后,仅屏蔽RX相关中断并调度NAPI;NAPI持续处理FIFO中的报文,完成后重新检查FIFO,若仍有数据则再次调度,以降低解除中断与新报文到达之间的竞态风险。


发生RX Buffer或RX Storage溢出时,应上报CAN_ERR_CRTL_RX_OVERFLOW并清理接收存储区。当前候选源码还会在该分支调用can_bus_off(),该策略会将接收存储区溢出升级为接口Bus-Off,正式合入前应根据项目需求确认并调整。

03


Bus-Off恢复机制如何调整?


原厂驱动固定启用控制器硬件Bus-Off恢复。优化方案根据SocketCAN的restart-ms配置划分恢复路径:restart-ms为0时使用控制器硬件恢复;restart-ms大于0时关闭硬件自动恢复,由CAN Core按设定时间重新启动接口。


该设计用于降低硬件恢复与软件恢复同时处理同一次Bus-Off的风险。Bus-Off发生后,驱动停止发送、释放待发送报文、清理接收FIFO,并调用can_bus_off()通知SocketCAN。针对短时间内连续Bus-Off,候选源码增加统计窗口和workqueue深度恢复机制,在进程上下文执行停止队列、关闭NAPI、复位控制器、清FIFO、重新启动控制器并恢复队列。需要注意的是,当前候选源码的恢复中断分支存在多处can_restart_now()调用,正式合入前必须合并为单一恢复出口,并处理普通恢复与深度恢复之间的互斥。

04


错误诊断能力有哪些变化?


优化版本增加CANFD_ERROR_CODE解析,将ACK错误、CRC错误、填充错误、格式错误、位错误和接收溢出等事件转换为Linux SocketCAN标准错误帧,并在错误帧中加入发送错误计数TEC和接收错误计数REC。用户可通过candump -e等工具查看错误类型,辅助排查终端电阻、波特率、物理层和节点应答问题。


候选源码中已包含仲裁丢失的CAN_ERR_LOSTARB映射,但当前错误中断集合尚未包含TX_LOSTARB_INT,正式补丁需补齐该中断入口后才能宣称完整支持仲裁丢失上报。在配置方面,原厂已有rockchip,rx-max-data;优化版本新增自动重发次数、Bus-Off深度恢复阈值、统计窗口和立即深度恢复开关等设备树参数。

05


功能使用需要注意什么?


优化版本关闭默认ATF配置,适用于将全部报文交给SocketCAN进行软件过滤的场景。如果项目需要控制器硬件ID过滤,必须重新设计ATF配置,不能直接沿用当前处理方式。


该版本属于RK3576 CANFD驱动优化候选方案,正式合入产品前需要修正重复恢复调用、标准帧ID掩码、RX Overflow恢复策略、TX Buffer逻辑、仲裁丢失中断入口和错误计数寄存器属性等实现细节。板端验证应覆盖标准帧、扩展帧、RTR、BRS、不同DLC、长短帧交替、高负载接收、RX Overflow、硬件Bus-Off恢复、SocketCAN定时恢复、连续Bus-Off深度恢复及长时间双向通信。

06


结语


RK3576 CANFD驱动候选优化主要集中在以下方面:启动及异常恢复时清理RX Storage;根据FDF和DLC提取有效载荷并完整消费固定RX Slot;优化RX中断与NAPI的屏蔽、恢复和重新调度;根据restart-ms划分硬件恢复与SocketCAN软件恢复路径;增加连续Bus-Off的workqueue深度恢复;补充协议错误帧和TEC/REC上报。


完整技术资料:

本文为精简解读版,完整的驱动原理、源码修改位置、设备树参数、SocketCAN配置示例及板端验证方法,请查看:

《RK3576_CANFD驱动修改优化开发说明》


点击左下角“阅读原文”,查看《RK3576 CANFD驱动修改优化开发说明》完整版。

如果您有基于RK3576平台项目需求

欢迎联系万象奥科

添加官方微信或私信评论↓

提供相应的技术支持



分享
下一篇:这是最后一篇
上一篇:这是第一篇