ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

LubanCat RK3588 实时 Linux 开发(六):启用 gs_usb 驱动并完成 USB-CAN 收发 摘要说明CONFIG_CAN_GS_USBm的含义完成模块生成、加载、SocketCAN 接口配置和安全收发测试。适用对象使用兼容 GS-USB 协议的 USB-CAN 适配器并希望在 LubanCat 上使用 SocketCAN 的开发者。收发测试需要第二个 CAN 节点或真实总线。文章目录本篇要解决什么问题一个很常见的误区一、gs_usb 是什么二、启用内核模块三、确认模块确实生成四、识别 USB-CAN 设备五、配置并测试六、如何判断问题到底出在哪一层情况 1modprobe gs_usb 报错情况 2模块能加载但没有 can0情况 3can0 存在但发送报错或进入 bus-off七、真实收发才算完整验收八、本文验收清单小结专栏导航参考资料本篇要解决什么问题Linux 下 USB-CAN 的关键不是“装一个 CAN 软件”而是让 USB 设备被正确的内核驱动绑定并最终暴露为 SocketCAN 网络接口。本篇使用gs_usb作为例子把链路分成四层层次成功标志常用命令内核配置CONFIG_CAN_GS_USBmgrep CONFIG_CAN_GS_USB .config模块产物存在gs_usb.ko且 vermagic 匹配modinfoUSB 绑定设备被gs_usb驱动识别lsusb、dmesgSocketCAN出现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_CANy CONFIG_CAN_RAWy CONFIG_CAN_GS_USBm以上是本次最终.config的实测值。使用 SDK 的入口进入内核配置并保存到当前内核 defconfigcd$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-Efilename|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-Efilename|vermagic|alias|intree如果提示 vermagic 不匹配说明模块不是针对当前运行内核构建的不能强行使用旧模块。四、识别 USB-CAN 设备lsusbdmesg|grep-iEgs_usb|can|usbip-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六、如何判断问题到底出在哪一层情况 1modprobe gs_usb报错先看modinfo gs_usb的filename和vermagic。如果 vermagic 与当前uname -r不匹配应重新用当前内核配置构建模块而不是强行加载旧模块。情况 2模块能加载但没有can0继续检查 USB 枚举和驱动绑定lsusbdmesg|tail-n100ip-detailslinkshowtypecan此时问题可能在 USB 设备、固件协议兼容性、驱动 alias 或硬件连接而不是 CAN bitrate。情况 3can0存在但发送报错或进入 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能设置目标 bitratecandump能收到另一节点发来的帧cansend发出的帧被另一节点实际收到。如果只有单个节点建议不要长时间反复发送测试帧以免因为缺少 ACK 造成错误计数持续累积。八、本文验收清单最终.config中CONFIG_CAN_GS_USBm最终 DEB 包含gs_usb.ko目标板modprobe gs_usb成功modinfo的 vermagic 与运行内核匹配出现 SocketCAN 接口bitrate 配置正确已使用真实第二节点完成收发闭环。小结CONFIG_CAN_GS_USBm是内核驱动配置不是普通用户态库安装问题。最终验收应同时包括模块、接口、波特率和真实收发四项。专栏导航专栏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驱动
返回列表