From e95f076db4ec6fb1496214839b094aff060e5b4a Mon Sep 17 00:00:00 2001 From: Michael Estes Date: Sat, 31 May 2025 19:31:48 -0400 Subject: [PATCH] boards: avnet: add zub1cg_r5 board definition Add board definition for the Avnet ZUBoarcd 1CG development board. This board is based on the Zynq Ultrascale+ MPSoC. As with other boards based on this platform, currently only the first R5 core is supported. Signed-off-by: Michael Estes --- boards/avnet/zub1cg_r5/Kconfig.defconfig | 16 +++ boards/avnet/zub1cg_r5/Kconfig.zub1cg_r5 | 5 + boards/avnet/zub1cg_r5/board.cmake | 4 + boards/avnet/zub1cg_r5/board.yml | 6 + boards/avnet/zub1cg_r5/doc/index.rst | 137 ++++++++++++++++++++ boards/avnet/zub1cg_r5/doc/zub1cg.webp | Bin 0 -> 34716 bytes boards/avnet/zub1cg_r5/support/xsdb.cfg | 24 ++++ boards/avnet/zub1cg_r5/zub1cg_r5.dts | 141 +++++++++++++++++++++ boards/avnet/zub1cg_r5/zub1cg_r5_defconfig | 14 ++ soc/xlnx/zynqmp/Kconfig.defconfig | 7 + 10 files changed, 354 insertions(+) create mode 100644 boards/avnet/zub1cg_r5/Kconfig.defconfig create mode 100644 boards/avnet/zub1cg_r5/Kconfig.zub1cg_r5 create mode 100644 boards/avnet/zub1cg_r5/board.cmake create mode 100644 boards/avnet/zub1cg_r5/board.yml create mode 100644 boards/avnet/zub1cg_r5/doc/index.rst create mode 100644 boards/avnet/zub1cg_r5/doc/zub1cg.webp create mode 100644 boards/avnet/zub1cg_r5/support/xsdb.cfg create mode 100644 boards/avnet/zub1cg_r5/zub1cg_r5.dts create mode 100644 boards/avnet/zub1cg_r5/zub1cg_r5_defconfig diff --git a/boards/avnet/zub1cg_r5/Kconfig.defconfig b/boards/avnet/zub1cg_r5/Kconfig.defconfig new file mode 100644 index 0000000000000..159b20e2d9d64 --- /dev/null +++ b/boards/avnet/zub1cg_r5/Kconfig.defconfig @@ -0,0 +1,16 @@ +# Copyright The Zephyr Project Contributors +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_ZUB1CG_R5 + +config BUILD_OUTPUT_BIN + default y + +if USERSPACE + +config COMPILER_ISA_THUMB2 + default n + +endif + +endif # BOARD_ZUB1CG_R5 diff --git a/boards/avnet/zub1cg_r5/Kconfig.zub1cg_r5 b/boards/avnet/zub1cg_r5/Kconfig.zub1cg_r5 new file mode 100644 index 0000000000000..46bfa0401a23e --- /dev/null +++ b/boards/avnet/zub1cg_r5/Kconfig.zub1cg_r5 @@ -0,0 +1,5 @@ +# Copyright The Zephyr Project Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ZUB1CG_R5 + select SOC_XILINX_ZYNQMP_RPU diff --git a/boards/avnet/zub1cg_r5/board.cmake b/boards/avnet/zub1cg_r5/board.cmake new file mode 100644 index 0000000000000..f919e4251b6fe --- /dev/null +++ b/boards/avnet/zub1cg_r5/board.cmake @@ -0,0 +1,4 @@ +# Copyright The Zephyr Project Contributors +# +# SPDX-License-Identifier: Apache-2.0 +include(${ZEPHYR_BASE}/boards/common/xsdb.board.cmake) diff --git a/boards/avnet/zub1cg_r5/board.yml b/boards/avnet/zub1cg_r5/board.yml new file mode 100644 index 0000000000000..15f302e4b04a4 --- /dev/null +++ b/boards/avnet/zub1cg_r5/board.yml @@ -0,0 +1,6 @@ +board: + name: zub1cg_r5 + full_name: ZUBoard 1CG Development Board RPU Cortex-R5 + vendor: avnet + socs: + - name: zynqmp_rpu diff --git a/boards/avnet/zub1cg_r5/doc/index.rst b/boards/avnet/zub1cg_r5/doc/index.rst new file mode 100644 index 0000000000000..e517e2151679a --- /dev/null +++ b/boards/avnet/zub1cg_r5/doc/index.rst @@ -0,0 +1,137 @@ +.. zephyr:board:: zub1cg_r5 + +Overview +******** +This configuration provides support for the real-time processing unit (RPU) on the Avnet +ZUBoard 1CG development board. It can operate as follows: + +* Two independent R5 cores with their own TCMs (tightly coupled memories) +* Or, as a single dual lock step unit with double the TCM size. + +This processing unit is based on an ARM Cortex-R5 CPU, it also enables the following devices: + +* ARM PL-390 Generic Interrupt Controller +* Xilinx Zynq TTC (Cadence TTC) +* Xilinx Zynq UART +* Xilinx Zynq I2C (Cadence I2C) + +Hardware +******** +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Devices +======== +System Timer +------------ + +This board configuration uses a system timer tick frequency of 1000 Hz. + +Serial Port +----------- + +This board configuration uses a single serial communication channel with the +on-chip UART1. + +Memories +-------- + +Flash, DDR and OCM memory regions are defined in the DTS file. +Vectors are placed in the ATCM region, while all other code plus +data of the application will be loaded in the sram1 region, +which points to the DDR memory. The sram1 region is defined to +match the Petalinux rproc_0_reserved region so the Zephyr application +can be launched from Petalinux using Remoteproc. The ocm0 memory +area is currently available for usage, although nothing is placed +there by default. + +Known Problems or Limitations +============================== + +The following platform features are unsupported: + +* Dual-redundant Core Lock-step (DCLS) execution is not supported yet. +* Only the first core of the R5 subsystem is supported. +* Xilinx Zynq TTC driver does not support tickless mode operation. +* The Cortex-R5 and the Cortex-A53 shares the same UART controller, more details below. + +Programming and Debugging +************************* + +Currently the best way to run this sample is by loading it through remoteproc +from the APU, running Linux, to the RPU, assuming the target board has a compatible +Linux kernel. Users can make use of Avnet's pre-built Petalinux BSP as a starting +point to enable remoteproc support, it is based around 6.6 Xilinx maintained kernel. +Building Petalinux is outside the scope of this document, see the `Avnet ZUBoard 1CG +Product Page`_ for more details. + +After getting the Linux image running on the target board, build a Zephyr application, +such as the hello world sample shown below: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :host-os: unix + :board: zub1cg_r5 + :goals: build + +Due to a hardware limitation, both Linux and Zephyr share the same UART +controller, meaning when the Zephyr application is started it will takeover the +console from Linux. + +To avoid this limitation when accessing the Linux shell, the best approach is to +connect to the board using ``ssh`` over the network (not using the FTDI +USB interface on the board), with the dev board and the host computer +connected to the same network. + +Alternatively, it is possible to use the other PS UART controller for either Linux +or Zephyr, but it must be enabled in Vivado and routed via MIO/EMIO to accessible +pins on the board. + +Assuming you are using the default ``petalinux`` user from the Xilinx +reference image , open a terminal on the host machine and ssh into the +development board with the board's IP address (found via ``ifconfig``): + +.. code-block:: console + + $ ssh petalinux@ + +The initial password should be ``petalinux``. On another terminal deploy +the Zephyr application ``.elf`` file using utility like the ``scp`` or ``rsync``, +for example: + +.. code-block:: console + + $ scp /path/to/zephyr_app_elf_file petalinux@:/home/petalinux + +After that move the file to ``/lib/firmware`` directory, then you be able to start the firmware +on the desired RPU via remoteproc with: + +.. code-block:: console + + $ sudo -i # You need to operate the remoteproc as root + $ echo zephyr.elf > /sys/class/remoteproc/remoteproc0/firmware + $ echo start > /sys/class/remoteproc/remoteproc0/state + +With another terminal connected to UART1 on the host machine +(available via one of the tty ports with the on-board FTDI chip), +you should see the Zephyr application running: + +.. code-block:: console + + *** Booting Zephyr OS build v4.1.0-5065-gc3ec37aa2e47 *** + Hello World! zub1cg_r5/zynqmp_rpu + +It is also possible to program and debug this program via AMD's Vitis development platform. +Create a new platform project based on your hardware XSA file (from Vivado), import a new +empty application template, and in the debug configuration point the application to the +zephyr.elf binary. + +References +********** + +.. target-notes:: + +.. _Avnet ZUBoard 1CG Product Page: + https://www.avnet.com/americas/products/avnet-boards/avnet-board-families/zuboard-1cg/ diff --git a/boards/avnet/zub1cg_r5/doc/zub1cg.webp b/boards/avnet/zub1cg_r5/doc/zub1cg.webp new file mode 100644 index 0000000000000000000000000000000000000000..95c868e17bae70d7f9f5672d0fa8348f46ef7444 GIT binary patch literal 34716 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 literal 0 HcmV?d00001 diff --git a/boards/avnet/zub1cg_r5/support/xsdb.cfg b/boards/avnet/zub1cg_r5/support/xsdb.cfg new file mode 100644 index 0000000000000..2976c9e763f12 --- /dev/null +++ b/boards/avnet/zub1cg_r5/support/xsdb.cfg @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Advanced Micro Devices, Inc. +# +# SPDX-License-Identifier: Apache-2.0 + +proc load_image args { + set elf_file [lindex $args 0] + set fsblelf_file [lindex $args 1] + connect -url 127.0.0.1:3121 + after 2000 + targets -set -nocase -filter {name =~ "*R5*#0"} + rst -proc + dow $fsblelf_file + after 1000 + con + after 1000 + stop + targets -set -nocase -filter {name =~ "*R5*#0"} + after 2000 + dow $elf_file + con + exit +} + +load_image {*}$argv diff --git a/boards/avnet/zub1cg_r5/zub1cg_r5.dts b/boards/avnet/zub1cg_r5/zub1cg_r5.dts new file mode 100644 index 0000000000000..658cbfdf8e902 --- /dev/null +++ b/boards/avnet/zub1cg_r5/zub1cg_r5.dts @@ -0,0 +1,141 @@ +/* + * Copyright The Zephyr Project Contributors + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include +#include +#include +#include + +/ { + model = "ZUBoard 1CG Cortex-R5"; + compatible = "xlnx,zynqmp-r5"; + + chosen { + zephyr,sram = &sram1; + zephyr,flash = &flash0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,ocm = &ocm; + }; + + aliases { + led0 = &red_led_0; + sw0 = &mio_push_btn; + eeprom-0 = &eeprom0; + }; + + leds: leds{ + compatible = "gpio-leds"; + + red_led_0: d6 { + gpios = <&psgpio_bank1 7 GPIO_ACTIVE_HIGH>; + label = "D6"; + }; + + red_led_1: d7 { + gpios = <&psgpio_bank0 25 GPIO_ACTIVE_HIGH>; + label = "D7"; + }; + + red_led_2: d8 { + gpios = <&psgpio_bank0 24 GPIO_ACTIVE_HIGH>; + label = "D8"; + }; + + red_led_3: d9 { + gpios = <&psgpio_bank0 7 GPIO_ACTIVE_HIGH>; + label = "D9"; + }; + }; + + keys { + compatible = "gpio-keys"; + + mio_push_btn: mio_push_btn { + gpios = <&psgpio_bank1 6 GPIO_ACTIVE_LOW>; + label = "MIO Push Button"; + }; + + user_switch_1: sw1 { + gpios = <&psgpio_bank1 18 GPIO_ACTIVE_HIGH>; + label = "User Switch 1"; + }; + + user_switch_2: sw2 { + gpios = <&psgpio_bank1 14 GPIO_ACTIVE_HIGH>; + label = "User Switch 2"; + }; + + user_switch_3: sw3 { + gpios = <&psgpio_bank1 13 GPIO_ACTIVE_HIGH>; + label = "User Switch 3"; + }; + + user_switch_4: sw4 { + gpios = <&psgpio_bank1 5 GPIO_ACTIVE_HIGH>; + label = "User Switch 4"; + }; + }; + + i2c_ref_clk: i2c_ref_clk { + compatible = "fixed-clock"; + clock-frequency = <100000000>; + #clock-cells = <0>; + }; + + soc { + /* rproc_0_reserved in Petalinux zynqmp_openamp.dtsi */ + sram1: memory@3ed00000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x3ed00000 DT_SIZE_K(256)>; + zephyr,memory-region = "SRAM1"; + zephyr,memory-attr = <( DT_MEM_ARM(ATTR_MPU_RAM) )>; + }; + }; +}; + +&ttc0 { + status = "okay"; + clock-frequency = <100000000>; +}; + +&psgpio { + status = "okay"; +}; + +&i2c1 { + status = "okay"; + clocks = <&i2c_ref_clk>; + clock-frequency = <400000>; + + eeprom0: eeprom@50 { + compatible = "atmel,at24"; + reg = <0x50>; + size = <256>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + }; + + mac_eeprom: mac-eeprom@58 { + compatible = "atmel,at24mac402"; + reg = <0x58>; + #address-cells = <1>; + #size-cells = <1>; + + mac_address: mac-address@9a { + reg = <0x9a 0x06>; + }; + }; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; + clock-frequency = ; +}; \ No newline at end of file diff --git a/boards/avnet/zub1cg_r5/zub1cg_r5_defconfig b/boards/avnet/zub1cg_r5/zub1cg_r5_defconfig new file mode 100644 index 0000000000000..bcf23dd2e8689 --- /dev/null +++ b/boards/avnet/zub1cg_r5/zub1cg_r5_defconfig @@ -0,0 +1,14 @@ +CONFIG_XIP=n + +CONFIG_SERIAL=y + +CONFIG_GPIO=y + +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +CONFIG_UART_XLNX_PS=y + +CONFIG_ARM_MPU=y + +CONFIG_ROMSTART_RELOCATION_ROM=y \ No newline at end of file diff --git a/soc/xlnx/zynqmp/Kconfig.defconfig b/soc/xlnx/zynqmp/Kconfig.defconfig index 869f4403d3202..75c46f1a50213 100644 --- a/soc/xlnx/zynqmp/Kconfig.defconfig +++ b/soc/xlnx/zynqmp/Kconfig.defconfig @@ -12,8 +12,15 @@ config NUM_IRQS default 220 config SYS_CLOCK_HW_CYCLES_PER_SEC + default $(dt_node_int_prop_int,$(dt_nodelabel_path,ttc0),clock-frequency) if XLNX_PSTTC_TIMER_INDEX = 0 + default $(dt_node_int_prop_int,$(dt_nodelabel_path,ttc1),clock-frequency) if XLNX_PSTTC_TIMER_INDEX = 1 + default $(dt_node_int_prop_int,$(dt_nodelabel_path,ttc2),clock-frequency) if XLNX_PSTTC_TIMER_INDEX = 2 + default $(dt_node_int_prop_int,$(dt_nodelabel_path,ttc3),clock-frequency) if XLNX_PSTTC_TIMER_INDEX = 3 default 5000000 +config SYS_CLOCK_TICKS_PER_SEC + default 1000 + endif # SOC_XILINX_ZYNQMP_RPU # Workaround for not being able to have commas in macro arguments