序言
由于 PYNQ 官方和一些开发者只提供了部分开发板的 PYNQ 镜像,但是许多第三方生产的开发板并没有提供对应的 PYNQ 镜像,或者所提供的镜像版本过于古老,所以本文章出于次目的介绍了如何为第三方 ZYNQ 开发板编译对应的 PYNQ 镜像。
PYNQ 官网提供的一些开发板的镜像文件:
Board | SD card image | Previous versions | Documentation | Board webpage |
---|---|---|---|---|
PYNQ-Z2 | v3.0.1 | v2.7 v2.6 | PYNQ setup guide | TUL Pynq-Z2 |
PYNQ-Z1 | v3.0.1 | v2.7 v2.6 | PYNQ setup guide | Digilent Pynq-Z1 |
PYNQ-ZU | v3.0.1 | v2.7 v2.6 | GitHub project page | TUL PYNQ-ZU |
Kria KV260* | Ubuntu 22.04 | Kria PYNQ setup | Xilinx Kria KV260 | |
Kria KR260* | Ubuntu 22.04 | Kria PYNQ setup | Xilinx Kria KR260 | |
ZCU104 | v3.0.1 | v2.7 v2.6 | PYNQ setup guide | Xilinx ZCU104 |
RFSoC 2x2 | v3.0.1 | v2.7 v2.6 | RFSoC-PYNQ | XUP RFSoC 2x2 |
RFSoC 4x2 | v3.0.1 | v2.7 | RFSoC-PYNQ | XUP RFSoC 4x2 |
ZCU111 | v3.0.1 | v2.7 v2.6 | RFSoC-PYNQ | Xilinx ZCU111 |
ZCU208 | v3.0.1 | RFSoC-PYNQ | Xilinx ZCU208 | |
Ultra96V2 | v3.0.1 | v2.7 v2.6 | Avnet PYNQ webpage | Avnet Ultra96V2 |
Ultra96 (legacy) | v3.0.1 | v2.7 v2.6 | See Ultra96V2 | See Ultra96V2 |
ZUBoard 1CG | v3.0.1 | GitHub project page | Avnet ZUBoard 1CG | |
TySOM-3-ZU7EV | v3.0.1 | v2.7 | GitHub project page | Aldec TySOM-3-ZU7EV |
TySOM-3A-ZU19EG | v3.0.1 | v2.7 | GitHub project page | Aldec TySOM-3A-ZU19EG |
准备工作:软件安装及环境配置
PYNQ 镜像的编译工作需要在 Ubuntu 系统中完成,软件安装及环境编译过程中会遇到许多问题,为了避免出现重大问题导致系统损坏,所以本文建议在虚拟机中安装 Ubuntu 系统来搭建编译 PYNQ 镜像所需的环境,需要准备的软件有VMware Workstation Pro:虚拟机 VMware Workstation Pro、Ubuntu系统镜像、VMware Workstation Pro VMware Workstation Pro、Vitis (包含 Vivado)、Petalinux 以及 PYNQ 官方仓库。
Xilinx 官方手册中描述了安装 Vitis 软件的系统要求,并且 PYNQ 官方文档中的“PYNQ SD Card image”也明确描述了 PYNQ 版本对应 Ubuntu 系统版本和所需的 Vitis 和 Petalinux 的版本要求,所以本文采用的 Ubuntu 20.04 系统和 PYNQ v3.0.1(PYNQ 官方文档更新不及时,所以最新版本还停留在 v3.0,但是 PYNQ 官网上发布的最新镜像版本都是v3.0.1,所以本文也采用该版本),以及 Vitis 2022.1 和 Petalinux 2022.1
建议使用的 Ubuntu 系统版本:
Supported OS Code name Ubuntu 18.04 Bionic Ubuntu 20.04 Focal PYNQ 版本对应使用的 Vitis 和 Petalinux 版本:
Release version Xilinx Tool Version v1.4 2015.4 v2.0 2016.1 v2.1 2017.4 v2.2 2017.4 v2.3 2018.2 v2.4 2018.3 v2.5 2019.1 v2.6 2020.1 v2.7 2020.2 v3.0 2022.1
虚拟机 VMware Workstation Pro 和 Ubuntu 系统的安装
目前 VMware Workstation Pro 17 已经对个人用户完全免费,所以我们可以直接下载安装使用,具体的安装过程不再本文中过多赘述,安装可以参考这篇博客:VMware Workstation Pro 个人免费版下载及安装指南
Ubuntu 20.04 的系统镜像可以从 USTC 的镜像网站中下裁:https://mirrors.ustc.edu.cn/ubuntu-releases/20.04/
由于 Vitis 软件非常庞大,Ubuntu 虚拟机安装时需要分配至少 400GB 的硬盘空间,系统安装好了以后需要在系统设置中将系统休眠时间改为 Never,防止系统自动休眠。
然后由于后续的编译时间很长,编译过程中执行的几次 sudo 命令需要输入密码才能继续进行,所以建议关闭 sudo 命令需要输入密码,操作如下,先切换到 root 用户,然后编辑 /etc/sudoers 文件
su root # root 用户默认密码为:root
vim /etc/sudoers
在文件末尾补充下列代码 其中 xilinx 为用户名,需要修改为自己电脑的用户名
xilinx ALL=(ALL) NOPASSWD: ALL
最后还建议安装上网软件(Clash Verge 或其他,本文不介绍该软件的安装和使用过程),确保在 PYNQ 镜像编译环境配置和编译过程中能够正常下载所需的软件包。
PYNQ 编译环境配置
安装 git
sudo apt install git
克隆 PYNQ 仓库
git clone https://github.com/Xilinx/PYNQ.git
进入 PYNQ 目录,并切换到 v3.0.1 版本
cd PYNQ
git checkout origin/image_v3.0.1
安装 ncurses-dev
sudo apt-get install ncurses-dev
用 Vim 或文本编辑器打开 PYNQ 目录下 sdbuild//scripts/setup_host.sh 脚本文件,找到脚本文件中下载 qemu 的所在的代码,并作如下替换,原因是原有的网站可能无法访问下载 qemu,需要替换其他网站下载。
该问题目前 PYNQ 的 master 分支已经修复了该问题,但 v3.1 及以下版本的 PYNQ 仍然存在这个错误,如果你使用的是 v3.1 及以下版本的 PYNQ,仍然需要手动解决这个问题。
# wget http://wiki.qemu-project.org/download/qemu-$qemuver.tar.bz2
wget https://download.qemu.org/qemu-$qemuver.tar.bz2
执行 sdbuild/scripts/setup_host.sh 脚本文件进行编译环境配置
./sdbuild/scripts/setup_host.sh
执行完成后会在 ~/.profile 末尾自动添加环境变量:
如果没有自动添加环境变量,那么需要手动在 ~/.profile 末尾添加环境变量
PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
最后可以执行 sdbuild/scripts/check_env.sh 脚本文件,检查环境是否配置成功
./sdbuild/scripts/check_env.sh
Petalinux 2022.1 安装
在 Xilinx 官方下载 Petalinux 2022.1 安装包:Downloads
下载需要登录 AMD 账户,没有的话需要注册一个,建议使用国外的邮箱注册
登录之后需要填写姓名和住址等信息,需要注意的是这里的填写的信息如果涉及到国内地址,或者国内人名或拼音的话将无法下载,所以需要填写美国的地址信息,那么可以在这个网站美国地址生成器 - 美国身份生成器 - 美国信用卡生成器中获取随机的美国地址,然后按照对应位置填写即可下载。
安装 tftp 和 tftpd-hpa
sudo apt install tftp
sudo apt install tftpd-hpa
切换到主目录,然后新建目录 petalinux,作为 Petalinux 的安装路径,把下载好的 Petalinux 安装包放入这个 petalinux 目录
cd
mkdir petalinux && cd petalinux
修改 Petalinux 安装包权限为 755
sudo chmod 755 petalinux-v2022.1-04191534-installer.run
然后输入安装命令,开始安装 Petalinux ,安装过程中需要同意协议内容,安装提示输入 y 即可
./petalinux-v2022.1-04191534-installer.run
安装完成之后需要把 Petalinux 的路径加入环境变量,打开主目录下的 .bashrc 文件,在末尾添加
source ~/petalinux/settings.sh
然后重启终端或者输入以下命令即可完成 Petalinux 安装和环境变量配置
source ~/.bashrc
最后删除 Petalinux 安装包
rm petalinux-v2022.1-04191534-installer.run
Vitis 2022.1 安装
在 Xilinx 官方下载 Vitis 2022.1 安装包:Downloads,这里选择 Xilinx Unified Installer 2022.1 SFD 这个离线安装包,同意下载之前需要登录 AMD 账户和填写美国地址信息,这部分内容在前面安装 Petalinux 时已经描述了
注意:不要在虚拟机系统中下载 Vitis 2022.1 安装包,我们需要在 Windows 主机系统中下载 Vitis 2022.1 安装包,因为 Vitis 2022.1 安装包非常大,如果在虚拟机系统中下载安装包,然后再解压出来,最后再安装,这会占用大量的虚拟机系统硬盘容量,甚至完全占用系统容量导致系统崩溃。
然后在 VMware Workstation Pro 中点击右上角的 VM,再点击 Settings,打开虚拟机系统的设置界面
然后将主机中下载 Vitis 2022.1 安装包的路径添加到共享文件夹中,比如我这里下载 Vitis 2022.1 安装包的路径为:D:\Downloads,那么我就将 D:\Downloads 添加到共享文件夹中
添加完共享文件夹之后,就可以在虚拟机系统中的 /mnt/hgfs/ 路径下看到添加进来的共享文件夹 Downloads,在 Downloads 目录就有下载好的 Vitis 2022.1 安装包
然后在共享文件夹路径下解压 Vitis 2022.1 安装包
cd /mnt/hgfs/Downloads/
tar -zxvf Xilinx_Unified_2022.1_0420_0327.tar.gz
解压完成后,在开始安装前需要先安装一下 libtinfo5,以防止出现下面这样安装失败的问题:ubuntu 20.4 安装vitis2021.1, 安装到这里就不动了。安装了2次,都是同一个现象,请问是怎么回事?
sudo apt install libtinfo5
进入安装包目录,执行安装命令,即可打开 Vitis 2022.1 安装界面
cd Xilinx_Unified_2022.1_0420_0327
./xsetup
打开界面后首先会弹出更新提示,点击 Continue,不更新并继续安装
选择 Vitis,点击 Next
这里默认会勾选所有的器件,但是我们并不需要所有的器件,将不需要的器件取消勾选,保留需要的器件即可,然后点击 Next
这里全部勾选 I Agree,然后点击 Next
确认安装信息,特别是注意左下方的硬盘空间是否充足,然后点击 Next
点击 Yes,确认创建安装路径
最后确然安装信息,点击 Install 开始安装,耐心等待安装完成
安装完成,关闭窗口
然后配置环境变量,将这行代码添加到 ~/.bashrc 的末尾
source /tools/Xilinx/Vitis/2022.1/settings64.sh
最后再安装 libcanberra-gtk-module,不安装这个包的话,Vivado 启动后可能会报错
sudo apt install libcanberra-gtk-module
准备开发板硬件相关文件
需要准备的文件介绍
软件安装及环境配置完成之后,还需要准备开发板硬件对应的比特流文件,开始之前我们先看一下 PYNQ 仓库目录下的 boards 文件夹:
boards 目录下的 Pynq-Z1、Pynq-Z1 和 ZCU104 三个文件夹是 PYNQ 官方提供的开发板编译 PYNQ 镜像所需的文件,我们可以使用 tree 命令查看任意文件夹,以 ZCU104 为例,在 boards 路径下打开终端输入:
tree ZCU104/
输出如下:
ZCU104/
├── base
│ ├── base.py
│ ├── base.tcl
│ ├── build_bitstream.tcl
│ ├── build_ip.tcl
│ ├── check_timing.tcl
│ ├── __init__.py
│ ├── makefile
│ ├── notebooks
│ │ ├── board
│ │ │ ├── asyncio_buttons.ipynb -> ../../../../Pynq-Z1/base/notebooks/board/asyncio_buttons.ipynb
│ │ │ └── register_map_intro.ipynb
│ │ ├── microblaze -> ../../../Pynq-Z1/base/notebooks/microblaze
│ │ ├── pmod -> ../../../Pynq-Z1/base/notebooks/pmod
│ │ └── video -> ../../../Pynq-Z1/base/notebooks/video
│ └── vivado
│ └── constraints
│ └── base.xdc
├── notebooks
│ └── common
│ └── zcu104_pmbus.ipynb
├── packages
│ ├── boot_leds
│ │ ├── boot.py
│ │ └── pre.sh
│ └── sensorconf
│ ├── pre.sh
│ └── zcu104.conf
├── petalinux_bsp
│ └── meta-user
│ └── recipes-bsp
│ ├── device-tree
│ │ └── files
│ │ └── system-user.dtsi
│ └── u-boot
│ ├── files
│ │ ├── bsp.cfg
│ │ └── ethernet.cfg
│ └── u-boot-xlnx_%.bbappend
└── ZCU104.spec
20 directories, 20 files
可以看到 ZCU104 路径下有非常多的文件,但是我们并不需要这么多文件,那么我们来看一下我们需要准备的文件有哪些,以我准备好的 zynq_pi 文件夹为例,这里的 zynq_pi 是我们定义的开发板的名字,zynq_pi 路径下的文件结构如下:
zynq_pi
├── base
│ ├── base.bit
│ ├── base.hwh
│ ├── base.py
│ └── base.xsa
├── petalinux_bsp
│ └── hardware_project
│ └── base.xsa
└── zynq_pi.spec
3 directories, 6 files
首先是 zynq_pi\base 路径下的 4 个文件,其中 base.py 是从 Pynq-Z1、Pynq-Z1 和 ZCU104 三个目录下任意一个目录中相同路径下复制出来的,其余三个文件 base.bit、base.hwh 和 base.xsa 是 Vivado 工程生成的开发板对应的硬件文件,稍后我们会介绍如何生成这三个文件。 zynq_pi\petalinux_bsp\hardware_project 这个路径下的 base.xsa 是从 zynq_pi\base 路径下复制过来的。最后 zynq_pi.spec 文件描述了针对该开发板的各种配置和文件路径,文件内容如下:
# Copyright (C) 2022 Xilinx, Inc
# SPDX-License-Identifier: BSD-3-Clause
ARCH_zynq_pi := aarch64
BSP_zynq_pi :=
BITSTREAM_zynq_pi := base/base.bit
FPGA_MANAGER_zynq_pi := 1
STAGE4_PACKAGES_zynq_pi := xrt pynq ethernet boot_leds
第一行 ARCH_zynq_pi := aarch64 描述了开发板搭载的 ZYNQ 芯片的处理器内核架构,根据官方文档中的描述,Zynq7000系列这里需要填写为 arm,MPSoC 系列需要填写为 aarch64。
第二行 BSP_zynq_pi := 为开发板 bsp 文件的路径,一般我们自己的开发板没有这个文件,所以这里留空,而 bsp 文件会在编译 PYNQ 镜像的时候通过 zynq_pi\petalinux_bsp\hardware_project 这个路径下的 base.xsa 文件生成。
第三行 BITSTREAM_zynq_pi := base/base.bit 指定了比特流文件的路径。
第四行 FPGA_MANAGER_zynq_pi := 1 指定了开发板上电后是否自动加载比特流文件到 FPGA 中,当设置为 0 时,开发板上电以后不自动加载比特流文件到 FPGA 中,需要手动加载比特流文件到 FPGA 中,当设置为 0 时,开发板上电以后将会自动加载比特流文件到 FPGA 中。
最后一行 STAGE4_PACKAGES_zynq_pi := xrt pynq ethernet boot_leds 指定了需要安装的软件包,其中 xrt、pynq 和 ethernet 这三个是必须的,也可以根据需要参考其他三个自带的开发板文件夹中的 spec 文件填写需要的软件包。
注意:spec 文件名以及文件中的变量名后缀"zynq_pi"需要和开发板文件夹的命名保持一致。
使用 Vivado 搭建硬件工程生成需要的文件
在终端中输入 vivado,打开 Vivado 图形界面
vivado
点击 Create Project 创建工程
输入工程名称 zynq_pi
默认创建 RTL Project,点击 Next
不需要添加源文件,点击 Next
不需要添加约束文件,点击 Next
选择你的开发板搭载的芯片型号,点击 Next
创建完工程后,需要先导入 License 文件,点击右上角的 Help --> Manage License
然后点击 Load LIcense,再点击 Copy License 导入 Vivado 的 License 文件。vivado License导入方法与资源获取
在右侧栏点击 Create Block Design
填写 Design name 为 system_ps,点击 OK
点击中间的 + ,搜索 zynq 并添加
zynq IP 的配置内容一般由开发板厂家提供,如果没有的话需要搭配开发板的硬件原理图进行配置外设,由于每个开发板对应的硬件不同,具体的配置过程也不相同,所以这里就不描述具体是如何配置的了,可以参考开发板厂家提供资料和例程进行配置。
配置完成后为 system_ps 创建 HDL Wrapper
然后点击右下角的 Generate Bitstream 生成比特流文件
Number of jobs 选择最高,然后点击 OK
等待比特流文件生成完成之后,点击右上角的 File --> Export --> Export Hardware
点击 Next
这里需要选择包含比特率,然后点击 Next,最后点击 Finish 导出硬件
然后按照上一节内容介绍的文件结构,在 PYNQ 仓库的 boards 路径下打开终端新建目录zynq_pi/base 和 zynq_pi/petalinux_bsp/hardware_project
mkdir -p zynq_pi/base
mkdir -p zynq_pi/petalinux_bsp/hardware_project
从其他的开发板文件夹中复制 base.py 和 .spec 文件到 zynq_pi目录下的相同路径,按照上一节的要求修改 .spec 文件的文件名为 zynq_pi.spec,修改内容为
# Copyright (C) 2022 Xilinx, Inc
# SPDX-License-Identifier: BSD-3-Clause
ARCH_zynq_pi := aarch64
BSP_zynq_pi :=
BITSTREAM_zynq_pi := base/base.bit
FPGA_MANAGER_zynq_pi := 1
STAGE4_PACKAGES_zynq_pi := xrt pynq ethernet boot_leds
在前面 Vivado 创建的工程路径下查找 *.bit *.xsa *.hwh 这三个文件,并复制到 zynq_pi/base 路径下,可以用这条命令完成:
find ~/Desktop/zynq_pi -type f -regex '.*\.\(bit\|xsa\|hwh\)$' -exec cp {} ./zynq_pi/base \;
然后在将这三个文件重命名为 base.bit、base.xsa、base.hwh
cd zynq_pi/base && for ext in bit xsa hwh; do mv *.$ext base.$ext; done
最后在再把 base.xsa 复制一份到 petalinux_bsp/hardware_project 路径下
cp base.xsa ../petalinux_bsp/hardware_project
zynq_pi 路径下的文件如下所示:
zynq_pi
├── base
│ ├── base.bit
│ ├── base.hwh
│ ├── base.py
│ └── base.xsa
├── petalinux_bsp
│ └── hardware_project
│ └── base.xsa
└── zynq_pi.spec
3 directories, 6 files
编译 PYNQ 镜像
这个时候理论上我们需要的文件已经准备完成了,可以开始我们的 PYNQ 镜像编译工作,但是为了减少编译时间,PYNQ 提供了与开发板硬件无关的预编译的 PYNQ 文件系统和预编译的 PYNQ 源码,这两个文件可以在 PYNQ 官网下载:PYNQ supported boards and PYNQ pre-built images | PYNQ
根据板子上 ZYNQ 芯片的处理器内核架构选择需要的预编译文件系统,Zynq7000 系列选择 PYNQ rootfs arm v3.0.1,MPSoC 系列选择 PYNQ rootfs aarch64 v3.0.1,以及预编译的 PYNQ 源码 Prebuilt PYNQ source distribution binary v3.0.1
将下载好的这两个文件放入 PYNQ 仓库 sdbuild/prebuild 路径下,并分别重命名为pynq_rootfs.aarch64.tar.gz(如果是 arm 架构就重命名为 pynq_rootfs.arm.tar.gz)和 pynq_sdist.tar.gz
注意:目前 PYNQ 官方下载的预编译的 PYNQ 源码文件是 .gz 格式文件,而不是 .tar.gz 格式文件,目前还没被修复,所以我们要将这个文件进行重新打包,如果你下载下来的文件是tar.gz 格式文件,那么可以跳过这部分
# 解压缩 .gz 文件: gunzip filename.gz # 这将生成一个名为 filename 的文件。 # 创建 .tar 文件: tar -cvf filename.tar filename # 这将创建一个名为 filename.tar 的 tar 包含文件。 # 压缩 .tar 文件: gzip filename.tar # 这将生成一个名为 filename.tar.gz 的文件。
在 PYNQ 仓库下的 sdbuild 路径下打开终端,输入编译以下命令开始编译,其中 zynq_pi 为 boards 路径下我们准备的文件夹名称
make BOARDS=zynq_pi
如果编译顺利完成的话,在 sdbuild/output 目录下将会得到编译完成的镜像文件:zynq_pi-3.0.1.img
但是在编译过程中大概率会因为网络问题无法下载 sstate-cache 而导致编译失败,即使能够正常下载 sstate-cache,下载过程也消耗了大量的编译时间,所以建议执行一下这一步操作:
解决办法是在编译前先下载好该文件,打开 Petalinux 的下载页面 依次点击 Archive --> 2022.1
然后翻到页面下方,找到 PetaLinux Tools sstate-cache Artifacts - 2022.1 ,根据需要的内核架构选择 aarch64 sstate-cache 或者 arm sstate-cache 进行下载
下载好了以后使用 tar 命令进行解压
tar sstate_aarch64_2022.1_04190222.tar.gz
然后在我们之前准备的 zynq_pi 文件夹的 petalinux 路径下创建文件夹 meta-user/conf
mkdir -p meta-user/conf
在 conf 目录下创建文件 petalinuxbsp.conf ,然后在 petalinuxbsp.conf 中配置解压出来的 sstate-cache 的路径
SSTATE_DIR = "/home/xilinx/aarch64"
这时候再执行编译命令,就不会出现无法下载 sstate-cache 的问题了,同时也能省去每次编译下载 sstate-cache 的时间。
编译完成之后,在 sdbuild/output 目录下会生成编译完成后的 PYNQ 镜像文件:zynq_pi-3.0.1.img,将镜像文件复制到 Windows 系统中,使用 Win32 Disk Imager 或者 balenaEtcher 将镜像烧录到 SD 卡中,然后将烧录完成的 SD 卡插入开发板,并将开发板的 BootMode 设置为 SD 卡启动,连接上串口,在 MobaXterm 中打开对应的端口号,波特率设置为 115200,开发板上电后即可进入安装了 PYNQ 的 Ubuntu 系统:
一些存在的问题和解决方法
镜像编译成功后,开发板上电无法进入系统:Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,10)
这个问题的出现的原因很复杂,一位大佬的博客中对这个问题进行了描述:EdgeBoard 的 PYNQ 移植 - Haozhe Zhu's Blog
这里我仅针对我遇到的问题提供一些理解,一个原因是由于 SD 卡的写保护功能导致系统无法启动,在大佬的博客中描述中,这个问题是由于 Vivado 创建工程时开启了 SD 卡槽的写保护引脚引起的,即在配置 Zynq 时勾选了 SD 配置中的 WP 引脚,但是开发板 PCB 中却没有使用到这个引脚。
所以按理来说这个问题的解决方法是取消勾选 WP 写保护引脚,然后重新生成比特流文件再次编译即可解决。但是事实并非如此,实际上就算取消勾选了 WP 写保护引脚,重新编译后的镜像文件还是会出现这样的问题,所以根据大佬博客中的描述,这可能是 petalinux 的一个 bug,解决方法就是编写设备树,禁用 SD 卡的写保护功能,具体操作就是在 zynq_pi/petalinux_bsp 目录下新建路径 meta-user/recipes-bsp/device-tree/files,然后在 files 目录下创建设备树文件 system-user.dtsi
mkdir -p meta-user/recipes-bsp/device-tree/files
cd meta-user/recipes-bsp/device-tree/files
touch system-user.dtsi
然后在 system-user.dtsi 文件中填写以下内容,需要注意的是,这里的 sdhci0 是因为在我的开发板中 SD 卡槽是接在 SD 0 上的,如果你的开发板上的 SD 卡槽是接在 SD 1 上的话,则需要把 sdhci0 改为 sdhci1。
/include/ "system-conf.dtsi"
/ {
};
&sdhci0 {
status = "okay";
max-frequency = <50000000>;
no-1-8-v;
disable-wp;
}
另外一个导致这个问题的原因是由于 PYNQ 镜像的编译过程中默认认定 SD 卡槽接在 SD 0 上,d大部分的开发板也是的 PCB 也是这么配置的,将 SD 卡槽接在 SD 0 上,而 EMMC 接在 SD 1 上,但是也有一些开发板是反过来的,也就是将 EMMC 接在 SD 0 上,而 SD 卡槽接在 SD 1 上。因此,如果是这样的话,开发板在上电之后首先会正常进入 SD 卡启动,如下图所示,但是在上电启动后不久,系统会由于 PYNQ 镜像编译时的配置,导致后续启动位置跳转到接在 SD 0 上的 EMMC,EMMC 上没有预先烧录系统的话,那么将会出现前面提到的报错信息:Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,10),但是如果 EMMC 上实现烧录了系统的话,则会进入 EMMC 中的系统,也是就出现了一个奇怪的现象,明明设置了 BootMode 是从 SD 卡启动,串口打印出来的启动信息也是 Bootmode:SD_MODE,但是实际确启动了 EMMC 上的系统。
这个问题的解决方法大佬也在自己的博客中进行了描述,具体操作就是修改 sdbuild/boot/meta-pynq/recipes-bsp/device-tree/files 目录下的 pynq_bootargs.dtsi 文件,将其中的 mmcblk0p2 修改为 mmcblk1p2,再将 sdbuild 目录下的 Makefile 文件中的 mmcblk0p2 修改为 mmcblk1p2,然后重新编译镜像。
/ {
chosen {
bootargs = "root=/dev/mmcblk1p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 uio_pdrv_genirq.of_id=\"generic-uio\" clk_ignore_unused";
pynq_board = "Unknown";
};
};
Problem 1:执行 scripts/setup_host.sh 出现报错:configure: error: curses library not found
解决方法:
安装 ncurses-dev
sudo apt-get install ncurses-dev
sdbuild/scripts/setup_host.sh error curses library not found · Issue #1421 · Xilinx/PYNQ · GitHub
Problem 2:执行 scripts/setup_host.sh 无法下载:qemu
连接不上http://wiki.qemu-project.org 导致以下命令无法下载qemu
wget <http://wiki.qemu-project.org/download/qemu-$qemuver.tar.bz2>
解决方法:
更换其他的源进行下载
# wget <http://wiki.qemu-project.org/download/qemu-$qemuver.tar.bz2>
wget <https://download.qemu.org/qemu-$qemuver.tar.bz2>
Problem 3:编译 pynq 镜像出现报错:make: *** [Makefile:372: qemu_check_aarch64] Error 1
环境变量中的qemu版本与scripts/setup_host.sh中安装的qemu版本不对应,scripts/setup_host.sh 执行后未能自动添加环境变量,需要手动添加环境变量
解决方法:
将环境变量添加到 ~/.profile 结尾
PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
或者执行
export PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
Pynq 3.0 fails quemu version check - Support - PYNQ
Problem 4:Petalinux 环境变量报错:WARNING: /bin/sh is not bash! - No tftp server found
解决方法:
安装 tftp 和 tftpd-hpa
sudo apt install tftp
sudo apt install tftpd-hpa
运行命令,然后选择 NO
sudo dpkg-reconfigure dash
Problem 5:安装 Vitis 时,Final Processing ... Generateing installed device list 进度条卡住不动
解决方法:
安装 libtinfo5
sudo apt-get install libtinfo5
参考资料
https://github.com/Xilinx/PYNQ
PYNQ Introduction — Python productivity for Zynq (Pynq)
EdgeBoard 的 PYNQ 移植 - Haozhe Zhu's Blog
[教程] PYNQ镜像完美移植适配教程_哔哩哔哩_bilibili
【原创教程】手把手教你编译移植PYNQ镜像_哔哩哔哩_bilibili