zynqmp之启动

22 篇文章 0 订阅
9 篇文章 1 订阅


  五一在家,不能出门,调试了 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,其他就没啥了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

搭建 Vitis 工程

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

这两个所需要的固件在 .xsa 的基础上进行,直接选择对应的工程生成即可
在这里插入图片描述

编译

要启动 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,如下图:
在这里插入图片描述
更为直观的可以看上图中的 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

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

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:在ZynqMP平台上,可以通过将文件系统和内核、uboot复制到eMMC分区来实现eMMC启动。首先,在官方板子上使用SD卡启动,然后挂载eMMC分区,将文件系统和内核、uboot复制到eMMC分区。接下来,通过拨码开关启动。需要注意的是,如果要将系统放到8G的eMMC中,需要进行压缩处理。可以在虚拟机中挂载SD卡,查看文件系统分区的实际大小,并进行压缩。压缩后的文件系统可以挂载到eMMC中,并直接解压到eMMC中。实测压缩后的文件系统大小为2.6G。\[1\] 引用\[2\]:如果遇到无法ping通外网的问题,可以参考https://superuser.com/questions/1026291/linux-avahi-daemon-failed-to-find-user-avahi。如果SSH无法登录,即使修改了/etc/ssh/sshd_config中的perimtrootlogin为yes,仍然无法登录,可以参考https://blog.csdn.net/lizheng2017/article/details/123141120。在处理这些问题时,可以观察启动日志,查看哪些服务未启动,并根据提示寻找解决方法。\[2\] 引用\[3\]:如果网络无法启动,eth无法识别,可以在rc.local文件中配置网络IP和网关。需要注意的是,在rc.local文件中启动失败的程序需要屏蔽,并在网络启动服务和设置IP服务之间增加适当的延时(例如sleep 5)。\[3\] 综上所述,要在ZynqMP上实现eMMC启动,可以通过将文件系统和内核、uboot复制到eMMC分区,并进行压缩处理。同时,需要注意处理网络相关的问题,如无法ping通外网、SSH无法登录以及网络无法启动等。可以参考提供的链接和观察启动日志来解决这些问题。 #### 引用[.reference_title] - *1* *2* *3* [在黑金zynqmp 上用emmc 启动的那些坑](https://blog.csdn.net/Nyiragongo/article/details/128470418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值