U-Boot 定制

适用于:NVIDIA® Jetson Nano™ 设备、NVIDIA® Jetson™ TX2 系列和 NVIDIA® Jetson TX1
U-Boot 是受支持平台上 NVIDIA® Jetson™ Linux 驱动程序包 (L4T) 的默认引导加载程序。

要求

软件要求和前提条件包括
基于 Linux 的主机系统
U-Boot 构建和刷写实用程序的功能已使用 Ubuntu 主机系统进行验证。较新版本的 Ubuntu 或其他 Linux 发行版可能可以通过特定于主机的修改来工作。
Jetson Linux 驱动程序包 (L4T)
从 NVIDIA Developer Zone 下载并安装最新的 L4T 包
设备树编译器 (DTC)
DTC 用于编译 U-Boot 源代码树中包含的设备树文件。有关从源代码构建 DTC 的详细示例,请参阅构建设备树编译器
您必须使用版本发布中的 kernel 目录中包含的预构建 DTC 二进制文件。标准 Linux 发行版包管理系统(如 APT)提供的许多 DTC 包都没有更新到支持 U‑Boot makefile 所需功能的 DTC 版本。
预构建的 DTC 二进制文件是从此版本中的内核源代码构建的。这些源代码位于 scripts/dtc 目录中。您可以通过构建内核 dtbs 目标来构建 DTC。
Linaro Aarch64 工具链
该工具链可从以下位置下载:
U‑Boot 源代码
有关信息,请参阅下载和构建 U-Boot
内核源代码
有关信息,请参阅

命令中的占位符

本主题介绍了许多使用这些占位符 <board><board_and_rev> 的命令。替换此表中的值
平台
<board>
<board_and_rev>
Jetson Nano
p3450-0000
p3450-0000
Jetson Nano 2GB
p3541-0000
p3541-0000
Jetson TX2 系列
p2771-0000
p2771-0000-500
Jetson TX1
p2371-2180
p2371-2180
其他占位符在每个使用它们的章节中进行描述。

下载和构建 U-Boot

在将 U-Boot 刷写到您的参考平台之前,您必须在 Linux 主机系统上下载并构建它。NVIDIA 提供了一个 Git 存储库,其中包含适用于 L4T 版本的 U‑Boot 源代码。

前提条件

在用提取的 L4T 版本包覆盖 U-Boot 二进制文件之前,请备份以下位置中的所有原始 U-Boot 文件:
Linux_for_Tegra/bootloader/<platform>/<board_and_rev>/
其中
<platform> 是 SoC 名称或平台。
<board_and_rev>命令中的占位符章节中进行了描述。
要下载和构建 U-Boot
1. 执行以下任一步骤
运行命令
$ git clone -n git://nv-tegra.nvidia.com/3rdparty/u-boot.git
从您要放置 L4T 版本包的位置运行 source_sync.sh 脚本。
如果您在没有参数的情况下运行 source_sync.sh –u,则脚本会提示输入 <tag_name>,这是发行说明中提供的版本标记名称。
-k 选项用于 source_sync 同步内核源代码。-u-k 选项之间允许有空格。默认情况下,如果未提供任何选项,则脚本会同步内核和 U-Boot 源代码。
此外,您还可以通过传递 <tag_name> 运行脚本,如下所示:
$ cd <your_L4T_root>/Linux_for_Tegra
$ ./source_sync.sh –u <tag_name>
这会将源代码同步到以下位置,相对于 source_sync.sh 的位置:
sources/u-boot_source
U‑Boot 源代码位于此目录中,相对于 L4T 版本包的位置:
Linux_for_Tegra/sources/u-boot_source
注意
这些说明的其余部分假定您当前的工作目录是 U-Boot 源代码树。
2. 检出 Git 标记名称
$ git checkout –b <branch_name> <tag_name>
其中
<branch_name> 是您的本地分支的名称。
<tag_name>发行说明中提供的版本标记名称。
3. 设置构建环境
$ export CROSS_COMPILE=<cross_prefix>
其中
<cross_prefix> 是 ARM64 工具链的绝对路径,不带 .gcc 后缀。例如,对于参考 ARM64 工具链,<cross_prefix>
<toolchain_install_path>/bin/aarch64-linux-gnu-
有关如何下载参考工具链的信息,请参阅Jetson Linux 工具链
注意
NVIDIA 建议使用 Linaro 7.3.1 2018.05 工具链。
4. 通过执行以下命令构建 U-Boot
$ make distclean
$ make <board_and_rev>_defconfig
$ make
其中 <board_and_rev>命令中的占位符章节中进行了描述。

刷写前

在刷写之前,您必须将更新后的 U-Boot 二进制文件复制到 L4T 树。
要复制更新后的 U-Boot 以刷写到参考平台
在您的 Linux 主机系统上运行此命令
$ cp <uboot_src_dir>/u-boot{,.bin,.dtb,-dtb.bin} \
<your_L4T_root>/Linux_for_Tegra/bootloader/<platform>/<board_and_rev>
其中
<uboot_src_dir><your_L4T_root>/Linux_for_Tegra/sources/u-boot_source
<your_L4T_root> 是 L4T 版本包的位置。
<platform> 是 SoC 名称或平台。
<board_and_rev>命令中的占位符章节中进行了描述。

刷写 U-Boot 完整 Jetson Linux 驱动程序包镜像

在启动时,U-Boot 会获取启动配置文件、内核和设备树,它们可以驻留在启动存储设备
用于 Jetson Nano 2GB (P3448-0003) 或原始 Jetson Nano 开发模块 (P3448-0000) 的 SD 卡
用于 Jetson TX2 或 Jetson TX1 的内部 eMMC 内存
当您执行刷写 U-Boot 的脚本时,请指定命令行选项以标识包含根文件系统的存储设备。这使脚本能够选择适当的启动配置文件。启动配置文件包含内核命令行参数,这些参数控制 Linux 内核在何处查找根文件系统。
要刷写 U-Boot 并选择从内部 eMMC 挂载根文件系统的脚本
选择一个启动配置文件,该文件使内核从启动存储设备挂载根文件系统。
对于 Jetson Nano 设备上的 SD 卡
$ sudo ./flash.sh <platform> mmcblk0p1
对于 Jetson TX2 或 Jetson TX1 上的 eMMC 内存
$ sudo ./flash.sh <platform> mmcblk0p1
其中 <platform> 是 SoC 名称或平台。
要刷写 U-Boot 并选择从 NFS 服务器挂载根文件系统的脚本
选择一个启动配置文件,该文件使内核从 NFS 服务器挂载根文件系统
$ sudo ./flash.sh –N <IPA>:/<nfs directory> [-n <target IPA>:<host IPA>:<gateway IPA>:<netmask>] <platform> <interface name>
其中
<IPA> 是托管根文件系统的 NFS 服务器。
<nfs_directory> 是导出的根文件系统的完整路径名。
<target IPA> 是目标设备的静态 IP 地址。
<host IPA> 是 NFS 服务器的静态 IP 地址。
<gateway IPA> 是网关的静态 IP 地址。
<netmask> 是本地网络的静态网络掩码。
<platform> 是 SoC 名称或平台。
<interface name> 对于 RJ45 连接器是 eth0,对于 USB 以太网适配器(仅在 Jetson TX2 系列上受支持)是 eth1
 
注意
-n 选项是在未配置 DHCP 服务器的点对点网络连接上推荐的选项。

仅刷写 U-Boot

要将完整的 Jetson Linux 驱动程序包 (L4T) 镜像刷写到参考平台,请参阅上面的刷写 U-Boot 完整 Jetson Linux 驱动程序包镜像,
要刷写新版本的 U-Boot
运行命令
$ sudo ./flash.sh -k LNX <platform> mmcblk0p1
其中 <platform> 是 SoC 名称或平台。

更改启动内存设备分区布局

本主题基于以下文件中的 SD 卡或 eMMC 硬件和软件布局信息。
对于 Jetson Nano 设备
Linux_for_Tegra/p3448-0000.conf.common
Linux_for_Tegra/bootloader/<platform>/cfg/flash_l4t_t210_spi_sd_p3448.xml
对于 Jetson TX2 系列
Linux_for_Tegra/p2771-0000.conf.common
Linux_for_Tegra/bootloader/<platform>/cfg/flash_l4t_t186.xml
对于 Jetson TX1
Linux_for_Tegra/p2371-2180-devkit.conf
Linux_for_Tegra/bootloader/<platform>/cfg/gnu_linux_tegraboot_emmc_full.xml
其中 <platform> 是 SoC 名称或平台。
注意
内核与启动配置文件一起安装到文件系统中。内核 (LNX) 分区包含 U-Boot。

eMMC IC 属性

适用于:Jetson TX2 系列和 Jetson TX1
eMMC IC 属性由 Linux_for_Tegra/<target_board>.conf.common 中的两个变量确定
BOOTPARTSIZE:指定 eMMC 启动分区大小,即 boot0 分区大小 + boot1 分区大小。
EMMCSIZE:指定 eMMC 可用数据大小,即 BOOTPARTSIZE + 用户分区大小。
注意
boot0、boot1 和用户分区大小可以从 eMMC 设备数据手册中获得。
eMMC IC 属性
限制可用数据区域的总大小
确定 GPT 分区的位置

根文件系统大小

根文件系统分区是最大的分区。此分区的大小是分区布局确定的关键因素之一。
要修改根文件系统分区大小
修改 Linux_for_Tegra/<target_board>.conf.common 文件中 ROOTFSSIZE 变量的值。
注意
所有分区使用的总空间不能超过 EMMCSIZE

GPT 分区

flash.sh 脚本根据启动内存设备分区的布局自动创建主 GPT 分区和辅助 GPT 分区。
保护性 MBR 包含设备信息,以防止传统引导加载程序执行破坏性操作。它位于逻辑块地址 (LBA) 0。
主 GPT 分区包含 GUID 分区表。它位于 LBA 1。
辅助 GPT 分区包含与主 GPT 相同的信息,并充当备份。它位于启动设备的最后一个 LBA。
最后一个 LBA 因设备而异。U-Boot 和内核都能够获得最后一个 LBA。

LNX 分区

LNX 分区通常包含内核。但是,当引导加载程序为 U‑Boot 时,此分区包含 U-Boot,而 U-Boot 从根文件系统读取内核。

APP 分区

如果根文件系统存储在启动存储设备上,则根文件系统将刷写到此分区。U-Boot 期望启动配置文件和内核文件存在于 <rootfs>/boot 目录中。flash.sh 脚本在 APP 分区中刷写以下内核文件:
内核 (Image)
启动配置文件 (extlinux/extlinux.conf)
注意
flash.sh 脚本将根文件系统位于 IP 网络上的配置视为特殊情况。它在 <APP partition>:/boot 目录中刷写这些内核文件。

完整启动内存设备分区布局

有关启动存储设备配置文件的示例,请参阅
对于 Jetson Nano 设备:flash_l4t_t210_spi_sd_p3448.xml
对于 Jetson TX2 系列:flash_l4t_t186.xml

构建设备树编译器

设备树编译器 (DTC) 必须从源代码构建。
注意
如果您不想将 DTC 文件名作为参数传递给 U‑Boot 环境,请确保包含 DTC 的本地目录(例如 /usr/local/bin/)位于 shell 命令路径的开头。
要从源代码构建 DTC
1. 运行以下命令下载 DTC 源代码并转到 DTC 源代码树的根目录
$ git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git
$ cd dtc
此过程的其余部分假定您当前的工作目录是 DTC 源代码树。
2. 运行以下命令来构建 DTC
$ make
要在默认目录 $HOME 中构建 DTC,请运行
$ make install
要在特定目录中构建 DTC,请运行
$ make install PREFIX=/usr/local
其中 PREFIX 指定目录的路径名。
在任何情况下make 都会在安装目录下构建以下目录:
bin
lib
include

替换内核

您可以使用您自己的自定义内核替换内核。使用适用于您设备的启动存储设备类型的过程。
要在实时系统上直接替换内核
您可以在 SD 卡和 USB 存储启动内存设备上使用此过程。
1. 启动 Jetson 设备。
2. 使用 scp 将新的内核文件复制到 Jetson 设备上的 /boot 目录中。
3. 重新启动 Jetson 设备。
要在从 SD 卡或 USB 设备启动的系统上替换内核
1. 将启动内存设备(SD 卡或 USB 设备)连接到您的主机系统。
2. 将新的内核文件复制到启动内存设备上的 /boot 目录中。
3. 从主机系统断开启动内存设备的连接。
4. 将启动内存设备连接到 Jetson 设备。
5. 重新启动 Jetson 设备。
要在从 NFS 服务器启动的系统中替换内核
1. 启动 Jetson 设备。
2. 在 Jetson 设备上输入以下命令
$ sudo mount /dev/mmcblk0p1 /mnt
3. 使用 scp 将新的内核文件复制到 Jetson 设备上的 mnt/boot 目录中。
4. 重新启动 Jetson 设备。

复制根文件系统

对于外部介质,您必须在运行 flash.sh 命令之后将根文件系统复制到设备。然后,将设备连接到目标系统。这是必需的,因为 flash.sh 脚本在运行时会将所需的文件添加到主机上的根文件系统目录。

启动顺序和 Sysboot 配置文件

U-Boot 功能包括默认启动扫描顺序。它按以下顺序扫描可启动设备:
外部 SD 卡
内部 eMMC
USB 设备或 NVMe 设备(仅限 Jetson TX2 系列)
通过 DHCP/PXE 的 NFS 网络
U‑Boot 在每个可启动设备上的可启动分区的以下目录中查找 extlinux.conf 配置文件:
<rootfs>/boot/extlinux
找到 extlinux.conf 文件后,U-Boot 执行以下步骤:
1. 使用 sysboot 命令从 extlinux.conf 中读取启动配置
2. 加载内核 Image 文件
3. 启动内核
Image 文件在启动后在 <rootfs>/boot 位置可供用户访问。extlinux.conf 文件在 <rootfs>/boot/extlinux 位置可供用户访问。您可以轻松更改这些文件以测试您自己的内核,而无需刷写。
extlinux.conf 文件是标准的文本格式 sysboot 配置文件,其中包含所有启动信息。它指示内核镜像文件名、设备树 blob 文件名和内核启动命令行。

优化 U-Boot 启动时间

默认情况下,U-Boot 使用默认配置,该配置启用所有受支持的硬件功能。它搜索可用设备以查找启动脚本。这为最广泛的存储设备和启动配置提供了开箱即用的支持。
这种灵活性会延迟最终操作系统的执行,因为硬件支持需要时间来初始化,并且扫描所有连接的存储和网络设备需要时间。在受限或预配置的系统中,这种灵活性可能不是必需的。您可能提前知道哪个存储设备包含所需的文件,或者某些设备不需要由引导加载程序初始化。为了优化启动时间,请配置 U-Boot 以利用这些约束来减少系统启动时间。
这些更改必须在 U‑Boot 源代码中进行。

禁用 PCIe 支持

U-Boot 延迟枚举和初始化 PCIe 设备,直到用户或启动脚本显式尝试访问 PCIe 设备。因此,禁用 PCIe 支持不会减少启动时间。
要禁用 PCIe 支持
1. include/configs/<board>.h 中删除以下值:
CONFIG_PCI_EHCI
CONFIG_PCI_TEGRA
CONFIG_CMD_PCI
2. configs/<board_and_rev>_defconfig中删除以下值:
CONFIG_PCI_TEGRA
CONFIG_RTL8169
CONFIG_E1000
其中 <board><board_and_rev>命令中的占位符章节中进行了描述。

启用/禁用 ASPM 支持

U-Boot 延迟枚举和初始化主动状态电源管理 (ASPM) PCIe 设备,直到用户或启动设备显式尝试访问 PCIe ASPM 设备。因此,禁用 ASPM 支持不会减少启动时间。
要启用 ASPM 支持
1. configs/<board_and_rev>_defconfig中删除以下值:
CONFIG_PCIEASPM
2. 添加以下值:
CONFIG_PCIEASPM_POWERSAVE=y
其中 <board_and_rev>命令中的占位符章节中进行了描述。
要禁用 ASPM 支持
1. configs/<board_and_rev>_defconfig中删除以下值:
CONFIG_PCIEASPM_POWERSAVE=y
2. 添加以下值。
CONFIG_PCIEASPM
其中 <board_and_rev>命令中的占位符章节中进行了描述。

禁用 USB 支持

U-Boot 延迟枚举和初始化 USB 设备,直到用户或启动脚本显式尝试访问 USB 设备。因此,禁用 USB 支持不会减少启动时间。
要禁用 USB 支持
1. configs/<board_and_rev>_defconfig 中删除以下值:
CONFIG_CMD_USB
CONFIG_CMD_USB_MASS_STORAGE
CONFIG_USB
CONFIG_USB_GADGET
CONFIG_USB_GADGET_DOWNLOAD
2. 编辑 include/configs/<board>.h 以删除 tegra-common-usb-gadget.h#include
3. 编辑 include/configs/tegra-common-post.h 以从 BOOT_TARGET_DEVICES 中删除 USB 条目。
其中 <board><board_and_rev>命令中的占位符章节中进行了描述。

环境配置

U-Boot 运行时行为由 U-Boot 环境中包含的脚本控制。当 U-Boot 开始执行时,它会等待 <bootdelay> 秒,然后执行自动启动顺序。在此期间,用户可以中断启动过程以访问 U-Boot shell。如果未中断,U-Boot 会执行 <bootcmd> 作为 shell 命令。<bootcmd> 包含一系列命令,用于搜索存储设备以查找启动脚本并执行它们。
通过在编译或制造时修改这些变量的值,可以指示 U‑Boot 以特定方式从特定设备启动,从而减少启动时间。
下表标识了可以修改的变量。
变量
描述
bootdelay
包含 U-Boot 暂停的秒数,以确定用户是否要中断启动顺序。
要消除延迟,请设置为 0。
注意:如果用户请求在到达 U-Boot shell 之前中断启动过程,即使 bootdelay 设置为 0,该请求也会被接受。
如果延迟小于 0,则 U‑Boot 会显示启动菜单并禁用自动启动。
bootcmd
包含要在启动时自动执行的 U-Boot shell 命令序列。
请注意,许多简单的自定义(例如选择特定的存储设备进行启动)不需要编辑此值。
boot_targets
包含 U-Boot 扫描以查找启动脚本的存储设备或网络协议的空格分隔列表。
有效值包括
mmc0:内置 eMMC
mmc1:SD 卡插槽
usb0:任何连接的 USB 大容量存储设备
nvme0:任何连接的 NVMe 设备
pxe:网络,使用 DHCP 接收 IP 地址,然后使用 PXE 下载 syslinux 配置文件
dhcp:网络,使用 DHCP 接收 IP 地址,然后使用 TFTP 下载 U-Boot 启动脚本
如果应用程序不需要备用启动设备,则此变量可以指定可能值的子集,甚至可以指定为单个值。
scan_dev_for_boot_part
包含用于解析设备分区表并确定 U-Boot 必须扫描哪个分区以查找启动文件的脚本。
如果分区号是预先知道的,请将脚本替换为更简单的脚本,该脚本将 <devplist> 的值硬编码为单个分区号(以十六进制表示),然后运行以下变量中的一个或两个:
scan_dev_for_extlinux
scan_dev_for_boot_scripts
boot_prefixes
包含要扫描启动脚本或配置文件的文件系统目录列表。
文件系统布局在不同的安装中有所不同。例如,启动目录可以是文件系统根目录中的 /boot,也可以是在文件系统上其他位置挂载的单独分区。
默认情况下,U-Boot 搜索根目录 ( / ) 和 /boot/
在受限情况下,用户可以将此变量设置为单个目录名称,以便 U-Boot 不搜索不必要的目录。
注意:此变量中的所有条目都必须包含前导斜杠和尾部斜杠。
scan_dev_for_extlinux
包含用于搜索 extlinux 配置文件的脚本。如果找到,则根据其内容启动系统。
如果已知系统不使用 extlinux 配置文件,请将此脚本设置为无害命令,例如 true。不要将其留空,否则 U‑Boot 会抱怨尝试将空变量作为脚本执行。
scan_dev_for_scripts
包含用于搜索 U-Boot 启动脚本的脚本。如果找到,则加载并执行它们。
如果已知系统不使用 U-Boot 启动脚本,请将此脚本替换为无害命令,例如 true。(请参阅 scan_dev_for_extlinux 的说明。)
注意:默认的启动脚本在执行 <scan_dev_for_extlinux> 之前执行 <scan_dev_for_scripts>。因此,修改此变量不会影响使用 extlinux 配置文件启动的系统,因为永远不会执行此脚本。
boot_scripts
包含一个空格分隔的 U-Boot 脚本名称列表,供 <scan_dev_for_scripts> 搜索。
如果事先知道脚本名称,请将此变量设置为所需的值,而不是默认列表。

设置环境变量

您可以在以下时间设置环境变量:
编译时
制造时
刷写时

编译时间

当 U-Boot 开始执行时,它会尝试从闪存中存储的数据初始化环境变量。数据的位置由板上的 U-Boot 配置文件确定。如果数据丢失或损坏,U-Boot 将使用内置在 U-Boot 二进制文件中的默认值集。
默认的 L4T 刷写过程不会将此数据写入闪存,因此最初始终使用内置副本。内置默认值在 U-Boot 源代码的以下位置设置。
注意
在下表中
固定宽度的名称(大写)表示 U-Boot 源代码中的配置变量。示例:CONFIG_BOOTDELAY
固定宽度的名称(小写)表示环境变量。示例:bootdelay
 
U-Boot 源代码
环境变量值
include/config_distro_bootcmd.h
定义与自动启动过程相关的变量和脚本。
include/config/auto.conf
CONFIG_BOOTDELAY 设置 bootdelay 的值。
include/configs/tegra‑common‑post.h
BOOT_TARGET_DEVICES 设置 boot_targets 的值。
BOOT_TARGET_DEVICES 还决定了可以出现在 boot_targets 中的合法值集。从此变量中删除条目会完全阻止在 <boot_targets> 中使用这些值。
要在编译时修改此值
1. 修改 include/config_distro_bootcmd.h 以避免在特定于板的配置文件已定义此值的情况下设置 boot_targets
2. 修改 include/config/<board>.h 以设置 boot_targets
(其中 <board>命令中的占位符 部分中描述。)

制造和刷写时间

您可以修改您的制造流程,以将环境变量的保存副本写入闪存。以下是一些修改制造流程的替代方法:
刷写板卡后,安排板卡执行 U-Boot,并使 U-Boot 执行修改和保存环境的命令
重置板卡,以便 U-Boot 运行并执行通过串行控制台发送的命令。您必须在主机系统上编写并执行一个程序,该程序检测 U-Boot 何时开始运行,中断 U-Boot 自动启动过程,并向 U-Boot 发送命令。
执行类似于以下的命令序列:
$ env default –f –a; setenv boot_targets mmc0; saveenv
手动编辑 U-Boot 环境,保存它,并将适当的闪存区域提取到主机系统上的文件中。然后修改 Jetson L4T 分区布局 XML 文件,以便在任何后续刷写过程中将数据写入闪存。
如果您的制造过程直接对闪存芯片进行编程,而不是在每个板卡上使用 L4T 刷写工具,您也可以使用此技术。您必须将保存的、提取的环境数据合并到您的闪存映像文件中,而不是从 L4T 分区布局 XML 文件中引用它。
使用 U-Boot fw_env 工具生成一组保存的环境数据,该工具位于 U-Boot 源代码的 tools/env 目录中。然后修改 L4T 分区布局 XML 文件,以便在任何后续刷写过程中将数据写入闪存。
如果您的制造过程直接对闪存芯片进行编程,而不是在每个板卡上使用 L4T 刷写工具,您也可以使用此技术。您必须将保存的、提取的环境数据合并到您的闪存映像文件中,而不是从 L4T 分区布局 XML 文件中引用它。

extlinux.conf

U-Boot 使用 EXTLINUX 来控制启动过程,如 SysLinux/PXELinux 规范所指定的那样。它从 /boot/extlinux/extlinux.conf 加载配置文件,并使用它查找和启动内核映像、RAM 磁盘,以及可选的内核 DTB,并将命令行参数添加到内核。
U-Boot 使用 TIMEOUTDEFAULTMENULABELKERNELINITRDFDTAPPEND 指令,如下例所示。它支持 NVIDIA 扩展,在以下部分中描述。
修改 extlinux.conf 后,通过重新运行 flash.sh 重新生成 system.img rootfs 映像,并将其刷写到板卡的 APP 分区。或者,您可以在启动 Jetson 设备后编辑 rootfs 中的 /boot/extlinux/extlinux.conf。Jetson Linux 将在下次重启时应用新内容。
extlinux.conf 文件示例
这是一个 extlinux.conf 文件的示例,适用于 Jetson Linux 中使用。
TIMEOUT 30
DEFAULT primary
MENU TITLE L4T 启动选项
LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
删除 extlinux.conf 启动菜单
Jetson Linux extlinux.conf 文件配置为在启动前向用户显示启动菜单三秒钟。要减少启动处理时间,您可以删除此超时。
编辑 extlinux.conf 以删除包含以下关键字的行:
TIMEOUT
MENU
在已安装的 L4T 目标系统上,此文件位于
/boot/extlinux/extlinux.conf
在刷写之前,此文件位于主机 L4T 刷写目录的 bootloader 目录中。
DTB 覆盖
U-Boot 可以加载 DTB 覆盖 (DTBO) 文件,以支持插件设备,例如 IMX477 摄像头、MCP51x CAN 控制器、Fe-Pi Audio Z 卡等。DTB 覆盖文件通过 extlinux.conf 文件的 FDTOVERLAYS 属性来识别。
DTB 覆盖非常有用,因为载板的内核 DTB 无法表示每个可能的附加设备。例如,它无法表示连接到 40 针扩展连接器的插件设备。开发人员可以修改内核 DTB 源代码以添加必要的节点、属性以及支持所需设备所需的其他更改,并重新刷写或重新加载 DTB,但这既困难又容易出错,可能会导致冲突(phandle 等),并且在开发和调试期间必须重复多次。
更好的方法是通过将覆盖(DTBO 文件)加载到随 Jetson Linux 分发的内核 DTB 上来添加对新设备的支持。覆盖仅包含设备所需的新属性和节点。
U-Boot 将 FDTOVERLAYS 属性命名的任何 DTBO 文件合并到早期引导加载程序加载的 DTB 中,然后将合并后的 DTB 传递给内核。
覆盖可以与 extlinux.confFDT 属性指定的基于磁盘的内核 DTB 一起使用,但更好的方法是在没有 FDT 的情况下使用 FDTOVERLAYS。这确保了引导加载程序从闪存使用的相同 DTB 在启动时传递给内核,并合并了来自 DTBO 文件的新信息。
DTB 文件(包括覆盖)通常存储在 rootfs 中的 /boot/dtb/ 中。Jetson Linux 约定是对覆盖文件使用扩展名 .dtbo,以将其与全局 .dtb 文件区分开来,但 U-Boot 不要求这样做。
您可以通过在指定 FDTOVERLAYS 属性的行上列出所有 DTBO 文件(以空格分隔)来加载多个 DTBO 文件。U-Boot 不支持多行属性,因此请将所有 DTBO 文件放在单行上。
为未连接的设备应用 DTBO 文件可能会导致内核出现错误或警告,因为它会看到节点和属性并尝试加载驱动程序以支持缺少的硬件。例如,如果您在未插入 FE-Pi Audio Z 卡时加载了该卡的覆盖,则可能会发生这种情况。
带有 DBT 覆盖的 extlinux.conf 文件示例
此示例与 extlinux.conf 文件示例 下的示例类似,如上,但说明了如何加载 DTB 覆盖(在本例中为 jetson-mcp251x.dtbo)。请注意更改后的 MENU LABEL 行和添加的 FDTOVERLAYS 行。
TIMEOUT 30
DEFAULT primary
MENU TITLE L4T 启动选项
LABEL primary
MENU LABEL 加载 DTBO
LINUX /boot/Image
INITRD /boot/initrd
FDTOVERLAYS /boot/dtb/jetson-mcp251x.dtbo
APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
从 U-Boot 命令提示符加载 DTB 覆盖
您可以在 U-Boot 命令提示符下输入命令,从 rootfs 加载 DTB 覆盖文件。以下示例说明了这一点。它假设引导加载程序 DTB 文件的数据位于 $fdt_addr 中,并且 rootfs 位于 SD 卡上
$ load mmc 1 $fdtoverlay_addr_r /boot/dtb/jetson-mcp51x.dtbo
$ fdt addr $fdt_addr
$ fdt resize 8192
$ fdt apply $fdtoverlay_addr_r
组合后的 DTB 现在位于 $fdt_addr,可以通过 booti 传递给内核,或者使用 fdt print 等命令进行检查/转储。这与 U-Boot 在解析 extlinux.conf 时用于应用 DTBO 文件 (或多个文件) 的序列相同。
U-Boot README 中讨论了手动覆盖加载方法,位置如下:
3rdparty/u-boot/doc/README.fdt-overlays
此 README(可在我们的 L4T U-Boot 源代码中获得,或通过 Denx 上游获得)未记录 FDTOVERLAYS 属性。

在 U-Boot 环境中调试

使用这些调试技巧来帮助您调试 U-Boot 环境。这些示例并不代表 U-Boot 功能的完整列表。有关 U-Boot 支持的命令及其用法的完整列表,请查阅 U-Boot 文档和源代码。
要中断 U-Boot
1. 将终端应用程序连接到板的串行端口。
2. 打开电源或重置板卡。
3. 等待 U-Boot 注册消息出现。在此消息出现之前按下的按键可能会被忽略。
4. 按任意键中断自动启动过程。
要查看 U-Boot 帮助文本
要查看 U-Boot 帮助文本,请输入以下命令:
# help
要列出设备的目录结构
要列出 eMMC 设备 0 分区 1 的目录结构,请在目标设备上输入此命令:
# ls mmc 0:1
此命令在 EXT2/3/4 和 FAT 文件系统上均可正常工作。
示例输出如下:
<DIR> 4096 .
<DIR> 4096 ..
<DIR> 4096 bin
<DIR> 4096 boot
<DIR> 4096 dev
<DIR> 4096 etc
<DIR> 4096 home
<DIR> 4096 lib
<DIR> 4096 lost+found
<DIR> 4096 media
<DIR> 4096 mnt
<DIR> 4096 opt
<DIR> 4096 proc
<DIR> 4096 root
<DIR> 4096 sbin
<DIR> 4096 selinux
<DIR> 4096 srv
<DIR> 4096 sys
<DIR> 4096 tmp
<DIR> 4096 usr
<DIR> 4096 var
要列出目录的内容
运行此命令:
# ls mmc 0:1 <directory>
其中 <directory> 是文件系统中的路径名。
例如,要列出 /boot 目录的内容(Image 文件应位于其中,如下例输出所示),请使用以下命令:
# ls mmc 0:1 /boot
<DIR>       1024 .
<DIR>       1024 ..
             908 extlinux
         5910248 Image
如果您知道目录所在的文件系统类型,则可以使用 U-Boot 中实现的文件系统特定的目录列出命令之一:ext2lsfatls 等。
要打印 U-Boot 环境
运行此命令:
# printenv
要打印环境变量
运行此命令:
# printenv <environment_variable>
其中 <environment_variable> 是 U-Boot 中的环境变量。
例如,要打印 U-Boot 向其发送控制台输出的设备列表,请运行:
# printenv stdout
输出如下所示:
stdout=serial
要设置环境变量
运行此命令:
# setenv <environment_variable> <new_value>
其中 <environment_variable> 是 U-Boot 中的环境变量,<new_value> 是该变量的新值。
例如,要修改 U-Boot 向其发送控制台输出的设备集,请运行:
# setenv stdout serial
要保存修改后的环境
运行此命令:
# saveenv
该命令在重置和重启的情况下保留保存的修改后的环境。