摘要:说明
CONFIG_CAN_GS_USB=m的含义,完成模块生成、加载、SocketCAN 接口配置和安全收发测试。
适用对象:使用兼容 GS-USB 协议的 USB-CAN 适配器,并希望在 LubanCat 上使用 SocketCAN 的开发者。收发测试需要第二个 CAN 节点或真实总线。
文章目录
-
- 本篇要解决什么问题
- [一、gs_usb 是什么](#一、gs_usb 是什么)
- 二、启用内核模块
- 三、确认模块确实生成
- [四、识别 USB-CAN 设备](#四、识别 USB-CAN 设备)
- 五、配置并测试
- 六、如何判断问题到底出在哪一层
-
- [情况 1:`modprobe gs_usb` 报错](#情况 1:
modprobe gs_usb报错) - [情况 2:模块能加载,但没有 `can0`](#情况 2:模块能加载,但没有
can0) - [情况 3:`can0` 存在,但发送报错或进入 bus-off](#情况 3:
can0存在,但发送报错或进入 bus-off)
- [情况 1:`modprobe gs_usb` 报错](#情况 1:
- 七、真实收发才算完整验收
- 八、本文验收清单
- 小结
- 专栏导航
- 参考资料
本篇要解决什么问题
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 中确认:
text
CONFIG_CAN=y
CONFIG_CAN_RAW=y
CONFIG_CAN_GS_USB=m
以上是本次最终 .config 的实测值。使用 SDK 的入口进入内核配置并保存到当前内核 defconfig:
bash
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,仅在目标机安装一个同名用户态库不能代替内核驱动。
三、确认模块确实生成
开发主机执行:
bash
find kernel-6.1/drivers/net/can/usb -name gs_usb.ko -print
modinfo kernel-6.1/drivers/net/can/usb/gs_usb.ko \
| grep -E 'filename|vermagic|alias|intree'
还应从最终 DEB 再检查一次,避免出现"源码树生成了模块,但打包时漏掉"的情况:
bash
dpkg-deb -c linux-image-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb \
| grep '/gs_usb\.ko$'
安装到目标设备后:
bash
sudo depmod -a
sudo modprobe gs_usb
modinfo gs_usb | grep -E 'filename|vermagic|alias|intree'
如果提示 vermagic 不匹配,说明模块不是针对当前运行内核构建的,不能强行使用旧模块。
四、识别 USB-CAN 设备
bash
lsusb
dmesg | grep -iE 'gs_usb|can|usb'
ip -details link show type can
本次设备识别后生成了多个 CAN 接口。接口初始为 DOWN 是正常的,因为波特率尚未配置。
五、配置并测试
bash
sudo ip link set can0 down 2>/dev/null || true
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up
ip -details link show can0
安装工具:
bash
sudo apt install can-utils
接收:
bash
candump can0
发送测试帧:
bash
cansend can0 123#11223344
上述测试至少需要另一个 CAN 节点提供 ACK。连接 CAN_H、CAN_L 和必要的参考地线,总线两端各使用一个 120 Ω 终端电阻,并确保所有节点波特率一致。没有第二节点时连续发送可能累计错误甚至进入 bus-off。
测试结束后关闭接口:
bash
sudo ip link set can0 down
六、如何判断问题到底出在哪一层
情况 1:modprobe gs_usb 报错
先看 modinfo gs_usb 的 filename 和 vermagic。如果 vermagic 与当前 uname -r 不匹配,应重新用当前内核配置构建模块,而不是强行加载旧模块。
情况 2:模块能加载,但没有 can0
继续检查 USB 枚举和驱动绑定:
bash
lsusb
dmesg | tail -n 100
ip -details link show type can
此时问题可能在 USB 设备、固件协议兼容性、驱动 alias 或硬件连接,而不是 CAN bitrate。
情况 3:can0 存在,但发送报错或进入 bus-off
先检查物理总线:
- 节点波特率是否一致;
- CAN_H/CAN_L 是否接反;
- 总线两端是否有 120 Ω 终端电阻;
- 是否存在另一个可正常 ACK 的 CAN 节点;
- 是否出现 error-passive / bus-off 状态。
可以查看详细状态:
bash
ip -details -statistics link show 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 排查
参考资料
文中的版本号、接口名、设备地址和测试数据均应以自己的板卡实测为准;引用命令前请先确认当前 SDK、内核和启动布局。
标签 :gs_usb USB-CAN SocketCAN RK3588 Linux驱动