对了,我最近开通了微信公众号,计划是两边会同步更新,并逐步的会将博客上的文章同步至公众号中。
感兴趣的朋友可以扫描下方的二维码或者搜索“里先森sements”来关注,欢迎来玩~!
目录
1.3 - petalinux读取 *.sdk 文件夹硬件信息
1 - petalinux 2018.3版本
1.1 - 前言
手头有块黑金AX7010的板子,这个板子附带的资料里面带有的kernel和uboot(黑金针对自己的开发板修改过的)版本实在太老,全是2017年的版本,在学习按照给的PDF里的流程,利用其提供的kernel和uboot进行编译的时候各种报错。9102年了,如果还要我去想办法去换开发环境兼容老东西来进行学习实在是太头疼了,于是转而使用xilinx官方的petalinux进行zynq7000上的linux环境搭建。
petalinux是xilinx官方推出的一个快速便利的搭建zynq系列fpga片上ps(processing system)端的linux环境搭建的软件,在官网上可以免费的下载安装(https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloadNav/embedded-design-tools.html)。这篇博文将介绍一下如何使用petalinux进行工程建立(不会介绍如何进行petalinux的安装)。环境的搭建和一些必要的资源如下所示:
- ubuntu 16.04.4 (安装在vmplayer虚拟机中,petalinux对系统版本有严格要求)
- petalinux 2018.3 (安装在/opt/pkg/petalinux文件夹下)
- UG1144 - PetaLinux Tools Documentation: Reference Guide (v2018.3) (参考文档,可以下载下来备用)
- linux_rtc.sdk (vivado工程生成比特流文件,并导出硬件【export hardware】生成的*.sdk文件夹,在本文中依此建立后面的petalinux)
安装完petalinux后的磁盘占用
1.2 - 建立petalinux工程
载入petalinux环境
$ source /opt/pkg/petalinux/settings.sh
建立petalinux工程,命名为lee_linux
$ petalinux-create --type project --template zynq --name lee_petalinux
完毕后,工程目录如下所示
1.3 - petalinux读取 *.sdk 文件夹硬件信息
进入lee_linux目录,让petalinux读取 *.sdk 文件夹,自动载入硬件信息,这里 *.sdk 文件夹就在上一级目录
$ cd lee_petalinux/
$ petalinux-config --get-hw-description=/home/sements/Desktop/developArea/FPGA/workspace/linux_rtc.sdk
1.4 - 设置SD根文件系统从SD卡载入
执行上面命令后,会自动打开配置窗口,在 Image Packaging Configuration --> Root filesystem type 选项中选择 SD card,把根文件系统放在 SD 卡中,方向键选择下方保存,然后退出。
注意,这里保存不要修改其默认文件名
1.5 - 使用外部的linux源码进行编译
除了让petalinux自动联网到xilinx的github上下载linux源码,我们也可以指定一个linux源码。但是注意,目前版本的petalinux对于下载的linux源码版本检测十分严格,请在下载时根据petalinx的版本下载对应的linux源码(在xilinx的linux-xlnx的github页面,选择tag,选择你需要的版本。或者使用git)
解压linux源码,普通用户
$ unzip -o linux-xlnx-xlnx_rebase_v4.14_2018.3.zip -d /home/sements/Desktop/developArea/FPGA/xilinx-official/
在petalinux-config中进行配置,选用外部linux源码进行编译,
Linux Components Selection -> linux-kernel选择ext-local-src。
新增的External linux-kernel local source settings选项内填入你的linux源码完整路径
1.6 - 配置Linux内核
执行指令,配置linux内核
$ petalinux-config -c kernel
- 配置CH340、CP210X串口驱动
- Device Drivers → USB support → USB Serial Converter support按y,回车进入。在CP210x和ch341前面按y。
- 配置USB摄像头驱动
- 选项 Device Drivers ---> Multimedia support ---> Media USB Adapters ---> 中使能 USB Video Class (UVC)
保存退出
注意,这里保存不要修改默认的 .config 文件名
1.7 - 编译
$ petalinux-build
1.8 - 生成BOOT.BIN及image.ub文件
$ petalinux-package --boot --fsbl --fpga --u-boot --force
petalinux-package --boot 用于打包生成BOOT.BIN文件
--fsbl 指令指定加入FSBL(First Store Block Load)文件,其默认指定文件路径是 images/linux/zynq_fsbl.elf,这个文件是petalinux执行编译命令后自动生成的
--fpga 指令指定加入FPGA比特流文件(bitstream image),其默认指定文件路径是 images/linux/*.bit , 这个文件是前面vivado编译生成比特流文件并在导出硬件时一同导入到 *.sdk 文件夹中的 *.bit 文件。在petalinux-config --get-hw-description时会从 *.sdk 文件夹中复制到默认路径并重命名为system.bit
--u-boot 指令指定将u-boot文件打包到BOOT.BIN中,其默认指定文件路径是 images/linux/u-boot.elf 这个文件是petalinux执行编译命令后自动生成的
--force 指令指定允许覆盖之前已生成过的BOOT.BIN文件
更多的介绍可以通过 petalinux-package --boot --help查看
执行后我们可以在 images/linux文件夹下看到BOOT.BIN和image.ub文件了。
关于image.ub
image.ub文件是一个复合文件,其将设备树dtb文件包含在内部,故我们在拷贝文件时只需要拷贝BOOT.BIN与image.ub。BOOT.BIN是为PL启动时服务的,image.ub是PL启动完成,FSBL调用uboot启动后服务的。
详情可以参考:How do I create image.ub? - Community Forums:
摘录部分回答如下:
“image.ub = peta Linux image consists of kernel image, device tree blob and minimal rootfs”
"The image.ub is a FIT image which is documented in the u-boot tree (doc/uImage.FIT)"
关于 FIT 文件的介绍,可以参考 wowotech 的这篇文章:u-boot FIT image介绍
1.9 - TF卡制作备用
我的AX7010开发板能插入TF卡,并且在 linux_rtc.sdk的vivado工程中已经将tf卡连接到PS内核。
插入TF卡到开发机,在虚拟机上挂载TF卡
运行gparted工具,将全卡格式化。然后新建一个FAT32格式分区,命名为FAT,大小约1000M即可,用于存放BOOT.BIN及image.ub文件。再在FAT分区后新建EXT4格式分区,命名为EXT,大小占用剩余TF卡上空间,用于存放文件系统。
将BOOT.BIN文件和image.ub文件放到FAT分区中。
将根文件系统放入EXT分区中,这里我使用之前制作好的给IMX6用的ubuntu根文件系统(https://blog.csdn.net/sements/article/details/88086468)
卸载TF卡
注意,这里卸载的时候会提示暂时无法弹出TF卡,因为从开发机复制文件到TF卡并没有实际写入TF卡上,而是直接写在磁盘缓存上,在卸载的时候会将这些磁盘缓存真正的写入TF卡上。可以使用sync命令来写入,写入完毕再卸载TF卡。这很耗时,具体时长取决于你自己放入TF卡的根文件系统大小
1.10 - 在板上运行
将TF卡插入FPGA开发板,插上调试串口(这里我vivado工程也已经连接好到PS核了),上电即可从tty调试窗口看到linux启动信息
1.X - 附录(一些可能碰到的问题)
- 无论碰到什么问题,先看看log,方便快速定位
在编译失败时,会输出如上的提示信息,在编译错误时养成先查看log是一个快速定位问题的好习惯
- petalinux-build时报错 set KERNEL_VERSION_SANITY_SKIP="1" in your recipe.。
这是由于petalinux版本与用户指定编译用的linux版本不匹配造成的(在本博文的流程中不会这样,因为按照的是默认设置,其会从网络上下载合乎版本的linux,这里是我安装petalinux 2018版本,指定用黑金提供的2017版本的linux源码时出现的问题)
解决方法有两种:
第一种,
在工程目录/project-spec/meta-plnx-generated/recipes-kernel/linux/ linux-xlnx_%.bbappend文件内加入KERNEL_VERSION_SANITY_SKIP="1"
第二种,其实应该是真正的根源解决,第一种方法中的/project-spec/meta-plnx-generated/recipes-kernel/linux/ linux-xlnx_%.bbappend文件是petalinux-build时生成的,其是根据/ project-spec/meta-user/recipes-kernel/linux/ linux-xlnx_%.bbappend文件生成的,所以只要在编译前在/ project-spec/meta-user/recipes-kernel/linux/ linux-xlnx_%.bbappend文件内加入KERNEL_VERSION_SANITY_SKIP="1"即可
- do_populate_lic: QA Issue: linux-xlnx: The LIC_FILES_CHKSUM does not match
这也是由于petalinux版本与用户使用的linux版本不一致造成的,这里我是从xilinx的官方github下载的linux源码(https://github.com/Xilinx/linux-xlnx),可是我安装的petalinux是2018.3版本的,而我使用git clone直接获取到的源码版本并不是,所以需要对linux源码版本进行切换
git checkout xlnx_rebase_v4.14_2018.3
git pull https://github.com/Xilinx/linux-xlnx.git xlnx_rebase_v4.14_2018.3
不通过git clone下载也可以,直接在github上先选择版本与你petalinux版本对应的linux branch,然后下载压缩包再到虚拟机中解压即可。
可以参考以下两个回答:
- https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-build-errors/m-p/956182#M32590
- https://forums.xilinx.com/t5/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6%E5%BC%80%E5%8F%91-MPSoC-Zynq-7000/HDMI-FrameBuffer%E5%AE%9E%E4%BE%8B%E8%AE%BE%E8%AE%A1%E6%8A%A5%E9%94%99/m-p/945439?advanced=false&collapse_discussion=true&filter=location&location=category:Chinese&q=LIC_FILES_CHKSUM&search_type=thread
2 - petalinux 2020.1
相比于 2018 以及 2019 版本,petalinux 2020.1版本作为vitis套件中的一环,做出了部分改动,但是大致流程与前述版本基本一致。这里主要记录几点在petalinux 2020.1版本中需要注意的地方。
2.1 - 导入硬件配置
在2020.1版本中,petalinux接受的是 vivado 2020.1 导出的 .xsa(Xilinx Shell Archive)文件,关于vitis同一软件平台的概览,可以查看我的这篇博客(ZYNQ #6 - Vitis统一软件平台概览)
petalinux-config --get-hw-description <.xsa文件目录>
2.2 - 使用外部linux源码进行编译
petalinux 2020.1中,官方kernel源码升级到了linux 5.9版本,但是由于我使用的 digilent_encoder 驱动只支持4.x的版本,为此需要使用 xilinx的4.x版本源码进行编译。
通过 git clone 将赛灵思的linux复制到本地,使用 git checkout 切换至需要的分支,这里我使用的是 xlnx_rebase_4.19_2019.2分支。
为了避免校验文件出错等问题,建议使用 git clone 再 checkout分支的方式来切换源码,不建议直接在 github 上下载zip压缩包
按照惯例,在 petalinux 中使用与当前版本不一致的源码前,需要在 project-spec/meta-user/recipes-kernel/linux 文件夹, linux-xlnx_%.bbappend 文件中添加
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
KERNEL_VERSION_SANITY_SKIP = "1"
在 2020.1 版本的 petalinux 中,若你的 petalinux-config → DTG 配置保持默认的 template 选项,工具不会自动新建 project-spec/meta-user/recipes-kernel/linux 文件夹,我们需要手动创建、添加 linux-xlnx_%.bbappend 文件
可以查看 project-spec/meta-user/下的 config 文件,可以看到其默认将当前文件夹下的所有 recipes-* 格式的文件夹都纳入编译,因此我们新建的文件夹才可以被 bitbake 搜索到