3. BSP 开发环境搭建
Jetson Orin 的 BSP 开发并不是“把系统烧进去”这么简单,它涉及内核、设备树、根文件系统、驱动模块与启动固件的协同修改。要让这些工作可重复、可回滚,第一步必须把主机侧环境搭稳。本节围绕 Ubuntu 主机要求、SDK Manager 安装与使用、JetPack 版本选择、交叉编译工具链配置,以及串口与网络调试环境准备展开,目标是形成一条从主机到目标板的完整开发链路。
一、Ubuntu 主机要求:版本、磁盘与权限
NVIDIA 官方对 SDK Manager 的主机系统有明确约束。推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 的 x86_64 桌面版,不建议在虚拟机、WSL 或 ARM 主机上执行刷机操作,因为 USB 直通、恢复模式识别和分区挂载容易失败。主机至少需要 8 GB 内存,建议 16 GB 以上;磁盘方面,JetPack 完整安装会占用 60 GB 以上,若同时保留多个版本,建议预留 150 GB 的 SSD 空间。
权限方面,刷机需要访问 USB 设备节点,普通用户应加入 plugdev 组,并配置 udev 规则,否则 SDK Manager 可能无法识别处于恢复模式的 Orin 模组。此外,主机需要稳定的网络,因为 SDK Manager 会从 NVIDIA 服务器下载数 GB 的组件包。
# 检查主机版本与架构
lsb_release -a
uname -m
# 将当前用户加入必要用户组
sudo usermod -aG plugdev $USER
sudo usermod -aG dialout $USER
# 重新登录后验证
groups
二、NVIDIA SDK Manager 安装与使用
SDK Manager 是 NVIDIA 提供的图形化与命令行双模式工具,用于下载 JetPack 组件、刷写目标板、安装主机侧交叉编译环境。安装方式通常是从 NVIDIA 官网下载 .deb 包后通过 apt 安装。安装完成后,首次启动需要登录 NVIDIA Developer 账号,随后选择目标产品、JetPack 版本和安装组件。
使用流程可以概括为:选择模组型号 → 选择 JetPack 版本 → 选择下载与安装组件 → 进入恢复模式 → 刷写 → 安装 SDK 组件。对于 Orin 系列,刷写时通常需要将模组置于恢复模式,即按住 Force Recovery 按钮后上电,再用 USB-C 连接主机。
# 安装 SDK Manager
sudo apt install ./sdkmanager_*.deb
sudo apt --fix-broken install
# 启动图形界面
sdkmanager
# 命令行查看可用版本
sdkmanager --list
SDK Manager 的日志位于 ~/.nvsdkm/logs,当刷机失败时,应优先查看 NV_L4T_FLASH_*.log 与 NV_L4T_FILE_SYSTEM_*.log,它们能直接指出是 USB 识别、分区写入还是组件安装阶段出错。
三、JetPack 版本选择:匹配模组与 L4T
JetPack 是 NVIDIA 面向 Jetson 的 SDK 集合,包含 L4T(Linux for Tegra)、CUDA、cuDNN、TensorRT、多媒体 API 等。选择版本时,核心是确认目标模组与 L4T 版本的对应关系。Orin 系列通常使用 JetPack 5.x 或 6.x,其中 JetPack 5.x 基于 Ubuntu 20.04,JetPack 6.x 基于 Ubuntu 22.04。若项目依赖较新的内核与驱动,优先选择 JetPack 6.x;若需要与既有产线或旧版 TensorRT 保持一致,则可能继续使用 JetPack 5.x。
| JetPack 版本 | L4T 版本 | 根文件系统 | 适用场景 |
|---|---|---|---|
| JetPack 5.1.x | L4T 35.x | Ubuntu 20.04 | 成熟产线、旧版 CUDA/TensorRT 兼容 |
| JetPack 6.0 | L4T 36.x | Ubuntu 22.04 | 新内核、新驱动、Orin 新特性验证 |
| JetPack 6.1+ | L4T 36.x+ | Ubuntu 22.04 | 持续维护版本,推荐新项目起步 |
四、交叉编译工具链配置
在 x86_64 主机上为 Orin 的 aarch64 架构编译内核与模块,需要交叉编译工具链。NVIDIA 官方推荐使用 L4T 自带的工具链,通常位于 l4t-gcc 或 SDK Manager 安装目录下。配置时,需要设置 CROSS_COMPILE 与 ARCH 环境变量,并确保工具链的 bin 目录加入 PATH。
# 示例:设置交叉编译环境
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PATH=$PATH:/opt/l4t-gcc/bin
# 验证工具链
aarch64-linux-gnu-gcc --version
# 编译内核模块示例
make -C $KERNEL_DIR M=$PWD modules
若使用 NVIDIA 提供的源码包,通常需要先执行 source 脚本或手动导出上述变量。建议把环境变量写入独立的 env.sh,每次开发前 source 一次,避免污染全局环境。
五、串口与网络调试环境准备
串口是 BSP 开发中最重要的调试通道。Orin 模组通常通过调试串口输出 U-Boot 与内核启动日志,波特率一般为 115200。主机侧可使用 USB 转 TTL 模块连接,设备节点通常为 /dev/ttyUSB0。推荐使用 picocom 或 minicom,并确保用户已加入 dialout 组。
# 串口连接示例
sudo picocom -b 115200 /dev/ttyUSB0
# 查看串口设备
ls -l /dev/ttyUSB*
dmesg | grep ttyUSB
网络调试方面,建议主机与 Orin 处于同一局域网,或通过 USB RNDIS/ECM 共享网络。常用手段包括 SSH 登录、NFS 挂载根文件系统、TFTP 传输内核镜像。若使用 NFS 调试,主机需安装 nfs-kernel-server,并在 /etc/exports 中导出目标目录。
# 主机 NFS 配置示例
sudo apt install nfs-kernel-server
echo "/srv/nfs/orin *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
六、案例与常见误区
一个典型场景是:开发者用 JetPack 6.0 刷写 Orin,却在主机上使用 JetPack 5.1 的内核源码编译模块,结果模块版本魔法数不匹配,insmod 报 invalid module format。复盘结论是:BSP 源码、工具链、目标板固件必须来自同一 L4T 版本。
另一个常见误区是忽略恢复模式。Orin 刷机前必须确认已进入恢复模式,主机执行 lsusb 应能看到 NVIDIA 设备。若看不到,应检查 USB 线材、端口和按键时序,而不是反复重装 SDK Manager。
完成以上准备后,主机侧就具备了刷机、编译、调试三项基本能力。后续进入 BSP 源码修改时,所有变更都应基于同一 L4T 版本进行,并通过串口与网络双通道验证,才能保证问题定位有据可依。