1. 项目概述
最近在 Jetson AGX Thor 开发套件上部署 PEAK PCAN-USB FD 设备时遇到了一个典型问题:设备插入后系统毫无反应。作为嵌入式开发的老手,我决定深入探究这个问题并记录完整的解决方案。本文将分享从问题诊断到最终解决的完整过程,特别针对 ARM64 架构的 Jetson 平台与标准 x86_64 环境的差异进行详细对比分析。
2. 问题诊断与原因分析
2.1 现象描述
当我们将 PEAK PCAN-USB FD 设备插入 Jetson AGX Thor 开发套件时,观察到了以下异常现象:
lsusb命令能够识别设备(显示为ID 0c72:0012 PEAK System PCAN-USB FD)- 但
ip link show命令没有显示预期的 CAN 接口(如 can4) - 对比测试中,同一设备在 x86_64 架构的台式机/笔记本上插入后立即出现 can0 接口
2.2 根本原因分析
通过深入对比两种平台的环境差异,我们发现了问题的根源:
| 对比项 | x86_64 平台 | Jetson AGX Thor (ARM64) |
|---|---|---|
| 操作系统 | 标准 Ubuntu 22.04/24.04 | JetPack 7.0 (L4T R38.4) 定制系统 |
| 内核版本 | 主线内核 6.8.0-generic | NVIDIA 定制内核 6.8.12-tegra |
| 内核配置 | 默认开启 CONFIG_CAN_PEAK_USB=y | 未开启 CONFIG_CAN_PEAK_USB |
| 驱动支持 | 预装或包含在主线内核中 | 无内置驱动支持 |
| 内核头文件 | 通过标准包安装 | 需要特殊包 nvidia-l4t-kernel-headers |
2.3 深层次原因解析
-
内核裁剪策略:NVIDIA 为 Jetson 平台定制的内核进行了深度裁剪,移除了许多在嵌入式场景中不常用的硬件驱动,包括 PEAK USB 系列设备的驱动支持。
-
架构差异:PEAK 官方主要提供 x86_64 架构的预编译驱动,对于 ARM64 (aarch64) 架构的设备,需要用户自行从源码编译驱动。
-
开发环境特殊性:JetPack 7.0 使用了特殊的内核头文件包管理方式,直接使用
apt install linux-headers-$(uname -r)的标准方法会失败,必须使用 NVIDIA 提供的特定包。
3. 系统环境准备
3.1 硬件配置
- 开发板:NVIDIA Jetson AGX Thor Developer Kit
- SoM:Jetson Thor (T5000)
- 外设:PEAK PCAN-USB FD 设备(4个接口)
3.2 软件环境
- 系统版本:JetPack 7.0 / 7.1 (L4T R38.4)
- 内核版本:6.8.12-tegra (aarch64)
- 编译工具链:GCC 13.3.0
4. 解决方案实施
4.1 安装 NVIDIA L4T 内核头文件
JetPack 7.0 使用了特殊的头文件包管理方式,必须使用以下命令安装:
bash复制sudo apt-get update
sudo apt-get install -y nvidia-l4t-kernel-headers build-essential
重要提示:直接安装标准头文件会失败,以下命令不可用:
bash复制sudo apt-get install linux-headers-$(uname -r)
安装完成后,需要进行验证:
bash复制dpkg -L nvidia-l4t-kernel-headers | head -20
ls /lib/modules/$(uname -r)/build/
关键检查点:
/lib/modules/6.8.12-tegra/build应该正确链接到/usr/src/linux-headers-6.8.12-tegra-ubuntu24.04_aarch64/3rdparty/canonical/linux-noble- 必须存在
arch/arm64/Makefile、.config和Module.symvers等关键文件
4.2 下载 PEAK Linux 驱动
建议使用支持内核 6.8 的最新版本驱动:
bash复制cd /tmp
wget https://www.peak-system.com/fileadmin/media/linux/files/peak-linux-driver-8.20.0.tar.gz
tar xzf peak-linux-driver-8.20.0.tar.gz
cd peak-linux-driver-8.20.0
4.3 编译驱动(关键步骤)
特别注意:默认编译会产生 CharDev 模式(字符设备)驱动,但我们需要的是 SocketCAN 网络接口模式,必须显式指定编译参数:
bash复制make clean
make NET=NETDEV_SUPPORT -j$(nproc)
两种模式的对比:
| 编译参数 | 结果模式 | 典型用途 |
|---|---|---|
| 默认(无参数) | CharDev 模式 (/dev/pcan32) |
应用程序直接访问设备 |
NET=NETDEV_SUPPORT |
SocketCAN 模式 (can4, can5...) |
兼容标准 Linux 网络栈,推荐使用 |
4.4 安装驱动
执行以下命令完成驱动安装:
bash复制sudo make install
安装过程会完成以下操作:
- 复制
pcan.ko内核模块到/lib/modules/6.8.12-tegra/misc/ - 安装库文件到
/usr/lib/ - 配置 udev 规则
/etc/udev/rules.d/45-pcan.rules - 更新模块依赖关系
depmod
4.5 加载驱动并验证
加载驱动模块:
bash复制sudo modprobe pcan
验证驱动加载状态:
bash复制lsmod | grep pcan
# 预期输出:pcan 188416 0
检查 CAN 接口是否出现:
bash复制ip link show | grep can
# 预期输出:显示 can4, can5, can6, can7(对应4个PEAK设备)
查看 /proc/pcan 信息:
bash复制cat /proc/pcan
成功标志:-ndev- 列显示 can4 而非 -NA-:
code复制32 usbfd can4 ffffffff 255 0x001c...
33 usbfd can5 ffffffff 255 0x001c...
34 usbfd can6 ffffffff 255 0x001c...
35 usbfd can7 ffffffff 255 0x001c...
4.6 配置 CAN 接口参数
设置波特率并启动接口(以500kbps为例):
bash复制# 单个接口配置
sudo ip link set can4 type can bitrate 500000
sudo ip link set can4 up
# 验证配置
ip -details link show can4
批量配置所有4个接口:
bash复制for i in 4 5 6 7; do
sudo ip link set can$i type can bitrate 500000
sudo ip link set can$i up
done
4.7 CAN 通信测试
进行基本通信测试:
bash复制# 发送测试帧
cansend can4 123#DEADBEEF
# 监听CAN数据
candump can4
# 查看统计信息
ip -s link show can4
5. 故障排除指南
5.1 问题1:只有 CharDev 没有 SocketCAN 接口
症状:
ip link看不到 can4 接口cat /proc/pcan显示-NA-
原因:
编译时未添加 NET=NETDEV_SUPPORT 参数
解决方案:
bash复制sudo make uninstall
make clean
make NET=NETDEV_SUPPORT -j$(nproc)
sudo make install
sudo modprobe pcan
5.2 问题2:编译报错缺少 arch/arm64/Makefile
原因:
内核头文件未正确安装
解决方案:
bash复制# 确认安装正确的头文件包
sudo apt-get install nvidia-l4t-kernel-headers
# 验证头文件路径
ls /lib/modules/$(uname -r)/build/arch/arm64/Makefile
5.3 问题3:设备权限不足
解决方案:
临时解决方案:
bash复制sudo chmod 666 /dev/pcan*
永久解决方案(安装时已自动配置udev规则):
检查 /etc/udev/rules.d/45-pcan.rules 是否存在并包含正确的权限设置
6. 与 Lerobot 集成注意事项
在将配置好的 CAN 接口与 Lerobot 等机器人框架集成时,需要特别注意:
-
接口选择:
- 不要使用 Jetson 自带的
can0-3(这些是内部 CAN 控制器,通常没有物理连接) - 使用
can4,can5,can6,can7(对应4个 PEAK USB 设备)
- 不要使用 Jetson 自带的
-
启动前准备:
bash复制sudo ip link set can4 up -
配置检查:
确保 Lerobot 配置文件中指定了正确的 CAN 接口名称
7. 关键步骤总结
以下是解决问题的关键步骤总结:
| 步骤 | 操作 | 目的 |
|---|---|---|
| 1 | 安装 nvidia-l4t-kernel-headers |
解决 Jetson 定制系统头文件缺失问题 |
| 2 | 下载 PEAK 驱动源码 | 获取 ARM64 架构支持 |
| 3 | make NET=NETDEV_SUPPORT |
编译为 SocketCAN 模式(最关键步骤) |
| 4 | sudo make install |
安装驱动到系统 |
| 5 | sudo modprobe pcan |
加载驱动,生成 can4-7 接口 |
完成上述步骤后,Jetson AGX Thor 开发套件就能像标准 x86_64 平台一样,正常识别和使用 PEAK PCAN-USB FD 设备,并通过标准的 SocketCAN 接口与各种应用软件(如 Lerobot)进行集成。
8. 经验分享与建议
在实际部署过程中,我总结了几点重要经验:
-
编译模式选择:
- 务必记得添加
NET=NETDEV_SUPPORT参数,这是大多数新手容易忽略的关键点 - SocketCAN 模式比 CharDev 模式更适合大多数现代应用场景
- 务必记得添加
-
内核头文件管理:
- Jetson 平台的头文件管理方式与标准 Ubuntu 不同,必须使用 NVIDIA 提供的特定包
- 遇到编译问题时,首先检查头文件路径是否正确
-
多设备管理:
- 当连接多个 PEAK 设备时,系统会按顺序分配 can4、can5 等接口编号
- 建议在脚本中固化接口配置,避免每次重启后需要重新设置
-
性能考量:
- 在资源受限的嵌入式平台上,合理设置 CAN 总线波特率
- 监控系统负载,确保实时性要求高的应用能得到足够资源
-
长期维护:
- 记录驱动版本与内核版本的对应关系
- 在系统升级前备份工作配置,避免因内核更新导致驱动不兼容