目录
一.开发环境搭建
1.Ubuntu 和 Windows 文件互传
1、开启 Ubuntu 下的 FTP 服务
2、Windows 下 FTP 客户端安装
2.Ubuntu 和 Windows 文件本地共享
3.Ubuntu 系统搭建 tftp 服务器
4.Ubuntu 下 NFS 和 SSH 服务开启
5.Source Insight 软件安装和使用
6.Visual Studio Code 软件的安装和使用
7.SecureCRT 软件安装和使用
8.Putty 软件的安装和使用
二.Petalinux 的安装
1.Petalinux 简介
2.安装 Petalinux
1、安装依赖库以及软件
2、修改 bash
3、安装 Petalinux
4、设置 Petalinux 环境变量
5、Linux 系统安装 JTAG cable 驱动
三.Petalinux 设计流程实战
1.Zynq UltraScale+ MPSoC 嵌入式软件栈概述
1、FSBL
2、Platform Management Unit (PMU) Firmware
3、ARM Trusted Firmware
4、U-Boot
5、Hypervisor (Optional,可选)
6、Linux
2.使用 Petalinux 定制 Linux 系统
1、创建 Vivado 硬件平台
2、设置 Petalinux 环境变量
3、创建 petalinux 工程
4、配置 petalinux 工程
5、配置 Linux 内核
6、配置 Linux 根文件系统
7、配置设备树文件
8、编译 Petalinux 工程
9、制作 BOOT.BIN 启动文件
10、制作 SD 启动卡
11、开发板启动模式设置
前置学习: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,讲解这两种操作系统下的环境搭建。
Windows 和 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
确保上面两行前面没有“#”,有的话就取消掉
Windows 下 FTP 客户端我们使用 FileZilla。打开站点管理器,点击:文件->站点管理器。点击“新站点(N)”按钮来创建站点,新建站点以后就会在“我的站点”下出现新建的这个站点,站点的名称可以自行修改,比如我将新的站点命名为“Ubuntu”。选中新创建的“Ubuntu”站点,然后对站点的“常规”进行设置:
如果要将 Windows 下的文件或文件夹拷贝到 Ubuntu 中,只需要在左侧的 Windows 区域选中要拷贝的文件或者文件夹,然后直接拖到右侧的 Ubuntu 中指定的目录即可。 将 Ubuntu 中的文件或者文件夹拷贝到 Windows 中也是直接拖放。
Ubuntu 和 Windows 文件互传可以使用本地共享的方式。这种共享的方式极大的免除了不同系统文件 之间的文件复制和磁盘空间的双重占用。下面笔者将介绍如何使用 Vmware 虚拟机来实现 Ubuntu 和 Windows 文件之间的共享。
在 Vmware 的菜单栏中,选择“设置(S)”,在弹出的菜单中,选择“选项”,在该界面中,单击“共享文件夹”,在右边界面中选择 “总是启用(E)”,添加共享的文件夹,默认勾选“启用此共享”。
该文件夹在 Ubuntu 系统中对应的是/mnt/hgfs/share/目录,我们在终端中输入命令:
ll /mnt/hgfs/share/
可以看到该文件夹为空。如果需要从 Ubuntu 系统向 Windows 传递文件,可 以用 cp 命令或 mv 命令文件到该目录。
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
后面进行 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,使用默认配置即可。
Source Insight 是一款功能强大的代码编辑、阅读工具,工作在 Windows 下,我们可以用 Source Insight 来进行代码编写和阅读,编写完成以后将代码拷贝到 Ubuntu 中去编译即可。
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 来编译程序,这里主要知道如何指定头文件路径就 可以了,后面有实际需要的时候再来讲。
在后续的开发过程中我们需要在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 中的终端一样。
关于:SecureCRT 中如何配置颜色
Putty 和 SecureCRT 是类似的软件,都是用来作为 SSH 或者串口终端的,区别在于 SecureCRT 是付费软件,而 Putty 是免费的。虽然 Putty 没有 SecureCRT 功能强大,但是 Putty 用来作为嵌入式 Linux 的串口终端是绰绰有余的,而且在 Ubuntu 下安装 Putty 十分方便,只需 一条命令即可:
sudo apt install putty
使用 USB 线将开发板串口和电脑连接起来,打开 Putty 软件,打开以后是配置界面,如下 图所示:
安装 Petalinux 开发工具在 Ubuntu 操作系统中,在虚拟机中安装了 Ubuntu 18.04 64 位操作系统,这也是官方推荐的版本。
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)
下载途径:下载 (xilinx.com)
注意 Petalinux 的版本 要求与 Vivado 的版本一致
首先将 petalinux 安装包文件 petalinux-v2019.2-final-installer.run 拷贝到 share 共享目录,,在 Ubuntu 系统中,打开终端,切换到 /mnt/hgfs/share/目录,可以看到 petalinux 的安装文件 petalinux-v2019.2-final-installer.run 已在该目录,可直接访问。
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
Petalinux 工具需要主机系统的/bin/sh 是 bash,而 Ubuntu 默认的/bin/sh 是 dash,所以这里 需要进行更改,运行 sudo dpkg-reconfigure dash 命令,如下:
sudo dpkg-reconfigure dash
选择“No”按下回车即可。
安装 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 安装工具便会继续安装,直到安装完成。
在正式使用 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 的时候要善用别名但不要滥用别名。
在嵌入式开发中,我们都是通过在线 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 工具提供了在 Xilinx 处理系统上自定义、构建和部署嵌入式 Linux 解决方案所需的一切。该解决方案旨在提高设计生产力,可与 Xilinx 硬件设计工具一起使用,以简化针对 Zynq SoC 的 Linux 系统的开发。本章我们以使用 Petalinux 定制 Linux 系统为例,实战 Petalinux 的设计流程,看下 Petalinux 如何简化 Linux 系统的开发。
在 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 固件。
Boot Image Format with FSBL and PMU Firmware
可以参考《xilinx zynq soc与嵌入式Linux设计实战指南》——第三章 zynq启动流程及镜像制作
及PMU Processor • Zynq UltraScale+ Device Technical Reference Manual (UG1085)
FSBL 是 Zynq UltraScale + MPSoC 的第一阶段引导加载程序,由 BootROM 引导加载到片上 RAM 中并启动,用于配置 FPGA(使用 bitstream,如果存在的话)和从非易失性 Flash(SD/eMMC/NAND/QSPI)加载裸机镜像或者操作系统的第二阶段引导加载程序镜像到内存(DDR/OCM)。
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的用处:
ARM Trusted Firmware(ATF)为 ARMv8-A 架构的安全软件提供了参考,它提供了各种接 口标准的实现,如 PSCI(Power State Coordination Interface,电源状态协调接口)和用于与 Normal world software 接口的安全监控代码。
U-Boot 是 Universal Boot Loader 的简称,是一个开源的、主要的引导加载程序,用于嵌入 式设备中引导设备的操作系统内核,在 Linux 社区中经常使用。Xilinx 在 Zynq Ultrascale+设备 中使用 U-Boot 作为第二阶段引导加载程序。
在 Zynq UltraScale+设备上,可以使用 hypervisor 运行多个虚拟机。Zynq UltraScale+设备 上支持几种 hypervisor,该榜单可在 Embedded Software EcoSystem 上找到。
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 内核可以适用与其 他芯片平台,其知识点是通用的,也是我们需要关注的。
system_wrapper.xsa 文件,该文件包含着 Vivado 工程所对应的硬件平台信 息,Petalinux 根据这些信息来配置 fsbl、uboot、内核等。 将该文件拷贝到 Ubuntu 系统下。在 share 文件夹下创建一个 xsa 文 件夹,并将 system_wrapper.xsa 文件复制到该文件夹下。
source /opt/pkg/petalinux/2019.2/settings.sh
#或者
sptl
为了方便工程的管理,我们在使用的用户的家目录下新建一个 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”
首次配置 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 工程的配置,如下图所示:
现在我们开始定制 Linux 内核,在终端输入如下命令:
petalinux-config -c kernel
等一段时间后会在终端中创建一个名为“linux-xlnx Configuration”的标签页,也就是 Linux 内核的配置界面,如下图所示:
可以看到 Petalinux 默认使用的内核版本为 4.19.0,当然也可以换成其它版本的内核,不过 修改起来比较麻烦,Petalinux 对内核版本有要求,读者如需使用其他的内核版本可以在网上查 找关于 Petalinux 使用非默认内核版本的方法。一般使用默认内核版本就可以了。
这里使用的内核 Xilinx 官方已经做好了基础配置,如无特定需求,无需更改。另外关于 Linux 内核的配置在后面的 Linux 内核移植章节进行讲解,此处就不多做介绍了。这里采用 Xilinx 官方的默认配置即可,保存配置并退出。
在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令:
petalinux-config -c rootfs
下图就是根文件系统的配置界面:
默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。需要说明的是“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
默认的文件内容如下,可见该文件需要我们自己手动配置。
/include/ "system-conf.dtsi"
#include
#include
/ {
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 灯才会亮)。
现在我们就可以编译整个 Petalinux 工程了,在终端输入如下命令:
petalinux-build
该命令将生成设备树 DTB 文件、fsbl 文件、U-Boot 文件,Linux 内核和根文件系统映像。 编译完成后,生成的映像将位于工程的 images 目录下。需要说明的是 fsbl、U-Boot 这两个我们在工程中并没有配置,这是因为 Petalinux 会根据 xsa 文件和配置 petalinux 工程自动配置 fsbl 和 uboot,如无特需要求,不需要再手动配置。
执行结果如下图所示:
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 目录下,如下图所示:
如果使用 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 卡了。
将 SD 卡插入 SD 卡槽,接下来将启动模式开关 BOOT MODE 的四个开关的第二个与第四个开关拨到下面(置为 OFF),即设置为从 SD 卡启动。打开 MobaXterm 串口上位机或其它串口上位机。上位机打印 Linux 启动信息如下:
停留在登录处,此处使用 root 用户登录,登录密码为“root”(去掉双引号),登录进去 后,界面如下:
如果我们把视线移到开发板,会看到板上的 LED 灯全都是亮的,其中,底板上的 PL_LED1 和 PS_LED1 同频闪烁,这是设备树配置文件产生的结果。
Petalinux 的功能远不止如此,其他功能读者有兴趣可进行探索,建议参考 ug1144 参考 手册,也就是 Xilinx 官方编写的 PetaLinux 工具使用说明文档。
支持文档:Xilinx Wiki - Confluence (atlassian.net)
特别说明:以后我们使用主机终端指代电脑上 Ubuntu 系统的终端,串口终端指代通过串 口线连接到开发板显示在串口上位机中的终端。