首页 > 系统相关 >《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​

时间:2023-01-07 10:00:54浏览次数:72  
标签:MPSoC petalinux DFZU2EG 配置 6.3 Linux Petalinux SD

Petalinux设计流程实战​

PetaLinux工具提供了在Xilinx处理系统上自定义、构建和部署嵌入式Linux解决方案所需的一切。该解决方案旨在提高设计生产力,可与Xilinx硬件设计工具一起使用,以简化针对Zynq SoC的Linux系统的开发。本章我们以使用Petalinux定制Linux系统为例,实战Petalinux的设计流程,看下Petalinux如何简化Linux系统的开发。​


Zynq UltraScale+ MPSoC嵌入式软件栈概述

要想在Zynq UltraScale+ MPSoC中搭建运行Linux,我们需要先简单的了解下其嵌入式软件栈,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板


图6.1.1 Zynq UltraScale+ MPSoC嵌入式软件栈​

在Zynq UltraScale+ MPSoC设备中,有一个BootROM用于设备的初始启动。配置和安全部件CSU(Configuration and Security Unit)处理器使用BootROM中的代码。在这个配置阶段,BootROM(CSU ROM代码的一部分)解释引导头部(boot header)来配置系统,并以安全或者非安全引导模式将处理系统(PS,processing system)的第一阶段引导加载程序(FSBL,first-stage boot loader)代码加载到片上RAM(OCM,on-chip RAM)中。引导头部定义了许多引导参数,包括安全模式和应该执行FSBL的处理器。引导头部参数可以在Zynq UltraScale+器件手册​UG1085​中找到。在启动过程中,CSU还将PMU用户固件(PMU FW)加载到PMU RAM中,与PMU ROM一起提供平台管理服务。对于基于xilinx的FSBL和系统软件,大多数系统中都必须有PMU FW。在PMU固件加载前加载FBSL是默认配置。有些系统会切换顺序,首先加载PMU固件。​

  1. FSBL​FSBL是Zynq UltraScale + MPSoC的第一阶段引导加载程序,由BootROM引导加载到片上RAM中并启动,用于配置FPGA(使用bitstream,如果存在的话)和从非易失性Flash(SD/eMMC/NAND/QSPI)加载裸机镜像或者操作系统的第二阶段引导加载程序镜像到内存(DDR/OCM)。​
  2. Platform Management Unit (PMU) Firmware​PMU控制系统的上电、复位和监控系统内的资源。Zynq MPSoC中的平台管理单元(PMU)有一个带有32KB和128 KB的Microblaze。启动时,ROM被PMU Boot ROM (PBR)预加载,PBR用于执行预启动任务,进入服务模式。有关PMU、PBR和PMUFW加载顺序的更多细节,请参阅Zynq UltraScale+器件手册​UG1085​中的平台管理单元(第6章)。PMU RAM可以在运行时加载固件(PMU Firmware),并可用于扩展或定制PMU的功能。​
  3. ARM Trusted Firmware​ARM Trusted Firmware(ATF)为ARMv8-A架构的安全软件提供了参考,它提供了各种接口标准的实现,如PSCI(Power State Coordination Interface,电源状态协调接口)和用于与Normal world software接口的安全监控代码。​
  4. U-Boot​U-Boot是Universal Boot Loader的简称,是一个开源的、主要的引导加载程序,用于嵌入式设备中引导设备的操作系统内核,在Linux社区中经常使用。Xilinx在Zynq Ultrascale+设备中使用U-Boot作为第二阶段引导加载程序。关于U-Boot的更详细的介绍和使用请参考第十一章U-Boot使用实验。​
  5. Hypervisor (Optional,可选)​在Zynq UltraScale+设备上,可以使用hypervisor运行多个虚拟机。Zynq UltraScale+设备上支持几种hypervisor,该榜单可在Embedded Software EcoSystem网站Xilinx.com上找到。​
  6. Linux​

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,是我们本开发指南的重点。​

以上就简单的介绍了Zynq UltraScale+ MPSoC嵌入式软件栈,如果没有看懂没关系,笔者这里简单的概括下。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系统启动完成。​

综上,就是需要在Zynq UltraScale+ MPSoC运行linux系统所需要搭建的软件栈。如果这些软件栈由我们一个个手工搭建,任务量极其庞大,所幸的是,Xilinx推出了Petalinux开发工具,可以让我们方便快捷的完成这些软件栈的搭建,从而加快linux的使用和开发。​

注:上面介绍了那么多软件栈,并不需要我们全部了解。以uboot为分界线,uboot以下的是跟zynq芯片密切相关的,是很底层的内容,一般不需要额外配置,让Petalinux工具自动适配即可。从uboot开始,跟zynq芯片的关联就弱了很多,uboot和linux内核可以适用与其他芯片平台,其知识点是通用的,也是我们需要关注的。​

Petalinux工具的设计流程概述

通常PetaLinux工具遵循顺序设计流程模型,如下表所示:​

表6.2.1设计流程表​

Design Flow Step

Tool / Workflow

Hardware Platform Creation ​

Vivado​

Create PetaLinux Project​

petalinux-create -t project​

Initialize PetaLinux Project​

petalinux-config --get-hw-description​

Configure System-Level Options ​

petalinux-config​

Create User Components​

petalinux-create -t COMPONENT​

Configure the Linux Kernel​

petalinux-config -c kernel​

Configure the Root Filesystem ​

petalinux-config -c rootfs​

Build the System​

petalinux-build​

Package for Deploying the System​

petalinux-package​

Boot the System for Testing​

petalinux-boot​

从上表可以看到,使用Vivado搭建好硬件平台后,通过几个命令就完成了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系统

现在我们以使用Petalinux定制Linux系统为例,来实战下Petalinux的设计流程,体验Petalinux对Linux系统开发的简便之处。​

创建Vivado硬件平台

在《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》中我们创建了很多Vivado工程,相信大家对vivado工程的创建已经非常熟悉了,为了节省时间,这里我们统一使用正点原子为DFZU2EG_4EV MPSoC开发板配置的vivado工程,该工程在开发板资料包中已经给大家提供了,在该目录下有两个目录——2eg和4ev,分别存放着ATK_DFZU2EG和ATK_DFZU4EV开发板的vivado工程,其中的base目录中的vivado工程就是我们本章节需要使用的vivado工程,为了方便读者的下载,以压缩包文件的形式提供的。这里大家根据自己所使用的开发板来选择,笔者以ATK_DFZU4EV MPSoC开发板为例,将4ev目录下的base.zip在Windows系统下解压得到vivado工程目录base,进入到该目录下,如下所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_02


图6.3.1 vivado工程目录​

该目录下有一个system_wrapper.xsa文件,该文件包含着Vivado工程所对应的硬件平台信息,Petalinux根据这些信息来配置fsbl、uboot、内核等。​

将该文件拷贝到Ubuntu系统下。譬如笔者在4.2节创建的share文件夹下创建一个xsa文件夹,并将system_wrapper.xsa文件复制到该文件夹下,如下所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_03


图6.3.2将xsa文件复制到share/xsa共享目录下​

这样Ubuntu系统就可以通过访问该文件夹来使用xsa文件,相当于将该xsa文件复制到Ubuntu系统下。​

设置Petalinux环境变量

现在进入到Ubuntu系统中,打开终端,以普通用户运行即可,不需要使用root用户。在正式使用petalinux工具之前,需要先设置petalinux的作环境,在终端输入如下命令即可:​

source /opt/pkg/petalinux/2019.2/settings.sh​

#或者​

sptl​

执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_04


图6.3.3 设置petalinux工作环境​

创建petalinux工程

为了方便工程的管理,我们在使用的用户的家目录下新建一个workspace/petalinux目录,作为petalinux的工程目录。在终端中输入如下命令新建workspace/petalinux目录并切换到该目录:​

cd​

mkdir -p workspace/petalinux/​

cd workspace/petalinux/​

现在我们创建一个名为“ALIENTEK-ZYNQ”的Petalinux工程,在终端中输入如下命令:​

petalinux-create -t project --template zynqMP -n ALIENTEK-ZYNQ​

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

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_05


图6.3.4 创建Petalinux工程​

可以看到该命令会自动在work/petalinux目录下创建一个名为ALIENTEK-ZYNQ的文件夹,也就是ALIENTEK-ZYNQ对应的Petalinux工程所在目录。​

配置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文件夹,如果是通过其他方式如FTP传到Ubuntu系统中的,只要执行“petalinux-config --get-hw-description xsa文件夹所在位置”即可。如果后面修改了Vivado工程,重新生成xsa文件后,可以重新执行“petalinux-config --get-hw-description xsa文件所在文件夹所在位置”以重新配置Petalinux工程。​

执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_06


图6.3.5 配置petalinux工程​

注:此处应该弹出petalinux工程配置窗口,如果没有弹出可能是因为终端窗口有点小,建议拉大终端窗口。​

弹出petalinux工程配置窗口,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_07


图6.3.6工程配置窗口​

需要注意的是该窗口不可以使用鼠标操作,只能通过键盘操作,界面上方的英文就是简单的操作说明,操作方法如下:​

通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。​

在配置界面下方会有五个按钮,这五个按钮的功能如下:​

<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。​

<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。​

<Help>:帮助按钮,查看选中菜单的帮助信息。​

<Save>:保存按钮,保存修改后的配置文件。​

<Load>:加载按钮,加载指定的配置文件。​

本实验我们无需更改该窗口的配置信息。不过由于该窗口菜单不多,我们就从上到下的简单地介绍下这些菜单。​

首先按键盘上的下方向键移动到“Linux Components Selection”,然后按键盘上的“Enter”进入子菜单,子菜单内容如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_08


图6.3.7 Linux Components Selection子菜单​

中括号里的“*”表示为已使能配置。前两个选项表示会自动生成我们在《DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南》程序固化实验中的fsbl.elf文件和自动更新ps_init。下面两个选项用来配置u-boot和linux-kernel的来源,本实验保持默认来源配置,不做改动,后面的实验需要更改的时候再做介绍。按键盘上的“Esc”按键连按两次退出该子菜单。​

“Auto Config Settings”菜单主要就是选择是否使能fsbl、pmufw、Device tree、Kernel和u-boot的自动配置,默认为自动配置,无需更改,就不看了。​

“Subsystem AUTO Hardware Settings”子菜单的内容如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_09


图6.3.8 Subsystem AUTO Hardware Settings子菜单​

进入到该界面的各个外设子菜单中,可以发现都已经设置好了默认配置,这些默认配置是根据xsa文件的信息自动配置的,基本上无需我们手动配置;“SD/SDIO Settings”配置项用于配置开发板的首要启动媒介,即是从SD卡启动还是从eMMC启动。一般我们调试使用都是通过SD卡启动,因为SD卡读写文件方便,从而方便调试;eMMC一般是程序测试稳定后上市时使用,不会像SD卡那样因碰摔造成的松动。对于DFZU2EG_4EV MPSoC开发板来说,这里需要修改一下,因为DFZU2EG_4EV MPSoC开发板的SD卡接在PS的SD1控制器,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_10


图6.3.9 PS的SD1​

首先光标移动到该配置项按回车进入,如下所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_11


图6.3.10 配置SD卡启动​

在“Primary SD/SDIO”配置项中需要将其修改为psu_sd_1。psu_sd_1对应的就是SD卡。修改完成之后连按两次ESC键回到上一级菜单。​

在“Advanced bootable images storage Settings”菜单中可配置启动引导镜像和内核镜像的存储媒介,默认为Primary SD,这里保持默认即可。​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_12


图6.3.11 Advanced bootable images storage Settings菜单​

返回到主界面(按四次“ESC”按键),设备树设置菜单“DTG Settings”和ATF配置菜单“ARM Trusted Firmware Compilation Configuration”等一般保持默认即可。​

我们进入“Image Packaging Configuration”子菜单,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_13


图6.3.12 Image Packaging Configuration子菜单​

第一个选项便是根文件系统的类型的配置,默认为INITRAMFS,一般默认即可,如果我们需要运行Ubuntu或Debian的根文件系统时,就需要配置成EXT(SD/eMMC/QSPI/SATA/USB),NFS挂载启动需要配置成NFS。另外从该界面我们可以看到,有“Copy final images to tftpboot”选项,当在Ubuntu的根文件下创建一个名为tftpboot的文件夹时,工程生成镜像后会自动将相关文件复制到/tftpboot目录中。​

回到主界面,“Firmware Version Configuration”可以用来修改定制的linux系统的主机名和产品名,默认与该Petalinux工程同名,如果需要可修改。“Yocto Settings”进行与Yocto相关的设置,这里就不做介绍了,一般保持默认即可。​

按键盘上的右方向键(即右箭头),移动到底部的“Save”,按键盘上的“Enter”键,进入如下图所示的保存配置文件界面:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_14


图6.3.13 保存配置文件界面​

按键盘上的“Enter”键确认,进入下图所示界面:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_15


图6.3.14 退出保存配置文件界面​

再次按键盘上的“Enter”键确认,返会到原界面,按两次键盘上的“Esc”退出配置窗口。​

如果后面想重新配置,只需输入“petalinux-config”命令即可重新配置。​

这一步可能需要几分钟才能完成。这是因为PetaLinux会根据“Auto Config Settings --->”和“Subsystem AUTO Hardware Settings --->”来解析xsa文件,以获取更新设备树、U-Boot配置文件和内核配置文件所需的硬件信息。​

等待一段时间后,完成petalinux工程的配置,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_16


图6.3.15 完成petalinux工程的配置​

配置Linux内核

现在我们开始定制Linux内核,在终端输入如下命令:​

petalinux-config -c kernel​

执行结果如下:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_17


图6.3.16 定制Linux内核​

等一段时间后会在终端中创建一个名为“linux-xlnx Configuration”的标签页,也就是Linux内核的配置界面,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_18


图6.3.17 内核配置界面​

可以看到Petalinux默认使用的内核版本为4.19.0,当然也可以换成其它版本的内核,不过修改起来比较麻烦,Petalinux对内核版本有要求,读者如需使用其他的内核版本可以在网上查找关于Petalinux使用非默认内核版本的方法。一般使用默认内核版本就可以了。​

这里使用的内核Xilinx官方已经做好了基础配置,如无特定需求,无需更改。另外关于Linux内核的配置在后面的Linux内核移植章节进行讲解,此处就不多做介绍了。这里采用Xilinx官方的默认配置即可,保存配置并退出。​

配置Linux根文件系统

在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令。​

petalinux-config -c rootfs​

下图就是根文件系统的配置界面:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_19


图6.3.18 根文件系统的配置界面​

默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。需要说明的是“PetaLinux RootFS Settings”可以用来设置root用户的密码,默认为“root”。后面登录的时候会用到。​

保存配置并退出。​

配置设备树文件

关于设备树的概念,这里先不做介绍。设备树的概念源自于Linux内核当中,当然其实在U-Boot当中也已经使用了。如果需要配置设备树,可以编辑当前petalinux工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。​

我们可以打开这个文件进行编辑,将一些简单外设添加到系统当中,譬如按键、led和IIC设备。设备树用于保存Linux系统中的各种设备信息,内核在启动过程当中会去解析设备树文件,获取设备所需的配置信息完成设备的初始化工作。​

设备树的概念以及相关配置、语法涉及到了Linux内核驱动相关知识,并不是本篇学习的重点,所以这里并不会去深入给大家介绍,将会在Linux驱动部分的章节做详细解说。​

使用vi命令打开system-user.dtsi文件,如下所示:​

vi project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi​

默认的文件内容如下,可见该文件需要我们自己手动配置。​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_20


图6.3.19 system-conf.dtsi文件初始内容​

我们把按键、led、USB和IIC设备的EEPROM添加到system-user.dtsi设备树当中,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工程中的该文件。​

设备树文件当中配置了4个gpio led灯,4个按键、i2c0和usb0,以及PS和PL的以太网。下面简单的讲解下gpio led的配置。​

4个gpio led灯分别对应开发板的4个led灯,配置信息主要包括compatible(用于与内核驱动匹配的名字)、label(名字)、gpios(对应的GPIO管脚)、默认状态以及触发状态。​

例如linux,default-trigger = " timer "表示默认的触发状态是timer模式,也可以改为heartbeat模式,可以用来判断系统是否还在运行。除此之外,还有其他一些内核定义好的触发状态;default-state = "on"表示默认led灯是亮着的;gpios = <&gpio 38 GPIO_ACTIVE_HIGH>表示该led的控制管脚是gpio_38,GPIO_ACTIVE_HIGH表示高电平有效(也就是高电平的时候led灯才会亮)。​

其他的就不讲解了,后面驱动部分文档中会详细讲解。​

内容编辑完成之后保存退出即可。​

编译Petalinux工程

现在我们就可以编译整个Petalinux工程了,在终端输入如下命令:​

petalinux-build​

该命令将生成设备树DTB文件、fsbl文件、U-Boot文件,Linux内核和根文件系统映像。编译完成后,生成的映像将位于工程的images目录下。需要说明的是fsbl、U-Boot这两个我们在工程中并没有配置,这是因为Petalinux会根据xsa文件和6.3.4节的配置petalinux工程自动配置fsbl和uboot,如无特需要求,不需要再手动配置。​

执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_21


图6.3.20 编译整个Petalinux工程​

制作BOOT.BIN启动文件

Petalinux提供了petalinux-package命令将PetaLinux项目打包为适合部署的格式,其中“petalinux-package --boot”命令生成可引导映像,该映像可直接与Zynq系列设备(包括Zynq-7000和Zynq UltraScale + MPSoC)或基于MicroBlaze的FPGA设计一起使用。对于Zynq系列设备,可引导格式为BOOT.BIN,可以从SD卡引导启动。对于基于MicroBlaze的设计,默认格式为MCS PROM文件,适用于通过Vivado或其他PROM编程器进行编程。​

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。这里笔者均没有指定对应的文件的路径信息,那么Petalinux会自动使用默认文件。执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_22


图6.3.21 生成文件​

可以看到Petalinux自动将PMU(Platform Management Unit) firmware文件pmufw.elf和ATF(Arm trusted firmware)文件bl31.elf包含进BOOT.BIN。​

生成的BOOT.BIN文件放在Petalinux工程的images/linux目录下,上一小节编译Petalinux工程生成的文件同样存放在images/linux目录下,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_23


图6.3.22 编译工程生成的启动镜像文件​

制作SD启动卡

如果使用SD卡引导linux系统启动,一般需要在SD卡上有2个分区。一个分区使用FAT32文件系统,用于放置启动镜像文件(如BOOT.BIN,linux镜像等),另一分区使用EXT4文件系统,用于存放根文件系统。​

需要说明的是在6.2.4节配置petalinux工程中,“Image Packaging Configuration”子菜单根文件系统的类型的配置使用的是默认的INITRAMFS,所以只需要一个使用FAT32文件系统的分区就可以了。当设置为“EXT”则需要另一个存放根文件系统的分区。​

本小节先讲解SD卡的分区和格式化,然后说明将哪些文件复制到SD卡中。此处的SD卡指的是那种小卡,也称为TF卡。​

注:在使用SD卡前需要先将sd卡中的数据做备份,否则会丢失SD卡中的数据。​

将SD卡插入到读卡器中、并将读卡器插入电脑并连接到Ubuntu系统,在Ubuntu系统中找到SD卡所对应的设备节点,笔者插入的SD卡对应的设备节点为/dev/sdc。在终端中输入如下命令:​

umount /dev/sdc*​

sudo fdisk /dev/sdc​

输入“p”执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_24


图6.3.23 给SD卡分区​

可以看到当前的分区表,有一个FAT32的分区。在开始新分区之前需要将以前的分区删除,键入“d”,删除该分区,再次键入“d”时会出现下图所示的红色字体提示,表明已无存在的分区。如果SD卡存在多个分区,需要全部删除,存在多个分区的情况下,键入“d”时会提示选择需要删除的分区编号。​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_25


图6.3.24 将以前的分区删除​

下面开始新建分区。输入“n”创建一个新分区。通过选择'p'使其为主,使用默认分区号1和第一个扇区2048。设置最后一个扇区,也就是设置第一个分区的大小,一般设置500M足够了,通过输入“+ 500M”,为该分区预留500MB,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_26


图6.3.25 创建第一个新分区​

现在设置分区类型,输入“t”,然后输入“c”,设置为“W95 FAT32 (LBA)”,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_27


图6.3.26设置分区类型​

输入“a”,设为引导分区,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_28


图6.3.27 设为引导分区​

第一个分区就创建好了,开始创建第二个分区。​

通过键入“n”来创建根文件系统分区。后面一路默认就可以了,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_29


图6.3.28 创建第二个分区​

如果现在输入“p”检查分区表,会看到刚刚创建的2个分区。如果没问题,键入“w”以写入到SD卡并退出。​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_30


图6.3.29 写入分区到SD卡​

完成了分区创建后,就可以格式化分区了。在终端输入如下命令:​

sudo mkfs.vfat -F 32 -n boot /dev/sdc1​

sudo mkfs.ext4 -L rootfs /dev/sdc2​

将第一个分区格式化成FAT32分区并命名为boot,将第二个分区格式化成ext4分区并命名为rootfs。执行结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_31


图6.3.30 SD卡分区格式化​

格式化分区之后就可以挂载分区了(重新插拔读卡器或者使用mount命令进行挂载)。挂载完成后,我们将该工程image/linux目录下的BOOT.BIN和image.ub文件拷贝到名为boot的分区也即/dev/sdc1分区中,结果如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_32


图6.3.31 拷贝启动镜像到第一个分区​

本实验只需要这两个文件即可,现在可以卸载SD卡了。​

开发板启动模式设置

将SD卡插入DFZU2EG_4EV MPSoC开发板的SD卡槽(卡槽位于开发板背面),然后使用USB连接线将开发板USB_UART接口与电脑连接,用于串口通信。DFZU2EG_4EV MPSoC开发板连接SD(TF)卡的正面图和背面图如图6.3.32和图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_33


图6.3.32 开发板连接TF卡正面图​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_34


图6.3.33 开发板连接TF卡背面图​

接下来DFZU2EG_4EV MPSoC开发板上的启动模式开BOOT MODE的四个开关的第二个与第四个拨到(置为OFF设置为从SD卡启动。不同的启动方式与四个拨码开关的状态对应关系如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_35


图6.3.34 启动模式设置​

最后连接开发板的电源线给开发板上电。​

打开串口上位机,进入Linux系统

打开MobaXterm串口上位机或其它串口上位机。上位机打印Linux启动信息如下:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_36


图6.3.35 打印Linux启动信息​

停留在登录处,此处使用root用户登录,登录密码为“root”(去掉双引号),登录进去后,界面如下:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_37


图6.3.36 使用root用户登录​

如果我们把视线移到开发板,会看到板上的LED灯全都是亮的,其中,底板上的PL_LED1和PS_LED1同频闪烁,这是设备树配置文件产生的结果,还记得那个“timer”么。​

至此我们就走完了Petalinux开发Linux的整个流程。正如俗语所说师傅领进门,修行靠个人,Petalinux的功能远不止如此,其他功能读者有兴趣可进行探索,建议参考ug1144参考手册,也就是Xilinx官方编写的PetaLinux工具使用说明文档,已提供在开发板光盘资料。​

特别说明:以后我们使用主机终端指代电脑上Ubuntu系统的终端,串口终端指代通过串口线连接到开发板显示在串口上位机中的终端。​

解决Petalinux由于网络原因产生的编译错误

如果编译Petalinux工程时,出现如下图所示的“Fetcher failure: Unable to find file”错误:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_加载_38


图6.4.1 Fetcher failure: Unable to find file​

出现这种错误的原因是Petalinux在编译的时候,需要联网下载一些文件,由于网络原因这些文件不能正常下载,导致编译出错。解决的方法是下载该压缩包​​​​。​

该压缩包很大,有20多G,里面包含了Petalinux编译需要的各种软件包和库。下载完成后将其复制到Ubuntu虚拟机中并解压。譬如笔者在4.2节创建的share文件夹下创建一个petalinux文件夹,并将该压缩包解压到该文件夹下,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_39


图6.4.2解压downloads_2019.2.tar.gz得到的文件夹​

从Ubuntu虚拟机访问该路径为:/mnt/hgfs/share/petalinux/downloads/。​

下面将解压后的路径添加到Petalinux工程中。​

进入Petalilnux工程,输入“petalinux-config”配置工程。配置“Yocto Settings ---> Add pre-mirror url”,删除原先的内容,添加解压downloads_2019.2.tar.gz后的绝对路径,添加格式为:file://+downloads_2019.2.tar.gz解压后的路径。对于笔者而言,添加的路径内容为​file:///mnt/hgfs/share/petalinux/downloads/​,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_开发板_40


图6.4.3 添加pre-mirror url​

保存配置,返回到Yocto Settings界面,使能BB_NO_NETWORK,如下图所示:​

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》第六章 Petalinux设计流程实战​_linux_41


图6.4.4 使能BB_NO_NETWORK​

保存配置并退出。​

现在编译就不会出现“Fetcher failure: Unable to find file”错误。​


标签:MPSoC,petalinux,DFZU2EG,配置,6.3,Linux,Petalinux,SD
From: https://blog.51cto.com/u_15046463/5995407

相关文章

  • 调整Linux系统为正确时区
    一、如何调整Linux系统为正确时区 一、查看当前的时区情况#date#dateFriJan612:52:24EST2023#ll-l/etc/localtimelrwxrwxrwx.1rootroot38Jan506......
  • Arch Linux 为 Discord 设置代理
    复制图标到用户所属目录$cp/usr/share/applications/discord.desktop~/.local/share/applications/修改启动命令为其添加代理[DesktopEntry]Name=DiscordStartup......
  • 在linux上测试net程序
    1、将net程序发布为linux内核,并且自包含框架  2、安装WSL并安装Ubuntu(可参考:https://learn.microsoft.com/zh-cn/windows/wsl/install)。如果安不上就参考《旧版本的......
  • Linux USB设备驱动(二)
    Note: 本文主要列举几个usb设备驱动实例一、“USBLED”驱动模块在前面的实验室中,开发了一个功能齐全的USBHID设备的固件,该设备能够通过使用HID报告发送和接收数据。......
  • (笔记)在每个 Linux 用户SSH登录时执行自定义脚本
     有些时候,我们需要在linux用户登录时执行我们自己编写的脚本,比如登录时给个友好的交互输出提示。为了实现该目的,我们有必要去了解一下linux在用户登录时执行内部shell的......
  • Kali 工具系列【2】在kali linux 上抓取握手包
    1、接入一块外置的无线网卡。2、查看可用的wifi接口,回显结果中有wlan0即代表支持监控模式airmon-ng3、开启无线网卡监控模式airmon-ngstartwlan0 命令执行后网卡接口变为......
  • linux安装sftp
    目录linux安装sftp1、创建用户及用户组2、创建文件夹作为sftp用户的根目录3、修改sshd_config3.1、注释Subsystemsftp/usr/libexec/openssh/sftp-server(若不注释,可以通过......
  • Linux拓展之字段分隔符IFS
    前言内部字符单分隔符(InternalFieldSeparator,IFS)在处理文本数据行时,具有很重要的作用。IFS是一个环境变量,默认值是'\t\n'。不可以用echo$IFS获取它保存的分隔符,......
  • Linux +Docker +Nginx 部署代理转发初探
    很多开发人员仅仅只会码代码,如果让开发人员部署一些深入点的东西,或者做负载均衡等,很多开发人员估计就懵逼了,作为一个专业的开发还需要懂一些基本的运维知识;虽然说在互联......
  • Linux关闭防火墙 / 开放端口
    Linux的网络可以ping通,但是linux启动的应用如tomcat/nginx等都无法访问?问题分析:这是由于Linux的安全问题默认开启了防火墙,并且禁用(不开放)所有端口。解决思路:关闭......