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 驱动识别 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 只能证明接口能被配置。完整验收至少应该做到:

  1. gs_usb 模块 vermagic 匹配;
  2. USB 设备被驱动绑定;
  3. can0 能设置目标 bitrate;
  4. candump 能收到另一节点发来的帧;
  5. 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 篇)

参考资料

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

标签 :gs_usb USB-CAN SocketCAN RK3588 Linux驱动

相关推荐
0+1114 小时前
Linux --读者写者问题、读写锁与自旋锁
linux
谷哥的小弟4 小时前
CentOS寿终正寝
linux·运维·centos
醇氧4 小时前
nohup 后台启动 uvicorn(仅测试 / 临时运行)
linux·运维·网络·python·python3.11
lisanmengmeng4 小时前
nagios的安装错误
linux
雪落漂泊4 小时前
Linux基本指令(上)
linux·运维·服务器
LongRunning4 小时前
【Linux】RK3568-系统镜像(六)
linux
阳光九叶草LXGZXJ4 小时前
达梦数据库-学习-68-dmasm0X_XXXXXX.log日志激增
linux·运维·数据库·sql·学习
KING-WU5124 小时前
Linux 工具之 yum、vim、gcc
linux·运维·服务器·后端
Mortalbreeze4 小时前
MySQL 基础篇(三):一文掌握 MySQL 常见数据类型
linux·服务器·数据库·mysql
zhangrelay4 小时前
机器人或计算机智能与时间相关案例汇总(ROS2-ROS1)
linux·笔记·学习·ubuntu·机器人