0 写在前面
这是一个系列博客,详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部分教程都是全程基于 Petalinux 的开发,虽然这样简化了开发流程,但对于初学者深入理解掌握 Linux 是不利的,所以,有了这个系列的博客,从几乎为 0 开始教大家怎么移植 Linux 系统。
本人的软件与环境版本:
Windows 的 Vivado 与 Vitis 版本:2020.2(前期学习 ZYNQ7020 跟随正点原子安装);
Ubuntu版本:18.04.2;
虚拟机上的 Vivado、Vitis 与 Petalinux 版本:2020.1(前期学习 ZYNQ MP 跟随 Alinx 安装)。
1 ZYNQ 与设备树
ZYNQ 本身是 FPGA + ARM 的异构处理器,设备树扮演着关键角色。它通过硬件描述与内核分离的机制,动态定义 CPU、内存、外设及 PL侧中的 IP 核资源,使同一内核镜像能够适配不同硬件配置,大幅提升系统移植的灵活性。设备树由 u-boot 传递给 Linux 内核,驱动据此自动匹配并初始化硬件,如 UART、GPIO 或自定义的 AXI IP 核,避免了传统嵌入式开发中的硬编码问题。此外,设备树支持运行时叠加,适应 FPGA 动态重配置场景,是实现 ZYNQ 硬件可扩展性与 Linux 驱动高效管理的重要桥梁。
2 获取设备树
从零编写设备树,是 Xilinx 等器件厂商该做的事情,那我们怎么获取设备树呢?简单来说,就是使用 Xilinx 的模版。具体而言,有两种获取的方法,一是通过 Vitis 获得,二是通过 Petalinux 获得。但在此之前还是需要先从 Vivado 中导出硬件描述性文件(.xsa
)。
2.1 Vivado导出 .xsa
只要使用 ZYNQ 的 PS 侧,就需要在 Block Design 中对 ZYNQ 核的相关功能进行配置:
添加 ZYNQ 核:
这里需要注意的是 ZYNQ-7000 系列与 ZYNQ-MPSoC 系列的 IP 核是不一样的,不过一般也不会选错,因为在创建 Vivado 工程时需要选定器件型号,选好后,这里就只能搜索到对应的 IP 核了。
而 ZYNQ核的配置部分根据自己的情况进行配置,自己设计的硬件需要参考硬件原理图与手册,如果是开发板可以参考对应的例程。
之后就按照 FPGA 的开发流程,在 Block Design 中根据需要(是否有逻辑侧)选择添加其它 IP 或在外面直接加 verilog/VHDL 等代码,生成输出文件,然后经过综合、实现、生成比特流。
而接下的步骤就比较关键了,我们需要从 Vivado 中输出 .xsa
(硬件描述性文件)。
依次选择 File --> Export --> Export Hardware…
点击 Next 至以下界面,这里需要注意默认是 Pre-synthesis
,我们需要把它修改至 Include bitstream
。
后面可以一直选择 Next ,默认输出路径不需要修改,如果曾经生成过,会提示是否要覆盖,选择是即可。默认是导出到 Vivado 工程目录下。
这个 .xsa 文件,我们后续要用到,可以先备份到一个地方。
2.2 Vitis 获取设备树
使用 Vitis 获取设备树,需要先获取官方的设备树模板,这部分在这个系列上一部分介绍过了,有需要的可以去看看。
先正常加载一个 Vitis 工程工作空间,指定路径(不着急创建工程!!!):
先把我们前面下载的设备树模板进行配置:
点击右侧的 New..
:
定位到解压出的模版文件所在位置:
依次点击下面的 Apply
与 Apply and Close
:
接着创建一个平台工程(Platform Project):
后续按 Vitis 正常创建工程的步骤进行,定一个工程名,我这里定为 linux_base,之后在选择 .xsa
的时候选择我们前面从 Vivado 中导出的 .xsa
(我的习惯是会把这个xsa拷贝到Vitis的工程目录下)。然后在操作系统部分改为设备树,其它的默认即可,然后 Finish
。
在生成的工程右键进行编译(build):
Viits 编译生成的设备树所在位置如下:
vitis工程目录/工程名/生成的处理器/device_tree_domain\bsp
其中 zynqmp.dts 和 zynqmp-clk-ccf.dtsi 是 ZYNQ 通用的设备树文件,后续在 Linux 内核源码等相关路径也会出现,不需要进行替换,只需要单独把其它4个设备树文件先备份出来。
如果后续的系统移植完全不使用 Petalinux,还需要备份一下以下的输出文件:
它们所在位置如下:
fsbl.elf: vitis工程目录/工程名/export\工程名\sw\工程名\boot
pmufw.elf: vitis工程目录/工程名/export\工程名\sw\工程名\boot
xxx.bit: vitis工程目录/工程名/hw
2.3 Petalinux 获取设备树
使用 Petalinux 的话,设备树包含两部分,一是从 .xsa 获取的设备树(其实就是和Vitis获取的一样),另一部分是用户自定义的追加设备树。
2.3.1 从 .xsa 获取的设备树
在创建好 Petalinu 工程后,需要先获取设备描述文件(.xsa):
petalinux-config --get-hw-description xsa路径
执行完命名后,进入以下图形化配置界面,此时需要先进行一些配置,与设备树相关的就是指定官方的设备树模板包路径。
按以下路径进入:
-->Auto Config Settings --> Device tree autoconfig
勾选上设备树的自动配置。
在完成 Petalinux 的基本配置后(如包含离线编译,镜像,内核源码与 u-boot 包的路径指定等),编译工程:
petalinux-build
编译完成后就能在以下路径找到从 .xsa
获取的设备树:
petalinux工程目录/components/plnx_workspace/device-tree/device-tree
感兴趣的话可以进去查看以下,与 Vitis 生成的内容基本一致。
2.3.2 用户自定义的追加设备树
如果是使用 Petalinux 进行 linux 开发,一般会对以下目录的设备树进行修改:
petalinux/project-spec/meta-user/recipes-bsp/device-tree/files
如果是不使用 Petalinux 来移植 Linux 系统,同样也需要把这个 system-user.dtsi
进行备份,放到内核对象位置。
3 获取文件总结
通过本篇内容,我们获取了后续 u-boot、Linux内核源码等需要使用的设备树。它们一般包含以下 4 个文件(除去 ZYNQ 通用的 2 个设备树 zynqmp.dts 和 zynqmp-clk-ccf.dtsi)
1,pcw.dtsi:PS 部分的配置,如 UART、I2C、SPI;
2,pl.dtsi:PL 部分的配置,如AXI GPIO、AXI DMA;
3,system.dts:完整设备树主干文件;
4,system-top.dts:顶层设备树文件
其中关于 PL 和 PS 侧配置的设备树文件都不建议自行修改,需要修改也要谨慎起见。
如果是使用 Petalinux,还可能涉及到用户设备树:
5,system-user.dtsi
6,pl-custom.dtsi
如果后续的系统移植完全不使用 Petalinux,还可以从 Vitis 获取:
1,fsbl.elf : ZYNQ启动(全称叫First Stage Boot Loader)所需要的文件;
2,pmufw.elf :ZYNQ用来进行包括系统初始化,电源管理和错误处理等功能的小型处理器执行代码;
3,xxx.bit :就是 FPGA 开发中常用到的比特文件。