PetaLinux 简介 - 第 2 部分

作者:Aoifem,AMD工程师;来源:AMD开发者社区

简介

此博客是 PetaLinux 简介 - 第 1 部分的续篇。它面向想要开始使用 PetaLinux 以及希望了解其关键工具、概念和功能的任何用户。在第一篇博客中,我们介绍了如何创建 PetaLinux 工程以及如何修改镜像。在这第二篇博客中,我们将在“第 1 部分”中创建的工程的基础上,继续介绍如何构建系统镜像并在 Zynq UltraScale+™ ZCU102 评估套件上启动该镜像。

我将全程完成本教程中所需的基本步骤,但博客的篇幅有限,不可能面面俱到。您可以在 AMD 网站(单击此处)上找到有关 PetaLinux 的更多信息。 

PetaLinux 设计流程:

在第一篇博客中,我们完成了以下红色虚线框中的第 1 部分。我们学习了如何创建 PetaLinux 工程和修改镜像。

在本教程中,我们将构建镜像并将其加载到开发板上(下图中的第 2 和第 3 部分)。然后,我们将测试开发板,确定是否按预期实现了相应的配置。 

1.png

步骤 1 – 构建镜像:

过程:

在此步骤中,我们将构建镜像,以便将其转换为开发板可以运行和理解的形式。如果您想要跳过此步骤,或者尚未完成“PetaLinux 简介 - 第 1 部分”,可以下载本博客随附的已构建完成的文件。

只需使用一条命令即可构建系统。

在 Linux 终端上,使用 cd 命令切换到工程目录。

使用以下命令构建镜像:

petalinux-build

 解释:

1) 运行的命令:

petalinux-build 命令用于自动执行一系列步骤(如下所列),以简化用户的构建过程。

但是,也可以手动执行这些步骤。如果您愿意,可以按以下顺序逐个执行这些步骤,而不使用上述构建命令。

步骤 1:

petalinux-build -x bootloader

创建第一阶段启动加载程序 (FSBL)。FSBL 将配置处理子系统,加载 PL,然后移交给辅助启动加载程序 (U-Boot)。

步骤 2:

petalinux-build -x pmufwls

构建可编程管理单元固件 (PMUFW)。PMUFW 用于控制系统内资源的上电与监控。

步骤 3:

petalinux-build -x arm-trusted-firmware

在这个步骤中将构建 ARM 可信固件 (ATF)。ATF 为 ARMv8 架构提供对安全软件的引用。

步骤 4:

petalinux-build -x device-tree

在这个步骤中将构建设备树。设备树是使用设备树生成器 (Device Tree Generator) 创建的,该工具是基于 Tcl 的工具,使用 HSI 实用工具来创建设备树节点。

DTG 内置于 PetaLinux 中。PetaLinux 使用硬件描述文件 (HDF) 作为 DTG 的输入。HDF 会向 DTG 描述硬件。如果未提供 HDF,则 PetaLinux 将使用基于模板的默认设置(在本例中为 ZynqMP)。设备树用于向内核描述硬件。

步骤 5:

petalinux-build -x u-boot

在这个步骤中将构建 U-Boot。U-Boot 是用于启动内核的开源应用。PetaLinux 将使用 U-Boot 的特定分支(版本),其中包含有关 AMD 开发板的附加信息以及 defconfig 和设备树信息。

用户也可以使用 petalinux-build -x <component> 命令自行构建各个组件(例如设备树)。

2) 添加的文件:

petalinux-build 命令完成后,以下文件将被添加到 <project root>/images/linux 文件夹内:

  • image.ub

    • 请注意 .ub 扩展名。U-Boot 工具中有一个 mkimage 实用工具,它会将头文件信息添加到 U-Boot 应用在内核启动过程中使用的内核镜像中。

  • zynqmp_fsbl.elf

  • pmu.elf(或者在更高版本的 Petalinux 中则会添加 pmufw.elf)

  • u-boot.elf

  • bl31.elf(即 ATF)

  • design_1_wrapper.bit(或者在更高版本的 PetaLinux 中则会添加 system.bit)

2.png

步骤 2 – 封装文件

为了使开发板能够正常运行,需要将上一步中构建的关键文件封装到可启动镜像中(在本例中为 SD 镜像)。PetaLinux 包含一条 petalinux-package 命令,它使用 bootgen 实用工具来创建 SD 启动镜像。  

如果您想要跳过此步骤,或者尚未完成“PetaLinux 简介 - 第 1 部分”,可以下载本博客随附的文件。

cd images/linux
petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga system.bit --u-boot

或者

petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga design_1_wrapper.bit --u-boot

3.png

步骤 3 – 在 ZCU102 评估板上启动 Linux:

在本章节中,我们将了解如何将 Petalinux 工程文件加载到 ZCU102 评估板上。

我们的开发板需要两个文件才能正常工作:BOOT.bin 文件和 image.ub 文件。

过程:

将 BOOT.bin 和 image.ub(位于 <project root>/images/linux 中)从您的计算机复制到 SD 卡上,然后将该卡插入 ZCU102 评估板上的 SD 卡槽中。如果未完成以上步骤,可使用这篇博客随附的镜像和启动文件。

调整 ZCU102 评估板上的启动模式管脚(开关 SW6),将其设为 SD 模式。如需了解有关 ZCU102 评估板及其设置方法的更多信息,请参阅用户指南(单击此处)。

4.png

5.jpg

将 UART 从 ZCU102 连接到计算机,这样您就可以看到开发板的输出。

给开发板上电。

在计算机上打开终端通信软件(如 TeraTerm)以查看开发板的输出。

如果您不确定如何设置开发板,该用户指南中对此进行了更为详细的说明。 

您应该可以在终端输出中看到如以下截屏所示的内容:

  • FSBL 应用(带调试)执行

  • ATF(ARM 可信固件)执行

  • U-Boot 执行、加载 image.ub 并执行

  • 内核启动

注释:默认的登录/密码为 root

6.png

步骤 4 - 探索内核

在“PetaLinux 简介 - 第 1 部分”中,我们在 Verilog 中设计了硬件,如下图所示。由于我们针对 Zynq UltraScale+ PS 使用了预定义的设置,因此已在 zynq_ultra_ps_e_0 IP 中启用 PS GPIO(如下面的绿框中所示)。

我们在硬件中添加了 AXI GPIO 和 LED,如下图中的红框所示。

7.png

为了检查开发板的配置是否正确,在此步骤中,我们将手动测试开发板上的 LED。

过程:

1) 找到 AXI GPIO 地址:

首先,我们需要找到 AXI GPIO 的地址,才能向 LED 发送信号。  

在 Linux 控制台中,从根目录切换到 GPIO 目录:

 cd /sys/class/gpio/

打开此目录后,您可以使用 ls 命令来查看标记为“gpiochipXXXX”的一些 GPIO 芯片:

ls /sys/class/gpio

您将看到以下输出:

export  gpiochip330  gpiochip504  unexport

但我们如何确定这些芯片中哪个与 AXI GPIO 相关联呢?  

要进行检查,我们需要查看 GPIO 芯片的标签:

cat /sys/class/gpio/gpiochip330/label

此命令将输出以下内容:

zynqmp_gpio

这意味着它是 Zynq MP 的 GPIO 芯片,不是我们要寻找的芯片。

接下来我们查看第二个芯片的标签:

cat /sys/class/gpio/gpiochip504/label

我们会获得以下输出:

/amba_pl@0/gpio@a0000000

AMBA_PL 名称告诉我们这是 AXI GPIO 芯片。其后的数字是它的地址。

这就是我们要找的 GPIO 芯片。我们现在知道,所需的基本管脚号是 504,偏移地址为 0。 

2) 开关 LED

要开关 AXI GPIO 管脚 0,请在终端通信软件(例如 TeraTerm)中使用以下命令。

管脚的计算公式如下:

base_pin + offset 或 504 + 0 = 504。 

我们将使用 Sysfs 命令控制 LED。Sysfs 是一个由 Linux 内核提供的伪文件系统。如需了解有关这些命令的更多信息,请参阅 Sysfs

在终端通信软件(例如 TeraTerm)中输入以下命令:

echo 504 > /sys/class/gpio/export (asks the kernel to export control of GPIO 504 to userspace)echo out > /sys/class/gpio/gpio504/direction (initialises GPIO value as low)echo 1 > /sys/class/gpio/gpio504/value (LED Turns ON)echo 0 > /sys/class/gpio/gpio504/value (LED Turns OFF)echo 504 > /sys/class/gpio/unexport (unexport control of GPIO 504 from userspace)

8.png

您应该看到开发板上的 LED (DS38) 点亮,然后熄灭。

9.jpg

如果看到 LED 点亮然后熄灭,那么恭喜!您的 PetaLinux 工程目前正在开发板上运行,并且配置正确无误。

如果希望继续拓展 PetaLinux 知识,请随时探索 AMD 网站,其中包含大量有关 PetaLinux 的优秀示例和文章。