Changchun Master Li

pynq-z1 bring up 研究

2024-09-06

pynq-z1

在PYNQ-Z1开发板上学习PYNQ,第一步当然是要熟练掌握开关机——别小看这一步,它可是成功的开端。官方镜像用起来省心又顺手,但如果你偏要挑战自己,不用官方镜像来启动PYNQ-Z1,那你就得准备好深入 bare metal 世界,搞定 bring-up 这个技术活了。

Boot Process

zynq7000系列芯片启动步骤概括来说分为下面几个部分

  • BOOTROM
  • FSBL
  • bitstream
  • U-Boot
  • Kernel
  • device-tree
  • rootfs

有两种启动方式,master boot 和 slave boot。master boot 是指从 zynq ps 启动,初始化过程由 ps 端的 arm 来完成。slave boot是说zynq作为jtag的从设备,这里不做讨论。

Boot Mode Pin Settings

ug585

BOOT_MODE

https://digilent.com/reference/_media/reference/programmable-logic/arty-z7/arty_z7_sch.pdf

Circuit

首先要对硬件做一些设置,

1
2
BOOT_MODE[0] = 1
BOOT_MODE[2] = 0

对应到 Boot Device = SD ,因此要把 pynq-z1 的 jp1 拨到 SD 上。

BOOTROM

上电后,片上 Arm Cortex A9 第0个核开始跑 bootrom 读 boot_mode 引脚电平,得知启动设备是 sd 卡,初始化 sdio 相关的 MIO pin,初始化 SD 控制器。然后,它从 sd 卡第一个 fat32 格式的分区加载特定格式的启动镜像 BOOT.BIN 。从 BOOT.Bin 中找到 fsbl,解析 BootRom header,加载 fsbl 到 OnChipMemory,最后跳转到 OCM 上,移交 CPU,开始了下一阶段的旅程。

BOOT.BIN

AMD Technical Information Portal

ug1400

boot header

值得一提, BOOT.BIN 是一个非常灵活的结构,可以把 bitstream、uboot、linux kernel 甚至是 rootfs 都放进去,让 bootrom 帮助加载执行。

怎么生成 BOOT.BIN 呢?这里有两个工具 bootgen vs mkimage

bootgen

bootgen 是 Xilinx 用于生成启动映像的工具,source一下就可以使用了

1
source /opt/Xilinx/Vivado/2018.3/settings64.sh

它的 GUI 集成在 AMD Vitis (原来叫 Xilinx SDK) 里面

mkimage

mkimage 是 u-boot 集成的工具

1
./tools/mkimage -T zynqimage -R ./"" -d spl/u-boot-spl-align.bin spl/boot.bin

可以把 u-boot SecondaryProgramLoader 转换成 zynq 可以识别的格式,引导 u-boot elf 启动

u-boot

u-boot 起来之后,启动 Linux 方式就花样繁多了,这里 xilinx 官方的 Writeup Using Distro Boot With Xilinx U-Boot 上面有详细介绍,官方很多文档值得学习(甚至想做个mirror)

简单说,有三种启动方式 bootcmd、extlinux、boot.scr,选一个适合自己的就好。 如果在 BOOT.BIN 没有 配置 bitstream,也可以考虑用 u-boot 加载位流,U-Boot FPGA Driver。 也可以在 Linux 系统中加载。

Linux Kernel

zynq7000 有三个 kernel 分支可用

Build Linux for PYNQ z1 using petalinux

参考
https://blog.csdn.net/sements/article/details/88921275
https://blog.csdn.net/sements/article/details/88978302

PetaLinux 是 xilinx 提供的一个基于 Yocto 项目的构建系统,允许用户为 zynq 定制和构建嵌入式 Linux 发行版,这是官方推荐的方式,与 vivado、SDK 等工具集成度高,方便稳定,隐藏了很多细节。 我这里用 petalinux 2018.3 版本,老版本有个额外的 bonus,就是有 hdmi framebuffer 驱动,Linux 可以用 X window 桌面系统。

hdmi demo bitstream

https://digilent.com/reference/learn/programmable-logic/tutorials/arty-z7-hdmi-demo/start

安装 petalinux

1
2
./petalinux-v2018.3-final-installer.run /opt/Xilinx/petalinux/2018.3
source /opt/pkg/petalinux/2018.3/settings.sh

创建

1
2
petalinux-create --type project --template zynq --name pynqlinux
petalinux-config --get-hw-description=/path/to/Arty-Z7-20-HDMI-Out.sdk

配置

1
2
3
4
petalinux-config
petalinux-config -c kernel
petalinux-config -c rootfs
petalinux-config -c device-tree

配置 kernel 打上两个 digilent 驱动,然后修改和配置对应的 Kconfig 和 Makefile

配置 rootfs 选项

1
2
Petalinux Package Groups ---> packagegroup-petalinux-xfce
Filesystem Packages ---> misc ---> epiphany

安装 xfce 桌面环境和 epiphany 浏览器

修改设备树 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&amba_pl {

hdmi_encoder_0:hdmi_encoder {
compatible = "digilent,drm-encoder";
digilent,edid-i2c = <&i2c0>;
};

xilinx_drm {
compatible = "xlnx,drm";
xlnx,vtc = <&v_tc_0>;
xlnx,connector-type = "HDMIA";
xlnx,encoder-slave = <&hdmi_encoder_0>;
clocks = <&axi_dynclk_0>;
dglnt,edid-i2c = <&i2c0>;
planes {
xlnx,pixel-format = "rgb888";
plane0 {
dmas = <&axi_vdma_0 0>;
dma-names = "dma";
};
};
};
};

编译

1
2
petalinux-build -c device-tree 
petalinux-build

可以只device-tree部分编译,如果需要cleanup

1
petalinux-build -x mrproper

最后打包 fsbl、bitstream、u-boot 生成BOOT.BIN文件

1
petalinux-package --boot --fsbl --fpga --u-boot --force

准备 sd 卡

1
2
sudo tar -xzf rootfs.tar.gz -C /media/sdxxx
cp image.ub BOOT.BIN /media/sdxxx

擦腚 开机,简单上上网有亿点点卡

PYNQ-Z1 linux desktop

hdmi驱动参考

如果想体验完善的桌面系统,可以玩一下 Xillinux

Build Linux for PYNQ z1 using Buildroot

除了 petalinux,buildroot 也是构建 Linux 的一个选择。buildroot 上游没有官方支持 PYNQ-Z1,但自己动手添加一下并不难。 https://bootlin.com/doc/training/buildroot/buildroot-slides.pdf 这是入门 buildroot 很好的教程。

这里以 2024.05-rc2 为例,使用 br2-external trees 的方式

1
https://github.com/996refuse/pynqz1_buildroot/tree/2024.05-rc2

根据 buildroot 官方文档 和 xilinx buildroot 文档

需要 buildroot 移植主要是两点

  • kernel 和 u-boot 的 device-tree
  • ps7_init_gpl.c/h

设备树

包括 u-boot 设备树和 linux 设备树

我们可以参考其他项目的配置来修改

ps7_init_gpl.c/h

U-Boot 只包含了常见开发板的 ps7_init_gpl.c/h 文件,如果没有这些文件, boot.bin 可以成功构建,但无法正常运行。ps7_init 是使用 Xilinx SDK 生成的,用来配置时钟、引脚、AXI等等外设

在 sdk 目录下可以找到方便阅读的配置文件 hw_platform_0/ps7_init.html

操作步骤

1
2
3
4
5
$ git clone https://gitlab.com/buildroot.org/buildroot
$ cd buildroot
$ git checkout -b 2024.05-rc2
$ make BR2_EXTERNAL=../pynqz1_buildroot zynq_pynqz1_defconfig
$ make all

这样我们可以非常方便的为 PYNQ-Z1 定制 Linux 了

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章