博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
博客内容主要围绕:
5G/6G协议讲解
算力网络讲解(云计算,边缘计算,端计算)
高级C语言讲解
Rust语言讲解
文章目录
- Jetson AGX Orin内核、设备树更新指南
- 一、下载工具包和内核源码
- 二、准备编译环境
- 三、编译内核
- 3.1 修改内核参数
- 3.2 修改设备树文件
- 3.3 编译内核及外部模块
- 3.4 安装内核及外部模块
- 3.5 切换实时内核
- 四、编译NVIDIA驱动
- 五、更新内核和设备树文件
- 5.1 使用官方flash.sh脚本刷新系统
- 5.2 只更新内核和设备树(非刷机方式)
2024年5月4号,nvidia正式发布了Jetpack6.0版本,这个版本带来了很多功能,包括:
- 新的cude、tensorrt等库,可以大幅提升AI推理性能(亲测提升很明显,所以才考虑从Jetpack5.1升级到最新版本);
- 可以使用UpStreaming Linux内核版本,并且提供了实时内核;
- 根文件系统升级到了Ubuntu2204;
【NVIDIA Jetpack5.x】Jetson AGX Orin内核、设备树更新指南
Jetson AGX Orin内核、设备树更新指南
这篇文章主要介绍如何手动更新内核和设备树文件,不会再介绍如何使用sdkmanage
工具刷机,如果需要可以参考 【NVIDIA Jetpack5.x】Jetson AGX Orin内核、设备树更新指南。如果不知道如何下载最新的BSP代码、内核代码和工具链也请参考上面的链接,不再赘述。
一、下载工具包和内核源码
请参考 【NVIDIA Jetpack5.x】Jetson AGX Orin内核、设备树更新指南
二、准备编译环境
请参考 【NVIDIA Jetpack5.x】Jetson AGX Orin内核、设备树更新指南
三、编译内核
3.1 修改内核参数
上一版本中需要手动修改tegra_defconfig
文件,新版本中不需要手动修改了,NVIDIA提供了一个脚本,可以方便的开启或者关闭某个Feature,相关命令如下所示:
cd path/to/Linux_for_Tegra/source./kernel/kernel-jammy-src/scripts/config --file "./kernel/kernel-jammy-src/arch/arm64/config/defconfig" --enable CONFIG_NO_HZ_FULL./kernel/kernel-jammy-src/scripts/config --file "./kernel/kernel-jammy-src/arch/arm64/config/defconfig" --disable CONFIG_NO_HZ_FULL
解释一下上面的命令,
- 进入下载的内核文件夹中;
- 执行
./kernel/kernel-jammy-src/scripts/config
脚本,其中--file
指定使用的内核配置文件,--enable
和disable
指定要开启或者关闭的Feature;
3.2 修改设备树文件
上一版本中我们修改了默认的设备树文件,这样不太优雅。这次我们自定义一个设备树文件。
首先,我们以NVIDIA提供的设备树文件作为base,
cd path/to/Linux_for_Tegra/source/hardware/nvidia/t23x/nv-public/nv-platformcp tegra234-p3737-0000+p3701-0005-nv.dts tegra234-p3737-0000+p3701-0005-csrs.dts
编译tegra234-p3737-0000+p3701-0005-csrs.dts文件,关闭PCIe的IOMMU功能,
cat <<EOF > tegra234-p3737-0000+p3701-0005-csrs.dts#include "tegra234-p3737-0000+p3701-0005-nv.dts"
/*C5 X8 rp*/
pcie@141a0000{/delete-property/ iommus;/delete-property/ iommu-map;/delete-property/ dma-coherent;/delete-property/ iommu-map-mask;/delete-property/ vpcie3v3-supply;
};/*C5 X8 ep*/
pcie-ep@141a0000{/delete-property/ iommus;/delete-property/ iommu-map;/delete-property/ dma-coherent;/delete-property/ iommu-map-mask;/delete-property/ vpcie3v3-supply;
};
EOF
修改当前目录下的Makefile
文件,增加编译选项,
vim Makefile#adddtb-y += tegra234-p3737-0000+p3701-0005-csrs.dtb
之后不需要我们手动编译,在编译内核的时候会自动编译,编译后的文件就在kernel_output/nvidia-oot/device-tree/platform/generic-dts/dtbs
3.3 编译内核及外部模块
首先需要定义交叉编译工具链的地址,
export CROSS_COMPILE=path/to/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
然后定义内核的编译输出路径
export kernel_output=$HOME/kernel_output
运行NVIDIA提供的脚本开始编译内核,
cd path/to/Linux_for_Tegra/source./nvbuild -o ${kernel_output}
3.4 安装内核及外部模块
首先需要定义安装路径,
export INSTALL_MOD_PATH=$HOME/jetson_update
运行NVIDIA提供的脚本开始安装内核和模块,
cd path/to/Linux_for_Tegra/source./nvbuild -i -o ${kernel_output}
3.5 切换实时内核
运行下面的命令会自动打上RT Patch,并开始编译RT内核,
cd path/to/Linux_for_Tegra/source./nvbuild -r -o ${kernel_output}
四、编译NVIDIA驱动
不需要手动操作了,在通过NVIDIA提供的nvbuild.sh
脚本编译内核的时候,会自动编译Out of Tree模块。然后在安装内核和模块的时候,会自动复制到正确的位置,也不需要我们手动复制了。
五、更新内核和设备树文件
5.1 使用官方flash.sh脚本刷新系统
请参考 【NVIDIA Jetpack5.x】Jetson AGX Orin内核、设备树更新指南
5.2 只更新内核和设备树(非刷机方式)
-
修改Jetson设备中的
/boot/extlinux/extlinux.conf
文件TIMEOUT 100 DEFAULT primaryMENU TITLE L4T boot optionsLABEL primaryMENU LABEL primary kernelLINUX /boot/ImageFDT /boot/dtb/tegra234-p3737-0000+p3701-0005-csrs.dtbINITRD /boot/initrdAPPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 LABEL backupMENU LABEL primary kernelLINUX /boot/Image.backupFDT /boot/dtb/kernel_tegra234-p3737-0000+p3701-0005-csrs-nv.dtbINITRD /boot/initrdAPPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0
-
将生成的
${jetson_update}/boot/Image
文件替换Jetson设备中的/boot/Image
文件 -
将生成的设备树文件
${jetson_update}/boot/dtb/tegra234-p3737-0000+p3701-0005-csrs.dtb
放到Jetson设备中的/boot/dtb/
文件夹 -
将生成的
${jetson_update}/lib/modules
下的整个文件夹,拷贝到Jetson设备的/lib/modules
文件夹下 -
将内核的符号表文件
${kernel_output}/kernel/kernel-jammy-src/Module.symvers
拷贝到Jetson设备的/usr/src/linux-headers-5.15.136-tegra-ubuntu22.04_aarch64/3rdparty/canonical/linux-jammy/kernel-source/Module.symvers
-
在Jetson设备上运行
sudo nv-update-initrd
,更新initrdfs -
重启Jetson设备
-
重启后修改jetson设备中/lib/modules/`uname -r`的软链接,
sudo ln -snf /usr/src/linux-headers-5.15.136-tegra-ubuntu22.04_aarch64/3rdparty/canonical/linux-jammy/kernel-source /lib/modules/`uname -r`/build
这里不需要再执行sudo depmod -a,这个bug已经修复了