From 956b0323f5dc8a53da47a2ebefb48903db7d8589 Mon Sep 17 00:00:00 2001 From: Philipp Steiner Date: Tue, 17 Jun 2025 14:15:34 +0200 Subject: [PATCH 1/2] boards: adafruit: esp32s3_feather_tft fix size of Flash and PSRAM fix size of Flash and PSRAM Signed-off-by: Philipp Steiner --- .../feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft | 2 +- .../adafruit_feather_esp32s3_tft_appcpu.dts | 2 +- .../adafruit_feather_esp32s3_tft_procpu.dts | 2 +- boards/adafruit/feather_esp32s3_tft/doc/index.rst | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft b/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft index cd78387ff8876..febc0d7738141 100644 --- a/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft +++ b/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft @@ -3,6 +3,6 @@ # SPDX-License-Identifier: Apache-2.0 config BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT - select SOC_ESP32S3_WROOM_N8 + select SOC_ESP32S3_WROOM_N4R2 select SOC_ESP32S3_PROCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_ESP32S3_PROCPU select SOC_ESP32S3_APPCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts index f4662f4b0a3ee..34571911c6784 100644 --- a/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts @@ -6,7 +6,7 @@ */ /dts-v1/; -#include +#include #include #include "adafruit_feather_esp32s3_tft-pinctrl.dtsi" diff --git a/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts index 2f4e43d8e8dde..a93a67d709285 100644 --- a/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts @@ -6,7 +6,7 @@ */ /dts-v1/; -#include +#include #include #include #include diff --git a/boards/adafruit/feather_esp32s3_tft/doc/index.rst b/boards/adafruit/feather_esp32s3_tft/doc/index.rst index f46daa99688af..7324debe849da 100644 --- a/boards/adafruit/feather_esp32s3_tft/doc/index.rst +++ b/boards/adafruit/feather_esp32s3_tft/doc/index.rst @@ -16,8 +16,7 @@ Hardware - ESP32-S3 mini module, featuring the dual core 32-bit Xtensa Microprocessor (Tensilica LX7), running at up to 240MHz -- 512KB SRAM and either 8MB flash or 4MB flash + 2MB PSRAM, depending on the - module variant +- 512KB SRAM and either 4MB flash + 2MB PSRAM - USB-C directly connected to the ESP32-S3 for USB/UART and JTAG debugging - LiPo connector and built-in battery charging when powered via USB-C - MAX17048 fuel gauge for battery voltage and state-of-charge reporting From ce819f0090a5532784cb4b4589b1284d27dbbe44 Mon Sep 17 00:00:00 2001 From: Philipp Steiner Date: Tue, 24 Jun 2025 07:02:07 +0200 Subject: [PATCH 2/2] boards: adafruit: add initial support esp32s3_feather_tft_reverse The Adafruit Feather ESP32S3 TFT Reverse is a development board in the Feather standard layout, sharing peripheral placement with other devices labeled as Feathers or FeatherWings. The board is equipped with an ESP32-S3 mini module, a fuel gauge, a USB-C and Qwiic/STEMMA-QT connector. This variant additionally comes with a 240x135 pixel IPS TFT color display on the backside of the boards and with 3 buttons. Signed-off-by: Philipp Steiner --- .../CMakeLists.txt | 4 + .../feather_esp32s3_tft_reverse/Kconfig | 11 + ...onfig.adafruit_feather_esp32s3_tft_reverse | 9 + .../Kconfig.defconfig | 32 +++ .../Kconfig.sysbuild | 10 + ...t_feather_esp32s3_tft_reverse-pinctrl.dtsi | 73 +++++ ...uit_feather_esp32s3_tft_reverse_appcpu.dts | 33 +++ ...it_feather_esp32s3_tft_reverse_appcpu.yaml | 27 ++ ...ather_esp32s3_tft_reverse_appcpu_defconfig | 3 + ...uit_feather_esp32s3_tft_reverse_procpu.dts | 270 ++++++++++++++++++ ...it_feather_esp32s3_tft_reverse_procpu.yaml | 23 ++ ...ather_esp32s3_tft_reverse_procpu_defconfig | 7 + .../feather_esp32s3_tft_reverse/board.c | 27 ++ .../feather_esp32s3_tft_reverse/board.cmake | 9 + .../feather_esp32s3_tft_reverse/board.yml | 6 + .../adafruit_feather_esp32s3_tft_reverse.webp | Bin 0 -> 34172 bytes .../feather_esp32s3_tft_reverse/doc/index.rst | 249 ++++++++++++++++ .../feather_connector.dtsi | 41 +++ .../support/openocd.cfg | 7 + ...it_feather_esp32s3_tft_reverse_procpu.conf | 4 + ...it_feather_esp32s3_tft_reverse_procpu.conf | 4 + samples/net/wifi/shell/socs/esp32s2.overlay | 3 + .../wifi/shell/socs/esp32s3_procpu.overlay | 3 + ...it_feather_esp32s3_tft_reverse_procpu.conf | 6 + ...feather_esp32s3_tft_reverse_procpu.overlay | 3 + 25 files changed, 864 insertions(+) create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/CMakeLists.txt create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/Kconfig create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.adafruit_feather_esp32s3_tft_reverse create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.sysbuild create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.dts create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.yaml create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.dts create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.yaml create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/board.c create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/board.cmake create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/board.yml create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/doc/img/adafruit_feather_esp32s3_tft_reverse.webp create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/doc/index.rst create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/feather_connector.dtsi create mode 100644 boards/adafruit/feather_esp32s3_tft_reverse/support/openocd.cfg create mode 100644 samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf create mode 100644 samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf create mode 100644 samples/net/wifi/shell/socs/esp32s2.overlay create mode 100644 samples/net/wifi/shell/socs/esp32s3_procpu.overlay create mode 100644 samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf create mode 100644 samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.overlay diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/CMakeLists.txt b/boards/adafruit/feather_esp32s3_tft_reverse/CMakeLists.txt new file mode 100644 index 0000000000000..218a0602483ab --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() +zephyr_library_sources(board.c) diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig new file mode 100644 index 0000000000000..785bb38993d7f --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig @@ -0,0 +1,11 @@ +# Adafruit ESP32-S3 Reverse TFT Feather board configuration + +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# Copyright (c) 2025 Philipp Steiner +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 4096 if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_PROCPU + default 256 if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.adafruit_feather_esp32s3_tft_reverse b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.adafruit_feather_esp32s3_tft_reverse new file mode 100644 index 0000000000000..7447335883d18 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.adafruit_feather_esp32s3_tft_reverse @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# Copyright (c) 2025 Philipp Steiner +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE + select SOC_ESP32S3_WROOM_N4R2 + select SOC_ESP32S3_PROCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_PROCPU + select SOC_ESP32S3_APPCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.defconfig b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.defconfig new file mode 100644 index 0000000000000..e24600b09bcac --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.defconfig @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Leon Rinkel +# Copyright (c) 2025 Philipp Steiner +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_PROCPU + +if DISPLAY + +config BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE + select BOARD_LATE_INIT_HOOK + +choice ST7789V_PIXEL_FORMAT + default ST7789V_RGB565 +endchoice + +if LVGL + +config LV_Z_BITS_PER_PIXEL + default 16 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_16 +endchoice + +config LV_COLOR_16_SWAP + default y + +endif # LVGL + +endif # DISPLAY + +endif # BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_REVERSE_ESP32S3_PROCPU diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.sysbuild b/boards/adafruit/feather_esp32s3_tft_reverse/Kconfig.sysbuild new file mode 100644 index 0000000000000..8d3acb9e11d7c --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/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/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi new file mode 100644 index 0000000000000..80a29d5e14a87 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * Copyright (c) 2025 Philipp Steiner + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + /* Debug TX (DBG) - This is the hardware UART debug pin */ + uart0_default: uart0_default { + group1 { + pinmux = ; + output-high; + }; + + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + uart1_default: uart1_default { + group1 { + pinmux = ; + output-high; + }; + + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + drive-open-drain; + output-high; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + , + ; + }; + + group2 { + pinmux = ; + output-low; + }; + }; + + spim3_ws2812_led: spim3_ws2812_led { + group1 { + pinmux = ; + }; + }; + + twai_default: twai_default { + group1 { + pinmux = , + ; + }; + }; +}; diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.dts b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.dts new file mode 100644 index 0000000000000..859188739806b --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.dts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * Copyright (c) 2025 Philipp Steiner + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include "adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi" + +/ { + model = "Adafruit ESP32-S3 Reverse TFT Feather APPCPU"; + compatible = "adafruit,feather_esp32s3_tft_reverse", "espressif,esp32s3"; + + 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/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.yaml b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.yaml new file mode 100644 index 0000000000000..1d3f5c950a392 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: adafruit_feather_esp32s3_tft_reverse/esp32s3/appcpu +name: Adafruit ESP32-S3 Reverse TFT Feather 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: adafruit diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu_defconfig b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu_defconfig new file mode 100644 index 0000000000000..48546641cadd6 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_appcpu_defconfig @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_CLOCK_CONTROL=y diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.dts b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.dts new file mode 100644 index 0000000000000..837bf550e1483 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.dts @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include +#include +#include +#include +#include "feather_connector.dtsi" +#include "adafruit_feather_esp32s3_tft_reverse-pinctrl.dtsi" + +/ { + model = "Adafruit ESP32-S3 Reverse TFT Feather PROCPU"; + compatible = "adafruit,feather_esp32s3_tft_reverse", "espressif,esp32s3"; + + chosen { + zephyr,sram = &sram1; + zephyr,console = &usb_serial; + zephyr,shell-uart = &usb_serial; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,bt-hci = &esp32_bt_hci; + zephyr,display = &st7789v_tft; + }; + + aliases { + i2c-0 = &i2c0; + watchdog0 = &wdt0; + uart-0 = &uart0; + sw0 = &button0; + sw1 = &button1; + sw2 = &button2; + led0 = &led0; + led-strip = &led_strip; + backlight = &led1; + }; + + gpio_keys { + compatible = "gpio-keys"; + status = "okay"; + + button0: button_0 { + gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "D0"; + zephyr,code = ; + }; + + button1: button_1 { + gpios = <&gpio0 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "D1"; + zephyr,code = ; + }; + + button2: button_2 { + gpios = <&gpio0 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "D2"; + zephyr,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + status = "okay"; + + led0: led_0 { + label = "Red-LED"; + gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + }; + + led1: led_1 { + + label = "TFT Backlight"; + gpios = <&gpio1 45 GPIO_ACTIVE_HIGH>; + }; + }; + + /* + * The neopixel on this board has its positive side hooked up to a GPIO + * pin rather than a positive voltage rail to save on power. + */ + neopixel_pwr: neopixel_pwr { + compatible = "power-domain-gpio"; + #power-domain-cells = <0>; + enable-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + }; + + /* + * On-board regulator powers I2C pull-ups and external devices connected + * via the STEMMA QT connector. + */ + i2c_reg: i2c_reg { + label = "I2C Power"; + compatible = "power-domain-gpio"; + #power-domain-cells = <0>; + enable-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>; + }; + + mipi_dbi { + compatible = "zephyr,mipi-dbi-spi"; + spi-dev = <&spi2>; + dc-gpios = <&gpio1 40 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio1 41 GPIO_ACTIVE_LOW>; + write-only; + #address-cells = <1>; + #size-cells = <0>; + + st7789v_tft: st7789v_tft@0 { + compatible = "sitronix,st7789v"; + status = "disabled"; + + /* Also powered by i2c_reg */ + power-domains = <&i2c_reg>; + + mipi-max-frequency = ; + reg = <0>; + width = <135>; + height = <240>; + x-offset = <52>; + y-offset = <40>; + vcom = <0x20>; + gctrl = <0x35>; + vrhs = <0x0b>; + vdvs = <0x20>; + mdac = <0x08>; + gamma = <0x01>; + colmod = <0x55>; + lcm = <0x2c>; + porch-param = [0c 0c 00 33 33]; + cmd2en-param = [5a 69 02 01]; + pwctrl1-param = [a4 a1]; + pvgam-param = [70 2C 2E 15 10 09 48 33 53 0B 19 18 20 25]; + nvgam-param = [70 2C 2E 15 10 09 48 33 53 0B 19 18 20 25]; + ram-param = [00 F0]; + rgb-param = [40 02 14]; + mipi-mode = "MIPI_DBI_MODE_SPI_4WIRE"; + }; + }; +}; + +&usb_serial { + status = "okay"; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&uart1 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart1_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&touch { + debounce-interval-ms = <30>; + href-microvolt = <2700000>; + lref-microvolt = <500000>; + href-atten-microvolt = <1000000>; + filter-mode = ; + filter-debounce-cnt = <1>; + filter-noise-thr = ; + filter-jitter-step = <4>; + filter-smooth-level = ; +}; + +zephyr_i2c: &i2c0 { + status = "okay"; + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; + + max17048: max17048@36 { + compatible = "maxim,max17048"; + status = "okay"; + reg = <0x36>; + + /* + * The MAX17048 itself is directly powered by the battery, not + * through the on-board regulator. However using this device + * requires I2C pull-ups powered by the regulator. + */ + power-domains = <&i2c_reg>; + }; +}; + +&spi2 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim2_default>; + pinctrl-names = "default"; +}; + +&spi3 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim3_ws2812_led>; + pinctrl-names = "default"; + + /* Workaround to support WS2812 driver */ + line-idle-low; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + power-domains = <&neopixel_pwr>; + + /* WS2812 */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <6400000>; + chain-length = <1>; + spi-cpha; + spi-one-frame = <0xf0>; /* 625 ns high and 625 ns low */ + spi-zero-frame = <0xc0>; /* 312.5 ns high and 937.5 ns low */ + color-mapping = ; + }; +}; + +&twai { + pinctrl-0 = <&twai_default>; + pinctrl-names = "default"; +}; + +&timer0 { + status = "disabled"; +}; + +&timer1 { + status = "disabled"; +}; + +&timer2 { + status = "disabled"; +}; + +&timer3 { + status = "disabled"; +}; + +&wdt0 { + status = "okay"; +}; + +&trng0 { + status = "okay"; +}; + +&esp32_bt_hci { + status = "okay"; +}; diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.yaml b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.yaml new file mode 100644 index 0000000000000..1b9773f89bf04 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu.yaml @@ -0,0 +1,23 @@ +identifier: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu +name: Adafruit ESP32-S3 Reverse TFT Feather PROCPU +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - gpio + - uart + - i2c + - spi + - can + - counter + - watchdog + - entropy + - pwm + - dma + - input + - feather_serial + - feather_i2c + - feather_spi + - display +vendor: adafruit diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu_defconfig b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu_defconfig new file mode 100644 index 0000000000000..d8fbaa879257b --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/adafruit_feather_esp32s3_tft_reverse_procpu_defconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y +CONFIG_CLOCK_CONTROL=y diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/board.c b/boards/adafruit/feather_esp32s3_tft_reverse/board.c new file mode 100644 index 0000000000000..88aa3b0b35447 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/board.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + * + * Automatically turns on backlight if display is configured, i.e. display DT + * node has status okay. + */ + +#include +#include +#include + +#define DISPLAY_NODE DT_CHOSEN(zephyr_display) + +#if DT_NODE_HAS_STATUS(DISPLAY_NODE, okay) +static const struct gpio_dt_spec backlight = GPIO_DT_SPEC_GET(DT_ALIAS(backlight), gpios); +#endif + +void board_late_init_hook(void) +{ +#if DT_NODE_HAS_STATUS(DISPLAY_NODE, okay) + if (gpio_is_ready_dt(&backlight)) { + gpio_pin_configure_dt(&backlight, GPIO_OUTPUT_ACTIVE); + } +#endif +} diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/board.cmake b/boards/adafruit/feather_esp32s3_tft_reverse/board.cmake new file mode 100644 index 0000000000000..2f04d1fe8861e --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/board.cmake @@ -0,0 +1,9 @@ +# 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/adafruit/feather_esp32s3_tft_reverse/board.yml b/boards/adafruit/feather_esp32s3_tft_reverse/board.yml new file mode 100644 index 0000000000000..b8c23080dc501 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/board.yml @@ -0,0 +1,6 @@ +board: + name: adafruit_feather_esp32s3_tft_reverse + full_name: Adafruit ESP32-S3 Reverse TFT Feather + vendor: adafruit + socs: + - name: esp32s3 diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/doc/img/adafruit_feather_esp32s3_tft_reverse.webp b/boards/adafruit/feather_esp32s3_tft_reverse/doc/img/adafruit_feather_esp32s3_tft_reverse.webp new file mode 100644 index 0000000000000000000000000000000000000000..34bcd7400a545440a673063435e2ad1a8e2e5ceb GIT binary patch literal 34172 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 literal 0 HcmV?d00001 diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/doc/index.rst b/boards/adafruit/feather_esp32s3_tft_reverse/doc/index.rst new file mode 100644 index 0000000000000..98135629d74b2 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/doc/index.rst @@ -0,0 +1,249 @@ +.. zephyr:board:: adafruit_feather_esp32s3_tft_reverse + +Overview +******** + +The Adafruit ESP32-S3 Reverse TFT Feather is a development board in the +Feather standard layout, sharing peripheral placement with other devices +labeled as Feathers or FeatherWings. The board is equipped with an +ESP32-S3 mini module, a fuel gauge, a USB-C and Qwiic/STEMMA-QT connector. +This variant additionally comes with a 240x135 pixel IPS TFT color display +on the backside of the boards and with 3 buttons. + +For more information, check +`Adafruit ESP32-S3 Reverse TFT Feather`_. + +Hardware +******** + +- ESP32-S3 mini module, featuring the dual core 32-bit Xtensa Microprocessor + (Tensilica LX7), running at up to 240MHz +- 512KB SRAM and either 4MB flash + 2MB PSRAM +- USB-C directly connected to the ESP32-S3 for USB/UART and JTAG debugging +- LiPo connector and built-in battery charging when powered via USB-C +- MAX17048 fuel gauge for battery voltage and state-of-charge reporting +- Charging indicator LED, user LED, reset buttons +- Built-in NeoPixel indicator RGB LED +- STEMMA QT connector for I2C devices, with switchable power for low-power mode +- 240x135 pixel IPS TFT color display with 1.14" diagonal and ST7789 chipset +- Three User Tactile buttons - D0, D1, and D2. D0/BOOT0 is also used for entering ROM + bootloader mode if necessary. + + +Asymmetric Multiprocessing (AMP) +================================ + +The ESP32-S3 SoC allows 2 different applications to be executed in asymmetric +multiprocessing. Due to its dual-core architecture, each core can be enabled to +execute customized tasks in stand-alone mode and/or exchanging data over OpenAMP +framework. See :zephyr:code-sample-category:`ipc` folder as code reference. + +For more information, check the datasheet at `ESP32-S3 Datasheet`_. + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Connections and IOs +=================== + +The `Adafruit ESP32-S3 Reverse TFT Feather User Guide`_ has detailed information about +the board including `pinouts`_ and the `schematic`_. + +Programming and Debugging +************************* + +.. zephyr:board-supported-runners:: + +Prerequisites +============= + +Espressif HAL requires WiFi and Bluetooth binary blobs in order work. Run the +command below to retrieve those files. + +.. code-block:: console + + west blobs fetch hal_espressif + +.. note:: + + It is recommended running the command above after :file:`west update`. + +Building & Flashing +=================== + +Simple boot +----------- + +The board could be loaded using the single binary image, without 2nd stage +bootloader. It is the default option when building the application without +additional configuration. + +.. note:: + + Simple boot does not provide any security features nor OTA updates. + +MCUboot bootloader +------------------ + +User may choose to use MCUboot bootloader instead. In that case the bootloader +must be build (and flash) at least once. + +There are two options to be used when building an application: + +1. Sysbuild +2. Manual build + +.. note:: + + User can select the MCUboot bootloader by adding the following line + to the board default configuration file. + + .. code:: cfg + + CONFIG_BOOTLOADER_MCUBOOT=y + +Sysbuild +-------- + +The sysbuild makes possible to build and flash all necessary images needed to +bootstrap the board with the ESP32-S3 SoC. + +To build the sample application using sysbuild use the command: + +.. zephyr-app-commands:: + :tool: west + :zephyr-app: samples/hello_world + :board: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + :goals: build + :west-args: --sysbuild + :compact: + +By default, the ESP32-S3 sysbuild creates bootloader (MCUboot) and application +images. But it can be configured to create other kind of images. + +Build directory structure created by sysbuild is different from traditional +Zephyr build. Output is structured by the domain subdirectories: + +.. code-block:: + + build/ + ├── hello_world + │   └── zephyr + │   ├── zephyr.elf + │   └── zephyr.bin + ├── mcuboot + │ └── zephyr + │ ├── zephyr.elf + │ └── zephyr.bin + └── domains.yaml + +.. note:: + + With ``--sysbuild`` option the bootloader will be re-build and re-flash + every time the pristine build is used. + +For more information about the system build please read the :ref:`sysbuild` +documentation. + +Manual build +------------ + +During the development cycle, it is intended to build & flash as quickly +possible. For that reason, images can be build one at a time using traditional +build. + +The instructions following are relevant for both manual build and sysbuild. +The only difference is the structure of the build directory. + +.. note:: + + Remember that bootloader (MCUboot) needs to be flash at least once. + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: :board: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + :goals: build + +The usual ``flash`` target will work with the ``adafruit_feather_esp32s3_tft_reverse`` +board. Here is an example for the :zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + :goals: flash + +Open the serial monitor using the following command: + +.. code-block:: shell + + west espressif monitor + +After the board has automatically reset and booted, you should see the following +message in the monitor: + +.. code-block:: console + + ***** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx ***** + Hello World! adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + +Debugging +========= + +ESP32-S3 support on OpenOCD is available upstream as of version 0.12.0. Download +and install OpenOCD from `OpenOCD`_. + +ESP32-S3 has a built-in JTAG circuitry and can be debugged without any +additional chip. Only an USB cable connected to the D+/D- pins is necessary. + +Further documentation can be obtained from the SoC vendor in `JTAG debugging +for ESP32-S3`_. + +Here is an example for building the :zephyr:code-sample:`hello_world` +application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + :goals: build flash + +You can debug an application in the usual way. Here is an example for the +:zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: adafruit_feather_esp32s3_tft_reverse/esp32s3/procpu + :goals: debug + +References +********** + +.. target-notes:: + +.. _`Adafruit ESP32-S3 Reverse TFT Feather`: + https://www.adafruit.com/product/5691 + +.. _`OpenOCD`: + https://github.com/openocd-org/openocd + +.. _`JTAG debugging for ESP32-S3`: + https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/jtag-debugging/ + +.. _Adafruit ESP32-S3 Reverse TFT Feather User Guide: + https://learn.adafruit.com/esp32-s3-reverse-tft-feather + +.. _pinouts: + https://learn.adafruit.com/esp32-s3-reverse-tft-feather/pinouts + +.. _schematic: + https://learn.adafruit.com/esp32-s3-reverse-tft-feather/downloads + +.. _ESP32-S3 Datasheet: + https://www.espressif.com/sites/default/files/documentation/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf + +.. _ESP32 Technical Reference Manual: + https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/feather_connector.dtsi b/boards/adafruit/feather_esp32s3_tft_reverse/feather_connector.dtsi new file mode 100644 index 0000000000000..b2a4321b8178a --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/feather_connector.dtsi @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Richard Osterloh + * Copyright (c) 2024 Leon Rinkel + * Copyright (c) 2025 Philipp Steiner + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + feather_header: connector { + compatible = "adafruit-feather-header"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 18 0>, /* A0 */ + <1 0 &gpio0 17 0>, /* A1 */ + <2 0 &gpio0 16 0>, /* A2 */ + <3 0 &gpio0 15 0>, /* A3 */ + <4 0 &gpio0 14 0>, /* A4 */ + <5 0 &gpio0 8 0>, /* A5 */ + <6 0 &gpio1 36 0>, /* SCK */ + <7 0 &gpio1 35 0>, /* MOSI */ + <8 0 &gpio1 37 0>, /* MISO */ + <9 0 &gpio1 38 0>, /* RX */ + <10 0 &gpio1 39 0>, /* TX */ + <11 0 &gpio1 46 0>, /* DB */ + <12 0 &gpio0 3 0>, /* SDA */ + <13 0 &gpio0 4 0>, /* SCL */ + <14 0 &gpio0 5 0>, /* D5 */ + <15 0 &gpio0 6 0>, /* D6 */ + <16 0 &gpio0 9 0>, /* D9 */ + <17 0 &gpio0 10 0>, /* D10 */ + <18 0 &gpio0 11 0>, /* D11 */ + <19 0 &gpio0 12 0>, /* D12 */ + <20 0 &gpio0 13 0>; /* D13 */ + }; +}; + +feather_serial: &uart1 {}; +feather_i2c: &i2c0 {}; +feather_spi: &spi2 {}; diff --git a/boards/adafruit/feather_esp32s3_tft_reverse/support/openocd.cfg b/boards/adafruit/feather_esp32s3_tft_reverse/support/openocd.cfg new file mode 100644 index 0000000000000..2f740b4a36ab1 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft_reverse/support/openocd.cfg @@ -0,0 +1,7 @@ +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] diff --git a/samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf new file mode 100644 index 0000000000000..0968fb220e006 --- /dev/null +++ b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf @@ -0,0 +1,4 @@ +CONFIG_POWER_DOMAIN=y +CONFIG_GPIO=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_POWER_DOMAIN=y diff --git a/samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf b/samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf new file mode 100644 index 0000000000000..0968fb220e006 --- /dev/null +++ b/samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf @@ -0,0 +1,4 @@ +CONFIG_POWER_DOMAIN=y +CONFIG_GPIO=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_POWER_DOMAIN=y diff --git a/samples/net/wifi/shell/socs/esp32s2.overlay b/samples/net/wifi/shell/socs/esp32s2.overlay new file mode 100644 index 0000000000000..d342be1381c43 --- /dev/null +++ b/samples/net/wifi/shell/socs/esp32s2.overlay @@ -0,0 +1,3 @@ +&wifi { + status = "okay"; +}; diff --git a/samples/net/wifi/shell/socs/esp32s3_procpu.overlay b/samples/net/wifi/shell/socs/esp32s3_procpu.overlay new file mode 100644 index 0000000000000..d342be1381c43 --- /dev/null +++ b/samples/net/wifi/shell/socs/esp32s3_procpu.overlay @@ -0,0 +1,3 @@ +&wifi { + status = "okay"; +}; diff --git a/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf new file mode 100644 index 0000000000000..cf023663fe53a --- /dev/null +++ b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.conf @@ -0,0 +1,6 @@ +CONFIG_POWER_DOMAIN=y +CONFIG_GPIO=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_POWER_DOMAIN=y + +CONFIG_MAIN_STACK_SIZE=4096 diff --git a/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.overlay b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.overlay new file mode 100644 index 0000000000000..bf62c27670add --- /dev/null +++ b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_reverse_procpu.overlay @@ -0,0 +1,3 @@ +&st7789v_tft { + status = "okay"; +};