PetaLinux 是赛灵思(Xilinx,现为AMD旗下)推出的嵌入式Linux开发工具套件,专为其FPGA(如Zynq、Zynq UltraScale+ MPSoC、MicroBlaze等)和自适应SoC设计。它基于Yocto Project构建,提供了一套完整的工具链,简化了嵌入式Linux系统的开发、定制和部署流程。petalinux并不是一个特殊Linux内核,而是一套开发环境配置的工具,降低uboot、内核、根文件系统的配置的工作量,可以从Vivado的导出硬件信息自动完成相关软件的配置。
这里选择将petalinux安装在ubuntu 20.04.6上。因为使用的主机是windows系统,所以选择安装virtualbox后再安装的ubuntu 20.04.6虚拟机。你也可以通过vmware安装ubuntu。具体怎么如何在virtualbox或者vmware上安装ubuntu,请自行网上查找相关资料。
安装好ubuntu系统之后需要进行一下操作。
安装依赖库
xsudo apt-get install -y python tofrodos iproute2 gawk xvfb gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential libsdl1.2-dev libglib2.0-dev zlib1g:i386 screen pax gzip
petalinux默认使用的是bash解释器,查看Ubuntu解释器:
xxxxxxxxxxls -l /bin/sh
解释器类型相符,若不相符则用以下命令进行修改dash为bash:
xxxxxxxxxxsudo dpkg-reconfigure dash
在出现的弹框中点击“NO”。
/opt目录下只能在root账户下创建 文件夹,所以这里需要额外加一行代码切换管理员身份:
xxxxxxxxxxsusudo chown -R user:user /opt这里的 user:user更换成 ubuntu的普通账户名,我这里是mind
创建一个下载petalinux的文件夹,此处我是建在/opt/pkg/petalinux目录下,修改文件夹权限
xxxxxxxxxxroot@Ubuntu20:/media/sf_vmshare# mkdir -p /opt/pkg/petalinux/2021.1root@Ubuntu20:/media/sf_vmshare# sudo chown -R mind:mind /opt
因为 Petalinux 不能在root账户下安装,只能在普通用户下安装 ,所以此处需要退出管理员模式进入普通用户模式下载(2021版一定得在命令里输入-d):
xxxxxxxxxxmind@Ubuntu20:/media/sf_vmshare$ ./petalinux-v2021.1-final-installer.run -d /opt/pkg/petalinux/2021.1
之后系统就开始安装petalinux了,直到出现 “Press Enter to display the license agreements 字样,按下回车继续,之后会出现三个许可协议,也是按 Q 退出后 按下Y 按回车继续,之后系统就开始安装Petalinux了
输入以下命令对Petalinux 的环境进行加载,此命令只对当前终端有用。
xxxxxxxxxxsource /opt/pkg/petalinux/2021.1/settings.sh
出现
xxxxxxxxxxPetaLinux environment set to '/opt/pkg/petalinux/2021.1'WARNING: This is not a supported OSINFO: Checking free disk spaceINFO: Checking installed toolsINFO: Checking installed development librariesINFO: Checking network and other services
可以将其写入到系统环境变量中:
xxxxxxxxxxvi ~/.bashrc#方法一:将如下内容写入到.bashrc中,不过这种办法每次打开一个终端,都会有一段信息输出source source /opt/pkg/petalinux/2021.1/settings.sh#方法二:将如下内容写入到.bashrc中。如果新开一个终端时,需要启用环境变量,可以直接输入speta 即可alias speta='source /opt/pkg/petalinux/2021.1/settings.sh'
再按下 echo $PETALINUX:
xxxxxxxxxxecho $PETALINUX
如果显示Petalinux的安装目录,表明工作环境已设置 并且可以正常运行了。
创建vivado工程
编译工程
导出硬件,得到.xsa
如果是在window系统下生成的xsa文件,则可以通过virtualbox或者vmware的共享文件夹的方式复制到ubuntu系统中
在用户目录下,创建一个文件夹:
xxxxxxxxxxmkdir petalinux_projects进入该文件夹,创建一个工程目录:
x
cd petalinux_projects#创建一个petalinux工程petalinux-create -t project --template zynq --name petalinux-mind将xsa文件复制到工程目录中:
再配置前进行petalinux环境的加载。如果petalinux的环境是自动加载则可以跳过该步骤:
xxxxxxxxxxsource /opt/pkg/petalinux/2021.1/settings.sh#已经用了环境变量的话直接输入spetaspeta
进入该工作目录下,导入硬件信息进行配置:
x
cd petalinux-mind# petalinux-config --get-hw-description <xsa文件目录>petalinux-config --get-hw-description=./system_wrapper.xsa此处会弹出相关配置的字符图形界面,相关配置在后续讲述。
如果后面想单独配置设备树、uboot、kernel、rootfs、busybox,则可以通过如下相应命令进行配置
xxxxxxxxxxpetalinux-config -c device-treepetalinux-config -c u-bootpetalinux-config -c kernelpetalinux-config -c rootfspetalinux-config -c busybox
编译和clean操作
x
# 方式一:编译整个工程(uboot/kernel/devicetree/rootfs/fsbl/bitfile)#一步到位编译设备树、内核、uboot等petalinux-build# 方式二:根据需要编译petalinux-build -c u-bootpetalinux-build -c kernelpetalinux-build -c rootfs# 如果不是第一次编译设备树,即使修改了设备树执行petalinux-build -c device-dree也不会生成dtb文件,这时应先执行petalinux-build -c device-tree -x cleansstate 清理编译状态后再编译设备树。
# clean# remove the <PROJECT>/build/linux/u-boot/ directorypetalinux-build -c u-boot -x distclean # remove the <PROJECT>/build/ directorypetalinux-build -x distclean#remove <PROJECT>/images/ and <PROJECT>/build/ directoriespetalinux-build -x mrproper打包:生成BOOT.BIN文件
x
# --fsbl:不指定则默认为images/linux/zynq_fsbl.elf # --u-boot:不指定则默认为images/linux/u-boot.elf# --fpga:不指定则默认为images/linux/system.bit “--fpga”指合成 bit 文件到 BOOT.bin 中
# 仅将uboot/fsbl/bit文件打包到BOOT.bin文件中petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --fpga --force
# 将内核也打包到BOOT.bin中petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --fpga --kernel --force在执行petalinux-config --get-hw-description命令弹出一个窗口里可以配置petalinux工程。如果已经配置过了,之后想再次配置,可以运行命令“petalinux- config”来配置。
通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中蓝色高亮的首字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。 在配置界面下方会有五个按钮,这五个按钮的功能如下:
xxxxxxxxxx<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。<Help>:帮助按钮,查看选中菜单的帮助信息。<Save>:保存按钮,保存修改后的配置文件。<Load>:加载按钮,加载指定的配置文件。
从上到下的简单地介绍下这些菜单:
“Linux Components Selection”:
子菜单内容如下图所示:
中括号里的“*”表示已使能配置,第二项和第三项表示会自动生成实验中使用的 fsbl.elf 文件和自动更新 ps_init。下面两个选项用来配置 u-boot 和 linux- kernel 的来源
“Auto Config Settings”:
主要就是选择是否使能 Device tree、Kernel 和 u-boot 的自动配置,这里使用默认配置,无需更改。
“Subsystem AUTO Hardware Settings”:
子菜单的内容如下图所示:
进入到该界面的各个外设子菜单中,可以发现都已经设置好了默认配置,这些默认配置是根据 xsa 文件的信息自动配置的,基本上无需我们手动配置;“Serial Settings”配置项用于配置开发板的调试串口和串口波特率等参数。
把“FSBL Serial stdin/stdout”和“DTG Serial stdin/stdout”两项中默认使用的“ps7_uart_1”改成“ps7_uart_0”,也就是 USB 串口。这是因为 uart1 是 PL 端的接口。修改完成之后连按两次 ESC 键回到上一级菜单。
“DTG Settings”、FSBL 配置菜单“FSBL Configuration”、FPGA 管理器菜单“FPGA Manager”、u-boot 配置菜单“u-boot Configuration”和 linux 配置菜单“Linux Configuration”一般保持默认即可。
“Image Packaging Configuration”:
子菜单如下:
第一个选项便是根文件系统的类型的配置,默认为 INITRD,一般默认即可。如果我们需要运行Ubuntu 或 Debian 的根文件系统时,就需要配置成 EXT4(SD/eMMC/ SATA/USB),NFS 挂载启动需要配置成 NFS。
“Firmware Version Configuration”:
可以用来修改定制的 linux 系统的主机名和产品名,默认与该 Petalinux 工程同名,如果需要可修改。
“Yocto Settings”:
进行与 Yocto 相关的设置,这里就不做介绍了,一般保持默认即可。
在选项Linux Components Selection 中可以配置uboot和Linux内核的来源,按回车键可进入下一个选择界面。uboot和Linux内核默认是github上下载的,需要Linux主机连接互联网才能下载。本实验将对应的资源都下载到了本地。下载链接:linux-xlnx、uboot-xlnx
注意:①一定要使用和petalinux对应版本,我们使用的是petalinux2021.1版本;②如果多个petalinux工程都需要使用本地源码,那么每一个 petalinux 工程都需要单独对应内核源码和 u-boot 源码, 否则其中一个 petalinux 工程修改了源码, 就会影响到其他的工程。
将内核源码复制到虚拟机内解压。在这里我们选择解压到/home/mind/petalinux_downloads下(需要先创建petalinux_downloads文件夹)。
将linux内核/uboot的来源改为本地获取,并配置对应下载的离线包解压后的地址:
选择Linnux Compoents Selection-->u-boot-->ext-local-src
Linnux Compoents Selection-->linux-kernel-->ext-local-src
选择完成后会出现多两行选项:External u-boot local source settings--->
External u-boot local source settings--->
选中这两项,填入对应地址保存并退出。
Petalinux 编译工程默认需要联网下载一些资源,如果网络不佳会编译非常缓慢甚至编译失败。为了解决这个问题,我们可以预先下载两个离线资源包,然后设置 petalinux离线编译。此时,u-boot和linux的资源包已从github下载,还需要下载downloads 、ssate:
注意,一定要下载 petalinux版本对应的文件,我们使用的 petalinux 版本是 2021.1,就需要找到 2021.1标签中的这两个文件下载。
选择Petalinux工具arm- sstate-cache:
将下载的压缩包拷贝到虚拟机中并解压,这里选择解压到/home/mind/petalinux-downloads:
选择最下面的“Yocto Settings —>选项:
在“Yocto Settings —>” 界面中,取消选择“Enable Network sstate feeds”,选择“Enable BB NO NETWORK”,因为我们已经把所需要的包下载到了本地,所以在编译时不需要进行联网,可以缩短编译时间。
注:即便设置了离线编译,但在构建工程时也需要保证ubuntu系统可以连接网络,petalinux需要从github上下载一些源代码。
设置“sstate_aarch64”包的路径,选择此页面下的“Local sstate feeds settings —>”选项,配置相应的解压文件所在路径
设置“downloads”包的路径,先选择< Exit >选项返回到下图的界面,然后选择“Add pre-mirror url —>”选项:此路径前一定要加file:///
在初始页面选择Image Packaging Configuration----->
第一个选项便是根文件系统的类型的配置,默认为 INITRD,一般默认即可。如果我们需要运行Ubuntu 或 Debian 的根文件系统时,就需要配置成 EXT4(SD/eMMC/ SATA/USB),NFS 挂载启动需要配置成 NFS。此处设置成EXT4。
注:INITRD 类型的根文件系统每次重新启动 linux 系统都是全新的、未改动过的,也就是说启动系统后进行的所有修改掉电后就全部丢失了,再次重新启动还是之前未修改过的根文件系统,选择“EXT4”可以将根文件系统放在 SD 卡、eMMC 的 ext4 分区,这样启动系统后进行的所有修改掉电后就不会丢失了。
“Copy final images to tftpboot”选项:当在 Ubuntu 的根文件下创建一个名为 tftpboot 的文件夹时,工程生成镜像后会自动将相关文件复制到/tftpboot 目录中。
最后点击Save,Exit。
在配置完petalinux工程后,并执行以下命令,即可生成内核镜像和文件系统:
xxxxxxxxxxpetalinux-buildpetalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --fpga --force至此在image/linux文件夹下生成了:BOOT.bin、boot.scr、image.ub、rootfs.tar.gz。下面需要将内核镜像以及文件系统保存到TF卡上。
插入TF卡,此时可以在虚拟机右下角位置查看并选择tf卡的连接位置:
格式化TF卡,可用Ubuntu系统上的Disks软件格式化TF卡:需要创建两个分区,一个是fat32分区(存放boot.bin、boot.scr和image.ub文件),一个是ext4分区(存放文件系统)。
xxxxxxxxxxumount /dev/sdb1sudo fdisk /dev/sdb
创建第一个分区:FAT32分区
输入“p”,会看到当前分区情况。
输入"d",将一个分区删除,如果有多个分区,则需要输入多次d。
再输入“p”,会看到当前分区情况。如果当前分区不是dos分区的话,则输入“o”,改为dos
输入“n”,将创建一个分区。输入“p”,然后依次输入“1”、“2048”、“+200M”。
输入“t”,设置分区类型,输入“c”,将类型设置为“W95 FAT32 LBA”。
输入“a”,将分区设置为引导分区。
创建第二个分区:EXT4分区
使用“n”命令,将剩余空间都留给第二个分区,直接回车就可以了。
检查分区
输入“p”,检查一下是不是两个分区;都没问题则输入“w”,将分区表写入tf卡。
格式化分区表
xxxxxxxxxx# 将第一个分区格式化成 FAT32 分区并命名为 boot# 将第二个分区格式化成 ext4 分区并命名为 rootfssudo mkfs.vfat -F 32 -n boot /dev/sdb1sudo mkfs.ext4 -L rootfs /dev/sdb2将工程目录images -> linux目录中的BOOT.BIN、boot.scr及image.ub复制到sd卡的FAT分区。
将./image/rootfs.tar.gz文件解压到第二个分区
x
sudo tar -xzf ./images/linux/rootfs.tar.gz -C /media/mind/rootfs/syncumount TF卡
将TF卡插入板卡内,跳线帽选择TF卡启动模式,板卡连接好串口。上电。
使用petalinux的bsp包,我们可以方便快速的提供我们验证好的petalinux工程给他人使用,或者是使用他人验证好的petalinux工程。只需要掌握创建和使用bsp包的两条命令即可。
创建 bsp包
使用下面的命令即可创建petalinux工程的bsp包到当前打开终端的路径中:
x
cd petalinux-mindpetalinux-package --bsp -p ./ --output petalinux-mind.bsp
#-p参数后面的路径是petalinux工程的一级路径#–output参数后面跟的是bsp包的名称使用bsp包
使用下面的命令即可用bsp包来创建petalinux工程到当前打开终端的路径中:
xxxxxxxxxxpetalinux-create -t project -n new_project -s ./petalinux-mind.bsp
#-n参数后面跟的是petalinux工程的名称#-s参数后面跟的是我们使用的bsp包的路径注:如果制作bsp包的工程可以编译成功,那使用bsp包制作的工程也可以直接编译.