1. Orin NX JP6.2开发环境搭建概述
作为一名长期从事嵌入式系统开发的工程师,我最近在Jetson Orin NX平台上进行系统级开发时,积累了一些环境搭建的经验。不同于普通的应用开发,系统开发需要从底层开始构建完整的运行环境,这对新手来说可能会遇到不少坑。本文将以Orin NX 16G Super版本为例,详细介绍如何从零开始搭建完整的开发环境。
Orin NX是NVIDIA推出的一款高性能边缘计算设备,搭载了强大的ARM Cortex-A78AE CPU和Ampere架构GPU。JP6.2(JetPack 6.2)是NVIDIA为其提供的软件开发套件版本,基于Ubuntu 22.04系统。与使用SDKManager图形化工具不同,我们将采用源码编译的方式,这样可以获得更高的定制灵活性,特别是对于需要Super模式支持的开发者来说尤为重要。
2. SDK下载与编译烧录
2.1 SDK获取与解压
首先需要获取正确的SDK版本。对于JP6.2,对应的Jetson Linux版本是36.4.3。访问NVIDIA开发者网站的Jetson Linux下载页面(https://developer.nvidia.com/embedded/jetson-linux-r3643),下载以下两个关键文件:
- BSP包:Jetson_Linux_R36.4.3_aarch64.tbz2
- 示例根文件系统:Tegra_Linux_Sample-Root-Filesystem_R36.4.3_aarch64.tbz2
下载完成后,执行以下命令解压:
bash复制tar xf Jetson_Linux_R36.4.3_aarch64.tbz2
sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R36.4.3_aarch64.tbz2 -C Linux_for_Tegra/rootfs/
注意:解压根文件系统时必须使用sudo权限,因为会创建设备节点等特殊文件。
2.2 环境准备与配置
进入Linux_for_Tegra目录,安装必要的依赖:
bash复制cd Linux_for_Tegra/
sudo ./tools/l4t_flash_prerequisites.sh
这个脚本会自动安装所需的工具链和依赖库。为了避免首次启动时需要通过显示器设置用户,我们可以预先创建默认用户:
bash复制sudo ./tools/l4t_create_default_user.sh -u tao -p 1 -a
参数说明:
- -u:指定用户名(这里使用"tao")
- -p:指定密码(这里设为"1")
- -a:自动登录
这些配置只需执行一次,后续开发过程中无需重复。
3. 镜像构建与烧录
3.1 进入恢复模式
在烧录前,需要让开发板进入恢复模式。对于Orin NX Super版,操作步骤如下:
- 确保开发板断电
- 找到板子上的恢复模式短接点(通常标记为"RECOVERY")
- 用跳线帽短接这两个触点
- 保持短接状态的同时给开发板上电
- 通过USB线将开发板与主机连接
提示:不同版本的Orin NX恢复模式短接点位置可能不同,请参考具体型号的原理图确认。
3.2 执行烧录命令
在主机上执行以下命令开始构建和烧录:
bash复制sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_t234_nvme.xml \
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml" \
--showlogs --network usb0 jetson-orin-nano-devkit-super external
这个命令会:
- 构建完整的系统镜像
- 通过USB将镜像烧录到开发板
- 配置网络接口(usb0)
- 显示详细的日志信息(--showlogs)
烧录时间取决于主机性能,通常需要15-30分钟。完成后开发板会自动重启。
3.3 串口调试
烧录完成后,可以通过串口查看系统日志:
bash复制sudo minicom -b 115200 -D /dev/ttyUSB0
参数说明:
- -b 115200:设置波特率为115200
- -D /dev/ttyUSB0:指定串口设备(根据实际情况调整)
常见问题:如果minicom提示设备忙,可能是权限问题,尝试使用sudo或检查当前用户是否在dialout组中。
4. 内核源码获取与编译
4.1 下载内核源码
标准SDK中已包含预编译的内核镜像,但如需自定义内核,需要下载源码。在同一个下载页面找到"Kernel Sources"部分,下载以下文件:
- 内核源码包:kernel_src.tbz2
- 交叉编译工具链:aarch64--glibc--stable-2022.08-1.tar.bz2
4.2 设置交叉编译环境
解压工具链并设置环境变量:
bash复制mkdir $HOME/l4t-gcc
cd $HOME/l4t-gcc
tar xf aarch64--glibc--stable-2022.08-1.tar.bz2
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
export IGNORE_PREEMPT_RT_PRESENCE=1
注意:这些环境变量设置只在当前终端会话有效,如果打开新终端需要重新设置。
4.3 编译内核
进入源码目录开始编译:
bash复制cd Linux_for_Tegra/source
./generic_rt_build.sh "enable" # 配置实时内核(RT)支持
make -C kernel
make modules
make dtbs
编译时间取决于主机性能,首次编译可能需要30分钟以上。
4.4 安装内核模块
将编译好的内核模块安装到根文件系统:
bash复制export INSTALL_MOD_PATH=<install-path>/Linux_for_Tegra/rootfs/
sudo -E make install -C kernel
sudo -E make modules_install
cp kernel/kernel-jammy-src/arch/arm64/boot/Image <install-path>/Linux_for_Tegra/kernel/Image
将
5. Bootloader定制与编译
5.1 获取UEFI源码
Orin NX使用NVIDIA定制的UEFI固件作为bootloader。源码位于GitHub仓库:
bash复制git clone https://github.com/NVIDIA/edk2-nvidia.git
详细编译说明参考仓库Wiki页面。编译需要额外的工具链和依赖,建议在Ubuntu 20.04/22.04系统上进行。
5.2 替换bootloader
编译完成后,将生成的固件文件:
- BOOTAA64.efi
- uefi_jetson.bin
复制到SDK的bootloader目录,替换原有文件:
bash复制cp BOOTAA64.efi Linux_for_Tegra/bootloader/
cp uefi_jetson.bin Linux_for_Tegra/bootloader/
然后重新执行烧录流程即可使用自定义bootloader。
经验分享:修改bootloader时要特别小心,错误的配置可能导致设备无法启动。建议每次修改前备份原文件,并确保有恢复手段(如Flash工具)。
6. 开发环境验证与调试
6.1 系统启动验证
首次启动时,建议通过串口观察启动日志,检查以下关键点:
- Bootloader是否正常加载
- 内核是否正常解压和启动
- 根文件系统是否正确挂载
- 所有服务是否正常启动
6.2 常见问题排查
-
启动卡在U-Boot:
- 检查bootloader配置是否正确
- 确认设备树文件匹配硬件版本
-
内核panic:
- 检查内核配置是否支持所用硬件
- 确认内核与模块版本匹配
-
根文件系统挂载失败:
- 检查烧录时是否指定了正确的设备节点
- 确认文件系统完整性
6.3 性能优化建议
-
启动时间优化:
- 在UEFI配置中减少启动延时
- 使用initramfs减少根文件系统挂载时间
-
内核裁剪:
- 移除不需要的驱动和模块
- 禁用调试选项提高运行效率
-
文件系统优化:
- 对频繁读写的目录使用tmpfs
- 调整文件系统挂载参数(如noatime)
在实际项目中,根据具体需求对系统进行定制和优化,可以显著提升性能和响应速度。建议每次修改后做好记录和备份,便于问题追踪和回滚。
