1、开发板eMMC烧写官方系统过程
Jetson Xavier NX有两个版本,第一个是SD卡槽的版本,第二个是带eMMC存储芯片的版本。带SD卡槽的版本可以使用microSD卡烧录系统后直接插入使用,也支持通过虚拟机SDK Manager软件刷入系统使用。带eMMC存储芯片的版本,容量为16G,不支持microSD卡烧录系统方式,仅支持虚拟机SDK Manager软件刷入系统使用。
1、打开NVIDIA的jetpack下载网址,下载NVIDIA SDK Manager:
https://developer.nvidia.com/zh-cn/embedded/jetpack
下载下来是一个deb包,我们将其拷贝到我们的Ubuntu主机中。
2、在Ubuntu主机中安装SDK Manager。
进入到sdkmanager_1.6.1-8175_amd64.deb
所在目录,直接执行sudo dpkg -i sdkmanager_1.6.1-8175_amd64.deb
命令安装。安装过程可能会报错找不到依赖文件:
执行sudo apt --fix-broken install
命令可以解决该问题。
安装好后,在Ubuntu的软件列表中可以找到SDK Manager的图标,直接双击运行。第一次运行,它会自动打开网页,要求使用你在NVIDIA官网注册的账号密码登录,并使用邮箱验证。只有登陆成功才能正式进入软件运行。
3、硬件连接
硬件连接结构图如下所示:
在插入电源通电前,还要将跳线帽连接到REC和GND引脚(第二、三引脚),让系统进入刷机模式,SDK Manager 会优先将系统文件烧录到Jetson NX 的EMMC里。
4、系统烧写。
硬件连接好后,接入电源,打开Ubuntu主机的SDK Manager
点击CONTINUE TO STEP 02
,会要求选择板子型号,第一个是eMMC版本,第二个是SD卡版本,我们选第一个。
默认会勾选Jetson OS 和Jetson SDK Components,表示刷入系统和SDK,可以单独选系统OS 或者软件SDK,但是单独刷入软件SDK 前需要保证已经刷入系统OS。由于eMMC 的容量有限,所以烧录到eMMC 建议只选择刷入Jetson OS 的内容。文件下载路径保持默认就好,勾选协议,点击CONTINUE 进入第三步。
第三步会自动去下载相应文件,然后烧写到Jetson NX开发板的eMMC中,第三步完成不用进入第四步,通过Jetson NX开发板链接的显示器,就可以看到烧写到开发板的系统已成功启动,进入了系统安装好后的初始配置界面。此时可以直接拔掉Ubuntu主机与开发板连接的micro USB线。然后按照安装Ubuntu系统的设置一步步设置即可。
2、系统启动项配置文件
进入系统后在/boot/extlinux目录下有一个extlinux.conf文件,该文件定义了系统启动所使用的Image文件。如下图所示,可以通过DEFAULT来指定。
可以看到,在更换新内核时,需要替换/boot目录下的Image文件,并将之前的Image文件保存为Image.backup,然后将extlinux.conf文件中LABEL backup项前面的注释删掉。以备在系统启动时,/boot目录下找不到Image文件,系统会从Image.backup启动。
当我们将/boot目录下的Image文件备份为Image.backup,并将Image改名为Image2,然后修改extlinux.conf文件如下
然后reboot重启,系统是可以重启成功的。但是如果我们把/boot目录下的Image和extlinux.conf中的LINUX /boot/Image都改成Image2,重启系统是不成功的。
3、更换内核尝试
基于以上,我们尝试在Ubuntu主机交叉编译5.10版Linux内核(使用英伟达官方提供的配置文件),然后用生成的Image文件替换掉/boot目录下的Image,是否可以升级Jetson Xavier NX的内核版本。
在linux-5.10.78源码目录下执行以下命令
$ export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
$ export KBUILD_OUTPUT=./build
$ make defconfig
#Adjust the configuration:
$ scripts/config --file $KBUILD_OUTPUT/.config --enable STMMAC_ETH
$ scripts/config --file $KBUILD_OUTPUT/.config --enable STMMAC_PLATFORM
$ scripts/config --file $KBUILD_OUTPUT/.config --enable DWMAC_DWC_QOS_ETH
$ scripts/config --file $KBUILD_OUTPUT/.config --enable MARVELL_PHY
$ scripts/config --file $KBUILD_OUTPUT/.config --set-val CMA_SIZE_MBYTES 256
#Build the kernel:
$ make -j4
$ make dtbs
$ make modules
$ sudo make INSTALL_MOD_PATH=./rootfs/ modules_install
然后用inux-5.10.78/build/arch/arm64/boot目录下的Image文件替换掉Jetson Xavier NX系统中/boot目录下的Image,并将原来的备份为Image.backup,然后修改extlinux.conf文件如下:
然后重启系统,失败,说明这种替换方法并不能成功升级内核。
在随后的分析中,发现交叉编译生成的Image文件类型是可执行文件
而Jetson Xavier NX系统中/boot目录下的Image文件类型是DATA类型
简单的文件替换肯定不能成功。
4、官方手册的内核定制
在英伟达的官方指导手册中,有定制内核的一节。
在该节的描述中,我们需要去官方的下载中心下载NVIDIA® Jetson™ Linux Driver Package (L4T):
Jetson_Linux_R32.6.1_aarch64.tbz2
以及L4T source:
public_sources.tbz2
下载地址:Jetson Linux R32.6.1 Release Page
然后在官方给定的内核源码包中进行交叉编译,编译成功会在arch/arm64/boot/目录下生成Image文件。可以看到,在英伟达官方提供的内核源码包中交叉编译生成的Image依然是data类型的文件。
可见英伟达官方对内核源码以及编译规则做了改动,我们很难使用Linux官方内核自行编译然后去替换Image。目前英伟达官方提供的开发工具包最新版本就是32.6.1,里面的内核版本为4.9。
5、更换实时内核
虽然我们无法通过自行编译Linux源码来升级内核,但是官方提供了实时内核,在官方指导手册有相关更换实时内核的说明:
Using the L4T Real-Time Kernel Package
This section explains how to install and remove L4T real-time kernel packages on your system through the NVIDIA repository.
To install the real-time kernel package
1.Open the apt source configuration file in a text editor, for example:
$ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
2.Add a new entry for the rt-kernel repo:
deb https://repo.download.nvidia.com/jetson/rt-kernel r32.5 main
3.Enter this command:
$ sudo apt update
4.Install the real-time kernel packages:
$ sudo apt install nvidia-l4t-rt-kernel nvidia-l4t-rt-kernel-headers
5.Reboot
To remove the real-time kernel package
1.Enter this command:
$ sudo apt remove nvidia-l4t-rt-kernel nvidia-l4t-rt-kernel-headers
2.Reboot.
To switch to a different kernel
Once you have installed the real-time kernel on your device, you may want to switch between the real-time kernel image and the original generic kernel image without re-installing or removing kernel packages. You can do this by editing /boot/extlinux/extlinux.conf and setting the DEFAULT property to specify the kernel you want to boot. Set DEFAULT to real-time for the real-time kernel, or to primary for the generic kernel.
TIMEOUT 30
DEFAULT real-time
按照该步骤,可以安装英伟达提供的实时内核,并且重启后,会自动从实时内核启动。
可以看到实时内核安装完成后,会自动在/boot目录下生成Image.real-time文件,以及extlinux.conf文件中DEFAULT的默认指向也会改为real-time。重启系统: