目录
1.Zynq UltraScale+ MPSoC
嵌入式软件栈概述
2、Platform Management Unit (PMU)
Firmware
前置学习:Linux系统——OS学习笔记<1>
参考资料:正点原子《DFZU2EG_4EV MPSoC 之 Linux 驱动开发指南》
“PetaLinux 工具提供在 Xilinx 处理系统上定制、构建和调配嵌入式 Linux 解决方案所需的所有组件。该解决方案旨在提升设计生产力,可与 Xilinx 硬件设计工具配合使用,以简化针对 Versal、Zynq UltraScale MPSoC、Zynq 7000 SoC 和 MicroBlaze 的 Linux 系统开发。”
一.开发环境搭建
要进行 ZYNQ MPSoC 开发肯定要先搭建好开发环境,我们在开始学习 STM32 的时候肯
定需要安装一堆的软件,比如 MDK、IAR、串口调试助手等等,这个就是 STM32 的开发环境
搭建。同样的,要想在 Ubuntu 下进行 ZYNQ MPSoC 开发也需要安装一些软件,也就是网上
说的开发环境搭建,环境搭建好以后我们就可以进行开发了。环境搭建分为 Ubuntu 和 Windows,
因为我们最熟悉 Windows,所以代码编写、查找资料啥的肯定是在 Windows 下进行的。但是
Linux 开发又必须在 Ubuntu 下进行,所以还需要搭建 Ubuntu 下的开发环境。本章我们就分为
Ubuntu 和 Windows,讲解这两种操作系统下的环境搭建。
1.Ubuntu 和 Windows 文件互传
Windows 和 Ubuntu 下的文件互传我们需要使用 FTP 服务,设置方法如下:
1、开启 Ubuntu 下的 FTP 服务
打开 Ubuntu 的终端窗口,然后执行如下命令来安装 FTP 服务:
sudo apt-get install vsftpd
等待软件自动安装,安装完成以后使用如下 VI 命令打开/etc/vsftpd.conf,命令如下:
sudo vi /etc/vsftpd.conf
打开以后 vsftpd.conf 文件以后找到如下两行:
local_enable=YES
write_enable=YES
确保上面两行前面没有“#”,有的话就取消掉
2、Windows 下 FTP 客户端安装
Windows 下 FTP 客户端我们使用 FileZilla。打开站点管理器,点击:文件->站点管理器。点击“新站点(N)”按钮来创建站点,新建站点以后就会在“我的站点”下出现新建的这个站点,站点的名称可以自行修改,比如我将新的站点命名为“Ubuntu”。选中新创建的“Ubuntu”站点,然后对站点的“常规”进行设置:
如果要将 Windows 下的文件或文件夹拷贝到 Ubuntu 中,只需要在左侧的 Windows 区域选中要拷贝的文件或者文件夹,然后**直接拖到右侧** 的 Ubuntu 中指定的目录即可。 将 Ubuntu 中的文件或者文件夹拷贝到 Windows 中也是**直接拖放** 。
2.Ubuntu 和 Windows 文件本地共享
Ubuntu 和 Windows 文件互传可以使用本地共享的方式。这种共享的方式极大的免除了不同系统文件 之间的文件复制和磁盘空间的双重占用。下面笔者将介绍如何使用 Vmware 虚拟机来实现 Ubuntu 和 Windows 文件之间的共享。
在 Vmware 的菜单栏中,选择“设置(S)”,在弹出的菜单中,选择“选项”,在该界面中,单击“共享文件夹”,在右边界面中选择 “总是启用(E)”,添加共享的文件夹,默认勾选“启用此共享”。
该文件夹在 Ubuntu 系统中对应的是**/mnt/hgfs/share/目录** ,我们在终端中输入命令:
ll /mnt/hgfs/share/
可以看到该文件夹为空。如果需要从 Ubuntu 系统向 Windows 传递文件,可 以用 cp 命令或 mv 命令文件到该目录。
3.Ubuntu 系统搭建 tftp 服务器
TFTP 作为一种**简单的文件传输协议** ,在嵌入式开发中会经常使用到,而且后面我们在**安装 Petalinux 工具时也会提示需要 tftp 服务** ,所以我们需要**在 Ubuntu 上搭建 TFTP 服务器** 。需要**安装 tftp-hpa(客户端软件包,如果不用可不装)和 tftpd-hpa 软件包** ,命令如下:
sudo apt install tftp-hpa tftpd-hpa
TFTP 需要一个文件夹来存放文件,我们在根目录下新建一个/tftpboot 目录做为 TFTP 文 件存储目录,之所以使用该目录是因为后面使用的 Petalinux 工具默认使用该目录,省得我们 每次建 Petalinux 工程的时候手动修改。创建/tftpboot 目录命令如下:
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot
这样笔者就在电脑上创建了一个名为 tftpboot 的目录(文件夹),路径为/tftpboot。需要注意 的是我们要给 tftpboot 文件夹权限,否则的话后面在使用过程中会遇到问题,所以使用了 chmod 777 命令 。 最后配置 tftp。打开/etc/default/tftpd-hpa 文件,将其内容修改如下:
# /etc/default/tftpd-hp
TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/tftpbo
TFTP_ADDRESS=”:69”
TFTP_OPTIONS=”-l -c -s”
最后输入如下命令,重启 tftp 服务器:
sudo service tftpd-hpa restart
4.Ubuntu 下 NFS 和 SSH 服务开启
后面进行 **Linux 驱动开发** 的时候**需要 NFS 启动** ,因此要先安装并开启 Ubuntu 中的 NFS 服务,使用如下命令安装 NFS 服务:
sudo apt install nfs-kernel-server
等待安装完成。安装完成以后在用户根目录 下创建一个名为“workspace/nfs”的文件夹, 命令如下:
cd
mkdir -p workspace/nfs
cd workspace/nfs
pwd
以后所有需要使用 nfs 的东西都放到这个“nfs”文件夹里面。
上面创建的 nfs 文件夹供 nfs 服务器使用,以后我们可以在开发板上**通过网络文件系统来访问 nfs 文件夹** 。
使用前需要先**配置 nfs** 。NFS 允许挂载的目录及权限**在文件/etc/exports 中进行定义** ,使用 如下命令打开 nfs 配置文件/etc/exports,打开/etc/exports 以后在后面添加如下所示内容:
/home/<用户名>/workspace/nfs *(rw,sync,no_root_squash)
* 代表允许所有的网络段访问,rw 是可读写权限,sync 是文件同步写入存储器,no_root_squash 是 nfs 客户端分享目录使用者的权限。如果客户端使用的是 root 用户,那么对于该共享目录而 言,该客户端就具有 root 权限。
重启 NFS 服务,使用如下命令:
sudo systemctl start nfs-kernel-server.service
此时可以运行以下命令来显示共享的目录:
showmount -e
在 nfs 运行的过程中,修改了/etc/exports 配置文件,可以使用 exportfs 命令使改动生效, 具体命令:
sudo exportfs -rv
开启 Ubuntu 的 SSH 服务以后我们就可以在 Windwos 下使用终端软件登陆到 Ubuntu,比 如使用 SecureCRT,Ubuntu 下使用如下命令开启 SSH 服务 :
sudo apt install openssh-server
上述命令安装 ssh 服务,ssh 的配置文件为/etc/ssh/sshd_config,使用默认配置即可。
5.Source Insight 软件安装和使用
Source Insight 是一款功能强大的代码编辑、阅读工具,工作在 Windows 下,我们可以用 Source Insight 来进行代码编写和阅读,编写完成以后将代码拷贝到 Ubuntu 中去编译即可。
6.Visual Studio Code 软件的安装和使用
Visual Stuio Code 和 Source Insight 一样,都是编辑器,Visual Studio Sode 本教程以后就简 称为 VSCode,VSCode 是微软出的一款编辑器,但是免费的。VSCode 有 Windows、Linux 和 macOS三个版本的,是一个跨平台的编辑器。
我们需要按照的插件有下面几个:
1)、C/C++。
2)、C/C++ Snippets,即 C/C++重用代码块。
3)、C/C++ Advanced Lint,即 C/C++静态检测。
4)、Code Runner,即代码运行。
5)、Include AutoComplete,即自动头文件包含。
6)、Rainbow Brackets,彩虹花括号,有助于阅读代码。
7)、One Dark Pro,VSCode 的主题。
8)、GBKtoUTF8,将 GBK 转换为 UTF8。
9)、ARM,即支持 ARM 汇编语法高亮显示。
10)、Chinese(Simplified),即中文环境。
11)、vscode-icons,VSCode 图标插件,主要是资源管理器下各个文件夹的图标。
12)、compareit,比较插件,可以用于比较两个文件的差异。
13)、DeviceTree,设备树语法插件。
新建文件后,按下“Ctrl+Shift+P”打开搜索框,然后**输入“Edit configurations”, 选择“C/C++:Edit configurations…”。C/C++的配置文件是个 json 文件** ,json 中的变量“includePath”用于指定工程中的头文件路径,但是“stdio.h” 是 C 语言库文件,而**VSCode 只是个编辑器,没有编译器** ,所以肯定是没有 stdio.h 的,除非 我们自行安装一个编译器,比如 CygWin,然后**在 includePath 中添加编译器的头文件** 。这里我 们就不添加了,因为我们不会使用 VSCode 来编译程序,这里主要知道如何指定头文件路径就 可以了,后面有实际需要的时候再来讲。
7.SecureCRT 软件安装和使用
在后续的开发过程中我们需要在Windows下使用串口终端,用来查看信息以及进行操作。 常用的串口终端有 SecureCRT、Putty 和 MobaXterm。
SecureCRT 功能很强大,支持 SSH,可以用来远程登陆;支持串口,可以用来作为 Linux 开发板的串口终端。我们用的最多的就是将 **SecureCRT 作为串口终端来使用** 。
我们以串口连接为例讲解如何使用 SecureCRT,我们需要准备好一个能进行**串口通信** 的设 备,我们的 DFZU2EG_4EV MPSoC 开发板就可以。DFZU2EG_4EV MPSoC 开发板出厂已经 烧写了 Linux 系统,Linux 系统在运行的过程中会通过串口输出信息,**通过串口可以实现 Linux 命令行交互操作** ,就和 Ubuntu 里面的终端一样,使用方法如下:
打开 SecureCRT,然 后点击 File->Quick Connect…,按照下图所示进行设置:
左侧是会话列表,保存着历史会话,会显示出所有曾经连接的串口,这个在关闭 SecureCRT 以后会被保存起来,下次重新打开 SecureCRT 就可以直接使用这个串口会话连接进行快速连接。比如我们关闭 SecureCRT,在关闭 SecureCRT 之前要先关闭所有的会话(串口),重新打开 SecureCRT。上图中重新打开的 SecureCRT 保存这上次关闭之前建立的会话(串口)“serial-com8”,通 过双击“serial-com8”可以重新连接会话(串口),不需要再使用快速连接对话框进行连接设置。 开发板默认出厂烧写了 Linux 系统,所以如果连接上 SecureCRT 以后会将串口作为终端, 会输出 Linux 系统启动信息,并且可以通过 SecureCRT 来操作开发板中的 Linux 系统,此时 SecureCRT 就是开发板的终端,和 Ubuntu 中的终端一样。
8.Putty 软件的安装和使用
Putty 和 SecureCRT 是类似的软件,都是用来作为 SSH 或者串口终端的,区别在于 SecureCRT 是付费软件,而 Putty 是免费的。虽然 Putty 没有 SecureCRT 功能强大,但是 Putty 用来作为嵌入式 Linux 的串口终端是绰绰有余的,而且**在 Ubuntu 下安装 Putty 十分方便** ,只需 一条命令即可:
sudo apt install putty
使用 USB 线将开发板串口和电脑连接起来,打开 Putty 软件,打开以后是配置界面,如下 图所示:
二.Petalinux 的安装
安装 Petalinux 开发工具在 Ubuntu 操作系统中,在虚拟机中安装了 Ubuntu 18.04 64 位操作系统,这也是官方推荐的版本。
1.Petalinux 简介
Petalinux 工具是 Xilinx 公司推出的嵌入式 Linux 开发套件,包括了 **u-boot、Linux Kernel、 device-tree、rootfs 等源码和库** ,以及 **Yocto recipes** ,可以让客户很方便的生成、配置、编译及 自定义 Linux 系统。Petalinux 支持 Versal 、Zynq UltraScale+ MPSoC、Zynq-7000 SoC 以及 MicroBlaze,可与 Xilinx 硬件设计工具 Vivado 协同工作,大大简化了 Linux 系统的开发工作。
官方网站:[PetaLinux 工具 (xilinx.com)](https://china.xilinx.com/products/design-
tools/embedded-software/petalinux-sdk.html “PetaLinux 工具 (xilinx.com)“)
下载途径:[下载
(xilinx.com)](https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/embedded-
design-tools/2023-1.html “下载 (xilinx.com)“)
注意 Petalinux 的版本 要求与 Vivado 的版本一致
2.安装 Petalinux
首先将 petalinux 安装包文件 petalinux-v2019.2-final-installer.run 拷贝到 share 共享目录,,在 Ubuntu 系统中,打开终端,切换到 /mnt/hgfs/share/目录,可以看到 petalinux 的安装文件 petalinux-v2019.2-final-installer.run 已在该目录,可直接访问。
1、安装依赖库以及软件
Xilinx 提供了安装脚本 plnx-env-setup.sh。将下载后的脚本拷贝到 Ubuntu 虚拟机中,打开 Ubuntu Terminal 终端执行输入如下命令以 执行此脚本:
sudo ./plnx-env-setup.sh
如果上面的命令不行,可以使用下面的方式替代,对与 Ubuntu 而言,两种方式是等效的。
sudo apt install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib automake zlib1g:i386 screen pax gzip cpio python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3
2、修改 bash
Petalinux 工具需要主机系统的/bin/sh 是 bash,而 Ubuntu 默认的/bin/sh 是 dash,所以这里 需要进行更改,运行 sudo dpkg-reconfigure dash 命令,如下:
sudo dpkg-reconfigure dash
**选择“No”按下回车即可。 **
3、安装 Petalinux
安装 Petalinux 就要考虑安装位置了,对于 Petalinux 这种体积庞大的工具,我们将其放在 /opt 目录下。在/opt 目录下新建专门存放 Petalinux 的文件夹,如/opt/pkg/petalinux/2019.2,在 终端输入以下命令即可:
sudo chown -R $USER:$USER /opt
mkdir -p /opt/pkg/petalinux/2023.1
chown命令将/opt 目录的属主和属组更改为当前的用户名 ,如笔者的 Ubuntu 用户名为 cx, 执行的 chown 命令就相当于“sudo chown -R cx:cx /opt”,然后通过 mkdir 创建安装目录。现在我们将 petalinux 安装在/opt/pkg/petalinux/2023.1 目录下,在终端中输入如下命令:
./petalinux-v2023.1-05012318-installer.run -d /opt/pkg/petalinux/2023.1
运行上述命令后,需要等待一段时间,当出现“Press Enter to display the license agreements”
字样的时候,从显示的意思可以知道,让我们按下回车键显示软件许可协议,按下键盘上的回车键
Enter,这些内容如果你感兴趣可以看看,此处我们就不详细看了,直接按下键盘上的 Q 键退出, 回到之前的界面之后会出现一个选择项,询问我们是否接受
xilinx 最终用户协议。这个显然是没得选,必须接受,否则无法进行下面的安装;输入 y 按回车接受。除了 xilinx
最终用户协议之外,还有两个协议也需要大家接受,会依次显示在终端上,同理也是输入 Y 按下回车接受。接受所有协议之后 Petalinux
安装工具便会继续安装,直到安装完成。
4、设置 Petalinux 环境变量
在正式使用 petalinux 工具之前,需要先运行 petalinux 安装目录下的 settings.sh 脚本文件 设置 petalinux 工作环境,settings.sh 脚本用于 bash,还有一个 settings.csh 用于 C shell。
一般默认情况下,我们使用 bash作为登录 shell,所以 source 脚本文件 settings.sh对 petalinux 所需的运行环境进行配置,命令如下:
source settings.sh
需要注意的是该命令只对当前终端有效 ,重新打开终端后需要重新执行这一步。执行结果 如下图所示:
我们来验证下工作环境是否已设置,在终端输入如下命令:
echo $PETALINUX
显示 Petalinux 的安装目录,表明工作环境已设置。现在可以使用 Petalinux 工具了。
鉴于每次打开终端使用 Petalinux 都需要设置相应的环境变量,我们为了方便,**将设置 Petalinux 环境变量的命令设置成别名**,这样我们使用起来就方便些。设置别名方法的很简单, 在终端输入如下命令:
echo “alias sptl=’source $PETALINUX/settings.sh’” >> ~/.bashrc
以后我们打开终端后,**输入 sptl** 就可以设置 Petalinux 的环境变量了,无需输入长长的路 径。sptl 的记忆法是 Source PeTaLinux 的环境变量。提醒:在使用 linux 的时候要善用别名但不要滥用别名。
5、Linux 系统安装 JTAG cable 驱动
在嵌入式开发中,我们都是通过在线 jtag 进行调试的,这种调试方式方便快捷,在使用 Petalinux 进行 Linux 开发中,其实也是可以使用 JTAG 的,不过对于 Linux 系统,**由于安装驱动程序需要 root 或 sudo 访问权限,因此从 Vivado 2015.4 版本开始,默认不安装 jtag 驱动。这 样 Vivado 安装程序和 Petalinux 安装程序可以在没有 root 或 sudo 特权的 Linux 系统上运行。** 这也导致了在 linux 系统中,jtag 驱动需要手动安装。
下面我们介绍如何在 Ubuntu 主机中(其 他 Linux 系统同样适用)安装 jtag 驱动。 需要注意的是在安装 jtag 驱动之前,请**不要将 jtag 下载器连接到电脑** ,已经接到电脑的, 最好先拔掉。下面开始安装。
在 Ubuntu 系统中,打开终端,以普通用户运行即可。进入到 petalinux 安装目录。可以看到有一个名为“tools”的目录,jtag 驱动程序在该目录下,我们输入以下命令进入 到 jtag 驱动程序所在位置:
cd tools/xsct/data/xicom/cable_drivers/lin64/install_script/install_drivers
可以看到该目录下有一个名为“install_drivers”的文件,输入如下命令,以 root 权限执行该文件,安装 jtag 驱动程序:
sudo ./install_drivers
可以看到 jtag 驱动安装成功。对于最下面一行的警告,如果已经拔掉 jtag 下载器与电脑的 连接就可以不用看。至此 jtag 驱动程序就安装完成了。
下面说下在遇到 jtag 驱动问题时,如何删除 jtag 驱动。注意如无特需情况,请不要执行下 面的命令:
sudo rm -f /etc/udev/rules.d/52-xilinx-digilent-usb.rules
sudo rm -f /etc/udev/rules.d/52-xilinx-ftdi-usb.rules
sudo rm -f /etc/udev/rules.d/52-xilinx-pcusb.rules
三.Petalinux 设计流程实战
PetaLinux 工具提供了**在 Xilinx 处理系统上自定义、构建和部署嵌入式 Linux 解决方案** 所需的一切。该解决方案旨在提高设计生产力,可**与 Xilinx 硬件设计工具一起使用** ,以**简化针对 Zynq SoC 的 Linux 系统的开发** 。本章我们以使用 Petalinux 定制 Linux 系统为例,实战 Petalinux 的设计流程,看下 Petalinux 如何简化 Linux 系统的开发。
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](https://docs.xilinx.com/r/en-US/ug1085-zynq-ultrascale-trm/Fallback "UG1085") 中找到。在启动过程中,CSU 还将 **PMU** 用户固件(PMU FW)加载到 PMU RAM 中, 与 PMU ROM 一起提供平台管理服务。对于基于 xilinx 的 FSBL 和系统软件,大多数系统中都 必须有 PMU FW。在 PMU 固件加载前加载 FBSL 是默认配置。有些系统会切换顺序,首先加 载 PMU 固件。
在[Vitis开发二——FPGA学习笔记——二程序固化实验](https://blog.csdn.net/qq_32971095/article/details/136352300?spm=1001.2014.3001.5501 "Vitis开发二——FPGA学习笔记——二程序固化实验")中也涉及到相关内容,不过产生的BOOT文件不涉及linux操作系统。
Boot Image Format with FSBL and PMU Firmware
可以参考《xilinx zynq soc与嵌入式Linux设计实战指南》——第三章 zynq启动流程及镜像制作
及[PMU Processor • Zynq UltraScale+ Device Technical Reference Manual
(UG1085)](https://docs.xilinx.com/r/en-US/ug1085-zynq-ultrascale-trm/PMU-
Processor “PMU Processor • Zynq UltraScale+ Device Technical Reference Manual
(UG1085)“)
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 ROM 和 128 KB RAM 的 Microblaze。启动时,ROM 被 PMU Boot ROM (PBR)预加载,PBR 用于执行预启动任务,进入服务模式。有关 **PMU、PBR 和 PMUFW 加载顺序** 的更多细节,请参阅 Zynq UltraScale+器件手册 UG1085 中的平台管理单元(第 6 章)。PMU RAM 可以在运行时加载固件(PMU Firmware),并可用于扩展或定制 PMU 的功能。
PMU System Diagram
官方给出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 作为 第二阶段引导加载程序**。
5、Hypervisor (Optional,可选)
**在 Zynq UltraScale+设备上** ,可以**使用 hypervisor 运行多个虚拟机** 。Zynq UltraScale+设备 上支持几种 hypervisor,该榜单可在 [Embedded Software EcoSystem](https://www.xilinx.com/products/design-tools/embedded-software.html#rtos "Embedded Software EcoSystem") 上找到。
6、Linux
Linux,全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,是我们本开发指南的重点。
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 内核可以适用与其 他芯片平台,其知识点是通用的,也是我们需要关注的。**
2.使用 Petalinux 定制 Linux 系统
1、创建 Vivado 硬件平台
system_wrapper.xsa 文件,该文件包含着 Vivado 工程所对应的硬件平台信 息,Petalinux 根据这些信息来配置 fsbl、uboot、内核等。 将该文件拷贝到 Ubuntu 系统下。在 share 文件夹下创建一个 xsa 文 件夹,并将 system_wrapper.xsa 文件复制到该文件夹下。
2、设置 Petalinux 环境变量
source /opt/pkg/petalinux/2019.2/settings.sh
#或者
sptl
3、创建 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”
4、配置 petalinux 工程
首次配置 Petalinux 工程是将 xsa 文件导入到 Petalinux 工程中,Petalinux 工具会解析 xsa 文件并弹出配置窗口。在终端中输入如下命令配置 Petalinux 工程:
cd ALIENTEK-ZYNQ
petalinux-config –get-hw-description /mnt/hgfs/shared_folder/xsa/
弹出 petalinux 工程配置窗口,如下图所示:
需要注意的是该窗口不可以使用鼠标操作,只能通过键盘操作,界面上方的英文就是简单 的操作说明,操作方法如下:
通过键盘上的**“↑”和“↓”键来选择要配置的菜单** ,**按下“Enter”键进入子菜单** 。菜单中高亮的字母就是此菜单的**热键** ,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后**按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“ < * >”**。 **按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“ < M >”**。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信 息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。
在配置界面下方会有五个按钮,这五个按钮的功能如下:
首先按键盘上的下方向键移动到“Linux Components Selection”,然后按键盘上的“Enter” 进入子菜单,子菜单内容如下图所示:
括号里的“*”表示为已使能配置。前两个选项表示会**自动生成我们在《DFZU2EG_4EV MPSoC 之嵌入式 Vitis 开发指南》程序固化实验中的 fsbl.elf 文件和自动更新 ps_init** 。下面两个选项用来配置 u-boot 和 linux-kernel 的来源,本实验保持默认来源配置,不做改动,后面的实验需要更改的时候再做介绍。按键盘上的“Esc”按键连按两次退出该子菜单。
“Auto Config Settings”菜单主要就是**选择是否使能 fsbl、pmufw、Device tree、Kernel 和 u-boot 的自动配置** ,默认为自动配置,无需更改
其中**“SD/SDIO Settings”配置项用于配置开发板的首要启动媒介** ,即是从**SD 卡启动还是从 eMMC 启动** 。一般我们调试使用都 是通过 SD 卡启动,因为 SD 卡读写文件方便,从而方便调试;eMMC 一般是程序测试稳定后 上市时使用,不会像 SD 卡那样因碰摔造成的松动。对于 DFZU2EG_4EV MPSoC 开发板来说, 这里需要修改一下,因为 DFZU2EG_4EV MPSoC 开发板的 SD 卡接在 PS 的 SD1 控制器,如下图所示:
首先光标移动到该配置项按回车进入,如下所示:
在“Primary SD/SDIO”配置项中需要将其修改为 psu_sd_1。**psu_sd_1 对应的就是 SD 卡** 。 修改完成之后连按两次 ESC 键回到上一级菜单。
在“Advanced bootable images storage Settings”菜单中可**配置启动引导镜像和内核镜像的存储媒介** ,默认为 Primary SD,这里保持默认即可。
返回到主界面(按四次“ESC”按键),**设备树设置菜单“DTG Settings”和 ATF 配置菜 单“ARM Trusted Firmware Compilation Configuration”** 等一般保持默认即可。
我们进入“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”键, 进入如下图所示的保存配置文件界面:
按键盘上的“Enter”键确认,进入下图所示界面:
再次按键盘上的“Enter”键确认,返会到原界面,按两次键盘上的“Esc”退出配置窗口。 如果后面想重新配置,只需输入“petalinux-config”命令即可重新配置。
这一步可能需要几分钟才能完成。这是因为 PetaLinux 会根据“Auto Config Settings --->‖ 和―Subsystem AUTO Hardware Settings --->‖来解析 xsa 文件,以获取更新设备树、U-Boot 配置 文件和内核配置文件所需的硬件信息。等待一段时间后,完成 petalinux 工程的配置,如下图所示:
5、配置 Linux 内核
现在我们开始定制 Linux 内核,在终端输入如下命令:
petalinux-config -c kernel
等一段时间后会在终端中创建一个名为“linux-xlnx Configuration”的标签页,也就是 Linux 内核的配置界面,如下图所示:
可以看到 Petalinux 默认使用的**内核版本为 4.19.0** ,当然也可以换成其它版本的内核,不过 修改起来比较麻烦,Petalinux 对内核版本有要求,读者如需使用其他的内核版本可以在网上查 找关于 Petalinux 使用非默认内核版本的方法。一般使用默认内核版本就可以了。
这里使用的内核 Xilinx 官方已经做好了基础配置,如无特定需求,无需更改。另外关于 Linux 内核的配置在后面的 Linux 内核移植章节进行讲解,此处就不多做介绍了。这里采用 Xilinx 官方的默认配置即可,保存配置并退出。
6、配置 Linux 根文件系统
在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令:
petalinux-config -c rootfs
下图就是根文件系统的配置界面:
默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。需要说明的是**“PetaLinux RootFS Settings”可以用来设置 root 用户的密码,默认为“root”** 。后面登录的时候会用到。 保存配置并退出。
7、配置设备树文件
设备树的概念源自于 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
默认的文件内容如下,可见该文件需要我们自己手动配置。
/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 =
};
gpio-key2 {
label = “ps_key2”;
gpios = <&gpio 41 GPIO_ACTIVE_LOW>;
linux,code =
};
gpio-key3 {
label = “pl_key1”;
gpios = <&gpio 78 GPIO_ACTIVE_LOW>;
linux,code =
};
gpio-key4 {
label = “pl_key2”;
gpios = <&gpio 79 GPIO_ACTIVE_LOW>;
linux,code =
};
};
};
&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";
};
设备树文件当中配置了 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 = 表示该 led 的控制管脚是 gpio_38,GPIO_ACTIVE_HIGH 表示高电平有效(也就是高电平的时候 led 灯才会亮)。
8、编译 Petalinux 工程
现在我们就可以编译整个 Petalinux 工程了,在终端输入如下命令:
petalinux-build
该命令将生成设备树 DTB 文件、fsbl 文件、U-Boot 文件,Linux 内核和根文件系统映像 。 编译完成后,生成的映像将位于工程的 images 目录下 。需要说明的是 fsbl、U-Boot 这两个我们在工程中并没有配置,这是因为 Petalinux 会根据 xsa 文件和配置 petalinux 工程自动配置 fsbl 和 uboot ,如无特需要求,不需要再手动配置。
执行结果如下图所示:
9、制作 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 会自动使用默认文件。
执行结果如下图所示:
可以看到 Petalinux **自动将 PMU(Platform Management Unit) firmware 文件 pmufw.elf 和 ATF(Arm trusted firmware)文件 bl31.elf 包含进 BOOT.BIN** 。
生成的 BOOT.BIN 文件放在 Petalinux 工程的 **images/linux 目录下** ,上一小节编译 Petalinux 工程生成的文件同样存放在 images/linux 目录下,如下图所示:
10、制作 SD 启动卡
如果使用 SD 卡引导 linux系统启动,一般需要在 SD 卡上有 2 个分区。**一个分区使用 FAT32 文件系统,用于放置启动镜像文件(如 BOOT.BIN,linux 镜像等),另一分区使用 EXT4 文件系统,用于存放根文件系统**。
需要说明的是在配置 petalinux 工程中,“Image Packaging Configuration”子菜单根文件系统的类型的配置使用的是默认的 **INITRAMFS** ,所以**只需要一个使用 FAT32 文件系统** 的分区就可以了。**当设置为“EXT”则需要另一个存放根文件系统的分区** 。
先讲解 SD 卡的分区和格式化,然后说明将哪些文件复制到 SD 卡中。 注:在使用 SD 卡前需要先将 sd 卡中的数据做备份,否则会丢失 SD 卡中的数据。
将 SD 卡插入到读卡器中、并将读卡器插入电脑并连接到 Ubuntu 系统,**在 Ubuntu 系统中 找到 SD 卡所对应的设备节点** ,笔者插入的 SD 卡对应的设备节点为/dev/sdc。在终端中输入如 下命令:
umount /dev/sdc*
sudo fdisk /dev/sdc
输入“p”执行结果如下图所示:
可以看到当前的分区表,有一个 FAT32 的分区。在开始新分区之前需要将以前的分区删 除,键入“d”,删除该分区,再次键入“d”时会出现下图所示的红色字体提示,表明已无存 在的分区。如果 SD 卡存在多个分区,需要全部删除,存在多个分区的情况下,键入“d”时 会提示选择需要删除的分区编号。
下面开始新建分区。输入“n”创建一个新分区。通过选择'p'使其为主,使用默认分区号 1 和第一个扇区 2048。设置最后一个扇区,也就是设置第一个分区的大小,一般设置 500M 足 够了,通过输入“+ 500M”,为该分区预留 500MB,如下图所示:
现在设置分区类型,输入“t”,然后输入“c”,设置为“W95 FAT32 (LBA)”,如下图 所示:
输入“a”,设为引导分区,如下图所示:
第一个分区就创建好了,开始创建第二个分区。
通过键入“n”来创建根文件系统分区。后面一路默认就可以了,如下图所示:
如果现在输入“p”检查分区表,会看到刚刚创建的 2 个分区。如果没问题,键入“w” 以写入到 SD 卡并退出。
完成了分区创建后,就可以格式化分区了。在终端输入如下命令:
sudo mkfs.vfat -F 32 -n boot /dev/sdc1
sudo mkfs.ext4 -L rootfs /dev/sdc2
将第一个分区格式化成 FAT32 分区并命名为 boot,将第二个分区格式化成 ext4 分区并命 名为 rootfs。执行结果如下图所示:
格式化分区之后就可以挂载分区了(重新插拔读卡器或者使用 mount 命令进行挂载)。挂 载完成后,我们将该工程 image/linux 目录下的 BOOT.BIN 和 image.ub 文件拷贝到名为 boot 的分区也即/dev/sdc1 分区中。然后就可以卸载 SD 卡了。
11、开发板启动模式设置
将 SD 卡插入 SD 卡槽,接下来将启动模式开关 BOOT MODE 的四个开关的第二个与第四个开关拨到下面(置为 OFF),即设置为从 SD 卡启动。打开 MobaXterm 串口上位机或其它串口上位机。上位机打印 Linux 启动信息如下:
停留在登录处,此处使用 root 用户登录,登录密码为“root”(去掉双引号),登录进去 后,界面如下:
如果我们把视线移到开发板,会看到板上的 LED 灯全都是亮的,其中,底板上的 PL_LED1 和 PS_LED1 同频闪烁,这是设备树配置文件产生的结果。
Petalinux 的功能远不止如此,其他功能读者有兴趣可进行探索,建议参考 ug1144 参考 手册,也就是 Xilinx 官方编写的 PetaLinux 工具使用说明文档。
支持文档 :[Xilinx Wiki - Confluence (atlassian.net)](https://xilinx-
wiki.atlassian.net/wiki/spaces/A/overview “Xilinx Wiki - Confluence
(atlassian.net)“)
特别说明:以后我们使用主机终端指代电脑上 Ubuntu 系统的终端,串口终端指代通过串 口线连接到开发板显示在串口上位机中的终端。
本文转自 https://blog.csdn.net/qq_32971095/article/details/133468006,如有侵权,请联系删除。