zynqmp之启动

目录

  • 相关环境
  • 搭建 vivado 工程
  • 搭建 Vitis 工程
  • 编译
  • 生成
  • 启动
  • 部分所需源码地址
  • SD卡启动文件
  • 相关参考

  五一在家,不能出门,调试了 Xilinx 的 Zynq UltraScale+ MPSoCs 系列的芯片,黑金的 AXU2CGB 板子。这几天整理记录下。
  之前以为 Zynq UltraScale+ MPSoCs 系列的芯片和 zynq 的应该大同小异,现在看看还是有区别的,主要体现在 BOOT.bin 的生成上,具体的详见本文。
  对于 zynqmp系列,看到不少都是使用 petalinux 的,用过一次,不适合我,本文使用传统方式编译并进入 linux 系统。

相关环境

主控芯片: xczu2cg-sfvc784-1-e
PC软件:Xilinx vitis 2021.2
uboot版本 : xilinx-v2021.2 或 xlnx_rebase_v2021.01_2021.2 都可以
linux版本:xlnx_rebase_v5.10

搭建 vivado 工程

工程比较简单,就是加了 QSPI、SD1、uart1、网口,然后配置下 ddr,其他就没啥了
zynqmp之启动_第1张图片
zynqmp之启动_第2张图片
zynqmp之启动_第3张图片
zynqmp之启动_第4张图片

从vivado 2017.4 直接跳到 vitis 2021.2,比较直观的是软件基本上分成了两个部分,Vivado 部分完成,生成一个 .xsa 文件,这个文件是搭建 vitis 工程的基础。

搭建 Vitis 工程

新建 fabl 与 PMU 工程,新建后编译即可得到 fsbl.elfpmu.elf 两个固件。PMU 是在 zynqmp 上有的,其主要控制系统内资源的上电、复位和监控。

这两个所需要的固件在 .xsa 的基础上进行,直接选择对应的工程生成即可
zynqmp之启动_第5张图片

编译

要启动 uboot ,需要生成 BOOT.bin 文件,除了用到上面提到的 fsbl.elfpmu.elf 两个固件,还需要用到 bl31.elfuboot.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,如下图:
zynqmp之启动_第6张图片
更为直观的可以看上图中的 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 启动
zynqmp之启动_第7张图片
配置 本地 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 卡中,上电即可启动。
zynqmp之启动_第8张图片
进入系统,配置 ip,搞定!!!
zynqmp之启动_第9张图片

部分所需源码地址

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842156/Fetch+Sources

SD卡启动文件

此板子所生成固件详见
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

你可能感兴趣的:(arm,linux,zynq,linux,嵌入式,zynqmp,arm)