BSP 定制

您可以通过以下方式定制 NVIDIA® Jetson™ Linux 驱动程序包 (L4T):
在使用前手动配置和设置软件驱动程序。
使用 NVIDIA® SDK 管理器执行自定义设置。
 
注意
NVIDIA SDK 管理器执行以下操作
• 安装 NVIDIA® Jetson™ Linux 驱动程序包
• 配置或刷写您的 Jetson 设备
• 运行示例
如果您使用 SDK 管理器安装,请跳过这些主题。有关更多信息,请参阅平台对应的 Jetson 开发者套件用户指南中的“安装 JetPack”部分。

启动选项

在 NVIDIA® Jetson 参考板上,Linux 从集成内存(eMMC 或 QSPI)、连接内存(SD 卡或 USB 设备)或网络可访问存储上的根文件系统 (rootfs) 启动。
引导加载程序必须从内部 eMMC 加载。
内核和 DTB 可以从以下位置加载
SD 卡(格式化为 GPT)
USB 驱动器(格式化为 GPT)
网络(通过 DHCP/TFTP)
NVMe SSD(格式化为 GPT)

为 Jetson AGX Xavier 系列平台选择启动设备

适用于:Jetson AGX Xavier 系列
CBoot 启动选项 (CBO) 是一个设备树,可用于设置某些启动配置选项,例如启动设备优先级和用于从网络启动的 IP 地址。
CBO 设备树节点的名称是 boot-configuration

节点属性

boot-order
boot-order 属性包含按优先级排序的启动设备列表。每个设备都由其名称和控制器信息指定。可能的条目有
sd:表示任何控制器上的 SD 卡。
usb:表示任何控制器和端口上的外部 USB 大容量存储设备。
net:表示网络启动。
emmc:表示内置 MMC 存储。
nvme…:表示内置 NVMe SSD 存储。条目的格式是以下之一
nvme: C<n>
到 PCIe 设备 <n> 上的 NVMe 存储
nvme:pcie@<addr>
使用 PCIe 地址 <addr> 处的 NVMe 存储
nvme
使用任何可用的 NVMe 设备
例如
boot-order = "sd", "usb", "nvme", "net", "emmc";
tftp-server-ip
tftp-server-ip 属性指定 TFTP 服务器的 IP 地址。
该属性指定为
tftp-server-ip = /bits/ 8 <a b c d>
其中 <a b c d> 是 V4 IP 地址的四个部分。
dhcp-enabled
dhcp-enabled 属性没有值。如果它存在,设备将从 DHCP 服务器获取其 IP 配置。如果它不存在,设备将从 static-ipip-netmaskip-gateway 属性获取其 IP 配置。
static-ip、ip-netmask 和 ip-gateway
static-ip 属性在 IP 配置中指定静态 IP 地址。
ip-netmask 属性在 IP 配置中指定 IP 地址的子网掩码。
ip-gateway 属性在 IP 配置中指定网关的 IP 地址。
如果 dhcp-enabledfalse 或未指定,则所有三个属性都是必需的;否则,它们不是必需的,如果存在则会被忽略。
这些属性指定为
static-ip = /bits/ 8 <a b c d>
ip-netmask = /bits/ 8 <a b c d>
ip-gateway = /bits/ 8 <a b c d>
其中 <a b c d> 是 V4 IP 地址或子网掩码的四个部分。

示例

本主题介绍完整的 boot-configuration 定义示例。
示例:DHCP 已启用
/dts-v1/;
 
 
/ {
compatible = "nvidia,cboot-options-v1";
boot-configuration {
boot-order = "sd", "usb", "nvme", "emmc", "net";
tftp-server-ip = /bits/ 8 <10 1 2 3>;
dhcp-enabled;
};
};
示例:指定静态 IP 配置
/dts-v1/;
 
/ {
compatible = "nvidia,cboot-options-v1";
boot-configuration {
boot-order = "sd", "usb", "nvme", "net", "emmc";
tftp-server-ip = /bits/ 8 <10 1 2 3>;
static-ip = /bits/ 8 <10 1 2 2>;
ip-netmask = /bits/ 8 <255 255 255 0>;
ip-gateway = /bits/ 8 <10 1 2 1>;
};
};

重新构建 DTB

如果您修改了 DTS,则必须重新构建 DTB。
要修改 DTS 并重新构建 DTB
1. 在此目录中找到 cbo.dts 文件
$ cd <bsp>/Linux_for_Tegra/bootloader/
其中 <bsp> 是 Jetson 板级支持包 BSP 的位置。
2. 根据需要修改文件。有关更多信息,请参见上面的 节点属性示例
3. 输入此命令以将 DTS 转换为 DTB
dtc -I dts -O dtb -o cbo.dtb cbo.dts
dtc 可执行文件位于
<bsp>/Linux_for_tegra/kernel/dtc
4. 刷写分区 CPUBL-CFG。有关说明,请参见 刷写和启动目标设备

为其他平台选择启动设备

适用于:Jetson Nano 设备、Jetson TX2 系列和 Jetson TX1
在 NVIDIA® Jetson AGX Xavier™ 系列以外的平台上,CBoot 使用 U‑Boot 执行启动过程。启动设备优先级由 U‑Boot 确定。
有关更多信息,请参见主题 U‑Boot 定制中的 启动顺序和 Sysboot 配置文件部分。

Linux 主机系统先决条件

要在 Linux 主机系统上使用 L4T,必须满足以下硬件和软件先决条件
运行 Linux 的主机 PC
内核镜像
L4T 包含供您使用的内核镜像。或者,您可以从源代码下载并重新构建内核镜像。
引导加载程序
在 NVIDIA® Jetson 开发者板上刷写需要引导加载程序,即 NVIDIA T-Boot (nvtboot)。
网络文件系统
如果您打算从 Linux 主机系统或网络可访问服务器在参考板上启动 Linux。
连接到恢复端口的 USB 电缆。

在主机系统上设置 TFTP 服务器

主机系统必须提供 TFTP 服务器供目标设备使用。
要设置 TFTP 服务器
1. 通过输入此命令安装 tftp 包及其依赖项
$ sudo apt-get install xinetd tftpd tftp
2. 创建文本文件 /etc/xinetd.d/tftp,例如通过输入命令
$ sudo vim /etc/xinetd.d/tftp
3. 将以下内容放入文件中,然后保存
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = ~/tftpboot
disable = no
}
4. 生成已签名的内核镜像。创建目录 ~/tftpboot(指定由 server_args 定义的路径名)并将内核镜像复制到其中
$ sudo ./flash.sh -k kernel --no-flash --sign <board> mmcblk0p1
$ mkdir ~/tftpboot
$ cp /Linux_for_Tegra/bootloader/boot_sigheader.img.encrypt ~/tftpboot/boot.img
其中 <board> 是您的特定 Jetson 模块和载板支持的配置名称,如主题 快速入门中的 Jetson 模块和配置表的 $(BOARD) 列所示。
5. 生成已签名的 .dtb 并将 .dtb 文件复制到同一目录。
对于 NVIDIA Jetson Xavier™ NX
$ sudo ./flash.sh -k kernel-dtb --no-flash --sign jetson-xavier-nx-devkit mmcblk0p1
$ cp /Linux_for_Tegra/bootloader/tegra194-p3668-p3509-0000_sigheader.dtb.encrypt ~/tftpboot/jetson.dtb
对于 Jetson AGX Xavier 系列
$ sudo ./flash.sh -k kernel-dtb --no-flash --sign jetson-xavier mmcblk0p1
$ cp /Linux_for_Tegra/bootloader/tegra194-p2888-0001-p2822-0000_sigheader.dtb.encrypt ~/tftpboot/jetson.dtb
6. 重启 xinetd 服务器
$ sudo service xinetd restart

提取 Jetson Linux 驱动程序包

使用以下步骤提取 Jetson Linux 驱动程序包 (L4T)。示例中的命令假定您在 ~/ 中提取了发行包。
要提取 Jetson Linux 驱动程序包
通过执行以下命令手动提取软件包
$ sudo tar -vxjf Jetson_Linux_R<release_num>_aarch64.tbz2
其中 <release_num> 是当前版本的发行号。

登录凭据

L4T 不提供默认登录凭据。首次启动时创建您自己的登录凭据。

安装其他软件包

NVIDIA 在 APT (Debian) 存储库中提供额外的 L4T 软件组件和更新,可通过 apt 实用程序访问。
NVIDIA 维护以下 APT 存储库
对于 NVIDIA® Jetson™ Nano 设备和 Jetson TX1:https://repo.download.nvidia.com/jetson/t210
对于 Jetson TX2 系列:https://repo.download.nvidia.com/jetson/t186
对于 Jetson AGX Xavier 系列:https://repo.download.nvidia.com/jetson/t194
所有 Jetson 平台上使用的软件包:https://repo.download.nvidia.com/jetson/common
软件包 nvidia-l4t-apt-source 预安装在 L4T 根文件系统中。它识别其运行的平台,并将相应的存储库添加到软件源列表。
APT 存储库中的软件包使用 GPG 密钥签名。相应的公钥预安装在 L4T 根文件系统中。将存储库添加到源列表后,apt 可以下载并安装软件包。
注意
此处描述的 APT 存储库也用于升级现有软件包和安装 NVIDIA 添加到最初随 L4T 安装的软件包集中的软件包。有关更多信息,请参见主题 更新 Jetson 设备和主机

重新打包 Debian 软件包

您可以使用脚本 nvdebrepack.sh 重新打包现有的 L4T Debian 软件包。该脚本可以在 Linux_for_Tegra/tools/Debian/ 中找到。有关用法和示例,请参见 Linux_for_Tegra/tools/Debian/nvdebrepack.txt

自行构建 Debian 引导加载程序包

此过程是上述 重新打包 Debian 软件包过程的替代方法。
Debian 引导加载程序包根据您的 Jetson 设备中处理器的类型安装一个或多个有效负载文件。软件包的安装后脚本会自动从有效负载文件更新引导加载程序。
引导加载程序包的分布式版本仅支持 Jetson 参考载板。如果您正在使用自定义载板,您可能需要自定义此软件包以更改 ODM 数据、引脚复用分配等。要自定义引导加载程序
1. 生成您需要更改的 BUP 的自定义版本。
2. 解包软件包。
3. 将适用的 BUP 或 BUP 替换为您的自定义版本。
4. 将 BUP 重新打包到软件包中。
5. 安装自定义软件包。
本节介绍 NVIDIA 用于构建引导加载程序包的软件包依赖项和脚本。您可以将其用作创建自己的引导加载程序包的参考。

引导加载程序包的版本

Jetson Linux 可以获取两个版本的引导加载程序包,具体取决于您使用的 Jetson 设备。引导加载程序包安装以下有效负载
Jetson Nano 设备和 Jetson TX1 的软件包
/opt/ota_package/t21x/bl_update_payload
其他 Jetson 设备的软件包
Jetson Xavier NX 系列和 Jetson AGX Xavier 系列的 BUP
/opt/ota_package/t19x/bl_only_payload
/opt/ota_package/t19x/bl_update_payload
Jetson TX2 系列的 BUP
/opt/ota_package/t18x/bl_only_payload
/opt/ota_package/t18x/bl_update_payload
注意
有关更多信息,请参见有关 Jetson Xavier NX 系列、Jetson AGX Xavier 系列和 Jetson TX2 系列Jetson Nano 设备和 Jetson TX1 的“更新和冗余”部分中标题为“生成引导加载程序更新有效负载 (BUP)”的小节。

预依赖项和依赖项

引导加载程序包的预依赖项是
nvidia-l4t-core(必须与此软件包的主版本匹配)
软件包的依赖项是
nvidia-l4t-tools

软件包脚本

该软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。它执行 BUP 安装。

自行构建内核 Debian 软件包

注意
此过程是上述 重新构建 nvidia-l4t-kernel 过程的替代方法。
您可以通过获取内核源软件包、进行更改和构建 Debian 软件包来自定义 L4T 内核。
本节介绍 NVIDIA 用于构建内核软件包的软件包依赖项和脚本。您可以将其用作创建自己的 Debian 软件包的参考。

使用软件包

内核软件包都是开源的。四个内核软件包中的三个在 public_sources.tbz2 中。您可以从 NVIDIA 开发者中心通过以下链接下载此存档
此存档包含另一个名为 kernel_src.tbz2 的存档,而 kernel_src.tbz2 又包含三个头文件目录
nvidia-l4t-kernel/
nvidia-l4t-kernel-dtbs/
nvidia-l4t-kernel-headers/
debian.org Debian 维护者指南 提供了修改开源文件并从中创建新的 Debian 软件包的指南。
第四个内核软件包 nvidia-l4t-jetson-io 在下面的 nvidia-l4t-jetson-io 中讨论。

软件包依赖项

大多数 L4T Debian 软件包都预依赖于 nvidia-l4t-core。此软件包可防止在不兼容的 Jetson 平台上安装软件包,例如,在 Jetson Nano 设备上安装 Jetson TX2 内核。nvidia-l4t-core 如果检测到不兼容的平台,则不会执行安装。
nvidia-l4t-core 还防止部分升级,即一个 L4T 软件包升级到新的主版本(例如,从版本 32.4 升级到版本 32.5),但依赖于它的其他 L4T 软件包也未升级。部分升级可能会导致已升级的固件、程序和库与未升级的固件、程序和库之间出现兼容性问题。

nvidia-l4t-kernel

nvidia-l4t-kernel 包含 L4T 内核本身的文件。

预依赖项和依赖项

此软件包的预依赖项是
nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是

软件包脚本

此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。它执行以下操作
1. 执行 depmod -a
2. 创建名为 /usr/lib/linux/triggers/<release> 的 dpkg 触发器文件。触发器调用 /etc/kernel/postinst.d 中定义的操作,以在内核更新时更新 initramfs/grub configs/…。这符合标准的 Ubuntu 内核更新过程。

nvidia-l4t-kernel-dtbs

nvidia-l4t-kernel-dtbs 包含 L4T 设备树 Blob (DTB) 的文件。
该软件包将所有 .dtb 文件安装在 /boot/ 中。当您刷写板时,它会通过检查板规范与 DTB 的兼容性信息,将板使用的 .dtb 文件安装在 /boot/dtb/ 中。

预依赖项和依赖项

此软件包的预依赖项是
nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
device-tree-compiler
nvidia-l4t-kernel

软件包脚本

此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。
安装后脚本执行以下操作
1. 反编译 /boot/dtb/ 中板使用的 .dtb 文件,并在 /chosen 节点中获取 bootargs 属性。
2. 反编译 /boot/ 中相应的 .dtb 文件,并将步骤 1 中的 bootargs 属性替换到生成的 .dts 文件中。
3. .dts 文件重新编译为 .dtb 文件,并将其放在 /boot/dtb/ 中。

nvidia-l4t-kernel-headers

nvidia-l4t-kernel-headers 包含 L4T 内核头文件。

预依赖项和依赖项

此软件包的预依赖项是
nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
nvidia-l4t-kernel

软件包脚本

此软件包有一个安装后脚本,您可以通过提取 .deb 文件来获取它。该脚本执行以下操作
1. 将内核头文件 tarball 提取到 /usr/src/
2. 更新两个符号链接文件 buildsource,以指向正确的内核头文件目录。

nvidia-l4t-jetson-io

nvidia-l4t-jetson-io 包含与 Jetson I/O 功能相关的 Python 脚本。

预依赖项和依赖项

此软件包的预依赖项是
nvidia-l4t-core(必须与此软件包的主版本匹配)
此软件包的依赖项是
mount
python3
util-linux
nvidia-l4t-kernel
device-tree-compiler
您还可以通过提取 Debian 文件来获取依赖项。

软件包脚本

此软件包没有软件包脚本。

在 Linux 主机上配置 NFS 根目录

要从 NFS 启动目标设备,您必须在 Linux 主机系统上提供 NFS 根挂载点。
先决条件
用于在主机上安装软件包的以太网连接。
目标设备上的以太网连接。
要在 Linux 主机上配置 NFS 根目录
1. 在您的主机机器上安装 NFS 组件
$ sudo apt-get install nfs-common nfs-kernel-server
2. NFS 服务器必须知道您要为客户端导出的目录。此信息在 /etc/exports 文件中指定。
修改 /etc/exports 以使其看起来像这样
$ /nfsroot *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
添加条目后,使用以下命令重启
$ sudo /etc/init.d/nfs-kernel-server restart
3. 在您的 Linux 主机系统上创建 /nfsroot 目录
$ sudo mkdir /nfsroot
4. 设置 /nfsroot 目录的权限,如下所示
$ sudo chmod 755 /nfsroot
$ sudo chown root.root /nfsroot
5. 将文件系统复制到 nfsroot 目录
$ cd ./rootfs
$ sudo cp –a * /nfsroot
您可能必须在 rootfs 中禁用 oem‑config,使用主题 刷写和启动目标设备 中的 跳过 oem‑config 部分中的步骤,以使 NFS 可启动。
6. 导出根点
$ sudo exportfs -a
或者,您可以使用 -a-u 标志导出或取消导出所有目录。以下命令取消导出所有目录
$ sudo exportfs -au
7. 可选地,如果 Ubuntu 防火墙阻止 NFS 根访问,则必须禁用它,具体取决于您的配置,使用以下命令
$ sudo ufw disable
8. 如果执行 NFS 启动时出现问题,请通过 USB/SD/内部 eMMC 在启动的目标板上执行以下步骤,验证主机系统上的所有配置是否正确。应该可以在目标设备上挂载主机 NFS 根点
$ mkdir rootfs
$ sudo mount -v -o nfsvers=3 <IP-ADDR>:/nfsroot rootfs
其中 <IP-ADDR> 是 Linux 主机机器的 IP 地址,取自 ifconfig 命令。这证明主机配置是正确的。
注意
在目标系统上执行 mount 命令之前,使用以下命令安装 nfs-common 软件包
$ sudo apt-get install nfs-common
要使用 NFS 根点启动目标,请参见 刷写和启动目标设备。请务必包含 NFS 根点的 -N 选项。

确定版本和平台信息

使用以下步骤确定
刷写的 BSP 版本
内核版本
其他平台信息
要确定 BSP 版本和其他平台信息
执行命令
head -1 /etc/nv_tegra_release
输出类似于以下内容
# R31, REVISION: 0.0, GCID: , BOARD: t186ref, EABI: aarch64, DATE: Wed Aug  1 23:57:14 UTC 2018"
要确定内核版本
kernel 目录中执行此命令
head -22 Makefile | tail -3
输出类似于以下内容
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 140
如果系统正在运行,请使用以下命令确定内核版本
uname -a
输出类似于以下内容
Linux tegra-ubuntu 4.9.140-tegra #16 SMP PREEMPT Mon Jun 3 12:08:39 PDT 2019 aarch64 GNU/Linux
要确定启动配置
所有启动配置都存在于刷写配置中。例如,jetson-xavier.conf 提供以下信息
CHIPID=0x19;
EMMC_CFG=flash_t194_sdmmc.xml;
BOOTPARTSIZE=8388608;
EMMCSIZE=31276924928;
ITS_FILE=;
SYSBOOTFILE=p2972-0000/extlinux.conf;
BPFDTB_FILE=tegra194-a01-bpmp-p2888-a01.dtb;
DTB_FILE=tegra194-p2888-0001-p2822-0000.dtb;
TBCDTB_FILE=tegra194-p2888-0001-p2822-0000.dtb;
引导配置的完整定义位于 p2792-0000.conf.common 中。类似 jetson-xavier.conf 这样的文件会引用该文件,然后指定添加和更改。
默认内核构建配置如下
arch/arm64/configs/tegra_defconfig

提高系统性能

本节讨论您可以使用的自定义类型,以提高 Jetson 平台的性能。

轻量级窗口管理器替代方案

L4T 安装的窗口系统是 Gnome,它是标准的 Ubuntu 窗口管理器。在许多情况下,您可以通过将 Gnome 替换为轻量级窗口管理器来减少启动时间、响应时间、内存消耗和 CPU 利用率。NVIDIA 建议为此目的使用 LXDE 环境和 Compton 合成管理器。
有关 LXDE 安装说明和其他信息,请参阅主题 Window SystemsLXDE 部分。