学习目标:

 使用 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 系统启动完成。

二、嵌入式设计流程

  1. 通过 Vivado 创建硬件平台,得到 xsa 文件;
  2. 运行 source <petalinux 安装路径>/settings.sh,设置 Petalinux 运行环境
  3. 通过 petalinux-create -t project 创建 petalinux 工程;
  4. 使用 petalinux-config --get-hw-description, 将 xsa 文件导入到 petalinux 工程当中并配置
    petalinux 工程;
  5. 使用 petalinux-config -c kernel 配置 Linux 内核;
  6. 使用 petalinux-config -c rootfs 配置 Linux 根文件系统;
  7. 配置设备树文件;
  8. 使用 petalinux-build 编译整个工程;
  9. 使用 petalinux-package --boot 制作 BOOT.BIN 启动文件;
  10. 制作 SD 启动卡,将 BOOT.BIN 和 image.ub 以及根文件系统部署到 SD 卡中;
  11. 将 SD 卡插入开发板,并将开发板启动模式设置为从 SD 卡启动;
  12. 开发板连接串口线并上电启动,串口上位机打印启动信息, 登录进入 Linux 系统

三、使用Petalinux定制Linux系统

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

在这里插入图片描述
这里不做配置,直接保存退出。

  1. 配置设备树
    设备树的概念:设备树用于保存 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 = <&ethernet_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";
};

  1. 编译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 目录下,如下图:
    在这里插入图片描述
  1. 制作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
  1. 上板测试
    此处就不赘述了。

上述内容记录如何使用Petalinux 定制 Linux 系统,参考正点原子开发文档

更多推荐