Software Application Development

Software Application Development

This is a getting started guide providing walk through style examples using the AMD Embedded Development Framework (EDF) covering initial board setup and running a pre-built disk image, hardware and software applications development using the pre-built image, and full custom hardware & software builds and image creation.

Table of Contents

Software Application Development on Target

image-20250328-112619.png

On-target development is convenient because you can use native compilers and tools and a workflow most developers are used to similar to doing native x86 development on a workstation. You can install a rich set of dev packages from the package feed and use familiar build systems like make, autotools, cmake, or meson without having to set up a cross-development environment.

Package Management using RPM

Update for EDF 25.05 - AMD Vivado™ Design Suite 2025.1

  • This flow is supported as an on-line flow

  • Prior release (EA) - The Package feed required for this section was only supported as an offline flow for Early access. see Accessing the package feed without an on-line network connection

 

A package manager and package feed is a convenient way of installing additional packages into your root file system. dnf (Danified Packaging) is the default runtime package manager. The package management feature is enabled in the general purpose Linux file system.

Below is an example to update, search and install the packages using the network-hosted package feed.

amd-edf:~$ sudo dnf update amd-edf:~$ dnf search <package-name> amd-edf:~$ sudo dnf install <package-name>

Accessing the package feed without an on-line network connection

If you do not have online network access, you can download a copy of the package feed, then copy and extract the contents to a USB flash drive on your host PC so that you can use the package feed offline. After the flash drive has been prepared, plug it into the evaluation board and follow the below steps.

AMD EDF 25.05 (VEK385 EA) and Vivado™ Design Suite 2025.1

  • It is recommended to use the on-line package feed available with EDF 25.05.

  • An updated package feed can be generated manually for offline use.

  • (The offline package feed bundle from the AMD Vivado design suite 2025.1 EA release for VEK385 EA can be downloaded from the VEK385 lounge site [rpmfeed_04121214.tar.gz] but this might not be compatible with the latest EDF images)

The below tutorial assumes that your USB flash drive is enumerated as /dev/sda and has one partition /dev/sda1. This might be different depending on your system and device.

# query device amd-edf:~$ lsblk -S NAME HCTL TYPE VENDOR MODEL REV SERIAL TRAN sda 0:0:0:0 disk SanDisk Cruzer Blade 1.00 usb # query partitions amd-edf:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 1 14.9G 0 disk `-sda1 8:1 1 14.9G 0 part # mount partition that contains extracted package feed amd-edf:~$ sudo mount /dev/sda1 /media # check directory tree amd-edf:~$ tree -L 1 /media /media/ └── rpm ├── aarch64 ├── all ├── amd_cortexa78_mali_common ├── any ├── armv8a ├── armv8a_crc ├── cortexa72_cortexa53 ├── noarch └── versal_2ve_2vm_generic

Next we need to update the DNF repo file to point to the offline package feed file path based on where the USB partition has been mounted, clean and update the DNF cache.

Toolchain installation

Update for EDF 25.05 - AMD Vivado™ Design Suite 2025.1

  • This flow is supported as an on-line flow

  • Prior release (EA) - The Package feed required for this section was only supported as an offline flow for Early Access. see Accessing the package feed without an on-line network connection

In preparation for doing any on-target development, we first need to install the compiler toolchains and other commonly used development utilities. This can be done by installing the self-hosted package group from the package feed.

Note: The installation step takes a while to complete

amd-edf:~$ sudo dnf install packagegroup-self-hosted [snip] amd-edf:~$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-amd-linux/13.4.0/lto-wrapper Target: aarch64-amd-linux Configured with: ../../../../../../work-shared/gcc-13.4.0-r0/gcc-13.4.0/configure --build=x86_64-linux --host=aarch64-amd-linux --target=aarch64-amd-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/ --with-gnu-ld --enable-shared --enable-languages=c,c++,fortran --enable-threads=posix --enable-multilib --enable-default-pie --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=aarch64-amd-linux- --without-local-prefix --disable-install-libiberty --disable-libssp --enable-libitm --enable-lto --disable-bootstrap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-build-sysroot=/ --disable-static --enable-nls --with-glibc-version=2.28 --enable-initfini-array --enable-__cxa_atexit Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 13.4.0 (GCC)

Software application development

In this example we will clone, build and install the example application to test on-target development using common tools:

amd-edf:~$ wget https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz --2025-05-08 03:09:51-- https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz Resolving ftp.gnu.org... 209.51.188.20, 2001:470:142:3::b Connecting to ftp.gnu.org|209.51.188.20|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1017723 (994K) [application/x-gzip] Saving to: 'hello-2.12.tar.gz' hello-2.12.tar.gz 100%[==================================================================================================================>] 993.87K 1.49MB/s in 0.7s 2025-05-08 03:09:53 (1.49 MB/s) - 'hello-2.12.tar.gz' saved [1017723/1017723] amd-edf:~$ tar -xf hello-2.12.tar.gz amd-edf:~$ cd hello-2.12 amd-edf:~/hello-2.12$ ./configure [snip] amd-edf:~/hello-2.12$ make -j8 [snip] amd-edf:~/hello-2.12$ sudo make install [snip] amd-edf:~/hello-2.12$ hello Hello, world!

Kernel module development

Update for EDF 25.05 - AMD Vivado™ Design Suite 2025.1

  • This flow is supported as an on-line flow

  • Prior release (EA) - The Package feed required for this section was only supported as an offline flow for Early access. see Accessing the package feed without an on-line network connection

Install the kernel-devsrc package which provides the entire kernel source tree for kernel module development. The resulting sources will be installed into /usr/src/kernel

amd-edf:~$ sudo dnf install kernel-devsrc [snip]

Prepare the kernel source tree for module build.

Note: the kernel release string shown in this example can be different depending on the exact build/image used.

amd-edf:~$ export LOCALVERSION="-$(uname -r | cut -d'-' -f3)" amd-edf:~$ echo $LOCALVERSION -gf28cb5f8491a amd-edf:~$ export KERNEL_SRC=/usr/src/kernel amd-edf:~$ cd $KERNEL_SRC amd-edf:/usr/src/kernel$ make kernelrelease 6.12.40-xilinx-gf28cb5f8491a # make sure the above output matches the output of uname -r amd-edf:/usr/src/kernel$ uname -r 6.12.40-xilinx-gf28cb5f8491a amd-edf:/usr/src/kernel$ sudo -E make modules_prepare [snip]

For this example, we will clone the hdmi21-modules repository, after that we will build and install the module. This example is for illustration only, the compiled kernel module is not used subsequently.

If you are building your own kernel module, the same steps apply provided your kernel module source tree and Makefile follow the same structure as the provided example. 

See GitHub - Xilinx/hdmi21-modules for the example code.

amd-edf:/usr/src/kernel$ cd amd-edf:~$ git clone https://github.com/Xilinx/hdmi21-modules Cloning into 'hdmi21-modules'... remote: Enumerating objects: 26, done. remote: Counting objects: 100% (26/26), done. remote: Compressing objects: 100% (15/15), done. remote: Total 26 (delta 11), reused 26 (delta 11), pack-reused 0 (from 0) Receiving objects: 100% (26/26), 33.72 KiB | 575.00 KiB/s, done. Resolving deltas: 100% (11/11), done. amd-edf:~$ cd hdmi21-modules/ amd-edf:~/hdmi21-modules$ make -j8 make -C /usr/src/kernel M=/home/amd-edf/hdmi21-modules O= modules make[1]: Entering directory '/usr/lib/modules/6.12.40-xilinx-gf28cb5f8491a/build' warning: the compiler differs from the one used to build the kernel The kernel was built by: aarch64-amd-linux-gcc (GCC) 13.4.0 You are using: gcc (GCC) 13.4.0 CC [M] /home/amd-edf/hdmi21-modules/xfmc/x_vfmc.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/fmc.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/fmc74.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/fmc64.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/fmc65.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/tipower.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/idt.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/onsemi_tx.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/onsemi_rx.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/ti_tmds1204_tx.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/ti_tmds1204_rx.o CC [M] /home/amd-edf/hdmi21-modules/xfmc/si5344.o LD [M] /home/amd-edf/hdmi21-modules/xfmc/hdmi21-xfmc.o MODPOST /home/amd-edf/hdmi21-modules/Module.symvers CC [M] /home/amd-edf/hdmi21-modules/xfmc/hdmi21-xfmc.mod.o CC [M] /home/amd-edf/hdmi21-modules/.module-common.o LD [M] /home/amd-edf/hdmi21-modules/xfmc/hdmi21-xfmc.ko make[1]: Leaving directory '/usr/lib/modules/6.12.10-xilinx-gf28cb5f8491a/build' amd-edf:~/hdmi21-modules$ sudo -E make modules_install make -C /usr/src/kernel M=/home/amd-edf/hdmi21-modules modules_install make[1]: Entering directory '/usr/lib/modules/6.12.40-xilinx-gf28cb5f8491a/build' INSTALL /lib/modules/6.12.40-xilinx-gf28cb5f8491a/updates/xfmc/hdmi21-xfmc.ko DEPMOD /lib/modules/6.12.40-xilinx-gf28cb5f8491a Warning: modules_install: missing 'System.map' file. Skipping depmod. make[1]: Leaving directory '/usr/lib/modules/6.12.40-xilinx-gf28cb5f8491a/build' amd-edf:~/hdmi21-modules$ sudo depmod amd-edf:~/hdmi21-modules$ ls xfmc/*ko xfmc/hdmi21-xfmc.ko

You can now inspect your kernel module, load and unload it as follows.

Note: The exact output of the shown commands can vary based on the kernel version etc.

Development inside container

A devtools container image is provided for on-target development inside a container isolated from the host OS. The devtools container image has toolchains and basic developer tools pre-installed. The image has package management enabled and can easily be extended by installing additional packages from the package feed.

devtools container:

amd-edf:~$ sudo docker pull xilinx/edf:devtools-25.05 amd-edf:~$ sudo docker pull xilinx/edf:hello-world-25.05 amd-edf:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hub.docker.com/r/xilinx/edf/devtools-25.05 latest 6ec094fb31d2 28 hours ago 425MB hub.docker.com/r/xilinx/edf/hello-world-25.05 latest e9fff5795aa2 3 weeks ago 13.4MB amd-edf:~$ sudo docker run -it hub.docker.com/r/xilinx/edf/devtools-25.05 bash bash-5.2# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-amd-linux/13.4.0/lto-wrapper Target: aarch64-amd-linux Configured with: ../../../../../../work-shared/gcc-13.4.0-r0/gcc-13.4.0/configure --build=x86_64-linux --host=aarch64-amd-linux --target=aarch64-amd-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/libexec --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/ --with-gnu-ld --enable-shared --enable-languages=c,c++,fortran --enable-threads=posix --enable-multilib --enable-default-pie --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=aarch64-amd-linux- --without-local-prefix --disable-install-libiberty --disable-libssp --enable-libitm --enable-lto --disable-bootstrap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --with-cloog=no --enable-checking=release --enable-cheaders=c_global --without-isl --with-build-sysroot=/ --disable-static --enable-nls --with-glibc-version=2.28 --enable-initfini-array --enable-__cxa_atexit Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 13.4.0 (GCC) # type exit to stop the container. bash-5.2# exit amd-edf:~$ # to list all containers amd-edf:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34c71be1d202 333a4f403bbb "bash" 45 minutes ago Exited (0) 33 minutes ago unruffled_cori 68af55567e65 014d1198c8c8 "hello" About an hour ago Exited (0) About an hour ago charming_faraday # to restart a container and attach the console amd-edf:~$ sudo docker start unruffled_cori amd-edf:~$ sudo docker attach unruffled_cori bash-5.2#

You can follow the same steps as mentioned in the on-target software application development and kernel module development tutorials above for building inside the container.

Note: You might want to add bind mounts using -v when starting the container to map directories from the host OS to the container.

Software Application Development using SDK

An SDK for cross-development on an x86 host is useful when a user does not have access to a board for on-target development. Depending on the project, it can speed up the build task compared to building on-target. The downside is that the content of the SDK is fixed and it is not possible to install additional dev packages or utilities into an existing SDK whereas on target, packages can be installed from the package feed.

SDK installation

The EDF Application and Machine SDK script amd-edf-glibc-x86_64-meta-edf-app-sdk-cortexa72-cortexa53-amd-cortexa78-mali-common-toolchain-<release>-<stamp>.sh which can be downloaded from the Downloads and Release Notes is installed as follows.

Once installed, the SDK can be set up by sourcing the environment setup script. This will set all of the required environment variables (CC, CXX, LD, etc.) required for cross compilation of projects.

Note: If you start a new shell, you need to source the env setup script again in the new shell.

Install Toolchain on host machine:

A newly downloaded SDK needs to be made executable so it can be run. The following “chmod” line only needs to be run first after a fresh download.

When installing the SDK, it will ask you where you want the SDK to be installed. Make sure to choose a location on your system to which you have write permission. The following example uses “/scratch/sdk” as the install location; this location might or might not exist on your host system.

Once an SDK is installed to a specific location, it cannot be simply moved; it has been set up to work from that specific location. If you wish to move the SDK to a different location, re-run the install script specifying the new location.

[/scratch]$ chmod +x amd-edf-glibc-x86_64-meta-edf-app-sdk-cortexa72-cortexa53-amd-cortexa78-mali-common-toolchain-25.05+release-S05062043.sh [/scratch]$ ./amd-edf-glibc-x86_64-meta-edf-app-sdk-cortexa72-cortexa53-amd-cortexa78-mali-common-toolchain-25.05+release-S05062043.sh AMD Embedded Development Framework Linux distribution SDK installer version 25.05+release-S05062043 =================================================================================================== Enter target directory for SDK (default: /opt/amd-edf/25.05+release-S05062043): sdk You are about to install the SDK to "/scratch/sdk". Proceed [Y/n]? Extracting SDK.................................................................................................................................................................................................................................................................................................done Setting it up...done SDK has been successfully set up and is ready to be used. Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g. $ . /scratch/sdk/environment-setup-cortexa72-cortexa53-amd-linux [/scratch]$ source sdk/environment-setup-cortexa72-cortexa53-amd-linux [/scratch]$ export PS1="${PS1}sdk> " [/scratch/]$ sdk>

If you see the below message when installing the SDK or when sourcing the environment setup script, run 'unset LD_LIBRARY_PATH' as stated in the message and rerun the command.

Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'
but please check why this was set in the first place and that it's safe to unset.
The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set.
For more references see:
Shared Libraries
Why LD_LIBRARY_PATH is bad

Software application development

We can use the same example code as shown in the on-target compilation tutorial.

Note: You have to pass --host=aarch64 to the configure script to indicate that you are cross-compiling for aarch64

Cross compile example code:

[/scratch]$ sdk> wget https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz --2025-05-08 01:22:40-- https://ftp.gnu.org/gnu/hello/hello-2.12.tar.gz Resolving ftp.gnu.org (ftp.gnu.org)... 209.51.188.20, 2001:470:142:3::b Connecting to ftp.gnu.org (ftp.gnu.org)|209.51.188.20|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1017723 (994K) [application/x-gzip] Saving to: ‘hello-2.12.tar.gz’ hello-2.12.tar.gz 100%[==================================================================================================================>] 993.87K 133KB/s in 6.4s 2025-05-08 01:22:48 (154 KB/s) - ‘hello-2.12.tar.gz’ saved [1017723/1017723] [/scratch]$ sdk> tar -xf hello-2.12.tar.gz [/scratch]$ sdk> cd hello-2.12/ [hello-2.12]$ sdk> [hello-2.12]$ sdk> ./configure --host=aarch64 [snip] [hello-2.12]$ sdk> make -j12 [snip] [hello-2.12]$ sdk> file hello hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=dbe295a872b578a639907fa8ec500e77aea5bc46, for GNU/Linux 5.15.0, with debug_info, not stripped

The resulting binary can then be copied over to the target system and run.

Note: Use the IP address assigned to your board in the scp command below. You can query the IP address by running ip a s on the target

[hello-2.12]$ sdk> scp hello amd-edf@192.168.1.214:~/ [snip]

 On the target run the compiled binary

amd-edf:~$ ./hello Hello, world!

Kernel module development

The steps are largely analogous to the steps provided for on-target kernel module development.

Note: make sure you source the SDK environment script before you start

First, we prepare the kernel sources.

[/scratch]$ sdk> export KERNEL_SRC=$OECORE_TARGET_SYSROOT/usr/src/kernel [/scratch]$ sdk> cd $KERNEL_SRC [kernel] sdk> [kernel]$ sdk> export LOCALVERSION="-$(echo System.map* | cut -d'-' -f4)" [kernel]$ sdk> echo $LOCALVERSION -gf28cb5f8491a [kernel]$ sdk> make kernelrelease 6.12.10-xilinx-gf28cb5f8491a [kernel]$ sdk> make modules_prepare [snip]

Now we clone our example out-of-tree kernel module repository and build the driver module.

[kernel]$ sdk> cd /scratch [/scratch]$ sdk> git clone https://github.com/Xilinx/hdmi21-modules Cloning into 'hdmi21-modules'... remote: Enumerating objects: 26, done. remote: Counting objects: 100% (26/26), done. remote: Compressing objects: 100% (15/15), done. remote: Total 26 (delta 11), reused 26 (delta 11), pack-reused 0 (from 0) Receiving objects: 100% (26/26), 33.72 KiB | 986.00 KiB/s, done. Resolving deltas: 100% (11/11), done. [/scratch]$ sdk> cd hdmi21-modules/ [hdmi21-modules]$ sdk> [hdmi21-modules (master u=)]$ sdk> make -j8 make -C /scratch/sdk/sysroots/cortexa72-cortexa53-amd-linux/usr/src/kernel M=/scratch/hdmi21-modules O= modules make[1]: Entering directory '/scratch/sdk/sysroots/cortexa72-cortexa53-amd-linux/usr/lib/modules/6.12.10-xilinx-gf28cb5f8491a/build' CC [M] /scratch/hdmi21-modules/xfmc/x_vfmc.o CC [M] /scratch/hdmi21-modules/xfmc/fmc.o CC [M] /scratch/hdmi21-modules/xfmc/fmc74.o CC [M] /scratch/hdmi21-modules/xfmc/fmc64.o CC [M] /scratch/hdmi21-modules/xfmc/fmc65.o CC [M] /scratch/hdmi21-modules/xfmc/tipower.o CC [M] /scratch/hdmi21-modules/xfmc/idt.o CC [M] /scratch/hdmi21-modules/xfmc/onsemi_tx.o CC [M] /scratch/hdmi21-modules/xfmc/onsemi_rx.o CC [M] /scratch/hdmi21-modules/xfmc/ti_tmds1204_tx.o CC [M] /scratch/hdmi21-modules/xfmc/ti_tmds1204_rx.o CC [M] /scratch/hdmi21-modules/xfmc/si5344.o LD [M] /scratch/hdmi21-modules/xfmc/hdmi21-xfmc.o MODPOST /scratch/hdmi21-modules/Module.symvers CC [M] /scratch/hdmi21-modules/xfmc/hdmi21-xfmc.mod.o CC [M] /scratch/hdmi21-modules/.module-common.o LD [M] /scratch/hdmi21-modules/xfmc/hdmi21-xfmc.ko make[1]: Leaving directory '/scratch/sdk/sysroots/cortexa72-cortexa53-amd-linux/usr/lib/modules/6.12.10-xilinx-gf28cb5f8491a/build' [hdmi21-modules (master % u=)]$ sdk> ls xfmc/*ko xfmc/hdmi21-xfmc.ko

You can now copy the generated files to the target via scp.

[hdmi21-modules (master % u=)]$ sdk> scp xfmc/*.ko amd-edf@192.168.1.214:~/ hdmi21-xfmc.ko

On the target, copy the files to the kernel module directory of the active kernel.

Note: There might be multiple subdirectories under /lib/modules for different kernel versions. Make sure you copy the files to your active kernel (run uname -r on the target) and also make sure that the version matches the version in your SDK (output of make kernelrelease  on the host)

amd-edf:~$ ls *.ko hdmi21-xfmc.ko amd-edf:~$ mkdir -p /lib/modules/$(uname -r)/updates/xfmc amd-edf:~$ sudo mv *.ko /lib/modules/$(uname -r)/updates/xfmc amd-edf:~$ ls /lib/modules/$(uname -r)/updates/xfmc hdmi21-xfmc.ko amd-edf:~$ sudo depmod amd-edf:~$ modinfo hdmi21-xfmc filename: /lib/modules/6.12.10-xilinx-gf28cb5f8491a/updates/xfmc/hdmi21-xfmc.ko description: Xilinx Vphy driver license: GPL license: GPL v2 description: FMC Expander driver license: GPL v2 description: FMC74 Expander driver license: GPL v2 description: FMC64 Expander driver license: GPL v2 description: FMC65 Expander driver license: GPL v2 description: TIPOWER Expander driver license: GPL v2 description: 8T49N24x ccf driver license: GPL v2 description: ONSEMI NB7NQ621M cable redriver driver license: GPL v2 description: ONSEMI NB7NQ621M cable redriver driver license: GPL v2 description: TI TMDS1204 retimer chip driver license: GPL v2 description: TI TMDS1204 retimer chip driver license: GPL description: Si5344 driver alias: i2c:IDT alias: i2c:FMC74 alias: of:N*T*CvfmcC* alias: of:N*T*Cvfmc alias: i2c:TIPOWER alias: i2c:expander-fmc64 alias: of:N*T*Cti_tmds1204,ti_tmds1204-rxC* alias: of:N*T*Cti_tmds1204,ti_tmds1204-rx alias: i2c:ti_tmds1204tx alias: i2c:onsemitx alias: of:N*T*Consemi,onsemi-rxC* alias: of:N*T*Consemi,onsemi-rx alias: i2c:FMC alias: of:N*T*Cti_tmds1204,ti_tmds1204-txC* alias: of:N*T*Cti_tmds1204,ti_tmds1204-tx alias: of:N*T*Cexpander-fmcC* alias: of:N*T*Cexpander-fmc alias: i2c:si5344 alias: of:N*T*Cexpander-fmc65C* alias: of:N*T*Cexpander-fmc65 alias: i2c:onsemirx alias: of:N*T*Csi5344C* alias: of:N*T*Csi5344 alias: of:N*T*Cexpander-fmc74C* alias: of:N*T*Cexpander-fmc74 alias: of:N*T*Cexpander-fmc64C* alias: of:N*T*Cexpander-fmc64 alias: i2c:ti_tmds1204rx alias: of:N*T*Cexpander-tipowerC* alias: of:N*T*Cexpander-tipower alias: of:N*T*Cidt,idt8t49C* alias: of:N*T*Cidt,idt8t49 alias: i2c:expander-fmc65 alias: of:N*T*Consemi,onsemi-txC* alias: of:N*T*Consemi,onsemi-tx depends: name: hdmi21_xfmc vermagic: 6.12.10-xilinx-gf28cb5f8491a SMP mod_unload aarch64

QEMU based development

The SDK also includes QEMU and QEMU helper scripts that enable full system emulation. The same boot artifacts and disk image that are used to boot on hardware can also be used to boot on QEMU with very minor tweaks. The QEMU system emulates hybrid OSPI + UFS boot mode.

The following tutorial shows how to boot the prebuilt images on QEMU using the runqemu helper script from the installed SDK.

Note: make sure you source the SDK environment script before you start.

First download the prebuilt QEMU prebuilt artifacts tar ball. The bundle consists of the following files that QEMU and the runqemu helper script expect:

 

VEK385 EA - AMD Vivado™ Design Suite 2025.1 EA

  • The QEMU prebuilt artifacts tar ball can be downloaded from the VEK385 lounge [versal2-vek385-qemu-prebuilt_04121214.tar.gz]

Update for EDF 25.05 - AMD Vivado™ Design Suite 2025.1

  • This flow is supported as an on-line flow

  • Prior release (EA) - The Package feed required for this section was only supported as an offline flow for EA. see Accessing the package feed without a on-line network connection

 

 

artifact

file or directory name

artifact

file or directory name

disk image

VEK385 - edf-linux-disk-image-amd-cortexa78-mali-common.rootfs.wic.ufs

boot image

VEK385 - BOOT-versal2-vek385-sdt-seg.bin

QEMU device tree folder

qemu-hw-devicetrees/

runqemu configuration file

qemuboot.conf

ospi image (VEK385)

VEK385 - qemu-ospi-versal2-vek385-sdt-seg.bin

VEK385 EA - AMD EDF 25.05, AMD Vivado™ Design Suite 2025.1

UFS is used as secondary boot medium in QEMU, but the hardware images use SD as secondary boot medium. The next major release is scheduled to use UFS as secondary boot medium for the hardware images.

The SD card wic image (.wic) is using a sector size of 512 bytes whereas the UFS image (.wic.ufs) is using a sector size of 4096 bytes. Therefore, these image are not interchangeable. However they are functionally equivalent.

 

 

Change directory into your lounge download folder, extract the QEMU prebuilt artifacts tar ball, and run the following command to start your QEMU session:

Note - Example below is for VEK385, change the filename “versal-2ve-2vm-vek385-sdt-qemu-prebuilt” to the correct filename for the targe board / architecture of your device.

/scratch $ tar -xf versal-2ve-2vm-vek385-sdt-qemu-prebuilt_<timestamp>.tar.gz /scratch $ cd versal-2ve-2vm-vek385-sdt-qemu-prebuilt_<timestamp>/ /scratch/versal2-vek385-qemu-prebuilt $ runqemu combined.qemuboot.conf nographic slirp [snip]

This command will launch three separate QEMU instances:

  1. PMXC: this runs PLM

  2. ASU: this runs ASU firmware

  3. APU: this runs various software payloads and ultimately boots into Linux

Each executes their respective payloads. At the end of the boot process you will land at the Linux login prompt. Upon first boot, Linux requires a password to be set for the default user account.

AMD EDF 25.05 (VEK385 EA) - AMD Vivado™ Design Suite 2025.1 and later

  • Default username 'amd-edf'

To exit your QEMU session, press Ctrl + A followed by X.

Related Links

 

Trademarks

Yocto Project and all related marks and logos are trademarks of The Linux Foundation. This website is not, in any way, endorsed by the Yocto Project or The Linux Foundation.

Linux® is the registered trademark of Linus Torvalds in the U.S. and other countries.

© 2025 Advanced Micro Devices, Inc. Privacy Policy