LubanCat RK3588 实时 Linux 开发(六):启用 gs_usb 驱动并完成 USB-CAN 收发

摘要:说明 CONFIG_CAN_GS_USB=m 的含义,完成模块生成、加载、SocketCAN 接口配置和安全收发测试。

适用对象:使用兼容 GS-USB 协议的 USB-CAN 适配器,并希望在 LubanCat 上使用 SocketCAN 的开发者。收发测试需要第二个 CAN 节点或真实总线。

文章目录

本篇要解决什么问题

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 驱动识别 lsusbdmesg
SocketCAN 出现 can0 等接口并能真实收发 ipcandumpcansend

一个很常见的误区

can-utils 是用户态测试工具,gs_usb.ko 是内核驱动。安装 can-utils 不能替代内核驱动;同样,只看到 gs_usb.ko 文件存在,也不能证明 USB 设备已经绑定并能完成 CAN 收发。

一、gs_usb 是什么

采用 GS-USB/candleLight 兼容固件的 USB-CAN 适配器可以使用 Linux 的 gs_usb 驱动。加载成功后,设备通过 SocketCAN 表现为 can0can1 等网络接口;仅仅安装一个名字相近的用户态库不会生成这些接口。

二、启用内核模块

在 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_usbfilenamevermagic。如果 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 只能证明接口能被配置。完整验收至少应该做到:

  1. gs_usb 模块 vermagic 匹配;
  2. USB 设备被驱动绑定;
  3. can0 能设置目标 bitrate;
  4. candump 能收到另一节点发来的帧;
  5. cansend 发出的帧被另一节点实际收到。

如果只有单个节点,建议不要长时间反复发送测试帧,以免因为缺少 ACK 造成错误计数持续累积。

八、本文验收清单

  • 最终 .configCONFIG_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 篇)

参考资料

文中的版本号、接口名、设备地址和测试数据均应以自己的板卡实测为准;引用命令前请先确认当前 SDK、内核和启动布局。

标签gs_usb USB-CAN SocketCAN RK3588 Linux驱动

相关推荐
2601_962299883 小时前
Linux执行Python脚本方法
linux·python·脚本·解释器·shebang
snow@li3 小时前
服务器运维:Linux命令速查手册(全景梳理)
linux·服务器·网络
handler013 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
新时代牛马3 小时前
实时 Linux:PREEMPT_RT、延迟来源与观测
linux·运维·服务器
微露清风3 小时前
# Linux 进程全景:从 PCB 到 O(1) 调度队列
linux·服务器
H_oRIZoN_3 小时前
Linux入门DAY38(手写 HTTP 客户端抓取天气 + 简易 HTTP 服务器实现元器件 Web 系统)
linux·linux应用编程
fangjianj4 小时前
windows环境反弹shell
linux·windows·web安全
明月不会写代码4 小时前
Ubuntu 下 Kitty 终端配置记录
linux·ubuntu
weipt4 小时前
利用wsl给windows电脑上安装一个ubuntu
linux·运维·ubuntu