该流程中使用的软硬件环境如下:
-
Windows 11 (pro) + Vivado 2022.2 + Vitis 2022.2
-
Ubuntu 20.04 + Petalinux 2022.2
-
git
-
简介
系统开发过程中计划使用nanomsg作为上下位机通讯接口,nanomsg需要运行在linux系统上,所以在开发过程中引入ZYNQ linux开发流程,其中包括Petalinux的安装与使用。Petalionux运行在Ubuntu20.04版本的服务器上,本地开发FPGA使用的Vivado运行在Windows 11,同时涉及到本地对ZYNQ硬件的烧写、多人合作等需求。为满足这些开发需求,搭建了一套通用pipeline,方便之后开发进行。
-
修订历史
修订日期 | 修订内容 | 执行人 |
20.02.2023 | 初始版本;基于Vivado 2018.3 | ldy |
22.02.2023 | 更新基于Vivado 2022.2 Ubuntu 20.04 | ldy |
-
软件安装
安装流程:
-
从官网获取Vivado 2022.2 windows版本,选择vitis产品安装
-
从官网获取petalinux 2022.2 Linux版本,服务器已安装
注意事项:
-
Ubuntu 20.04开始,对python版本的管理进行了更改,dpkg queue中不再维护python,而是分别用python2和python3进行两个大版本python的更新,这导致所有不支持Ubuntu 20.04版本的petalinux的安装和使用变得十分麻烦,因为petalinux使用dpkg queue来进行依赖包检测,报错提示检测不到python。所以对Ubuntu 20.04及以上版本建议使用petalinux 2021.1及以上版本
-
petalinux版本必须与Vivado版本一致,否则之后使用会有各种未知报错
-
Xilinx公司自2020年3月后新版本vivado更新后,用独立的Vitis替代了原来的Xilinx SDK。这使得老版本的hdf等文件无法在新版本的petalinux中使用,新数据格式为XSA。
-
Petalinux 配置流程
总流程:
-
Hardware Platform Creation : Vivado + Vitis
-
Create PetaLinux Project :
petalinux-create -t project --template zynq -n <name>
-
Initialize PetaLinux Project :
petalinux-config --get-hw-description <.xsa path>
-
Configure System-Level Options[optional] :
petalinux-config
-
Create User Components[optional] :
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 --fsbl --fpga --u-boot --force
-
Boot the System for Testing :
petalinux-boot
简化重点操作:
-
Create PetaLinux Project create 和
get-hw-description
很快能完成,生成 project-spec/configs/config 和 project-spec/configs/rootfs_config 以及 project-spec/hw-description目录 -
Configure the Linux Kernel 第一次非常费时间, 一定要先
petalinux-config
设定CONFIG_PRE_MIRROR_URL
= "file:///opt/share/petalinux/2022.2/downloads/" 原始默认为http://petalinux.xilinx.com/sswreleases/rel-v${PETALINUX_MAJOR_VER}/downloads
CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL
= "/opt/share/petalinux/2022.2/sstate-cache/arm/" -
Build the System 前需要先更改
Image Packaging Configuration
中的tftpboot 目录CONFIG_SUBSYSTEM_TFTPBOOT_DIR
= /srv/tftp
-
提醒:默认配置 root 不允许登陆,用 petalinux 账户第一次登陆会提示改密码,可以sudo,如果需要root登陆,必须要开启
petalinux-config -c rootfs
菜单中的 Image feature 中的debug-tweaks
-
Hardware Platform Creation
本地进行FPGA部分开发,正常生成bitstream,在Vivado窗口 File->Export->Export Hardware导出.xsa
文件。这里注意要包括bitstream。老版本中这一步会生成.sdk文件夹和.hdf文件,.xsa
文件的内容和以前的.hdf文件没有区别,但是格式改变了。之后petalinux需要该文件生成硬件部分,需要通过git或共享目录把该文件上传到Ubuntu服务器。
# 新建git repo
# windows上的更新通过branch fpga维护,当有可以运行版本时合并到main
git init
git remote add origin <repo ip>
git checkout -b fpga
# 添加.gitignore文件,只保留必要文件,详见附件
vi .gitignore
git add ./*
git commit
git push --set-upstream origin/fpga
git push
-
Create PetaLinux Project
每次运行petalinux前需要添加环境变量。这里petalinux安装在了/opt/share/petalinux/2022.2
Source
/setting.sh 为了方便项目同步,这里把之前vivado的仓库clone下来,在repo工作区中新建petalinux项目
# Clone远程repo
# Ubuntu上的更新通过branch linux维护,当有可以运行版本时合并到main
git clone <repo ip>
cd <project path>
git checkout -b linux
git rebase origin/fpga
# 新建petalinux项目
petalinux-create -t project --template zynq -n <name>
# -t : 声明生成文件类型,有app,modula,project三种
# --template : 按照模板生成project,有三种,这里选择我们使用的zynq
# -n : project名称
-
Initialize PetaLinux Project
Linux最小系统x最小系统由bootloader、linux kernel、root filesystem 组成,需要分别配置。
首先根据.xsa文件配置FSBL、SSBL(u-boot)、以及设备树(DTS),这里不用修改,使用默认设置
FSBL指First Stage Boot Loader,即一阶段启动器,负责初始化硬件,比如时钟和DDR之类的,初始化完成后启动U-Boot进行系统启动,所以U-Boot又被称为SSBL,即Second Stage Boot Loader
petalinux-config --get-hw-description <.xsa path>
# 输入后等待一段时间,会跳出新窗口显示配置界面,如果长时间没跳出新窗口,检查当前窗口是有新栏目
# 这里不做修改,左右键切换到<Save>,回车一路确认,回到该窗口后双击Esc退出完成配置
# 有报错请检查当前是否在项目目录内,或.xsa路径有没有错误
在 Subsystem AUTO中 可以更改 Ethernet 为固定IP地址
-
Configure the Linux Kernel
配置Linux kernel
类似的,这里也会跳出一个窗口,保持默认设置即可
petalinux-config -c kernel
# -c 即-component,这里指配置kernel,同样保持默认
-
Configure the Root Filesystem
配置Linux kernel
类似的,这里也会跳出一个窗口,保持默认设置即可
petalinux-config -c rootfs
# -c 即-component,这里指配置root filesystem,同样保持默认
-
Build the System
上面三步config完成了linux系统必要成分的设置,接下来需要根据设置构建完成的linux镜像
petalinux-build
# 这一步会生成之后用到的各种未打包文件,如:
# zynq_fsbl.elf : 一阶段启动引导程序镜像
# u-boot.elf : u-boot镜像
# system.dtb : 设备树二进制文件,描述驱动和硬件之间的动态连接
# etc.
-
Package for Deploying the System
上一步已经生成了系统启动必要的所有文件,接下来需要把所有文件打包成启动器和系统镜像,进行烧录
petalinux-package --boot --fsbl --fpga --u-boot --force
# --boot: 生成BOOT.BIN作为启动器
# --fsbl: 打包fsbl到BOOT.BIN中,源文件为zynq_fsbl.elf
# --fpga: 打包bitstream到BOOT.BIN中,源文件为system.bit
# --u-boot: 打包U-Boot到BOOT.BIN中,源文件为u-boot.elf
# etc. 其他还有设备树之类的也被打包到BOOT.BIN内了
# 同时也生成了系统镜像,即image.ub,其中包括rootfs等内容
-
Syncronize Project for BOOT
由于petalinux运行在远程服务器上,而ZYNQ开发板连接在本地电脑,此时开发板内还没有运行程序,无法通过TFTP远程调试,所以此时无法使用petalinux-boot启动系统,需要把必要文件同步到本地运行
# 修改petalinux工程目录下.gitignore文件,详见附件
vi .gitignore
# 添加/提交修改
git add ./*
git commit
git push --set-upstream origin/fpga
git push
回到Windows,从远程仓库中下载petalinux打包好的数据包,准备烧录程序。
git pull
git checkout fpga
git rebase origin/linux
-
启动Linux
Linux的启动有多种方式,分为主机启动和从机启动。主机启动指从自己的外围设备中装载启动文件,比如从SD卡或者QSPI Flash启动。从机启动指从上位机下载启动文件,比如从JTAG启动。
-
SD卡启动很简单,只需要按要求格式化后把petalinux生成的BOOT.BIN和image.ub文件导入到SD1分区下即可。但是这样操作之后可能需要频繁插拔SD卡,遇到需要更新SD文件的场合非常不方便,虽然也可以用TFTP调试,但是终归少一条调试路径
-
JTAG启动相对复杂,需要执行很多语句,每个镜像文件都需要手动下载,指定DDR地址。好处是能调的东西多,操作灵活,随时都能修改系统镜像。启动复杂的问题可以通过XSCT脚本解决,是比较完美的解决方案,就是保存修改可能不是很方便,还需要找方法。
-
QSPI Flash(未操作)。相较于SD卡就是把BOOT.BIN单独烧录到了QSPI-Flash中,系统镜像依然需要SD卡保存,所以也不是很方便。
-
SD卡启动
SD卡格式化并新建两个分区,第一个分区格式化为FAT32格式,预留100M空间用作boot loader。第二个分区格式化为ex4格式,分配剩下的所有空间用作rootfs。把BOOT.BIN, boot.scr, image.ub文件拷贝到第一个分区中。至此SD卡启动器制作完成,插到ZYNQ上,调整烧录模式为00即从SD卡启动。上位机用串口助手如Putty连接ZYNQ开发板USB_UART串口,开发板上电,串口中读出启动信息,一段时间后进入登陆界面。
-
JTAG启动
-
启动终端:
首先启动vitis的XSCT终端。可以在vitis->Xilinx->XSCT找到,也可以在vitis目录下bin下找到。
-
连接设备:
因为这里是直接用USB连的,所以可以直接connect
,根据情况有不一样的连法:connect -url tcp:<DEVICE_IP>:3121
-
SmartLynq远程连接的话,这里ip就是设备的服务器ip
-
SmartLynq用USB连接的话,就是10.0.0.2
-
直接用网线连的话就是127.0.0.1
默认端口就是3121,基本没见过有其他端口的
-
列出JTAG目标:
使用命令targets
可以看到有哪些设备可以连接,一般ZYNQ7020有四个
有时候JTAG连接不稳定会触发各种报错,报错开头whole
,这时候可能需要重新连接,调整JTAG频率之类的。
-
下载****FPGA
JTAG下载FPGA就是相当于把ZYNQ当成一个FPGA烧录,只需要生成好的.bit文件就行,操作也比较简单。烧录FPGA的时候要连接xc7z020
,所以需要命令target 4
或者ta 4
来连接PL部分。截图中的bit名和我们使用的不一样,我们使用的bit文件一般在<vivado project>.run/impl_1
目录下。
这里路径注意在复制粘贴bit文件路径后需要把\
换成/
。烧录的时候能看到ZYNQ核心板上的PL灯熄灭,烧录结束后亮起。此时如果FPGA是单独运行的话,里面的程序已经可以跑了。
-
下载FSBL
FSBL是在启动uboot前的一系列配置启动文件。一般在petalinux 第一步根据.xsa文件配置的时候生成。路径为<petalinux>/images/linux/zynq_fsbl.elf
。但是首先第一步,要从PL中切换到PS的ARM核。一般使用dow
操作,建议使用0核。
dow
指令的功能是把给定文件下载到目标设备。这里下载到了ARM核。dow会把ARM核的运行指针指到目标程序的起点。运行指针设置完后,CPU会立刻停止,来让FSBL完成它的工作。这里FSBL完成后会自动挂起。
注意: 任何下载任务之前都需要禁用MMU。MMU负责管理虚拟内存和物理内存映射,并且阻止任何对物理内存的直接读写,这会导致dow失败。
FSBL的启动会根据硬件配置选择FSBL来源。也就是SD卡还是JTAG。这里要确认选用了JTAG模式
-
初始化PL
上一步我们把FSBL下载到了设备上,我们需要根据FSBL里的设置对PS进行配置。PS的初始化脚本被打包在了.xsa文件里,在vitis/ps7_init.tcl
。由于这里不涉及的文件的下载,只是单纯执行引导程序,指向任意一个Arm核都能初始化整个APU。
-
为U-BOOT下载设备树
设备树-DTS(Device tree source)是用来建立驱动和外围设备之间的动态联系的。有了DTS U-BOOT才知道到哪里初始化设备。官方流程里漏了这一步,这一步不明确设备树的话,之后U-Boot会无法启动。
所有download的都建议回到0核操作。这里额外需要注意DTS不是.elf文件,所以再下载时要使用-data
标签,同时设置Offset,这个Offset可以在petalinux项目文件中找到,路径为:<project_path>/project-spec/configs/config
,里面能找到包括DST核UBOOT的各种offset。
-
下载SSBL(U-Boot)
和FSBL一样,直接下载到#0核,u-boot.elf
和FSBL在一个目录。提前用Putty连接好串口,con
之后就能在串口上看到U-Boot的启动信息。
con
之后ARM核开始运行,开始执行U-Boot
实际启动时后面有一大堆报错,最开始报错信息为:JTAG: Trying to boot script at 3000000
。这句说明U-boot正在运行,但是找不到要启动的linux内核。这很正常,因为我们才刚搞定U-Boot,具体的启动信息会在下一节输入。
-
下载Linux镜像
最后一步就是把Linux镜像下载到DDR里,并且通过U-Boot启动。安好U-Boot后我们可以用JTAG,TFTP,QSPI,eMMC等等各种方法启动kernel。这里我们就用JTAG启动。这一步需要用到打包好的image.ug
文件,其中包括了uboot引导程序、linux kernel、rootfs、FPGA bitstream这些运行的必要数据。没加的话可以回去重新package一下。
用于下载image的地址有一些限制,必须放到__DDR__的空的部分
该镜像不能破坏其他镜像。可以在配置文件里找个合适的地址。
这个地址需要和U-Boot的执行起点对齐
这个文件比较大所以下载时间是目前最长的。下载完就能把CPU release了。至此所有的文件都下载完了。接下来只要在U-Boot中启动就好了。
-
User Login
Petalinux 2022.1版本后禁止了root登录,如果需要root登录也不建议修改root密码,需要访问的话建议直接root免密。这里登陆时输入petalinux,会自动创建项目用户,并要求设置密码,这里还是设置了root。
如果要启用root auto login可以在petalinux内配置
petalinux-config -c rootfs
--> Image Features
--> []auto-login
petalinux-build
密码的配置在
petalinux-config -c rootfs
--> PetaLinux RootFS Setting
--> (root:root;petalinux:petalinux:passwd-expire;)
# 可以自定义用户和用户名
# 语句中的petalinux:passwd-expire指的是第一次自定义密码
-
TCL script BOOT
上面一长串代码,每次启动都要输入一遍实在太麻烦了,所以可以直接通过脚本启动,详见附件。
-
QSPI Flash启动(未操作)
-
创建 petalinux app 并打包在 rootfs中
步骤:
- 创建 app,注意:名字不要有大写字符
这里类型用了 install, 如果不提供,默认template 为 C
petalinux-create -t apps --template install --name instsshkey --enable
Options for apps:
--template <TEMPLATE> <c|c++|autoconf|install>
c : c user application(default)
c++ : c++ user application
autoconf: autoconf user application
install: install data only
fpgamanager : Pack the .dtbo,.bin,shell.json and .xclbin files into rootfs,
supports for versal,zynqmp and zynq.
fpgamanger_dtg : Extract the .xsa and pack the .dtbo,.bin/.pdi,shell.json and .xclbin files into rootfs,
supports for versal,zynqmp and zynq.
fpgamanager_dtg_dfx : Extract the DFX partial .xsa and pack the .dtbo,.bin/.pdi and shell.json files into rootfs.
supports only for versal and zynqmp.
fpgamanager_dtg_csoc : Extract the Classic soc partial .xsa and pack the .dtbo,.bin/.pdi and shell.json files into rootfs.
- 修改生成的 bb文件
project-spec/meta-user/recipes-apps/instsshkey/instsshkey.bb
#
# This file is the instsshkey recipe.
#
SUMMARY = "Install .ssh authorized_keys file"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://authorized_keys \
"
S = "${WORKDIR}"
do_install() {
install -m 0700 -d ${D}/home/root/.ssh
install -m 0600 ${S}/authorized_keys ${D}/home/root/.ssh/
}
FILES:${PN} += "/home/root"
Reference
-
正点原子:ZYNQ嵌入式Linux开发指南
-
Xilinx - ug1144-petalinux-tools-reference-guide-2022.2 / 该版本手册只适用于2019版本之前的Xilinx,是基于Xilinx SDK配置的,并不全部适用Xilinx Vitis
-
Xilinx 官方指南
Appendix
标签:文件,petalinux,启动,--,流程,boot,Vivado,git,Petalinux From: https://www.cnblogs.com/dy-stairmed/p/18471450