Petalinux设计流程
学习目标:
使用 Petalinux 定制 Linux 系统, 学习 Petalinux的设计流程及如何简化 Linux 系统的开发。
备注:开发板 MPSOC 2EG
一、嵌入式软件栈
Zynq UltraScale+ MPSoC 上电后,首先由 BootROM 对 zynq 设备进行初始启动,然后引导加载 fsbl 到 OCM 并启动 fsbl; fsbl 启动后加载 PMU Firmware,然后加载 ARM Trusted Firmware,配置 DDR,最后将 uboot 加载到 DDR 并启动 uboot; uboot 启动后可选的加
载 hypervisor,并在 hypervisor 上运行 linux 系统,一般我们不使用 hypervisor,而是直接使用uboot 加载 linux 系统镜像到 DDR 并启动 linux,至此整个 linux 系统启动完成。
二、嵌入式设计流程
- 通过 Vivado 创建硬件平台,得到 xsa 文件;
- 运行 source <petalinux 安装路径>/settings.sh,设置 Petalinux 运行环境
- 通过 petalinux-create -t project 创建 petalinux 工程;
- 使用 petalinux-config --get-hw-description, 将 xsa 文件导入到 petalinux 工程当中并配置
petalinux 工程; - 使用 petalinux-config -c kernel 配置 Linux 内核;
- 使用 petalinux-config -c rootfs 配置 Linux 根文件系统;
- 配置设备树文件;
- 使用 petalinux-build 编译整个工程;
- 使用 petalinux-package --boot 制作 BOOT.BIN 启动文件;
- 制作 SD 启动卡,将 BOOT.BIN 和 image.ub 以及根文件系统部署到 SD 卡中;
- 将 SD 卡插入开发板,并将开发板启动模式设置为从 SD 卡启动;
- 开发板连接串口线并上电启动,串口上位机打印启动信息, 登录进入 Linux 系统
三、使用Petalinux定制Linux系统
- 创建Vivado平台

这是本文使用的xsa文件,该文件包含着 Vivado 工程所对应的硬件平台信息, Petalinux 根据这些信息来配置 fsbl、 uboot、内核等。将该文件拷贝到 Ubuntu 系统下。 此处我创建了一个 share 文件夹下并在该文件夹下创建一个 xsa 文件夹,将 system_wrapper.xsa 文件复制到该文件夹下, 如下所示。此时登录Ubuntu,即可在Linux中访问该文件。

- 设置Petalinux环境
终端输入以下指令
source /opt/pkg/petalinux/2019.2/settings.sh

2.创建Petalinux环境
输入以下指令在workspace下创建Petalinux文件夹,在Petalinux文件夹下创建名为”ALIENTEK-ZYNQ“的Petalinux工程。
mkdir -p workspace/petalinux/
cd workspace/petalinux/
petalinux-create -t project --template zynqMP -n ALIENTEK-ZYNQ

其中,template 参数表明创建的 petalinux 工程使用的平台模板,此处的 zynqMP 表明使用的是zynqMP Soc 平台模板的 petalinux 工程,用于 Zynq UltraScale+ MPSoC 系列的芯片。 name 参数(此处简写为“-n”)后接的是 petalinux 工程名,如此处的“ALIENTEK-ZYNQ”。 创建完成后如下图:

3. 配置Petalinux工程
首次配置 Petalinux 工程是将 xsa 文件导入到 Petalinux 工程中, Petalinux 工具会解析 xsa文件并弹出配置窗口。 在终端中输入如下命令配置 Petalinux 工程:
cd ALIENTEK-ZYNQ
petalinux-config --get-hw-description /mnt/hgfs/Share/xsa/
上述指令的作用是:进 入 到 ALIENTEK-ZYNQ 文 件 夹 , 并 配 置 petalinux 工 程 。 “ petalinux-config–get-hw-description”命令后面的文件夹就是我们复制到 Windosw 系统下的 share 共享目录中的 xsa 文件夹。需要注意的是: 如果后面修改了 Vivado 工程,重新生成 xsa文件后,可以重新执行“petalinux-config --get-hw-description xsa 文件所在文件夹所在位置”以重新配置 Petalinux 工程.
注意:
本文开发板的 SD 卡接在 PS 的 SD1 控制器,所以此处需要进入“Subsystem AUTO Hardware Settings” 子菜单,进行如下修改。

其他配置保持不变,退出配置,等待配置完成。如果后面想重新配置, 只需输入“petalinux-config”命令即可重新配置。配置完成后如下:

4. 配置Linux内核
终端输入如下命令:
petalinux-config -c kernel
等待一段时间会出现如下标签页:

此处不做配置,直接退出。完成以后的如下:

5. 配置Linux根文件系统
petalinux-config -c rootfs

这里不做配置,直接保存退出。
- 配置设备树
设备树的概念:设备树用于保存 Linux 系统中的各种设备信息,内核在启动过程当中会去解析设备树文件,获取设备所需的配置信息完成设备的初始化工作。
编辑当前 petalinux 工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 文件,将一些简单外设添加到系统当中。
vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

具体内容如下:
/include/ "system-conf.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
/ {
model = "Alientek Zynq MpSoc Development Board";
leds {
compatible = "gpio-leds";
gpio-led0 {
label = "ps_led1";
gpios = <&gpio 38 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
};
gpio-led1 {
label = "ps_led2";
gpios = <&gpio 39 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
gpio-led2 {
label = "pl_led1";
gpios = <&axi_gpio_0 0 0 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
};
gpio-led3 {
label = "pl_led2";
gpios = <&axi_gpio_0 1 0 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
};
keys {
compatible = "gpio-keys";
autorepeat;
gpio-key,wakeup;
gpio-key1 {
label = "ps_key1";
gpios = <&gpio 40 GPIO_ACTIVE_LOW>;
linux,code = <KEY_UP>;
};
gpio-key2 {
label = "ps_key2";
gpios = <&gpio 41 GPIO_ACTIVE_LOW>;
linux,code = <KEY_DOWN>;
};
gpio-key3 {
label = "pl_key1";
gpios = <&gpio 78 GPIO_ACTIVE_LOW>;
linux,code = <KEY_LEFT>;
};
gpio-key4 {
label = "pl_key2";
gpios = <&gpio 79 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RIGHT>;
};
};
};
&gem3 {
phy-handle = <ðernet_phy>;
local-mac-address = [00 0a 35 00 1e 53];
ethernet_phy: ethernet-phy@7 {
reg = <0x7>;
};
};
&gem0 {
psu_ethernet_0_mdio: mdio {
#address-cells = <1>;
#size-cells = <0>;
phy1:phy@4 {
reg = <0x4>; /* YT8521 phy address */
};
gmii_to_rgmii_0: gmii_to_rgmii_0@0 {
compatible = "xlnx,gmii-to-rgmii-1.0";
phy-handle = <&phy1>;
reg = <0>;
};
};
};
&sdhci0 {
mmc-hs200-1_8v;
bus-width = <0x8>;
non-removable;
};
&sdhci1 {
disable-wp;
no-1-8-v;
};
&i2c0 {
clock-frequency = <400000>;
eeprom@50 {
compatible = "24c64";
reg = <0x50>;
pagesize = <32>;
};
};
&dwc3_0 {
dr_mode = "host";
maximum-speed = "super-speed";
};
&usb0 {
dr_mode = "host";
};
- 编译Petalinux
petalinux-build
编译完成如下图:

8. 制作BOOT.BIN启动文件
ZYNQ 的启动文件 BOOT.BIN 一般包含 fsbl 文件、 bitstream 文件和 uboot 文件。 使用下面的命令可生成 BOOT.BIN 文件:
petalinux-package --boot --fsbl --fpga --u-boot --force
- “–fsbl”用于指定 fsbl 文件所在位置,后面接文件对应的路径信息,如果不指定文件位置,默认对应的是 images/linux/zynqmp_fsbl.elf;
- “–fpga”用于指定 bitstream 文件所在位置,后面接该文件对应的路径信息,默认对应的是 images/linux/system.bit,实际可能有区别;
- 选项“–u-boot”用于指定 U-Boot 文件所在位置,后面接该文件所在路径信息,默认为images/linux/u-boot.elf。这里没有指定对应的文件的路径信息则使用默认路径。
- 生成的 BOOT.BIN 文件放在 Petalinux 工程的 images/linux 目录下,如下图:

- 制作SD启动卡
SD卡引导linux驱动通常需要在SD卡中建立两个分区。- FAT32文件系统
- EXT4文件系统
由于在配置Petalinux工程时使用的是默认配置,根文件系统的类型默认为INITRAMFS,所以只需要一个使用FAT32文件系统的分区。下面是SD卡分区和格式化的具体步骤:
- 指令:将SD卡插入电脑,在终端输入如下命令
umount /dev/sdc*
sudo fdisk /dev/sdc
- 删除分区:输入p查看当前分区表,新建分区需要将以前的分区删除,输入d即可。存在多个分区时,输入d会提示删除相应的分区编号。
- 新建分区1:输入n新建;输入p使其为主,使用默认分区号(1)以及扇区(2048);设置最后一个分区(第一个分区大小),输入+500M(一般)
- 设置分区类型:输入t;输入c,设置为“W95 FAT32(LBA)”;输入a,设为引导分区
- 新建分区2:输入n新建;后续使用默认情况即可
- 格式化分区:
sudo mkfs.vfat -F 32 -n boot /dev/sdc1 #第一个分区格式化为FAT32并命名为boot
sudo mkfs.ext4 -L rootfs /dev/sdc2 #第二个分区格式化为ext4并命名为rootfs
- 挂载分区:重新插拔即可
- 复制镜像:将工程目录下的image/linux下的BOOT.BIN和image.ub拷贝到boot分区中即/dev/sdc1
- 上板测试
此处就不赘述了。
上述内容记录如何使用Petalinux 定制 Linux 系统,参考正点原子开发文档
更多推荐


所有评论(0)