boards: arm: zybo: add board definition for the Digilent Zybo
Add board definition for the Xilinx Zynq-7000-based Digilent Zybo.
Signed-off-by: Henrik Brix Andersen <henrik@brixandersen.dk>
diff --git a/boards/arm/zybo/Kconfig.board b/boards/arm/zybo/Kconfig.board
new file mode 100644
index 0000000..30dfd50
--- /dev/null
+++ b/boards/arm/zybo/Kconfig.board
@@ -0,0 +1,8 @@
+# Digilent Zybo board configuration
+
+# Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+# SPDX-License-Identifier: Apache-2.0
+
+config BOARD_ZYBO
+ bool "Digilent Zybo"
+ depends on SOC_XILINX_XC7Z010
diff --git a/boards/arm/zybo/Kconfig.defconfig b/boards/arm/zybo/Kconfig.defconfig
new file mode 100644
index 0000000..5d0b1c7
--- /dev/null
+++ b/boards/arm/zybo/Kconfig.defconfig
@@ -0,0 +1,15 @@
+# Digilent Zybo board
+
+# Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+# SPDX-License-Identifier: Apache-2.0
+
+if BOARD_ZYBO
+
+config BOARD
+ default "zybo"
+
+config UART_XLNX_PS
+ default y
+ depends on SERIAL
+
+endif # BOARD_ZYBO
diff --git a/boards/arm/zybo/board.cmake b/boards/arm/zybo/board.cmake
new file mode 100644
index 0000000..0d3dae9
--- /dev/null
+++ b/boards/arm/zybo/board.cmake
@@ -0,0 +1,5 @@
+# Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+# SPDX-License-Identifier: Apache-2.0
+
+board_runner_args(openocd "--use-elf" "--cmd-reset-halt" "halt")
+include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)
diff --git a/boards/arm/zybo/doc/index.rst b/boards/arm/zybo/doc/index.rst
new file mode 100644
index 0000000..d48e598
--- /dev/null
+++ b/boards/arm/zybo/doc/index.rst
@@ -0,0 +1,148 @@
+.. _zybo:
+
+Digilent Zybo
+#############
+
+Overview
+********
+
+The `Digilent Zybo`_ (ZYnq BOard) is a feature-rich, ready-to-use embedded software and digital
+circuit development board. It is built around the Xilinx Zynq-7000 family, which is based on the
+Xilinx All Programmable System-on-Chip (AP SoC) architecture. This architecture tightly integrates a
+dual-core ARM Cortex-A9 processor with Xilinx 7-series Field Programmable Gate Array (FPGA) logic.
+
+.. figure:: ./zybo-0.png
+ :width: 600px
+ :align: center
+ :alt: Digilent Zybo
+
+ Digilent (Credit: Digilent)
+
+Hardware
+********
+
+Supported Features
+==================
+
+The zybo board configuration supports the following hardware features:
+
++------------+------------+-------------------------------------+
+| Interface | Controller | Driver/Component |
++============+============+=====================================+
+| GICv1 | on-chip | ARM generic interrupt controller v1 |
++------------+------------+-------------------------------------+
+| ARCH TIMER | on-chip | ARM architected timer |
++------------+------------+-------------------------------------+
+| PINCTRL | on-chip | pinctrl |
++------------+------------+-------------------------------------+
+| GPIO | on-chip | gpio |
++------------+------------+-------------------------------------+
+| UART | on-chip | serial port-polling; |
+| | | serial port-interrupt |
++------------+------------+-------------------------------------+
+
+The default configuration can be found in the defconfig file:
+``boards/arm/zybo/zybo_defconfig``.
+
+Other hardware features are not currently supported by the port.
+
+Programming and Debugging
+*************************
+
+The Zynq-7000 series SoC needs to be initialized prior to running a Zephyr application. This can be
+achieved in a number of ways (e.g. using the Xilinx First Stage Boot Loader (FSBL), the Xilinx
+Vivado generated ``ps_init.tcl`` JTAG script, Das U-Boot Secondary Program Loader (SPL), ...).
+
+The instructions here use the U-Boot SPL. For further details and instructions for using Das U-Boot
+with Xilinx Zynq-7000 series SoCs, see the following documentation:
+
+- `Das U-Boot Website`_
+- `Using Distro Boot With Xilinx U-Boot`_
+
+Building Das U-Boot
+===================
+
+Clone and build Das U-Boot for the Digilent Zybo:
+
+.. code-block:: console
+
+ git clone -b v2022.04 https://source.denx.de/u-boot/u-boot.git
+ cd u-boot
+ make distclean
+ make xilinx_zynq_virt_defconfig
+ export PATH=/path/to/zephyr-sdk/arm-zephyr-eabi/bin/:$PATH
+ export CROSS_COMPILE=arm-zephyr-eabi-
+ export DEVICE_TREE="zynq-zybo"
+ make
+
+Flashing
+========
+
+Here is an example for running the :ref:`hello_world` application via JTAG.
+
+Ensure the board is configured for JTAG boot, open a serial terminal, turn on/reset the board (press
+the ``PS-SRST`` button), and initialize the Zynq-7000 series SoC by uploading and running the U-Boot
+SPL via JTAG.
+
+Next, upload and run the Zephyr application:
+
+.. zephyr-app-commands::
+ :zephyr-app: samples/hello_world
+ :board: zybo
+ :goals: flash
+
+You should see the following message in the terminal:
+
+.. code-block:: console
+
+ *** Booting Zephyr OS vx.xx.x-xxx-gxxxxxxxxxxxx ***
+ Hello World! zybo
+
+Another option is to load and run the :ref:`hello_world` application via U-Boot. Copy
+``u-boot/spl/boot.bin``, ``u-boot/u-boot.img``, and ``zephyr/zephyr.bin`` to a FAT32 formatted
+microSD card, insert the card in the ``SD MICRO`` slot on the Zybo board, ensure the board is
+configured for ``SD`` boot, and turn on the board.
+
+Once U-boot is done initializing, load an run the Zephyr application:
+
+.. code-block:: console
+
+ Zynq> fatload mmc 0 0x0 zephyr.bin
+ 817120 bytes read in 56 ms (13.9 MiB/s)
+ Zynq> go 0x0
+ ## Starting application at 0x00000000 ...
+ *** Booting Zephyr OS vx.xx.x-xxx-gxxxxxxxxxxxx ***
+ Hello World! zybo
+
+Debugging
+=========
+
+Here is an example for the :ref:`hello_world` application.
+
+Ensure the board is configured for JTAG boot, open a serial terminal, turn on/reset the board (press
+the ``PS-SRST`` button), and initialize the Zynq-7000 series SoC by uploading and running the U-Boot
+SPL via JTAG.
+
+Next, upload and debug the Zephyr application:
+
+.. zephyr-app-commands::
+ :zephyr-app: samples/hello_world
+ :board: zybo
+ :goals: debug
+
+Step through the application in your debugger, and you should see the following message in the
+terminal:
+
+.. code-block:: console
+
+ *** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx ***
+ Hello World! zybo
+
+.. _Digilent Zybo:
+ https://digilent.com/reference/programmable-logic/zybo/start
+
+.. _Das U-Boot Website:
+ https://www.denx.de/wiki/U-Boot
+
+.. _Using Distro Boot With Xilinx U-Boot:
+ https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/749142017/Using+Distro+Boot+With+Xilinx+U-Boot
diff --git a/boards/arm/zybo/doc/zybo-0.png b/boards/arm/zybo/doc/zybo-0.png
new file mode 100644
index 0000000..eb78e27
--- /dev/null
+++ b/boards/arm/zybo/doc/zybo-0.png
Binary files differ
diff --git a/boards/arm/zybo/support/openocd.cfg b/boards/arm/zybo/support/openocd.cfg
new file mode 100644
index 0000000..e72b8ab
--- /dev/null
+++ b/boards/arm/zybo/support/openocd.cfg
@@ -0,0 +1,3 @@
+source [find interface/ftdi/digilent-hs1.cfg]
+transport select jtag
+source [find target/zynq_7000.cfg]
diff --git a/boards/arm/zybo/zybo-pinctrl.dtsi b/boards/arm/zybo/zybo-pinctrl.dtsi
new file mode 100644
index 0000000..a55aafd
--- /dev/null
+++ b/boards/arm/zybo/zybo-pinctrl.dtsi
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <zephyr/dt-bindings/pinctrl/pinctrl-zynq.h>
+
+&pinctrl0 {
+ pinctrl_uart1_default: uart1-default {
+ mux {
+ groups = "uart1_10_grp";
+ function = "uart1";
+ };
+
+ conf {
+ groups = "uart1_10_grp";
+ slew-rate = <IO_SPEED_SLOW>;
+ power-source = <IO_STANDARD_LVCMOS18>;
+ };
+
+ conf-rx {
+ pins = "MIO49";
+ bias-high-impedance;
+ };
+
+ conf-tx {
+ pins = "MIO48";
+ bias-disable;
+ };
+ };
+};
diff --git a/boards/arm/zybo/zybo.dts b/boards/arm/zybo/zybo.dts
new file mode 100644
index 0000000..95297c3
--- /dev/null
+++ b/boards/arm/zybo/zybo.dts
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/dts-v1/;
+#include <xilinx/zynq7000.dtsi>
+#include <zephyr/dt-bindings/gpio/gpio.h>
+
+#include "zybo-pinctrl.dtsi"
+
+/ {
+ model = "Digilent Zybo board";
+ compatible = "digilent,zynq-zybo", "xlnx,zynq-7000";
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ chosen {
+ zephyr,sram = &sram0;
+ zephyr,console = &uart1;
+ zephyr,shell-uart = &uart1;
+ zephyr,ocm = &ocm_high;
+ };
+
+ aliases {
+ led0 = &ld_mio;
+ sw0 = &btn4;
+ sw1 = &btn5;
+ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a9";
+ reg = <0>;
+ };
+
+ cpu1: cpu@1 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a9";
+ reg = <1>;
+ };
+ };
+
+ sram0: memory@0 {
+ compatible = "mmio-sram";
+ reg = <0x00000000 DT_SIZE_M(512)>;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ ld_mio: led_mio {
+ gpios = <&psgpio_bank0 7 GPIO_ACTIVE_HIGH>;
+ label = "LD_MIO";
+ };
+ };
+
+ gpio_keys {
+ compatible = "gpio-keys";
+ btn4: btn4 {
+ gpios = <&psgpio_bank1 18 GPIO_ACTIVE_LOW>;
+ label = "BTN4";
+ };
+ btn5: btn5 {
+ gpios = <&psgpio_bank1 19 GPIO_ACTIVE_LOW>;
+ label = "BTN5";
+ };
+ };
+};
+
+&uart1 {
+ status = "okay";
+ current-speed = <115200>;
+ clock-frequency = <100000000>;
+ pinctrl-0 = <&pinctrl_uart1_default>;
+ pinctrl-names = "default";
+};
+
+&psgpio {
+ status = "okay";
+};
diff --git a/boards/arm/zybo/zybo.yaml b/boards/arm/zybo/zybo.yaml
new file mode 100644
index 0000000..2405438
--- /dev/null
+++ b/boards/arm/zybo/zybo.yaml
@@ -0,0 +1,14 @@
+# Copyright (c) 2022 Henrik Brix Andersen <henrik@brixandersen.dk>
+# SPDX-License-Identifier: Apache-2.0
+
+identifier: zybo
+name: Digilent Zybo
+type: mcu
+arch: arm
+toolchain:
+ - zephyr
+ - gnuarmemb
+ - xtools
+ram: 524288
+supported:
+ - gpio
diff --git a/boards/arm/zybo/zybo_defconfig b/boards/arm/zybo/zybo_defconfig
new file mode 100644
index 0000000..ad4d88e
--- /dev/null
+++ b/boards/arm/zybo/zybo_defconfig
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: Apache-2.0
+
+CONFIG_SOC_SERIES_XILINX_XC7ZXXX=y
+CONFIG_SOC_XILINX_XC7Z010=y
+CONFIG_BOARD_ZYBO=y
+
+# The GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x)
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=325000000
+
+CONFIG_PINCTRL=y
+CONFIG_SERIAL=y
+CONFIG_CONSOLE=y
+CONFIG_UART_CONSOLE=y