ZYNQ学习笔记-Petalinux的使用

Petalinux可以简化ZYNQ-7000的Linux开发,这里记录一下基本使用流程。

设计流程

Petalinux设计流程一般如下:

  1. 创建硬件。使用vivado创建工程,设定硬件,导出hdf文件。
  2. 创建Petalinux工程。
  3. 导入硬件。导入vivado生成的hdf。
  4. 设置工程。
  5. 设置内核。
  6. 设置根文件系统。
  7. 配置设备树。
  8. 编译工程。
  9. 打包制作BIN文件。

创建硬件工程

这里需要使用vivado生成硬件工程。

这边偷懒一下,使用了小梅哥的BX71开发板给的出厂工程。其BlockDesign如图所示:

image-20240315224807284

可以看见它HDMI输出了一个色条。并且使用了PL端的ENET,并且为了适配板上的物理层芯片使用加了一个转换模块。

处理器的设置如下,开启了QSPI,UART1(与板子上的转换芯片相连),ENET0,USB0,SD0,GPIO。

image-20240315225137330

image-20240315225436429

ENET使用了EMIO(PL)端,并使用了MDIO(配置信号线)。

这里导出硬件信息,注意包含bit流。最后在工程目录下的sdk目录中得到hdf文件。

image-20240315225801357

在linux中创建petalinux工程文件夹,在该文件夹下创建hdf文件夹,将hdf文件夹整个拷贝到hdf下。

创建Petalinux工程

使用petalinux工程前,先使用source命令运行安装目录下的setting.sh文件,添加环境变量。

1
source petalinux2018.3/settings.sh

切换到之前的工程目录,在终端输入以下命令创建工程:

1
petalinux-create -t project --template zynq -n mylinux

image-20240315231253042

  • -t project:表明这是一个linux工程,而不是linux应用之类。
  • -n mylinux:指定工程名为mylinux。
  • --template zynq:设定这是一个ZYNQ的工程。

配置Petalinux工程

第一次配置时,需要将hdf文件导入到工程中,petalinux解析完成后会弹出配置界面。进入刚刚创建的mylinux工程,输入以下命令导入。

1
2
 petalinux-config --get-hw-description <hdf 文件
目录>

导入成功后会自动弹出配置窗口:

image-20240315233104690

这里对各个选项进行简单的说明。

  • Linux Components Selection

image-20240315233423687

星号表示已经使能。First Stage Bootloader是自动生成fsbl.elf文件。第二个是自动更新ps_init,即fsbl中的第一个函数。自动配置会让程序跟着hdf文件更新。下面两个是配置u-boot和linux内核的来源,一般默认就行。

  • Auto Config Setting

image-20240316000231659

自动配置各种组件(根据hdf文件)。

  • Subsystem AUTO Hardware Settings

image-20240316000904828

配置一些硬件设置。

第一个为系统处理器设置,程序跑在哪个核。

第二个用来配置内存大小以及程序基地址等等,根据hdf文件自动生成。

第三个选择使用哪个串口进行标志输入输出以及波特率,这里只开了一个串口。

第四个为网络设置,包括使用主网口,MAC地址设置和是否自动IP地址获取(DHCP)。

第五个设置FLASH(QSPI),设置FLASH的分区,用于从FLASH启动LInux时。

第六个设置默认的SD卡设备。

第七个设置RTC时钟,这里没开启。

最后为镜像设置。设置各种镜像存储在那个存储介质,包括boot(fsbl,bitstream,uboot,dtb(可选))、u-boot环境变量、jffs2文件系统(用来存配置信息)、dtb来源(设备树)。

  • DTG Settings

image-20240316002627246

MACHINE_NAME设置开发板的名字,用来对应开发板设备树(国外总是喜欢以开发板为配置单位)默认即可。

Kernel Bootargs设置,设置内核启动变量。

Devicetree flags 设备树相关

Devicetree overlay 设备树相关

Remove PL 设备树不自动包含PL端的设备。

  • u-boot Configuration

image-20240316003727615

配置uboot相关的设置。

第一个不知道。

第二个设置了uboot的配置文件。

第三个设置netboot,网络启动相关。

第四个设置TFTP服务器ip地址,网络下载镜像时使用。

  • Image Packaging Configuration

image-20240316004116822

第一个设置根文件系统的类型。默认是放在RAM中(内存模拟文件系统—根目录在内存中),和内核镜像打包在一起。也可以放在SD_card。

关于INITRAMFS

INITRAMFS 类型的根文件系统每次重新启动 linux 系统都是全新的、 未改动过的,也就是说启动系统后进行的所有修改掉电后就全部丢失了, 再次重新启动还是之前未修改过的根文件系统,选择 SD card 可以将根文件系统放在 SD 卡的 ext4 分区,这样启动系统后进行的所有修改掉电后就不会丢失了。 ——引用自正点原子

第二个设置了内核镜像名字。

第三个设备树相关。

第四个设置是否将镜像自动拷贝到tftp服务器目录中,这里没有搭建,设置为不使能。

第五个设置tftp服务器目录所在。

  • Firmware Version Configuration

image-20240316005612799

配置版本名,可自定义。

  • Yocto Settings

底层的设置。Petalinux底层就是Yocto。

配置完成后进行保存Save,程序会自动进行配置。

配置配置内核

终端输入如下命令配置内核:

1
petalinux-config -c kernel

这里由于使用了GMII 2 RGMIIIP核,需要添加相应的驱动。

Device Driver->Network device support->PHY Device support and infrastructure中使能xilinx GMII2RGMII converter driver

配置Uboot

  • 注意:由于petalinux2018的bug,如果将设备树放在sd卡,最后会生成booti(64位下的)命令,导致无法启动linux,这里需要将project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h中的
1
default_bootcmd=run uenvboot; run cp_kernel2ram && run cp_dtb2ram && booti ${netstart} - ${dtbnetstart}

将上面的booti改成bootm.

配置根文件系统

终端输入如下命令配置内核:

1
petalinux-config -c rootfs

image-20240318203717643

  • Filesystem Packages

配置常用的工具软件,包括内核调试软件、流媒体软件、 Python 软件以及图形界面软件等 。

  • Petalinux Package Groups

选择Petalinux提供的软件包,比如包含opencv的相关软件包依赖。

  • Image Features

配置根文件系统的某些功能,如是否支持 ssh,使用 dropbear
的 ssh 还是 openssh 等。如果不希望每次启动 linux 后都得输入密码验证,可以使能该菜单下的“ debug-tweaks”选项。

  • apps

构建用户应用。

  • user packages

配置自定义软件包。

  • petalinux rootfs settings

主要用来设置root的密码。

最后可以编译出各种rootfs文件,可以将 rootfs.tar.gz 或者 rootfs.tar.bz2文件解压到 SD 卡的第二个分区——ext4 文件系统分区来测试根文件系统 。

配置设备树

如果需要配置设备树,可以编辑当前 petalinux 工程目录下的 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 文件。

1
vim project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

编译Petalinux工程

配置全部完成后,使用命令编译。

1
petalinux-build

制作镜像

编译完成后,petalinux生成了一系列文件,此时需要将这些分散的文件部署整合成易于部署的镜像。

1
petalinux-package --boot --fsbl --fpga --u-boot --force

–boot说明生成镜像

–fsbl指定镜像中的fsbl文件位置

–fpga指定bit流文件

–u-boot指定uboot即用户代码位置

–force强制覆盖已生成的文件

文件都默认在images/linux下,不指定就会使用默认路径。

image-20240316170509589

BOOT.BIN就是启动镜像,image.ub是linux镜像。

制作SD启动卡

使用SD卡引导linux启动,一般需要两个分区。一个是FAT32文件系统,用来放置启动镜像(BOOT.BIN,linux镜像),另外一个是EXT4分区,用于存放根文件系统。由于本篇设置的是INITRAMFS,没有用到SD卡的文件系统,因此只需要FAT32分区。

将读卡器插入到电脑上,连接到虚拟机,查看其符号,我这里是/dev/sdb

如果使用图形界面。插入后会自动挂载,先取消挂载,然后进行分区。

1
2
umount /dev/sdb*
sudo fdisk /dev/sdb

在fdisk界面输入p:

image-20240316172748146

可以看到有一个FAT32分区/dev/sdb1。这里输入d将该分区删除。

接着输入n新建分区,输入p为主分区,使用默认分区号1和2048第一个扇区,设置第一个分区大小为100M。

image-20240316173139337

之后先后输入t,c,将分区设为W95 FAT32(代号为c)。

image-20240316173228563

之后输入a设置为引导分区。

image-20240316173341251

此时FAT分区创建完毕,之后创建ext分区。

输入n,之后全部默认,将剩余的空间全部分走。

image-20240316173551810

之后输入w保存,退出。

之后在分区创建文件系统:

1
2
sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2

如果使用图形界面,此时可以看到自动挂载了两个U盘。如果没有图形界面,还需手动挂载sdb1和sdb2。之后将BOOT.BIN和image.ub拷贝到boot下就可以了。

SD启动

之后将SD插入到卡槽,利用串口终端即可登录。默认账户和密码为root。

FLASH启动

当Linux文件系统不是太大时,可以直接将其放在FLASH中。其实就是将BOOT.BIN放在FLASH里面,在config中设置boot的路径后将最后生成的文件通过SDK的program flash烧录到QSPI FLASH即可。

问题

编译时报错提示没有“phy1”

1
2
3
system-top.dtb: ERROR (phandle_references): /amba/ethernet@e000b000: Reference to non-existent node or label "phy1"

system-top.dtb: ERROR (phandle_references): /amba/ethernet@e000b000/mdio/gmii_to_rgmii_0@31: Reference to non-existent node or label "phy1"

这是由于在配置中使能了MDIO(配置端口),引用了一个外部的物理层芯片却没有为其添加设备树导致的,外部芯片无法自动添加到设备树中。这里需要手动添加:
打开文件:project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 在这个文件中添加自定义的设备树。

在文件最后添加:

1
2
3
4
5
6
&gem0{
phy1:phy@1 {
device_type = "ethernet-phy";
reg = <0x5>;
};
};

&gem0表示重写gem0,在其中添加一个phy1。

这本质还是当前版本的petalinux不能正确的读取hdf生成设备树,请使用与vivado相同版本的petalinux