diff --git a/boards/khadas/edge2/Kconfig.khadas_edge2 b/boards/khadas/edge2/Kconfig.khadas_edge2 new file mode 100644 index 00000000000..58dd61dfe79 --- /dev/null +++ b/boards/khadas/edge2/Kconfig.khadas_edge2 @@ -0,0 +1,5 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KHADAS_EDGE2 + select SOC_RK3588S diff --git a/boards/khadas/edge2/board.yml b/boards/khadas/edge2/board.yml new file mode 100644 index 00000000000..93138f3a2bb --- /dev/null +++ b/boards/khadas/edge2/board.yml @@ -0,0 +1,6 @@ +board: + name: khadas_edge2 + full_name: Edge2 + vendor: khadas + socs: + - name: rk3588s diff --git a/boards/khadas/edge2/doc/index.rst b/boards/khadas/edge2/doc/index.rst new file mode 100644 index 00000000000..337ff3aa24e --- /dev/null +++ b/boards/khadas/edge2/doc/index.rst @@ -0,0 +1,97 @@ +.. zephyr:board:: khadas_edge2 + +Overview +******** + +See `Product page`_ + +.. _Product page: https://www.khadas.com/edge2 + +Hardware +******** + +See `Hardware details`_ + +.. _Hardware details: https://docs.khadas.com/products/sbc/edge2/hardware/start + +Supported Features +================== + +The ``khadas_edge2`` board target supports the following +hardware features: + ++-----------+------------+--------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+======================================+ +| GIC-600 | on-chip | GICv3 interrupt controller | ++-----------+------------+--------------------------------------+ +| ARM TIMER | on-chip | System Clock | ++-----------+------------+--------------------------------------+ +| UART | on-chip | Synopsys DesignWare 8250 serial port | ++-----------+------------+--------------------------------------+ + +Other hardware features have not been enabled yet for this board. + +The default configuration can be found in (NON-SMP) +:zephyr_file:`boards/khadas/edge2/khadas_edge2_defconfig` + +There are multiple serial ports on the board: Zephyr is using +uart2 as serial console. + +Programming and Debugging +************************* + +Use the following configuration to run basic Zephyr applications and +kernel tests on Khadas Edge2 board. For example, with the :zephyr:code-sample:`hello_world`: + +1. Non-SMP mode + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :host-os: unix + :board: khadas_edge2 + :goals: build + +This will build an image with the hello world sample app. + +Build the zephyr image: + +.. code-block:: console + + mkimage -C none -A arm64 -O linux -a 0x10000000 -e 0x10000000 -d build/zephyr/zephyr.bin build/zephyr/zephyr.img + +Burn the image on the board (we choose to use Rockchip burning tool `rkdeveloptool `_, you will need a `SPL `_ which is provided by khadas: + +.. code-block:: console + + rkdeveloptool db rk3588_spl_loader_*; rkdeveloptool wl 0x100000 zephyr.img; rkdeveloptool rd + +The sector 0x100000 was chosen arbitrarily (far away from U-Boot image) + +Use U-Boot to load and run Zephyr: + +.. code-block:: console + + mmc read ${pxefile_addr_r} 0x100000 0x1000; bootm start ${pxefile_addr_r}; bootm loados; bootm go + +0x1000 is the size (in number of sectors) or your image. Increase it if needed. + +It will display the following console output: + +.. code-block:: console + + *** Booting Zephyr OS build XXXXXXXXXXXX *** + Hello World! khadas_edge2 + +Flashing +======== + +Zephyr image can be loaded in DDR memory at address 0x10000000 from SD Card, +EMMC, QSPI Flash or downloaded from network in uboot. + +References +========== + +`Edge2 Documentation`_ + +.. _Edge2 Documentation: https://docs.khadas.com/products/sbc/edge2/start diff --git a/boards/khadas/edge2/doc/khadas_edge2.jpg b/boards/khadas/edge2/doc/khadas_edge2.jpg new file mode 100644 index 00000000000..68278e72a98 Binary files /dev/null and b/boards/khadas/edge2/doc/khadas_edge2.jpg differ diff --git a/boards/khadas/edge2/khadas_edge2.dts b/boards/khadas/edge2/khadas_edge2.dts new file mode 100644 index 00000000000..021015213b7 --- /dev/null +++ b/boards/khadas/edge2/khadas_edge2.dts @@ -0,0 +1,33 @@ +/* + * Copyright 2024 Université Gustave Eiffel + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include + +/ { + model = "Khadas Edge2"; + compatible = "khadas,edge2"; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &uart2; + zephyr,shell-uart = &uart2; + }; + + cpus { + /delete-node/ cpu@1; + /delete-node/ cpu@2; + /delete-node/ cpu@3; + /delete-node/ cpu@4; + /delete-node/ cpu@5; + /delete-node/ cpu@6; + /delete-node/ cpu@7; + }; +}; + +&uart2 { + status = "okay"; +}; diff --git a/boards/khadas/edge2/khadas_edge2.yaml b/boards/khadas/edge2/khadas_edge2.yaml new file mode 100644 index 00000000000..c9ed4ad11b2 --- /dev/null +++ b/boards/khadas/edge2/khadas_edge2.yaml @@ -0,0 +1,9 @@ +identifier: khadas_edge2 +name: Khadas Edge2 (single core, non SMP) +type: mcu +arch: arm64 +toolchain: + - zephyr + - cross-compile +ram: 8192 +vendor: khadas diff --git a/boards/khadas/edge2/khadas_edge2_defconfig b/boards/khadas/edge2/khadas_edge2_defconfig new file mode 100644 index 00000000000..38b7f52812f --- /dev/null +++ b/boards/khadas/edge2/khadas_edge2_defconfig @@ -0,0 +1,17 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +# Platform Configuration +CONFIG_ARM64_VA_BITS_40=y +CONFIG_ARM64_PA_BITS_40=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=24000000 +CONFIG_CACHE_MANAGEMENT=y +CONFIG_ARMV8_A_NS=y + +# Serial Drivers +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y + +# Enable Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/dts/arm64/rockchip/rk3588s.dtsi b/dts/arm64/rockchip/rk3588s.dtsi new file mode 100644 index 00000000000..4fb37a3113c --- /dev/null +++ b/dts/arm64/rockchip/rk3588s.dtsi @@ -0,0 +1,103 @@ +/* + * Copyright 2024 Université Gustave Eiffel + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +/ { + #address-cells = <1>; + #size-cells = <1>; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x0>; + }; + + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x100>; + }; + + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x200>; + }; + + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a55"; + reg = <0x300>; + }; + + cpu@4 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x400>; + }; + + cpu@5 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x500>; + }; + + cpu@6 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x600>; + }; + + cpu@7 { + device_type = "cpu"; + compatible = "arm,cortex-a76"; + reg = <0x700>; + }; + }; + + gic: interrupt-controller@fe600000 { + #address-cells = <1>; + compatible = "arm,gic-v3", "arm,gic"; + reg = <0xfe600000 0x10000>, /* GICD */ + <0xfe680000 0x100000>; /* GICR */ + interrupt-controller; + #interrupt-cells = <4>; + status = "okay"; + }; + + sram0: memory@10000000 { + reg = <0x10000000 DT_SIZE_M(128)>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupt-parent = <&gic>; + interrupts = , + , + , + ; + }; + + uart2: serial@feb50000 { + compatible = "rockchip,rk3588s-uart", "ns16550"; + reg = <0xfeb50000 0x1000>; + interrupt-parent = <&gic>; + interrupts = ; + status = "disabled"; + reg-shift = <2>; + clock-frequency = <350000000>; + }; +}; diff --git a/soc/rockchip/rk35/CMakeLists.txt b/soc/rockchip/rk35/CMakeLists.txt index 23c2d5fea6e..b45e8592a61 100644 --- a/soc/rockchip/rk35/CMakeLists.txt +++ b/soc/rockchip/rk35/CMakeLists.txt @@ -3,4 +3,6 @@ if(CONFIG_SOC_RK3568) add_subdirectory(rk3568) +elseif(CONFIG_SOC_RK3588S) + add_subdirectory(rk3588s) endif() diff --git a/soc/rockchip/rk35/rk3588s/CMakeLists.txt b/soc/rockchip/rk35/rk3588s/CMakeLists.txt new file mode 100644 index 00000000000..667a960e91b --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +zephyr_sources_ifdef(CONFIG_ARM_MMU mmu_regions.c) + +set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm64/scripts/linker.ld CACHE INTERNAL "") diff --git a/soc/rockchip/rk35/rk3588s/Kconfig b/soc/rockchip/rk35/rk3588s/Kconfig new file mode 100644 index 00000000000..edd700a9a9e --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig @@ -0,0 +1,10 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config SOC_RK3588S + select ARM64 + select CPU_CORTEX_A55 + select ARM_ARCH_TIMER if SYS_CLOCK_EXISTS + +config SOC_PART_NUMBER + default "RK3588S" if SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.defconfig b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig new file mode 100644 index 00000000000..f056f362aac --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig @@ -0,0 +1,8 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +if SOC_RK3588S + +rsource "Kconfig.defconfig.rk3588s" + +endif # SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s new file mode 100644 index 00000000000..fe40d788468 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.defconfig.rk3588s @@ -0,0 +1,19 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +if SOC_RK3588S + +config NUM_IRQS + default 544 + +config FLASH_SIZE + default 0 + +config FLASH_BASE_ADDRESS + default 0 + +config UART_NS16550_ACCESS_WORD_ONLY + default y + depends on UART_NS16550 + +endif diff --git a/soc/rockchip/rk35/rk3588s/Kconfig.soc b/soc/rockchip/rk35/rk3588s/Kconfig.soc new file mode 100644 index 00000000000..3dcf0bc6e81 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/Kconfig.soc @@ -0,0 +1,9 @@ +# Copyright 2024 Université Gustave Eiffel +# SPDX-License-Identifier: Apache-2.0 + +config SOC_RK3588S + bool + select SOC_SERIES_RK35 + +config SOC + default "rk3588s" if SOC_RK3588S diff --git a/soc/rockchip/rk35/rk3588s/mmu_regions.c b/soc/rockchip/rk35/rk3588s/mmu_regions.c new file mode 100644 index 00000000000..f33dce56c63 --- /dev/null +++ b/soc/rockchip/rk35/rk3588s/mmu_regions.c @@ -0,0 +1,26 @@ +/* + * Copyright 2024 Université Gustave Eiffel + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +static const struct arm_mmu_region mmu_regions[] = { + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 0), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 0), + MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 1), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 1), + MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), +}; + +const struct arm_mmu_config mmu_config = { + .num_regions = ARRAY_SIZE(mmu_regions), + .mmu_regions = mmu_regions, +}; diff --git a/soc/rockchip/soc.yml b/soc/rockchip/soc.yml index 1c13067004a..777bd05a9d3 100644 --- a/soc/rockchip/soc.yml +++ b/soc/rockchip/soc.yml @@ -6,4 +6,5 @@ family: - name: rk3399 - name: rk35 socs: + - name: rk3588s - name: rk3568