EBAZ4205之linux系统构建

敬请提问,知无不言(秒回),言无不尽

说明

对ebaz4205的开发五六年前开始了,网上各种资料教程都已经很完善了,但由于AMD开发工具的不断更新(删除了SDK,新出了Vitis,删除了.hdf文件格式,用.xsa取而代之),产生了很多开发版本不适配的问题。

多年过去,这块板子仍然是目前最具性价比的多核异构开发板,无论是学习linux开发,FPGA开发,都是不错的选择。对于一些的linux应用开发,网上提供了很多OS资源,只要简单的复制粘贴就能用SD卡在开发板上起一个linux系统。对于底层的开发(需要操作系统,需要用到逻辑资源),使用AMD提供的Vitis和Vivado从头到尾的制作一个操作系统是必要的。

网上也有很多大佬出过制作教程,但有些详略问题,有些也开发工具也逐渐停更,所以在此记录一下我的系统构建过程。仍然感谢对这块板子最初的开发做出贡献的先驱者们。

材料

平台:vitis、vivado 2019 、ubuntu18.0(本工程不使用petalinux)

需要启动文件:

fat32分区部分:BOOT.bin(u-boot.elf和fsbl.elf和bitstream)、dtb、uImage、uEnv.txt

ext4 分区部分:rootfs

Vivado设计部分

目的:对可用的外设资源参数进行配置、设计PL端、约束引脚。最终生成xsa文件。

①建立vivado工程,CREATE BLOCK DESIGN,按下图进行设计

修改网口为100M、DDR3型号为MT41K128M16 JT-125、位宽为16

按下图修改时序

按下图进行设计


②新建一个引脚约束文件xdc,写引脚约束

set_property IOSTANDARD LVCMOS33 [get_ports ENET0_MII_RX_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports ENET0_MII_TX_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports FCLK_CLK0]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_TX_EN[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports ENET0_MII_RX_DV]
set_property PACKAGE_PIN U14 [get_ports ENET0_MII_RX_CLK]
set_property PACKAGE_PIN U15 [get_ports ENET0_MII_TX_CLK]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_RXD[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_RXD[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_RXD[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_RXD[0]}]
set_property PACKAGE_PIN V17 [get_ports {ENET0_MII_RXD[2]}]
set_property PACKAGE_PIN Y17 [get_ports {ENET0_MII_RXD[3]}]
set_property PACKAGE_PIN Y16 [get_ports {ENET0_MII_RXD[0]}]
set_property PACKAGE_PIN V16 [get_ports {ENET0_MII_RXD[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_TXD[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_TXD[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_TXD[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {ENET0_MII_TXD[0]}]
set_property PACKAGE_PIN Y19 [get_ports {ENET0_MII_TXD[3]}]
set_property PACKAGE_PIN W18 [get_ports {ENET0_MII_TXD[0]}]
set_property PACKAGE_PIN Y18 [get_ports {ENET0_MII_TXD[1]}]
set_property PACKAGE_PIN V18 [get_ports {ENET0_MII_TXD[2]}]
set_property PACKAGE_PIN W19 [get_ports {ENET0_MII_TX_EN[0]}]
set_property PACKAGE_PIN W16 [get_ports ENET0_MII_RX_DV]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN W13 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_mdc]
set_property IOSTANDARD LVCMOS33 [get_ports MDIO_ETHERNET_mdio_io]
set_property PACKAGE_PIN W15 [get_ports MDIO_ETHERNET_mdc]
set_property PACKAGE_PIN Y14 [get_ports MDIO_ETHERNET_mdio_io]

③Generate block design产生.bd文件

  generate output product

  create HDL warpper


④ Run synthesis ->Run Implementation ->Generate Bitstream(修改布局设计后从此开始)


⑤导出

选择包含bitstream->产生了xsa(硬件组合)

U-boot、dtb、uImage制作

dts

使用vitis定制

①在vitis中导入xilinx设备树开发资源包

clone 地址:https://github.com/Xilinx/device-tree-xlnx.git


②新建platform project,选择devicetree选项,导入xsa,build。

下图目录下就会产生设备树相关文件(另外比特流文件和fsbl.elf文件也会同时产生,其实这一步执行完成后,下面的vitis设计部分就没必要再做一次了)

得到system-top、pcw和zynq-7000。(也得到bitstream、fsbl.elf)

(不要用菜单的generate devicetree生成设备树,会报错,也不要用dtc产生dtb也会报错)

pcw.dtsi作如下修改(原因:自动生成的pcw.dtsi里面gem节点里是没有phy信息 )

&gem0 {
	phy-mode = "gmii";
	status = "okay";
	xlnx,ptp-enet-clock = <0x69f6bcb>;
	phy-handle = <&ethernet_phy>;
	
	ethernet_phy: ethernet-phy@0 {
		reg = <0>;
		device_type = "ethernet-phy";
	};
};

与内核不同的是:uboot编译时会把设备树编译进uboot(内核编译设备树和镜像则是分开的)

把dts编译进uboot,同时也单独放到启动文件中

uboot.elf(u-boot)

在xilinx官网下载uboot源码:

https://github.com/Xilinx/u-boot-xlnx/archive/refs/tags/xilinx-v2018.3.zip

在zc702配置的基础上修改一点点(主要是改名),如下:

根据zc702修改板子配置文件zynq_ebaz4205_defconfig

删除:CONFIG_ENV_IS_IN_SPI_FLASH=y

改名:

CONFIG_SYS_CONFIG_NAME=“zynq_ebaz4205”

CONFIG_IDENT_STRING=" Xilinx Zynq EBAZ4205"

CONFIG_DEFAULT_DEVICE_TREE=“zynq-ebaz4205”

添加:

CONFIG_NAND=y

CONFIG_NAND_ZYNQ=y

CONFIG_BOOTDELAY=3

因为目前没有对uboot功能的需求,所以只作最简单的修改。有需求的可以自己去配置。

把生成的三个dts(system-top、pcw和zynq-7000)文件放入arch/arm/dts文件夹内(顶层文件要改名为上述配置中的名字)

此时编译会报错,我们按错误提示修改名字,添加文件

cp include/configs/zynq_zc70x.h include/configs/zynq_ebaz4205.h
加入一行#define CONFIG_CPU_FREQ_HZ 666666667

修改arch/arm/mach-zynq/Kconfig
config SYS_CONFIG_NAME
   string "Board configuration name"
   default "zynq_ebaz4205"

编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_ebaz4205_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
mv u-boot u-boot.elf

编译后要单独拷贝出一份dtb用于启动。得到dtb和uboot.elf

uImage

可以在xilinx官网的下载linux源码,链接如下

https://github.com/Xilinx/linux-xlnx/archive/refs/tags/xilinx-v2018.3.zip

使用默认配置进行编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage

在./arch/arm/boot下有uImage

Vitis设计部分

目的:用上一步生成的xsa文件,得到bitstream和fsbl.elf,生成BOOT.bin

①新建platform project


②直接build project


③产生 fsbl.elf和bitstream。文件位置如图


④Create Boot Image 制作BOOT.bin


一定按顺序导入fsbl.elf 、bitstream、u-boot.elf生成BOOT.bin

(该方法使用vitis内嵌的bootgen生成的,其实petalinux内也有bootgen,也可以用于生成BOOT.bin,本系统制作脱离于petalinux所以就不介绍了)

rootfs

随便

提供一个大佬的参考https://www.amobbs.com/thread-5713744-1-1.html

debian文件系统,下载后解压到ext4分区。id/密码:osrc/root

uEnv.txt

bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait
uenvcmd=run linaro_sdboot
linaro_sdboot=echo Run uEnv.txt copying Linux from SD to RAM... && \
fatload mmc 0 0x0 ${devicetree_image} && \
fatload mmc 0 0x8000 ${kernel_image} && \
bootm 0x8000 - 0x0

uboot主任务执行完后会自动加载uEnv.txt,为uboot环境变量赋值。

uEnv.txt作用:设置bootargs(控制台、根文件系统相关)、设置启动命令(设置设备树和内核的内存存放地址并加载,启动)

u-boot.elf一般被载入内存的高地址区域,因此kernel_image应当放置在低地址区域。kernel_image地址之前需要预留一些空间存放页表,因此存放在0x8000。

参考EBAZ4205 ZYNQ 7Z010 u-boot & Linux 生成方法记录_zynq uenv-CSDN博客

启动

需要改焊电阻(网上可以找到具体方法)设置为sd卡启动

分区sd卡,格式化

fat32分区部分:BOOT.bin(u-boot.elf和fsbl.elf和bitstream)、dtb、uImage、uEnv.txt

ext4 分区部分:rootfs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值