在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
https://digilent.com/reference/_media/reference/programmable-logic/arty-z7/arty_z7_sch.pdf
首先要对硬件做一些设置,
1 | BOOT_MODE[0] = 1 |
对应到 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.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 分支可用
- mainline kernel https://github.com/torvalds/linux
- xilinx kernel 有更多芯片级支持 https://github.com/Xilinx/linux-xlnx
- digilent kernel 有一些板级驱动 https://github.com/digilent/linux-digilent
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 | ./petalinux-v2018.3-final-installer.run /opt/Xilinx/petalinux/2018.3 |
创建
1 | petalinux-create --type project --template zynq --name pynqlinux |
配置
1 | petalinux-config |
配置 kernel 打上两个 digilent 驱动,然后修改和配置对应的 Kconfig 和 Makefile
- https://github.com/Digilent/linux-digilent/blob/old_master/drivers/clk/clk-dglnt-dynclk.c
- https://github.com/Digilent/linux-digilent/blob/old_master/drivers/gpu/drm/xilinx/digilent_encoder.c
配置 rootfs 选项
1 | Petalinux Package Groups ---> packagegroup-petalinux-xfce |
安装 xfce 桌面环境和 epiphany 浏览器
修改设备树 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
1 | &amba_pl { |
编译
1 | petalinux-build -c device-tree |
可以只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 | sudo tar -xzf rootfs.tar.gz -C /media/sdxxx |
擦腚 开机,简单上上网有亿点点卡
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 文档
- https://github.com/buildroot/buildroot/blob/master/board/zynq/readme.txt
- https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842369/Build+Linux+for+Zynq-7000+AP+SoC+using+Buildroot
需要 buildroot 移植主要是两点
- kernel 和 u-boot 的 device-tree
- ps7_init_gpl.c/h
设备树
包括 u-boot 设备树和 linux 设备树
我们可以参考其他项目的配置来修改
- https://blog.csdn.net/lilijianqun/article/details/132121892
- https://blog.cloudkernels.net/posts/pynq-z1/
- PYNQ 官方 patch https://github.com/Xilinx/PYNQ/blob/master/boards/Pynq-Z1/petalinux_bsp/meta-user/recipes-bsp/u-boot/files/0001-add-support-for-artyz.patch
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 | $ git clone https://gitlab.com/buildroot.org/buildroot |
这样我们可以非常方便的为 PYNQ-Z1 定制 Linux 了
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章