This is the documentation for the latest (main) development branch. If you are looking for the documentation of previous releases, use the drop-down menu on the left and select the desired version.

How to run a Zephyr application on Xilinx ZCU102 Cortex R5

Downloads

  • ZYNQMP common image (xilinx-zynqmp-common-v2022.1_04191534.tar.gz)

  • ZCU 102 BSP (xilinx-zcu102-v2022.1-04191534.bsp)

https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html

Petalinux ZCU102 binaries

Root file system

Unpack xilinx-zcu102-v2022.1-04191534.bsp (this is a gzipped tar archive) and xilinx-zynqmp-common-v2022.1_04191534.tar.gz

Flash xilinx-zcu102-2022.1/pre-built/linux/images/petalinux-sdimage.wic to an SD card.

Kernel image

The kernel image is xilinx-zynqmp-common-v2022.1/Image.

Device tree binary

The device tree file oa.dts is derived from xilinx-zcu102-2022.1/pre-built/linux/images/openamp.dtb with all uart1 entries removed.

dtc -I dts -O dtb oa.dts > oa.dtb

Zephyr application

The zephyr kernel image is based on the hello_world sample with a device tree overlay which enables UART1 for Zephyr output.

Build hello_r5 in your Zephyr environment and copy the resulting zephyr.elf file to your target’s root file system.

west build -p -b qemu_cortex_r5 zephyr/samples/hello_r5

Zephyr source tree tree information

commit 7dfdd5dcd5c9a2315001ca412cc848772a687e1a (origin/main, origin/HEAD)
Author: Martí Bolívar <marti.bolivar@nordicsemi.no>
Date:   Fri Apr 8 09:25:49 2022 -0700

ZCU102 boot sequence & Zephyr application deployment

setenv serverip 128.224.125.159
setenv bootargs "earlycon clk_ignore_unused root=/dev/mmcblk0p2 ro rootwait earlyprintk debug uio_pdrv_genirq.of_id=generic-uio";
dhcp 200000 hvlws/zcu102_2022.1/Image
dhcp 100000 hvlws/zcu102_2022.1/oa.dtb
booti 200000 - 100000;

Start zephyr on R5 CPU core 0 in the Petalinux environment

cp /home/petalinux/zephyr/zephyr.elf /lib/firmware/
echo zephyr.elf >/sys/class/remoteproc/remoteproc0/firmware
echo start >/sys/class/remoteproc/remoteproc0/state

The Zephyr application console will be available on ZCU102 UART1.

Note:

Reproducing this in a different Zephyr environment would most likely only require the updated device tree file (oa.dts) used when booting Petalinux and the Zephyr device tree overlay to enable UART1.

Binary size issue for recent Zephyr sources

You may encounter an issue when trying to start the hello app built in recent Zephyr environments (HEAD newer than 7ef05751a3f34030eb06dace23e357d10b33f460).

xilinx-zcu102-20221:/home/petalinux# echo start >/sys/class/remoteproc/remoteproc0/state
[  111.353903] remoteproc remoteproc0: powering up ff9a0000.rf5ss:r5f_0
[  111.361936] remoteproc remoteproc0: Booting fw image zephyr.elf, size 2073644
[  111.375897] remoteproc remoteproc0: no resource table found.
[  111.381645] remoteproc remoteproc0: bad phdr da 0xcf80 mem 0x196e8
[  111.387836] remoteproc remoteproc0: Failed to load program segments: -22
[  111.394844] remoteproc remoteproc0: Boot failed: -22
sh: echo: write error: Invalid argument

In this case apply the zephyr_zcu102_r5.patch patch on your Zephyr source tree and edit hello_r5/prj_qemu_cortex_r5.conf to enable the 3 configuration items which are disabled in the default configuration.

CONFIG_HAVE_CUSTOM_LINKER_SCRIPT=y
CONFIG_CUSTOM_LINKER_SCRIPT="linker_r5_hvl.ld"
CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVEN=n

This updated configuration will relocate the text section to memory area located at 0x38000000 and reserved in oa.dts.