【NVIDIA】Jetson AGX Orin内核、设备树更新指南

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G/6G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

文章目录

  • Jetson AGX Orin内核、设备树更新指南
  • 一、下载工具包和内核源码
    • 1.1 下载工具包
    • 1.2 安装依赖并下载内核源代码
  • 二、准备编译环境
    • 2.1 安装编译工具链
    • 2.2 安装内核工具包
  • 三、编译内核
  • 四、编译NVIDIA驱动
  • 五、更新内核和设备树文件
    • 5.1 使用官方flash.sh脚本刷新系统
      • 5.1.1 环境准备
      • 5.1.2 准备rootfs
      • 5.1.3 将编译的产物拷贝到特定的位置
      • 5.1.4 开始刷机
    • 5.2 只更新内核和设备树(非刷机方式)
      • 5.2.1 备份并更新内核
      • 5.2.2 备份并更新设备树文件
    • 5.3 使用flash.sh脚本更新内核和设备树
  • 六、设备备份与恢复
    • 6.1 环境准备
    • 6.2 备份环境(大约1h)
    • 6.3 恢复环境
  • 附录
    • 1. 编译内核时遇到的问题
    • 2. 如何进入恢复模式
      • 2.1 设别关闭情况下
      • 2.2 设备上电情况下
    • 3. 调试串口和刷机下载接口



Jetson AGX Orin内核、设备树更新指南

注意:最好使用Ubuntu20.04,如果使用的是Ubuntu22.04则需要使用docker

一、下载工具包和内核源码

1.1 下载工具包

       访问Jetson Download Center,下载最新版本的SDK Manage。

在这里插入图片描述
下载后安装sdkmanage,然后允许下面的命令,将需要的数据包都下载下来(记住不需要刷新jetson,只选择下载稍后安装即可,见下图)。

$ ./sdkmanage

在这里插入图片描述

下载完成后可以在默认的下载位置($HOME/Download)可以看到一个压缩包,Jetson_Linux_R35.3.1_aarch64.tbz2(撰写此文档的时候最新版本的R35.3.1),这个包里面包含了很多用于开发的工具和源代码,其中包含了脚本source_sync.sh可以用于自动同步和下载内核源代码。(也可以通过访问Jetson Linux home page下载Driver Package(BSP)但可能不是最新版本)

       解压缩该文件,解压后的文件目录结构如下图所示,其中Linux_for_Tegra是解压出来的文件夹:

在这里插入图片描述

1.2 安装依赖并下载内核源代码

       如果系统中没有git,可以运行下面的命令安装git:

$ sudo apt install git-core

       将上述压缩包解压后,在Linux_for_Tegra文件夹下运行:

$ ./source_sync.sh

就会自动同步下载内核源代码,下载过程中会要求输入tag,也可以直接输入下面的命令,直接不同步到jetson_35.3.1:

$ ./source_sync.sh -t jetson_35.3.1

下载完成后的目录结构如下图所示,其中sources中包含了内核和设备树源码:

在这里插入图片描述
在这里插入图片描述

       在内核代码仓中运行下面的命令可以查看所有可用的tag:

$ git tag -l

二、准备编译环境

2.1 安装编译工具链

       访问Jetson Linux home page,下载工具链压缩包:

在这里插入图片描述
然后运行下面的命令:

$ mkdir $HOME/l4t-gcc
$ cd $HOME/l4t-gcc
$ tar -xf <toolchain_archive>

最后设置环境变量(临时生效,重启系统或者cmd之后需要重新输入):

$ export CROSS_COMPILE=$HOME/l4t-gcc/bin/aarch64-buildroot-linux-gnu-

2.2 安装内核工具包

       访问Jetson Linux home page,下载最新版本的Jetson Linux Source:

在这里插入图片描述
这个工具包中包含了kernel、dtbs、kernel header,以及用于编译内核的脚本文件nvbuild.sh。解压pubilc_sources.tbz2后找到kernel_src.tbz2继续解压文件。解压后将nvbuild.sh、nvcommon_build.sh拷贝到通过source_sync.sh下载的内核<path-to>/Linux_for_Tegra/sources目录下。


三、编译内核

  1. 安装基础软件包:
$ sudo apt install build-essential bc flex bison libncurses-dev libssl-dev
  1. 配置交叉编译环境
$ export CROSS_COMPILE_AARCH64_PATH=$HOME/l4t-gcc
$ export CROSS_COMPILE_AARCH64=$HOME/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
  1. 创建内核编译文件的保存目录:
$ mkdir $HOME/kernel_output
  1. 运行下面的命令开始编译内核
$ ./nvbuild.sh -o $HOME/kernel_output

四、编译NVIDIA驱动

  1. 从2.2节解压的public_sources.tbz2中找到nvidia_kernel_display_driver_source.tbz2压缩包,并解压缩,目录结构如下图所示:
    在这里插入图片描述
  2. 设置环境变量:
$ export CROSS_COMPILE_AARCH64=$HOME/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
$ export LOCALVERSION="-tegra"
  1. 进入解压缩后的文件夹,并执行下面的命令:
$ make modules SYSSRC=<path-to>/Linux_for_Tegra/sources/kernel/kernel-<version> SYSOUT=$HOME/kernel_output CC=${CROSS_COMPILE_AARCH64}gcc LD=${CROSS_COMPILE_AARCH64}ld.bfd AR=${CROSS_COMPILE_AARCH64}ar CXX=${CROSS_COMPILE_AARCH64}g++ OBJCOPY=${CROSS_COMPILE_AARCH64}objcopy TARGET_ARCH=aarch64 ARCH=arm64

编译后的产物存储在$HOME/kernel_output中,如下图所示:

在这里插入图片描述

五、更新内核和设备树文件

Jetson AGX Orin默认的配置文件位于:/Jetson_for_Linux/sources/kernel/kernel-5.10/arch/arm64/config/tegra_defconfig

5.1 使用官方flash.sh脚本刷新系统

也是官方建议的方法,时间大约15~20min。注意备份文件,系统会被擦除。

5.1.1 环境准备

       通过Jetson提供的flash.sh(位于Linux_for_Tegra目录内)脚本来完成内核和设备树的更新(其实是刷机),首先需要安装flash.sh需要的库:

$ cd <path-to>/Linux_for_Tegra
$ sudo tools/l4t_flash_prerequisites.sh

5.1.2 准备rootfs

  1. 访问Jetson Linux home page,下载rootfs压缩包,如下图所示,然后解压缩到\<path-to>/Linux_for_Tegra/rootfs(注意需要使sudo进行解压缩)

在这里插入图片描述

  1. 执行下面的命令安装NVIDIA扩展bin文件:
$ sudo ./apply_binaries.sh
  1. 创建一个用于x,密码为1,并设置自动登录(这一步是避免刷机后没有图新界面需要通过串口创建用户时的不稳定,这里的用户名和密码需要改成您自己的):
$ sudo ./tools/l4t_create_default_user.sh -u x -p 1 -a

5.1.3 将编译的产物拷贝到特定的位置

  1. 执行下面的命令,拷贝编译内核的产物:
$ sudo cp $HOME/kernel_output/drivers/gpu/nvgpu/nvgpu.ko <path-to>/Linux_for_Tegra/rootfs/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/nvgpu/nvgpu.ko
$ sudo cp -r $HOME/kernel_output/arch/arm64/boot/dts/nvidia <path-to>/Linux_for_Tegra/kernel/dtb/
$ sudo cp $HOME/kernel_output/arch/arm64/boot/Image <path-to>/Linux_for_Tegra/kernel/Image
  1. 在 $HOME/kernel_output 目录下执行:
$ sudo make ARCH=arm64 O=$HOME/kernel_output modules_install INSTALL_MOD_PATH=<path-to>/Linux_for_Tegra/rootfs/
  1. 执行下面的命令,拷贝编译NVIDIA驱动的产物(nvidia-drm.konvidia.konvidia-modeset.ko):
$ sudo mkdir -p <path-to>/Linux_for_Tegra/rootfs/lib/modules/$(uname -r)/extra/opensrc-disp
$ sudo cp <path-to>/NVIDIA-kernel-module-source-TempVersion/kernel-open/*.ko <path-to>/Linux_for_Tegra/rootfs/lib/modules/$(uname -r)/extra/opensrc-disp

5.1.4 开始刷机

  1. 按照附录-2进入恢复模式
  2. 执行下面的命令:
$ sudo ./flash.sh jetson-agx-orin-devkit internal
  1. 【可选】刷机后第一次开机,如果没有图形界面,需要通过串口输入
$ sudo depmod -a

然后重新启动Jetson,图形界面就回来了。

5.2 只更新内核和设备树(非刷机方式)

这个方法是我自己尝试的,目前没有发现问题

5.2.1 备份并更新内核

  1. 修改jetson板块中的/boot/extlinux/extlinux.conf文件,备份现在使用的内核,修改后的文件内容如下所示:
TIMEOUT 100
DEFAULT primaryMENU TITLE L4T boot optionsLABEL primaryMENU LABEL primary kernelLINUX /boot/ImageFDT /boot/dtb/kernel_tegra234-p3701-0000-p3737-0000.dtbINITRD /boot/initrdAPPEND ${cbootargs} root=PARTUUID=0c4e1692-9ba5-4a6d-8192-2091bb0a3a35 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-p3701-0000-p3737-0000.dtbINITRD /boot/initrdAPPEND ${cbootargs} root=PARTUUID=0c4e1692-9ba5-4a6d-8192-2091bb0a3a35 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 

注意不要完全拷贝,看懂怎么改的是关键,有些参数可以是不同的,例如root的PARTUUID

  1. 将原始的内核镜像进行备份:
$ sudo cp /boot/Image /boot/Image.backup
  1. 通过scp命令将新内核拷贝到Jetson的/boot/Image
  2. 创建一个文件夹,例如
$ mkdir <path-to>/manual_update_kernel
$ sudo make ARCH=arm64 O=$HOME/kernel_output modules_install INSTALL_MOD_PATH=<path-to>/manual_update_kernel
  1. 将第四节编译的NVIDIA驱动,拷贝到manual_update_kernel的对应文件夹中。将nvgpu.ko也拷贝到对应的位置(参见5.1.3-1)
  2. manual_update_kernel/lib/modules下的文件打包,拷贝到jetson板卡后,替换对应位置的文件夹(/lib/modules/$(uname -r)
  3. 重启系统,在重启过程中会要求用户选择一个内核镜像。选择0就是新的内核镜像,1是备份内核镜像
  4. 执行下面的命令,并重启jetson
$ sudo depmod -a

5.2.2 备份并更新设备树文件

  1. 修改完设备树文件之后,重新编译内核,编译完成后会在$HOME/kernel_output/arch/arm64/boot/dts/nvidia目录下生成一个tegra234-p3701-0000-p3737-0000.dtb文件
  2. 将上述文件拷贝到Jetson板卡的/boot/dtb目录下
  3. 修改extlinux.conf文件中的FDT参数的值,使其指向正确的设备树文件

5.3 使用flash.sh脚本更新内核和设备树

  1. 可以通过下面的命令更新分区中的内核和设备树
$ sudo ./flash.sh -r -k A_kernel -k A_kernel_dtb jetson-agx-orin-devkit internal

注意:UEFI会优先使用/boot/extlinux/extlinux.conf文件中获取的image和dtb。如果在该文件中没有提到image和dtb,才会使用位于eMMC分区中的image和dtb。所以如果extlinux.conf中内置了image和dtb,则执行上述指令后,下次重启还是会使用原来的image和dtb。


六、设备备份与恢复

Jetson的BSP工具包携带了自动备份和恢复的工具,位于<path-to>/Linux_for_Tegra/tools/backup-restore/内。

注意:需要首先进入设备恢复模式(参见附录-2

6.1 环境准备

$ sudo systemctl stop udisks2.service
$ sudo tools/l4t_flash_prerequisites.sh
$ sudo service nfs-kernel-server start

6.2 备份环境(大约1h)

$ cd <path-to>/Linux_for_Tegra
$ sudo ./tools/backup_restore/l4t_backup_restore.sh -b jetson-agx-orin-devkit

备份完成后,会自动重启。备份后的文件存储在<path-to>/Linux_for_Tegra/tools/backup-restore/images中。

6.3 恢复环境

$ cd <path-to>/Linux_for_Tegra
$ sudo ./tools/backup_restore/l4t_backup_restore.sh -r jetson-agx-orin-devkit

附录

1. 编译内核时遇到的问题

drivers/video/Kconfig.27:can’t open file “drivers/video/tegra/Kconfig”

可以参考链接解决。

2. 如何进入恢复模式

2.1 设别关闭情况下

  • 按住设备上的“FORCE RECOVERY” 按钮5秒
  • 同时按下设备上的“POWER”按钮3秒,然后松开电源按钮
  • 松开“FORCE RECOVERY” 按钮

2.2 设备上电情况下

  • 按住设备上的“FORCE RECOVERY” 按钮5秒
  • 同时按下设备上的“RESET”按钮3秒,然后松开电源按钮
  • 松开“FORCE RECOVERY” 按钮

使用lsusb命令查看,如果显示下图内容表示已经进入恢复模式:

在这里插入图片描述

3. 调试串口和刷机下载接口

在这里插入图片描述
左图是刷机下载接口,右图是调试串口。



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4799.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis-单节点安装

daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.rdb logfile redis.log pidfile redis.pid##save 3600 1 300 100 60 10000 ##3600秒(一小时),至少有一个值的话,会进行存盘 ##300秒(五分钟),至少…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

macOS上下载安装Kibana并连接ES

下载Kibana 执行以下命令进行&#xff0c;版本号根据你所用的ES版本选择&#xff0c;比如我的是7.10.0 curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.0-darwin-x86_64.tar.gz解压安装Kibana tar -zxvf kibana-7.10.0-darwin-x86_64.tar.gz进行config…

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用 xxl是xxl-job的开发者大众点评的【许雪里】名称的拼音开头 官网地址 分布式任务调度平台XXL-JOB 文档地址…

【MySql】C语言连接mysql|图形化工具

文章目录 Connector/C 使用mysql接口介绍Navicat远程连接数据库 Connector/C 使用 说完了mysql的基础,后面我们只关心使用&#xff0c;要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;前往官网下载即可。 但是实际上我们并不需要这样去做&#xff0c;…

力扣1768.交替合并字符串(java模拟法)

题目描述&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 问题分析&#xff1a; 我们可以直…

MySQL MHA高可用集群部署及故障切换

MySQL MHA高可用集群部署及故障切换 一、MHA概述二、MHA的组成三、MHA的特点四、MHA的原理五、搭建MySQLMHA1、所有服务器&#xff0c;关闭系统防火墙和安全机制2、修改 master&#xff08;192.168.92.11&#xff09;、Slave1&#xff08;192.168.92.12&#xff09;、Slave2&am…

Jmeter(jmeter-plugins插件的安装使用)

目录 一、安装JMter Plugins 二、Custom Thread Groups插件 Stepping Thread Group 元件 Ultimate Thread Group 一、安装JMter Plugins 1、官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter --> Options -->…

[BJDCTF2020]认真你就输了

题目具有极大的威胁性 打开下发的excel文件&#xff0c;发现报错&#xff0c;文件格式与扩展不匹配&#xff0c;说明文件后缀做了更改 拿去010&#xff0c;根据文件头发现是一个zip压缩文件 成功解压&#xff0c;结果解压出来的文件一个都看不懂&#xff0c;查看了wp得知 刚上来…

Framework - AMS

一、概念 Android10&#xff08;API29&#xff09;开始&#xff0c;ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

【MySQL】SQL的高阶用法

文章目录 条件查询使用关系运算符查询使用IN关键字查询使用BETWEEN AND关键字查询使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询(模糊查询)使用LIMIT分页查询使用GROUP BY进行分组查询GROUP BY和聚合函数一起使用GROUP BY和聚合函数以及HAVING一起使用 使用…

Spring Boot 操作 Redis 的各种实现

一、Jedis,Redisson,Lettuce三者的区别 共同点&#xff1a;都提供了基于Redis操作的Java API&#xff0c;只是封装程度&#xff0c;具体实现稍有不同。 不同点&#xff1a; 1.1、Jedis 是Redis的Java实现的客户端。支持基本的数据类型如&#xff1a;String、Hash、List、Se…