摘要:说明
CONFIG_CAN_GS_USB=m的含义,完成模块生成、加载、SocketCAN 接口配置和安全收发测试。
适用对象:使用兼容 GS-USB 协议的 USB-CAN 适配器,并希望在 LubanCat 上使用 SocketCAN 的开发者。收发测试需要第二个 CAN 节点或真实总线。
文章目录
- 本篇要解决什么问题
- 一个很常见的误区
- 一、gs_usb 是什么
- 二、启用内核模块
- 三、确认模块确实生成
- 四、识别 USB-CAN 设备
- 五、配置并测试
- 六、如何判断问题到底出在哪一层
- 情况 1:`modprobe gs_usb` 报错
- 情况 2:模块能加载,但没有 `can0`
- 情况 3:`can0` 存在,但发送报错或进入 bus-off
- 七、真实收发才算完整验收
- 八、本文验收清单
- 小结
- 专栏导航
- 参考资料
本篇要解决什么问题
Linux 下 USB-CAN 的关键不是“装一个 CAN 软件”,而是让 USB 设备被正确的内核驱动绑定,并最终暴露为 SocketCAN 网络接口。本篇使用gs_usb作为例子,把链路分成四层:
| 层次 | 成功标志 | 常用命令 |
|---|---|---|
| 内核配置 | CONFIG_CAN_GS_USB=m | grep CONFIG_CAN_GS_USB .config |
| 模块产物 | 存在gs_usb.ko且 vermagic 匹配 | modinfo |
| USB 绑定 | 设备被gs_usb驱动识别 | lsusb、dmesg |
| SocketCAN | 出现can0等接口并能真实收发 | ip、candump、cansend |
一个很常见的误区
can-utils是用户态测试工具,gs_usb.ko是内核驱动。安装can-utils不能替代内核驱动;同样,只看到gs_usb.ko文件存在,也不能证明 USB 设备已经绑定并能完成 CAN 收发。
一、gs_usb 是什么
采用 GS-USB/candleLight 兼容固件的 USB-CAN 适配器可以使用 Linux 的gs_usb驱动。加载成功后,设备通过 SocketCAN 表现为can0、can1等网络接口;仅仅安装一个名字相近的用户态库不会生成这些接口。
二、启用内核模块
在 SDK 内核 defconfig 中确认:
CONFIG_CAN=y CONFIG_CAN_RAW=y CONFIG_CAN_GS_USB=m以上是本次最终.config的实测值。使用 SDK 的入口进入内核配置并保存到当前内核 defconfig:
cd"$HOME/lubancat/LubanCat_SDK"./build.sh kernel-config菜单中选择Networking support → CAN bus subsystem support → CAN Device Drivers → CAN USB interfaces → Geschwister Schneider UG interfaces,设为M。
修改配置后必须重新构建kerneldeb,仅在目标机安装一个同名用户态库不能代替内核驱动。
三、确认模块确实生成
开发主机执行:
findkernel-6.1/drivers/net/can/usb-namegs_usb.ko-printmodinfo kernel-6.1/drivers/net/can/usb/gs_usb.ko\|grep-E'filename|vermagic|alias|intree'还应从最终 DEB 再检查一次,避免出现“源码树生成了模块,但打包时漏掉”的情况:
dpkg-deb-clinux-image-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb\|grep'/gs_usb\.ko$'安装到目标设备后:
sudodepmod-asudomodprobe gs_usb modinfo gs_usb|grep-E'filename|vermagic|alias|intree'如果提示 vermagic 不匹配,说明模块不是针对当前运行内核构建的,不能强行使用旧模块。
四、识别 USB-CAN 设备
lsusbdmesg|grep-iE'gs_usb|can|usb'ip-detailslinkshowtypecan本次设备识别后生成了多个 CAN 接口。接口初始为DOWN是正常的,因为波特率尚未配置。
五、配置并测试
sudoiplinksetcan0 down2>/dev/null||truesudoiplinksetcan0typecan bitrate500000sudoiplinksetcan0 upip-detailslinkshow can0安装工具:
sudoaptinstallcan-utils接收:
candump can0发送测试帧:
cansend can0123#11223344上述测试至少需要另一个 CAN 节点提供 ACK。连接 CAN_H、CAN_L 和必要的参考地线,总线两端各使用一个 120 Ω 终端电阻,并确保所有节点波特率一致。没有第二节点时连续发送可能累计错误甚至进入 bus-off。
测试结束后关闭接口:
sudoiplinksetcan0 down六、如何判断问题到底出在哪一层
情况 1:modprobe gs_usb报错
先看modinfo gs_usb的filename和vermagic。如果 vermagic 与当前uname -r不匹配,应重新用当前内核配置构建模块,而不是强行加载旧模块。
情况 2:模块能加载,但没有can0
继续检查 USB 枚举和驱动绑定:
lsusbdmesg|tail-n100ip-detailslinkshowtypecan此时问题可能在 USB 设备、固件协议兼容性、驱动 alias 或硬件连接,而不是 CAN bitrate。
情况 3:can0存在,但发送报错或进入 bus-off
先检查物理总线:
- 节点波特率是否一致;
- CAN_H/CAN_L 是否接反;
- 总线两端是否有 120 Ω 终端电阻;
- 是否存在另一个可正常 ACK 的 CAN 节点;
- 是否出现 error-passive / bus-off 状态。
可以查看详细状态:
ip-details-statisticslinkshow can0七、真实收发才算完整验收
仅执行ip link set can0 up只能证明接口能被配置。完整验收至少应该做到:
gs_usb模块 vermagic 匹配;- USB 设备被驱动绑定;
can0能设置目标 bitrate;candump能收到另一节点发来的帧;cansend发出的帧被另一节点实际收到。
如果只有单个节点,建议不要长时间反复发送测试帧,以免因为缺少 ACK 造成错误计数持续累积。
八、本文验收清单
- 最终
.config中CONFIG_CAN_GS_USB=m; - 最终 DEB 包含
gs_usb.ko; - 目标板
modprobe gs_usb成功; modinfo的 vermagic 与运行内核匹配;- 出现 SocketCAN 接口;
- bitrate 配置正确;
- 已使用真实第二节点完成收发闭环。
小结
CONFIG_CAN_GS_USB=m是内核驱动配置,不是普通用户态库安装问题。最终验收应同时包括模块、接口、波特率和真实收发四项。
专栏导航
专栏:LubanCat RK3588 实时 Linux 开发实战(第 6/13 篇)
- 上一篇:LubanCat RK3588 实时 Linux 开发(五):如何确认 PREEMPT_RT 实时内核真正生效
- 下一篇:LubanCat RK3588 实时 Linux 开发(七):YT6801 PCIe 网卡驱动移植与 vermagic 排查
参考资料
- Linux 6.1 SocketCAN 文档
- Linux CAN 子系统文档
文中的版本号、接口名、设备地址和测试数据均应以自己的板卡实测为准;引用命令前请先确认当前 SDK、内核和启动布局。
标签:gs_usbUSB-CANSocketCANRK3588Linux驱动