主控芯片: xczu2cg-sfvc784-1-e
PC软件:Xilinx vitis 2021.2
uboot版本 : xilinx-v2021.2 或 xlnx_rebase_v2021.01_2021.2 都可以
linux版本:xlnx_rebase_v5.10
工程比较简单,就是加了 QSPI、SD1、uart1、网口,然后配置下 ddr,其他就没啥了
从vivado 2017.4 直接跳到 vitis 2021.2,比较直观的是软件基本上分成了两个部分,Vivado 部分完成,生成一个 .xsa
文件,这个文件是搭建 vitis 工程的基础。
新建 fabl 与 PMU 工程,新建后编译即可得到 fsbl.elf
与 pmu.elf
两个固件。PMU 是在 zynqmp 上有的,其主要控制系统内资源的上电、复位和监控。
这两个所需要的固件在 .xsa 的基础上进行,直接选择对应的工程生成即可
要启动 uboot ,需要生成 BOOT.bin 文件,除了用到上面提到的 fsbl.elf
与 pmu.elf
两个固件,还需要用到 bl31.elf
与 uboot.elf
。
- 编译 bl31.elf
这里主要构建 ARM 可信固件 (ATF)。下载源码,用的 arm-trusted-firmware-xilinx-v2021.2 版本,编译命令
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1
则在 build/zynqmp/release/bl31/
目录下生成 bl31.elf
- 编译 uboot.elf
这里直接使用 zynqmp-zcu100-revC 这个设备树,需要修改设备树
{
aliases {
ethernet0 = &gem3;
serial0 = &uart1;
mmc0 = &sdhci0;
mmc1 = &sdhci1;
};
};
&gem3 {
local-mac-address = [00 0a 35 00 00 00];
phy-mode = "rgmii-id";
status = "okay";
phy-handle = <&phy1>;
xlnx,ptp-enet-clock = <0x0>;
phy1:ethernet-phy@1 {
reg = <0x01>;
};
};
也可以使用生成的设备树直接替换,本文根据黑金的板子新建了一个简单工程,并生成设备树,如下:
/*
* CAUTION: This file is automatically generated by Xilinx.
* Version: XSCT 2021.2
* Today is: Mon May 2 16:56:39 2022
*/
/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
/ {
chosen {
bootargs = "earlycon";
stdout-path = "serial0:115200n8";
};
aliases {
ethernet0 = &gem3;
serial0 = &uart1;
spi0 = &qspi;
};
memory {
device_type = "memory";
reg = <0x0 0x0 0x0 0x7ff00000>;
};
cpus {
/delete-node/ cpu@2 ;
/delete-node/ cpu@3 ;
};
};
&gic {
num_cpus = <2>;
num_interrupts = <96>;
};
&lpd_dma_chan1 {
status = "okay";
};
&lpd_dma_chan2 {
status = "okay";
};
&lpd_dma_chan3 {
status = "okay";
};
&lpd_dma_chan4 {
status = "okay";
};
&lpd_dma_chan5 {
status = "okay";
};
&lpd_dma_chan6 {
status = "okay";
};
&lpd_dma_chan7 {
status = "okay";
};
&lpd_dma_chan8 {
status = "okay";
};
&xilinx_ams {
status = "okay";
};
&cci {
status = "okay";
};
&gem3 {
local-mac-address = [00 0a 35 00 00 00];
phy-mode = "rgmii-id";
status = "okay";
phy-handle = <&phy1>;
xlnx,ptp-enet-clock = <0x0>;
phy1:ethernet-phy@1 {
reg = <0x01>;
};
};
&fpd_dma_chan1 {
status = "okay";
};
&fpd_dma_chan2 {
status = "okay";
};
&fpd_dma_chan3 {
status = "okay";
};
&fpd_dma_chan4 {
status = "okay";
};
&fpd_dma_chan5 {
status = "okay";
};
&fpd_dma_chan6 {
status = "okay";
};
&fpd_dma_chan7 {
status = "okay";
};
&fpd_dma_chan8 {
status = "okay";
};
&gpio {
emio-gpio-width = <32>;
gpio-mask-high = <0x0>;
gpio-mask-low = <0x5600>;
status = "okay";
};
&qspi {
is-dual = <0>;
num-cs = <1>;
spi-rx-bus-width = <4>;
spi-tx-bus-width = <4>;
status = "okay";
};
&rtc {
status = "okay";
};
&sdhci1 {
clock-frequency = <187498123>;
status = "okay";
xlnx,mio-bank = <0x1>;
};
&psgtr {
status = "okay";
};
&uart1 {
cts-override ;
device_type = "serial";
port-number = <0>;
status = "okay";
u-boot,dm-pre-reloc ;
};
&ams_ps {
status = "okay";
};
&ams_pl {
status = "okay";
};
使用如下命令编译
export DEVICE_TREE="zynqmp-zcu100-revC"
make CROSS_COMPILE=aarch64-linux-gnu- xilinx_zynqmp_virt_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- -j4
在uboot源码目录下编译生成 u-boot.elf
,此时,基本具备了生成 BOOT.bin 的所需文件,bit 文件暂不合到 BOOT.bin 中。
- 编译 kernel 及 设备树
内核编译相对简单,设备树直接使用生成的设备树文件替换zynqmp-zcu100-revC.dts,当然也可新添加一个,在 Makefile 中添加编译即可,然后编译
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- xilinx_zynqmp_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4
在 arch/arm64/boot 目录中生成 Image.gz
内核压缩文件,arch/arm64/boot /dts 目录中生成设备树文件。
64位系统内核和 32 位不同,不是生成 zImage,而是 Image.gz,这里在 uboot 中使用 booti 加载启动。
使用 vitis 软件生成 BOOT.bin,如下图:
更为直观的可以看上图中的 fsbl_system.bif 文件
//arch = zynqmp; split = false; format = BIN
the_ROM_image:
{
[bootloader, destination_cpu = a53-0]C:/Users/F/workspace/system_wrapper/export/system_wrapper/sw/system_wrapper/boot/fsbl.elf
[pmufw_image]C:\Users\F\workspace\pmu\Debug\pmu.elf
[destination_cpu = a53-0, exception_level = el-3]C:\Users\F\workspace\fsbl_system\_ide\bootimage\bl31.elf
[destination_cpu = a53-0, exception_level = el-2]C:\Users\F\workspace\fsbl_system\_ide\bootimage\u-boot.elf
}
- uboot 启动
将生成的 BOOT.bin 文件放入 TF 卡中,选择 SD1 启动
配置 本地 ip 和 服务器 ip 后即可使用网口,如上图,完成配置后,可使用 tftp 功能
- linux 启动
在 uboot 中配置环境变量后,
setenv bootargs "earlycon console=ttyPS0,115200n8 clk_ignore_unused root=/dev/ram0 rw rootwait"
可使用 tftp 加载设备树、内核和文件系统,即可进入linux 系统;也可将文件放于TF卡中,通过 boot.scr 文件读取相关配置和文件,并启动进入系统。
新建 boot.cmd
文件,
setenv bootargs "earlycon console=ttyPS0,115200n8 clk_ignore_unused root=/dev/ram0 rw rootwait"
load mmc 1:1 0x18000000 Image.gz
load mmc 1:1 0x40000000 zynqmp-zcu100-revC.dtb
load mmc 1:1 0x02100000 uramdisk.image.gz
booti 0x18000000 0x02100000 0x40000000
通过命令生成 boot.scr
文件
mkimage -C none -A arm -T script -d boot.cmd boot.scr
将生成的 boot.scr 文件一同放入 TF 卡中,上电即可启动。
进入系统,配置 ip,搞定!!!
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842156/Fetch+Sources
此板子所生成固件详见
gitee :https://gitee.com/feitingfj/heijin_firmware
github:https://github.com/feitingfj/heijin_firmware
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841724/PMU+Firmware
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842305/Build+ARM+Trusted+Firmware+ATF
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841973/Build+U-Boot
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842481/Build+kernel
http://nano.lichee.pro/build_sys/bootargs.html