EDF如何为XSA创建 Yocto Machine并编译加载固件和linux镜像

作者:Davis Zhang,AMD工程师;来源:AMD开发者社区

EDF(Embedded Development Framework)是AMD发布的基于Yocto project的开源开发架构,它支持定制linux开发、嵌入式软件开发、以及基于CED(Configurable Example Design)和vitis的hardware开发。目前已经发布了几个版本,v25.05、v25.05.1、v25.11,目前petalinux还在更新,但是未来将由EDF替代。如何像在petalinux工程里那样导入XSA的硬件配置?本文基于v25.11版本介绍如何在EDF开发环境里为zcu102开发板的vivado工程导出的XSA创建Yocto Machine并编译加载固件和linux镜像。

一. 使用vivado工程导出的XSA生成system device tree

bash-4.4$ sdtgen

sdtgen% set_dt_param -debug enable

sdtgen% set_dt_param -zocl enable

sdtgen% set_dt_param -dir <directory-for-sdt>

sdtgen% set_dt_param -xsa <path-and-name-of-xsa>

sdtgen% set_dt_param -board_dts zcu102-reva

sdtgen% generate_sdt

二. EDF对主机的要求

EDF v25.11版本支持的主机操作系统有以下几种版本

  • Ubuntu Desktop/Server 22.04.2 LTS,22.04.3 LTS, 22.04.4 LTS and 22.04.5 LTS

  • OpenSuse Leap 15.4

  • AlmaLinux 8.10,9.4 and 9.5

三. Yocto project编译环境设置

1.AMD选择“repo”作为管理git repositories的工具,在安装repo之前,先配置git

$ git config --global user.email "you@example.com"

$ git config --global user.name "Your Name"

2. 主机的shell需要是bash,不能是 csh或者dash

3. 下载repo工具并把它设置为可执行

$ curl https://storage.googleapis.com/git-repo-downloads/repo > repo

$ chmod a+x repo

4. 如果主机用户路径里没有“bin”文件夹,生成bin文件夹,并将repo工具安装到bin文件夹里,然后将bin文件夹路径加入“PATH”环境变量

$ mkdir ~/bin

$ mv repo ~/bin/

$ PATH=~/bin:$PATH

5. 在主机里有读写权限的路径里建立edf project目录

$ mkdir -p yocto/edf

$ cd yocto/edf

6. 使用yocto manifest克隆Yocto meta layer的源文件

$ repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2025.2 -m default-edf.xml

7. 获取所有repositories

$ repo sync

8. 基于manifest所指定的版本开创一个branch,这步可选。

$ repo start <branch-name> --all

9. 使用edf-init-build-env脚本初始化编译环境

$ source edf-init-build-env

10. 如果主机编译环境用到了NFS,可以在build/conf/local.conf里增加下面的TMPDIR路径,这样编译产生的文件将保存在NFS上,需要注意的是Yocto编译环境不允许路径名称里有下划线“_”。如果不存在NFS,TMPDIR环境变量将指向build/tmp

TMPDIR = "/tmp/<user-name>/yocto/<release-version>/build"

11. 编译过程中,TMPDIR所指向的路径可能会需要几十GB的存储空间消耗,所以需要确保主机有足够的存储空间。为了节省空间,可以将下面这行代码加入build/conf/local.conf,这样一些编译中间文件会不再保留。

INHERIT += "rm_work"

四. 使用生成的system device tree生成Yocto Machine

1.下面使用gen-machineconf工具将前面生成的system device tree转换为Yocto类型的Machine配置,

$ gen-machineconf parse-sdt --hw-description <directory-for-sdt> -c conf -l conf/local.conf --machine-name <custom-machine-name>

这个命令将在build/conf/machine路径里生成一个新的Yocto Machine定义。

2. 我们可以将build/conf/local.conf里的默认MACHINE修改为我们新生成的Yocto Machine

$ sed -i "/MACHINE ??=/c\MACHINE ??= \"<custom-machine-name>\"" conf/local.conf

3. 前面我们已经将默认Machine修改为新生成的Yocto Machine,我们生成加载固件的时候就不需要指定Machine name了

$ bitbake xilinx-bootbin

4. 生成linux镜像的时候,可以使用默认的新生成的Yocto Machine,或者指定Machine为amd-cortexa53-mali-common

$ bitbake edf-linux-disk-image

or

$ MACHINE=amd-cortexa53-mali-common bitbake edf-linux-disk-image

5. 合并boot.bin和wic镜像

如果生成加载固件和linux镜像的时候都使用了新生成的Yocto Machine,那么boot.bin和“.wic”文件都在${TMPDIR}/deploy/images/<custom-machine-name>里。

如果生成linux镜像使用的Yocto Machine是amd-cortexa53-mali-common,“.wic“文件在${TMPDIR}/deploy/images/amd-cortexa53-mali-common里

前面生成的“.wic“里有四个partition,可以用下面命令来查看,

$ wic ls ${TMPDIR}/deploy/images/<*>/edf-linux-disk-image-<*>.rootfs.wic

其中第一个partition是FAT32格式的,是用来存放加载固件的,它目前是空的,可以用下面命令来查看,

$ wic ls ${TMPDIR}/deploy/images/<*>/edf-linux-disk-image-<*>.rootfs.wic:1

可以用下面命令把boot.bin合并在edf-linux-disk-image-<*>.rootfs.wic第一个partition里。

$ wic cp ${TMPDIR}/deploy/images/<custom-machine-name>/boot.bin \

${TMPDIR}/deploy/images/amd-cortexa53-mali-common/edf-linux-disk-image-<*>.rootfs.wic:1

最后就可以把edf-linux-disk-image-<*>.rootfs.wic烧写到SD卡里加载板卡了。