From c5454aaa34dc792bef9e956eea674d90bba46efb Mon Sep 17 00:00:00 2001 From: Chen Xingyu Date: Sat, 8 Nov 2025 11:45:34 +0800 Subject: [PATCH] boards: alientek: dnesp32s3b: Add board DNESP32S3B DNESP32S3B is a development board from Alientek, featuring a compatible ESP32-S3-WROOM-1-N16R8 module and rich set of on-board peripherals, providing an out-of-the-box development experience for AIoT applications. Signed-off-by: Chen Xingyu --- boards/alientek/dnesp32s3b/Kconfig | 8 ++ boards/alientek/dnesp32s3b/Kconfig.dnesp32s3b | 8 ++ boards/alientek/dnesp32s3b/Kconfig.sysbuild | 10 ++ boards/alientek/dnesp32s3b/board.cmake | 10 ++ boards/alientek/dnesp32s3b/board.yml | 6 + .../dnesp32s3b/dnesp32s3b-pinctrl.dtsi | 30 +++++ .../alientek/dnesp32s3b/dnesp32s3b_appcpu.dts | 29 +++++ .../dnesp32s3b/dnesp32s3b_appcpu.yaml | 27 ++++ .../dnesp32s3b/dnesp32s3b_appcpu_defconfig | 4 + .../alientek/dnesp32s3b/dnesp32s3b_procpu.dts | 122 ++++++++++++++++++ .../dnesp32s3b/dnesp32s3b_procpu.yaml | 12 ++ .../dnesp32s3b/dnesp32s3b_procpu_defconfig | 9 ++ .../dnesp32s3b/doc/img/dnesp32s3b.webp | Bin 0 -> 35928 bytes boards/alientek/dnesp32s3b/doc/index.rst | 80 ++++++++++++ .../alientek/dnesp32s3b/support/openocd.cfg | 10 ++ 15 files changed, 365 insertions(+) create mode 100644 boards/alientek/dnesp32s3b/Kconfig create mode 100644 boards/alientek/dnesp32s3b/Kconfig.dnesp32s3b create mode 100644 boards/alientek/dnesp32s3b/Kconfig.sysbuild create mode 100644 boards/alientek/dnesp32s3b/board.cmake create mode 100644 boards/alientek/dnesp32s3b/board.yml create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b-pinctrl.dtsi create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.dts create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.yaml create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_appcpu_defconfig create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_procpu.dts create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_procpu.yaml create mode 100644 boards/alientek/dnesp32s3b/dnesp32s3b_procpu_defconfig create mode 100644 boards/alientek/dnesp32s3b/doc/img/dnesp32s3b.webp create mode 100644 boards/alientek/dnesp32s3b/doc/index.rst create mode 100644 boards/alientek/dnesp32s3b/support/openocd.cfg diff --git a/boards/alientek/dnesp32s3b/Kconfig b/boards/alientek/dnesp32s3b/Kconfig new file mode 100644 index 0000000000000..84e2a2157babc --- /dev/null +++ b/boards/alientek/dnesp32s3b/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Joel Guittet +# Copyright (c) 2025 Chen Xingyu +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 4096 if BOARD_DNESP32S3B_ESP32S3_PROCPU + default 256 if BOARD_DNESP32S3B_ESP32S3_APPCPU diff --git a/boards/alientek/dnesp32s3b/Kconfig.dnesp32s3b b/boards/alientek/dnesp32s3b/Kconfig.dnesp32s3b new file mode 100644 index 0000000000000..ed22be762ee6b --- /dev/null +++ b/boards/alientek/dnesp32s3b/Kconfig.dnesp32s3b @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Joel Guittet +# Copyright (c) 2025 Chen Xingyu +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_DNESP32S3B + select SOC_ESP32S3_WROOM_N16R8 + select SOC_ESP32S3_PROCPU if BOARD_DNESP32S3B_ESP32S3_PROCPU + select SOC_ESP32S3_APPCPU if BOARD_DNESP32S3B_ESP32S3_APPCPU diff --git a/boards/alientek/dnesp32s3b/Kconfig.sysbuild b/boards/alientek/dnesp32s3b/Kconfig.sysbuild new file mode 100644 index 0000000000000..8d3acb9e11d7c --- /dev/null +++ b/boards/alientek/dnesp32s3b/Kconfig.sysbuild @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# SPDX-License-Identifier: Apache-2.0 + +choice BOOTLOADER + default BOOTLOADER_MCUBOOT +endchoice + +choice BOOT_SIGNATURE_TYPE + default BOOT_SIGNATURE_TYPE_NONE +endchoice diff --git a/boards/alientek/dnesp32s3b/board.cmake b/boards/alientek/dnesp32s3b/board.cmake new file mode 100644 index 0000000000000..f8867d9d0b65c --- /dev/null +++ b/boards/alientek/dnesp32s3b/board.cmake @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Joel Guittet +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "${OPENOCD}" MATCHES "^${ESPRESSIF_TOOLCHAIN_PATH}/.*") + set(OPENOCD OPENOCD-NOTFOUND) +endif() +find_program(OPENOCD openocd PATHS ${ESPRESSIF_TOOLCHAIN_PATH}/openocd-esp32/bin NO_DEFAULT_PATH) + +include(${ZEPHYR_BASE}/boards/common/esp32.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/alientek/dnesp32s3b/board.yml b/boards/alientek/dnesp32s3b/board.yml new file mode 100644 index 0000000000000..613dbe7a17865 --- /dev/null +++ b/boards/alientek/dnesp32s3b/board.yml @@ -0,0 +1,6 @@ +board: + name: dnesp32s3b + full_name: DNESP32S3B + vendor: alientek + socs: + - name: esp32s3 diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b-pinctrl.dtsi b/boards/alientek/dnesp32s3b/dnesp32s3b-pinctrl.dtsi new file mode 100644 index 0000000000000..d6f1998d17249 --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b-pinctrl.dtsi @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Chen Xingyu + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + output-high; + }; + + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + drive-open-drain; + }; + }; +}; diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.dts b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.dts new file mode 100644 index 0000000000000..6cdd1edfcc1f9 --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.dts @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025 Chen Xingyu + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include + +/ { + model = "DNESP32S3B APPCPU"; + compatible = "alientek,dnesp32s3b"; + + chosen { + zephyr,sram = &sram1; + zephyr,ipc_shm = &shm0; + zephyr,ipc = &ipm0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_appcpu_partition; + }; +}; + +&trng0 { + status = "okay"; +}; + +&ipm0 { + status = "okay"; +}; diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.yaml b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.yaml new file mode 100644 index 0000000000000..0e3986079a865 --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: dnesp32s3b/esp32s3/appcpu +name: DNESP32S3B APPCPU +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - uart +testing: + ignore_tags: + - net + - bluetooth + - flash + - cpp + - posix + - watchdog + - logging + - kernel + - pm + - gpio + - crypto + - eeprom + - heap + - cmsis_rtos + - jwt + - zdsp +vendor: alientek diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu_defconfig b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu_defconfig new file mode 100644 index 0000000000000..6a13f9c9e3928 --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_appcpu_defconfig @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Joel Guittet +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_CLOCK_CONTROL=y diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.dts b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.dts new file mode 100644 index 0000000000000..63593667f2f9e --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.dts @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2025 Chen Xingyu + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include +#include "dnesp32s3b-pinctrl.dtsi" + +/ { + model = "DNESP32S3B PROCPU"; + compatible = "alientek,dnesp32s3b"; + + aliases { + led0 = &ledb; + led1 = &ledr; + sw0 = &b0; + sw1 = &k1; + sw2 = &k2; + watchdog0 = &wdt0; + }; + + chosen { + zephyr,sram = &sram1; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,bt-hci = &esp32_bt_hci; + }; + + leds { + compatible = "gpio-leds"; + + ledb: led_blue { + gpios = <&gpio0 4 GPIO_ACTIVE_LOW>; + label = "LEDB"; + }; + + ledr: led_red { + gpios = <&io_expander 8 GPIO_ACTIVE_LOW>; + label = "LEDR"; + }; + }; + + buttons { + compatible = "gpio-keys"; + + b0: button_b0 { + gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BOOT"; + zephyr,code = ; + }; + + k1: button_k1 { + gpios = <&io_expander 4 GPIO_ACTIVE_LOW>; + label = "KEY1"; + zephyr,code = ; + }; + + k2: button_k2 { + gpios = <&io_expander 3 GPIO_ACTIVE_LOW>; + label = "KEY2"; + zephyr,code = ; + }; + }; +}; + +&usb_serial { + status = "disabled"; +}; + +&uart0 { + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; + + current-speed = <115200>; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; + + clock-frequency = ; + + io_expander: xl9555@20 { + compatible = "nxp,pca9555"; + reg = <0x20>; + gpio-controller; + #gpio-cells = <2>; + ngpios = <16>; + int-gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + }; +}; + +&trng0 { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&wifi { + status = "okay"; +}; + +&esp32_bt_hci { + status = "okay"; +}; diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.yaml b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.yaml new file mode 100644 index 0000000000000..7e81839b5714d --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu.yaml @@ -0,0 +1,12 @@ +identifier: dnesp32s3b/esp32s3/procpu +name: DNESP32S3B PROCPU +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - gpio + - uart + - i2c + - watchdog +vendor: alientek diff --git a/boards/alientek/dnesp32s3b/dnesp32s3b_procpu_defconfig b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu_defconfig new file mode 100644 index 0000000000000..ab1918ed758c0 --- /dev/null +++ b/boards/alientek/dnesp32s3b/dnesp32s3b_procpu_defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2025 Chen Xingyu +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y +CONFIG_I2C=y +CONFIG_CLOCK_CONTROL=y diff --git a/boards/alientek/dnesp32s3b/doc/img/dnesp32s3b.webp b/boards/alientek/dnesp32s3b/doc/img/dnesp32s3b.webp new file mode 100644 index 0000000000000000000000000000000000000000..d637da778758390aafdfc1346e9f397b2a88bdbc GIT binary patch literal 35928 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�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 QwXrXbIM1~g`)A1D0E)LPUjP6A literal 0 HcmV?d00001 diff --git a/boards/alientek/dnesp32s3b/doc/index.rst b/boards/alientek/dnesp32s3b/doc/index.rst new file mode 100644 index 0000000000000..fb6222e659ee7 --- /dev/null +++ b/boards/alientek/dnesp32s3b/doc/index.rst @@ -0,0 +1,80 @@ +.. zephyr:board:: dnesp32s3b + +Overview +******** + +DNESP32S3B is a development board from Alientek, featuring a compatible +ESP32-S3-WROOM-1-N16R8 module and rich set of on-board peripherals, providing an +out-of-the-box development experience for AIoT applications. + +It includes the following integrated components: + +- ATK-MWS3S module, compatible with ESP32-S3-WROOM-1-N16R8 (240MHz dual-core, Bluetooth LE, Wi-Fi, 16MB Flash and 8MB PSRAM) +- 2KB EEPROM +- 1 blue power LED (on when powered) +- 1 red-blue dual-color user LED +- 3 user buttons +- 1 USB-A host port +- 1 USB-C JTAG/programming port +- 1 USB-C port connected to external CH343P for programming +- 1 microSD card slot +- 2 PH-2.0 UART connectors +- 1 3x2 2.54mm GPIO header +- 2.4-inch 320x240 I8080 LCD display with optional touch support +- Buzzer +- Ambient light sensor +- QMI8658A 6-axis IMU +- NS4168 audio codec with speaker and microphone + +Hardware +******** + +The board is based on the ESP32-S3 with 16MB of flash, 8MB of PSRAM, WiFi and BLE +support. It has 3 USB ports (1 USB-A host, 1 USB-C JTAG/programming, and 1 USB-C +connected to external CH343P for programming). + +.. include:: ../../../espressif/common/soc-esp32s3-features.rst + :start-after: espressif-soc-esp32s3-features + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +System requirements +******************* + +.. include:: ../../../espressif/common/system-requirements.rst + :start-after: espressif-system-requirements + +Programming and Debugging +************************* + +.. zephyr:board-supported-runners:: + +.. include:: ../../../espressif/common/building-flashing.rst + :start-after: espressif-building-flashing + +.. include:: ../../../espressif/common/board-variants.rst + :start-after: espressif-board-variants + +Debugging +========= + +.. include:: ../../../espressif/common/openocd-debugging.rst + :start-after: espressif-openocd-debugging + +Sample Applications +******************* + +The following code samples run out of the box on the DNESP32S3B board: + +* :zephyr:code-sample:`blinky` +* :zephyr:code-sample:`button` + +References +********** + +- `DNESP32S3B web page `_ + +.. target-notes:: diff --git a/boards/alientek/dnesp32s3b/support/openocd.cfg b/boards/alientek/dnesp32s3b/support/openocd.cfg new file mode 100644 index 0000000000000..625341a5aa87b --- /dev/null +++ b/boards/alientek/dnesp32s3b/support/openocd.cfg @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Joel Guittet +# SPDX-License-Identifier: Apache-2.0 + +set ESP_RTOS none +set ESP32_ONLYCPU 1 + +# Source the JTAG interface configuration file +source [find interface/esp_usb_jtag.cfg] +# Source the ESP32-S3 configuration file +source [find target/esp32s3.cfg]