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
如果主机是 Ubuntu 22.04,建议关闭自动挂载与自动更新,避免刷机过程中系统弹出磁盘挂载提示,干扰 SDK Manager 对目标板分区的操作。

二、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 持续维护版本,推荐新项目起步
不要只看 JetPack 大版本号,必须同时确认 L4T 版本。BSP 源码、设备树和内核配置都以 L4T 为基准,JetPack 只是上层封装。版本选错会导致内核源码与目标板固件不匹配,出现无法启动或驱动缺失。

四、交叉编译工具链配置

在 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。

环境搭建的验收标准可以归纳为四条:主机能识别恢复模式设备;SDK Manager 能完成刷机;交叉编译工具链能编译出 aarch64 模块;串口能稳定输出启动日志且 SSH 可登录。四条全部通过,才具备进入 BSP 源码修改阶段的条件。
Jetson Orin BSP 开发环境搭建链路 Ubuntu 主机 • Ubuntu 20.04 / 22.04 x86_64 • 内存 ≥ 16 GB,磁盘 ≥ 150 GB • plugdev / dialout 用户组 • 稳定网络与 USB 直通 NVIDIA SDK Manager • 下载 JetPack 组件 • 刷写 L4T 到 Orin 模组 • 安装主机侧 SDK • 日志:~/.nvsdkm/logs JetPack / L4T 版本 • JetPack 5.x → L4T 35.x • JetPack 6.x → L4T 36.x • 根文件系统 Ubuntu 20.04/22.04 • 源码与固件必须同版本 交叉编译工具链 • ARCH=arm64 • CROSS_COMPILE=aarch64-linux-gnu- • 工具链来自同一 L4T • 编译内核与模块 串口调试 • /dev/ttyUSB0 • 波特率 115200 • picocom / minicom • 查看 U-Boot 与内核日志 网络调试 • SSH 登录目标板 • NFS 挂载根文件系统 • TFTP 传输内核镜像 • 主机与 Orin 同网段 验收:识别恢复模式 → 刷机成功 → 编译 aarch64 模块 → 串口日志 + SSH 可用

完成以上准备后,主机侧就具备了刷机、编译、调试三项基本能力。后续进入 BSP 源码修改时,所有变更都应基于同一 L4T 版本进行,并通过串口与网络双通道验证,才能保证问题定位有据可依。