From a5239298503fcfaccd1af2c5efe08b7aa3b4f91a Mon Sep 17 00:00:00 2001 From: Leon Rinkel Date: Wed, 13 Nov 2024 21:16:36 +0100 Subject: [PATCH 1/2] boards: adafruit: add initial support for esp32s3 feather The Adafruit Feather ESP32S3 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 lithium ion battery charger and a USB-C connector. Signed-off-by: Leon Rinkel --- boards/adafruit/feather_esp32s3/Kconfig | 10 + .../Kconfig.adafruit_feather_esp32s3 | 8 + .../adafruit/feather_esp32s3/Kconfig.sysbuild | 10 + .../adafruit_feather_esp32s3-pinctrl.dtsi | 68 +++++ .../adafruit_feather_esp32s3_appcpu.dts | 32 ++ .../adafruit_feather_esp32s3_appcpu.yaml | 27 ++ .../adafruit_feather_esp32s3_appcpu_defconfig | 4 + .../adafruit_feather_esp32s3_procpu.dts | 206 +++++++++++++ .../adafruit_feather_esp32s3_procpu.yaml | 22 ++ .../adafruit_feather_esp32s3_procpu_defconfig | 9 + boards/adafruit/feather_esp32s3/board.cmake | 9 + boards/adafruit/feather_esp32s3/board.yml | 6 + .../doc/img/adafruit_feather_esp32s3.webp | Bin 0 -> 42122 bytes boards/adafruit/feather_esp32s3/doc/index.rst | 279 ++++++++++++++++++ .../feather_esp32s3/feather_connector.dtsi | 40 +++ .../feather_esp32s3/support/openocd.cfg | 7 + .../adafruit_feather_esp32s3_procpu.conf | 4 + .../adafruit_feather_esp32s3_procpu.conf | 4 + 18 files changed, 745 insertions(+) create mode 100644 boards/adafruit/feather_esp32s3/Kconfig create mode 100644 boards/adafruit/feather_esp32s3/Kconfig.adafruit_feather_esp32s3 create mode 100644 boards/adafruit/feather_esp32s3/Kconfig.sysbuild create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3-pinctrl.dtsi create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.dts create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.yaml create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.dts create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.yaml create mode 100644 boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3/board.cmake create mode 100644 boards/adafruit/feather_esp32s3/board.yml create mode 100644 boards/adafruit/feather_esp32s3/doc/img/adafruit_feather_esp32s3.webp create mode 100644 boards/adafruit/feather_esp32s3/doc/index.rst create mode 100644 boards/adafruit/feather_esp32s3/feather_connector.dtsi create mode 100644 boards/adafruit/feather_esp32s3/support/openocd.cfg create mode 100644 samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_procpu.conf create mode 100644 samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_procpu.conf diff --git a/boards/adafruit/feather_esp32s3/Kconfig b/boards/adafruit/feather_esp32s3/Kconfig new file mode 100644 index 0000000000000..e56e7f846c47e --- /dev/null +++ b/boards/adafruit/feather_esp32s3/Kconfig @@ -0,0 +1,10 @@ +# Adafruit Feather ESP32-S3 board configuration + +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 4096 if BOARD_ADAFRUIT_FEATHER_ESP32S3_ESP32S3_PROCPU + default 256 if BOARD_ADAFRUIT_FEATHER_ESP32S3_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3/Kconfig.adafruit_feather_esp32s3 b/boards/adafruit/feather_esp32s3/Kconfig.adafruit_feather_esp32s3 new file mode 100644 index 0000000000000..a96fe92930821 --- /dev/null +++ b/boards/adafruit/feather_esp32s3/Kconfig.adafruit_feather_esp32s3 @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ESP32S3 + select SOC_ESP32S3_WROOM_N8 + select SOC_ESP32S3_PROCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_ESP32S3_PROCPU + select SOC_ESP32S3_APPCPU if BOARD_ADAFRUIT_FEATHER_ESP32S3_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3/Kconfig.sysbuild b/boards/adafruit/feather_esp32s3/Kconfig.sysbuild new file mode 100644 index 0000000000000..8d3acb9e11d7c --- /dev/null +++ b/boards/adafruit/feather_esp32s3/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/adafruit_feather_esp32s3-pinctrl.dtsi b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3-pinctrl.dtsi new file mode 100644 index 0000000000000..dc41eaae5412e --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3-pinctrl.dtsi @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + 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_default: spim3_default { + group1 { + pinmux = ; + }; + }; + + twai_default: twai_default { + group1 { + pinmux = , + ; + }; + }; +}; diff --git a/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.dts b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.dts new file mode 100644 index 0000000000000..8b9f9953792ec --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.dts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include "adafruit_feather_esp32s3-pinctrl.dtsi" + +/ { + model = "Adafruit Feather ESP32S3 APPCPU"; + compatible = "adafruit,feather_esp32s3", "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/adafruit_feather_esp32s3_appcpu.yaml b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.yaml new file mode 100644 index 0000000000000..329bcd7fa92ce --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: adafruit_feather_esp32s3/esp32s3/appcpu +name: Adafruit Feather ESP32-S3 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/adafruit_feather_esp32s3_appcpu_defconfig b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu_defconfig new file mode 100644 index 0000000000000..9abf2ff0430ab --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_appcpu_defconfig @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 +CONFIG_CLOCK_CONTROL=y diff --git a/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.dts b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.dts new file mode 100644 index 0000000000000..b745820ddaa09 --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.dts @@ -0,0 +1,206 @@ +/* + * 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 "feather_connector.dtsi" +#include "adafruit_feather_esp32s3-pinctrl.dtsi" + +/ { + model = "Adafruit Feather ESP32S3 PROCPU"; + compatible = "adafruit,feather_esp32s3", "espressif,esp32s3"; + + aliases { + i2c-0 = &i2c0; + 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; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + uart-0 = &uart0; + sw0 = &button0; + led0 = &led0; + led-strip = &led_strip; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BOOT Button"; + zephyr,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 13 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 { + compatible = "power-domain-gpio"; + #power-domain-cells = <0>; + enable-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>; + }; +}; + +&usb_serial { + status = "disabled"; +}; + +&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 = ; +}; + +&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_default>; + pinctrl-names = "default"; + + /* Workaround to support WS2812 driver */ + line-idle-low; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + power-domains = <&neopixel_pwr>; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <6400000>; + + /* WS2812 */ + 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/adafruit_feather_esp32s3_procpu.yaml b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.yaml new file mode 100644 index 0000000000000..6ca1ba6ae3c1c --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu.yaml @@ -0,0 +1,22 @@ +identifier: adafruit_feather_esp32s3/esp32s3/procpu +name: Adafruit Feather ESP32-S3 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 +vendor: adafruit diff --git a/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu_defconfig b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu_defconfig new file mode 100644 index 0000000000000..d789bab1824a6 --- /dev/null +++ b/boards/adafruit/feather_esp32s3/adafruit_feather_esp32s3_procpu_defconfig @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y +CONFIG_CLOCK_CONTROL=y diff --git a/boards/adafruit/feather_esp32s3/board.cmake b/boards/adafruit/feather_esp32s3/board.cmake new file mode 100644 index 0000000000000..2f04d1fe8861e --- /dev/null +++ b/boards/adafruit/feather_esp32s3/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/board.yml b/boards/adafruit/feather_esp32s3/board.yml new file mode 100644 index 0000000000000..89db0bb116cc7 --- /dev/null +++ b/boards/adafruit/feather_esp32s3/board.yml @@ -0,0 +1,6 @@ +board: + name: adafruit_feather_esp32s3 + full_name: Adafruit Feather ESP32S3 + vendor: adafruit + socs: + - name: esp32s3 diff --git a/boards/adafruit/feather_esp32s3/doc/img/adafruit_feather_esp32s3.webp b/boards/adafruit/feather_esp32s3/doc/img/adafruit_feather_esp32s3.webp new file mode 100644 index 0000000000000000000000000000000000000000..5d6575dca117052c60ac7470fd6316d9b2d675aa GIT binary patch literal 42122 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 W>lBW#0m&}iKuXY-`1QgnfWQF!zcEt) literal 0 HcmV?d00001 diff --git a/boards/adafruit/feather_esp32s3/doc/index.rst b/boards/adafruit/feather_esp32s3/doc/index.rst new file mode 100644 index 0000000000000..82e5801500d8a --- /dev/null +++ b/boards/adafruit/feather_esp32s3/doc/index.rst @@ -0,0 +1,279 @@ +.. zephyr:board:: adafruit_feather_esp32s3 + +Overview +******** + +The Adafruit Feather ESP32-S3 is an ESP32-S3 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 +LiPo battery charger, a fuel gauge, a USB-C and Qwiic/STEMMA-QT connector. For +more information, check `Adafruit Feather ESP32-S3`_. + +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 +- 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 and boot buttons +- Built-in NeoPixel indicator RGB LED +- STEMMA QT connector for I2C devices, with switchable power for low-power mode + +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 +================== + +The current ``adafruit_feather_esp32s3`` board supports the following hardware +features: + ++------------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++============+============+=====================================+ +| UART | on-chip | serial port | ++------------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++------------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++------------+------------+-------------------------------------+ +| USB-JTAG | on-chip | hardware interface | ++------------+------------+-------------------------------------+ +| SPI Master | on-chip | spi | ++------------+------------+-------------------------------------+ +| TWAI/CAN | on-chip | can | ++------------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++------------+------------+-------------------------------------+ +| Timers | on-chip | counter | ++------------+------------+-------------------------------------+ +| Watchdog | on-chip | watchdog | ++------------+------------+-------------------------------------+ +| TRNG | on-chip | entropy | ++------------+------------+-------------------------------------+ +| LEDC | on-chip | pwm | ++------------+------------+-------------------------------------+ +| MCPWM | on-chip | pwm | ++------------+------------+-------------------------------------+ +| PCNT | on-chip | qdec | ++------------+------------+-------------------------------------+ +| GDMA | on-chip | dma | ++------------+------------+-------------------------------------+ +| USB-CDC | on-chip | serial | ++------------+------------+-------------------------------------+ +| Wi-Fi | on-chip | | ++------------+------------+-------------------------------------+ +| Bluetooth | on-chip | | ++------------+------------+-------------------------------------+ + +Connections and IOs +=================== + +The `Adafruit Feather ESP32-S3 User Guide`_ has detailed information about the +board including `pinouts`_ and the `schematic`_. + +Programming and Debugging +************************* + +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/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: adafruit_feather_esp32s3/esp32s3/procpu + :goals: build + +The usual ``flash`` target will work with the ``adafruit_feather_esp32s3`` 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/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 + +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/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/esp32s3/procpu + :goals: debug + +References +********** + +.. target-notes:: + +.. _`Adafruit Feather ESP32-S3`: + https://www.adafruit.com/product/5323 + +.. _`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 Feather ESP32-S3 User Guide: + https://learn.adafruit.com/adafruit-esp32-s3-feather + +.. _pinouts: + https://learn.adafruit.com/adafruit-esp32-s3-feather/pinouts + +.. _schematic: + https://learn.adafruit.com/adafruit-esp32-s3-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/feather_connector.dtsi b/boards/adafruit/feather_esp32s3/feather_connector.dtsi new file mode 100644 index 0000000000000..49671be660cdf --- /dev/null +++ b/boards/adafruit/feather_esp32s3/feather_connector.dtsi @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Richard Osterloh + * Copyright (c) 2024 Leon Rinkel + * + * 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 44 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/support/openocd.cfg b/boards/adafruit/feather_esp32s3/support/openocd.cfg new file mode 100644 index 0000000000000..2f740b4a36ab1 --- /dev/null +++ b/boards/adafruit/feather_esp32s3/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_procpu.conf b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_procpu.conf new file mode 100644 index 0000000000000..0968fb220e006 --- /dev/null +++ b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32s3_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_procpu.conf b/samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_procpu.conf new file mode 100644 index 0000000000000..0968fb220e006 --- /dev/null +++ b/samples/fuel_gauge/max17048/boards/adafruit_feather_esp32s3_procpu.conf @@ -0,0 +1,4 @@ +CONFIG_POWER_DOMAIN=y +CONFIG_GPIO=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_POWER_DOMAIN=y From cbd9d61bc639dc06dcf027b35ec988a118c07da0 Mon Sep 17 00:00:00 2001 From: Leon Rinkel Date: Wed, 13 Nov 2024 21:33:51 +0100 Subject: [PATCH 2/2] boards: adafruit: add initial support esp32s3 feather tft The Adafruit Feather ESP32S3 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 lithium ion battery charger and a USB-C connector. Compared to the base model, this TFT variant additionally comes with a 240x135 pixel IPS TFT color display. Signed-off-by: Leon Rinkel --- .../feather_esp32s3_tft/CMakeLists.txt | 4 + boards/adafruit/feather_esp32s3_tft/Kconfig | 10 + .../Kconfig.adafruit_feather_esp32s3_tft | 8 + .../feather_esp32s3_tft/Kconfig.defconfig | 31 ++ .../feather_esp32s3_tft/Kconfig.sysbuild | 10 + .../adafruit_feather_esp32s3_tft-pinctrl.dtsi | 68 +++++ .../adafruit_feather_esp32s3_tft_appcpu.dts | 32 ++ .../adafruit_feather_esp32s3_tft_appcpu.yaml | 27 ++ ...fruit_feather_esp32s3_tft_appcpu_defconfig | 4 + .../adafruit_feather_esp32s3_tft_procpu.dts | 253 ++++++++++++++++ .../adafruit_feather_esp32s3_tft_procpu.yaml | 23 ++ ...fruit_feather_esp32s3_tft_procpu_defconfig | 9 + boards/adafruit/feather_esp32s3_tft/board.c | 27 ++ .../adafruit/feather_esp32s3_tft/board.cmake | 9 + boards/adafruit/feather_esp32s3_tft/board.yml | 6 + .../doc/img/adafruit_feather_esp32s3_tft.webp | Bin 0 -> 39706 bytes .../feather_esp32s3_tft/doc/index.rst | 282 ++++++++++++++++++ .../feather_connector.dtsi | 40 +++ .../feather_esp32s3_tft/support/openocd.cfg | 7 + samples/subsys/display/lvgl/README.rst | 1 + .../adafruit_feather_esp32s3_tft_procpu.conf | 6 + ...dafruit_feather_esp32s3_tft_procpu.overlay | 3 + 22 files changed, 860 insertions(+) create mode 100644 boards/adafruit/feather_esp32s3_tft/CMakeLists.txt create mode 100644 boards/adafruit/feather_esp32s3_tft/Kconfig create mode 100644 boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft create mode 100644 boards/adafruit/feather_esp32s3_tft/Kconfig.defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft/Kconfig.sysbuild create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft-pinctrl.dtsi create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.yaml create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.yaml create mode 100644 boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu_defconfig create mode 100644 boards/adafruit/feather_esp32s3_tft/board.c create mode 100644 boards/adafruit/feather_esp32s3_tft/board.cmake create mode 100644 boards/adafruit/feather_esp32s3_tft/board.yml create mode 100644 boards/adafruit/feather_esp32s3_tft/doc/img/adafruit_feather_esp32s3_tft.webp create mode 100644 boards/adafruit/feather_esp32s3_tft/doc/index.rst create mode 100644 boards/adafruit/feather_esp32s3_tft/feather_connector.dtsi create mode 100644 boards/adafruit/feather_esp32s3_tft/support/openocd.cfg create mode 100644 samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.conf create mode 100644 samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.overlay diff --git a/boards/adafruit/feather_esp32s3_tft/CMakeLists.txt b/boards/adafruit/feather_esp32s3_tft/CMakeLists.txt new file mode 100644 index 0000000000000..218a0602483ab --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/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/Kconfig b/boards/adafruit/feather_esp32s3_tft/Kconfig new file mode 100644 index 0000000000000..86f1012ae0d95 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/Kconfig @@ -0,0 +1,10 @@ +# Adafruit Feather ESP32S3 board configuration + +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 4096 if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_ESP32S3_PROCPU + default 256 if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_ESP32S3_APPCPU diff --git a/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft b/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft new file mode 100644 index 0000000000000..cd78387ff8876 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/Kconfig.adafruit_feather_esp32s3_tft @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. +# Copyright (c) 2024 Leon Rinkel +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT + select SOC_ESP32S3_WROOM_N8 + 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/Kconfig.defconfig b/boards/adafruit/feather_esp32s3_tft/Kconfig.defconfig new file mode 100644 index 0000000000000..2c3e9c9cfa768 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/Kconfig.defconfig @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Leon Rinkel +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT_ESP32S3_PROCPU + +if DISPLAY + +config BOARD_ADAFRUIT_FEATHER_ESP32S3_TFT + 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_PROCPU diff --git a/boards/adafruit/feather_esp32s3_tft/Kconfig.sysbuild b/boards/adafruit/feather_esp32s3_tft/Kconfig.sysbuild new file mode 100644 index 0000000000000..8d3acb9e11d7c --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/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/adafruit_feather_esp32s3_tft-pinctrl.dtsi b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft-pinctrl.dtsi new file mode 100644 index 0000000000000..0cf040eeb87d1 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft-pinctrl.dtsi @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + 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_default: spim3_default { + group1 { + pinmux = ; + }; + }; + + twai_default: twai_default { + group1 { + pinmux = , + ; + }; + }; +}; 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 new file mode 100644 index 0000000000000..f4662f4b0a3ee --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.dts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd. + * Copyright (c) 2024 Leon Rinkel + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include "adafruit_feather_esp32s3_tft-pinctrl.dtsi" + +/ { + model = "Adafruit Feather ESP32S3 TFT APPCPU"; + compatible = "adafruit,feather_esp32s3_tft", "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/adafruit_feather_esp32s3_tft_appcpu.yaml b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.yaml new file mode 100644 index 0000000000000..baed9f8ff70d1 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: adafruit_feather_esp32s3_tft/esp32s3/appcpu +name: Adafruit Feather ESP32-S3 TFT 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/adafruit_feather_esp32s3_tft_appcpu_defconfig b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu_defconfig new file mode 100644 index 0000000000000..9abf2ff0430ab --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_appcpu_defconfig @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 +CONFIG_CLOCK_CONTROL=y 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 new file mode 100644 index 0000000000000..b09b6262aa1e9 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.dts @@ -0,0 +1,253 @@ +/* + * 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-pinctrl.dtsi" + +/ { + model = "Adafruit Feather ESP32S3 TFT PROCPU"; + compatible = "adafruit,feather_esp32s3_tft", "espressif,esp32s3"; + + aliases { + i2c-0 = &i2c0; + 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; + zephyr,display = &st7789v_tft; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + uart-0 = &uart0; + sw0 = &button0; + led0 = &led0; + led-strip = &led_strip; + backlight = &led1; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BOOT Button"; + zephyr,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + }; + led1: led_1 { + 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 = <&gpio1 34 GPIO_ACTIVE_HIGH>; + }; + + /* + * On-board regulator powers I2C pull-ups and external devices connected + * via the STEMMA QT connector. + */ + i2c_reg: i2c_reg { + compatible = "power-domain-gpio"; + #power-domain-cells = <0>; + enable-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + }; + + mipi_dbi { + compatible = "zephyr,mipi-dbi-spi"; + spi-dev = <&spi2>; + dc-gpios = <&gpio1 39 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio1 40 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 = "disabled"; +}; + +&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 = ; +}; + +&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_default>; + pinctrl-names = "default"; + + /* Workaround to support WS2812 driver */ + line-idle-low; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + power-domains = <&neopixel_pwr>; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <6400000>; + + /* WS2812 */ + 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/adafruit_feather_esp32s3_tft_procpu.yaml b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.yaml new file mode 100644 index 0000000000000..bed1ac8ba70fc --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu.yaml @@ -0,0 +1,23 @@ +identifier: adafruit_feather_esp32s3_tft/esp32s3/procpu +name: Adafruit Feather ESP32-S3 TFT 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/adafruit_feather_esp32s3_tft_procpu_defconfig b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu_defconfig new file mode 100644 index 0000000000000..d789bab1824a6 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/adafruit_feather_esp32s3_tft_procpu_defconfig @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 + +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/board.c b/boards/adafruit/feather_esp32s3_tft/board.c new file mode 100644 index 0000000000000..88aa3b0b35447 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/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/board.cmake b/boards/adafruit/feather_esp32s3_tft/board.cmake new file mode 100644 index 0000000000000..2f04d1fe8861e --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/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/board.yml b/boards/adafruit/feather_esp32s3_tft/board.yml new file mode 100644 index 0000000000000..86f7b9293c892 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/board.yml @@ -0,0 +1,6 @@ +board: + name: adafruit_feather_esp32s3_tft + full_name: Adafruit Feather ESP32S3 TFT + vendor: adafruit + socs: + - name: esp32s3 diff --git a/boards/adafruit/feather_esp32s3_tft/doc/img/adafruit_feather_esp32s3_tft.webp b/boards/adafruit/feather_esp32s3_tft/doc/img/adafruit_feather_esp32s3_tft.webp new file mode 100644 index 0000000000000000000000000000000000000000..796170908e7e36900502d375ed0813979fc58fad GIT binary patch literal 39706 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�C4q9DiPCX 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%0DW1`W;tfGkD4r`#Zc<_9WvPXi zVWcXlXDmUk&?$y(`tdlp*4|{`*%R*I-~$AJ7$O#1$Vv~3b9BZ&S|1-z6;omF00=hu zRR!JlUbp@C!?*~?x5H72F)maEpP6d45#v}PoNQ1Tt5iQ13^98UctQe1V~5Cro=dQ& yvs7W~66!CryM}LN6G3tNlyVFWyI@mK?jhbkndHG!u?HlvB%mk9Ol#o@0000EhovU~ literal 0 HcmV?d00001 diff --git a/boards/adafruit/feather_esp32s3_tft/doc/index.rst b/boards/adafruit/feather_esp32s3_tft/doc/index.rst new file mode 100644 index 0000000000000..d628a8e5c31f9 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/doc/index.rst @@ -0,0 +1,282 @@ +.. zephyr:board:: adafruit_feather_esp32s3_tft + +Overview +******** + +The Adafruit Feather ESP32-S3 TFT is an ESP32-S3 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 LiPo battery charger, a fuel gauge, a USB-C and Qwiic/STEMMA-QT connector. +Compared to the base model, this TFT variant additionally comes with a 240x135 +pixel IPS TFT color display. For more information, check +`Adafruit Feather ESP32-S3 TFT`_. + +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 +- 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 and boot 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 + +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 +================== + +The current ``adafruit_feather_esp32s3_tft`` board supports the following +hardware features: + ++------------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++============+============+=====================================+ +| UART | on-chip | serial port | ++------------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++------------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++------------+------------+-------------------------------------+ +| USB-JTAG | on-chip | hardware interface | ++------------+------------+-------------------------------------+ +| SPI Master | on-chip | spi | ++------------+------------+-------------------------------------+ +| TWAI/CAN | on-chip | can | ++------------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++------------+------------+-------------------------------------+ +| Timers | on-chip | counter | ++------------+------------+-------------------------------------+ +| Watchdog | on-chip | watchdog | ++------------+------------+-------------------------------------+ +| TRNG | on-chip | entropy | ++------------+------------+-------------------------------------+ +| LEDC | on-chip | pwm | ++------------+------------+-------------------------------------+ +| MCPWM | on-chip | pwm | ++------------+------------+-------------------------------------+ +| PCNT | on-chip | qdec | ++------------+------------+-------------------------------------+ +| GDMA | on-chip | dma | ++------------+------------+-------------------------------------+ +| USB-CDC | on-chip | serial | ++------------+------------+-------------------------------------+ +| Wi-Fi | on-chip | | ++------------+------------+-------------------------------------+ +| Bluetooth | on-chip | | ++------------+------------+-------------------------------------+ + +Connections and IOs +=================== + +The `Adafruit Feather ESP32-S3 TFT User Guide`_ has detailed information about +the board including `pinouts`_ and the `schematic`_. + +Programming and Debugging +************************* + +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/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: adafruit_feather_esp32s3_tft/esp32s3/procpu + :goals: build + +The usual ``flash`` target will work with the ``adafruit_feather_esp32s3_tft`` +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/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 + +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/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/esp32s3/procpu + :goals: debug + +References +********** + +.. target-notes:: + +.. _`Adafruit Feather ESP32-S3 TFT`: + https://www.adafruit.com/product/5483 + +.. _`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 Feather ESP32-S3 TFT User Guide: + https://learn.adafruit.com/adafruit-esp32-s3-tft-feather + +.. _pinouts: + https://learn.adafruit.com/adafruit-esp32-s3-tft-feather/pinouts + +.. _schematic: + https://learn.adafruit.com/adafruit-esp32-s3-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/feather_connector.dtsi b/boards/adafruit/feather_esp32s3_tft/feather_connector.dtsi new file mode 100644 index 0000000000000..9a4dd731e8ca9 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/feather_connector.dtsi @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Richard Osterloh + * Copyright (c) 2024 Leon Rinkel + * + * 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 &gpio0 2 0>, /* RX */ + <10 0 &gpio0 1 0>, /* TX */ + <11 0 &gpio1 44 0>, /* DB */ + <12 0 &gpio1 42 0>, /* SDA */ + <13 0 &gpio1 41 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/support/openocd.cfg b/boards/adafruit/feather_esp32s3_tft/support/openocd.cfg new file mode 100644 index 0000000000000..2f740b4a36ab1 --- /dev/null +++ b/boards/adafruit/feather_esp32s3_tft/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/subsys/display/lvgl/README.rst b/samples/subsys/display/lvgl/README.rst index 0bfeff7c7639c..135aca3cfa84b 100644 --- a/samples/subsys/display/lvgl/README.rst +++ b/samples/subsys/display/lvgl/README.rst @@ -46,6 +46,7 @@ for corresponding connectors, for example: or a board with an integrated display: - :zephyr:board:`esp_wrover_kit` +- :zephyr:board:`adafruit_feather_esp32s3_tft` or a simulated display environment in a :ref:`native_sim ` application: diff --git a/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.conf b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.conf new file mode 100644 index 0000000000000..cf023663fe53a --- /dev/null +++ b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_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_procpu.overlay b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.overlay new file mode 100644 index 0000000000000..bf62c27670add --- /dev/null +++ b/samples/subsys/display/lvgl/boards/adafruit_feather_esp32s3_tft_procpu.overlay @@ -0,0 +1,3 @@ +&st7789v_tft { + status = "okay"; +};