From 8a71c331e4c4e07802f38c731113cf4177d57624 Mon Sep 17 00:00:00 2001 From: Lena Voytek Date: Mon, 17 Mar 2025 07:55:47 -0400 Subject: [PATCH] boards: adafruit: add initial support for esp32 feather v2 The Adafruit ESP32 Feather V2 is a board that uses the Feather standard layout. It uses an ESP32-PICO v3 02 module, and includes a USB-C connector, LiPo battery charger, NeoPixel RGB LED, and STEMMA QT connector. Signed-off-by: Lena Voytek --- boards/adafruit/feather_esp32/Kconfig | 7 + .../Kconfig.adafruit_feather_esp32 | 9 + .../adafruit_feather_esp32-pinctrl.dtsi | 62 +++++++ .../adafruit_feather_esp32_appcpu.dts | 30 ++++ .../adafruit_feather_esp32_appcpu.yaml | 27 +++ .../adafruit_feather_esp32_appcpu_defconfig | 3 + .../adafruit_feather_esp32_procpu.dts | 154 ++++++++++++++++++ .../adafruit_feather_esp32_procpu.yaml | 23 +++ .../adafruit_feather_esp32_procpu_defconfig | 6 + boards/adafruit/feather_esp32/board.cmake | 12 ++ boards/adafruit/feather_esp32/board.yml | 11 ++ .../doc/img/adafruit_feather_esp32.webp | Bin 0 -> 37038 bytes boards/adafruit/feather_esp32/doc/index.rst | 113 +++++++++++++ .../boards/adafruit_feather_esp32_procpu.conf | 2 + 14 files changed, 459 insertions(+) create mode 100644 boards/adafruit/feather_esp32/Kconfig create mode 100644 boards/adafruit/feather_esp32/Kconfig.adafruit_feather_esp32 create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32-pinctrl.dtsi create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.dts create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.yaml create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu_defconfig create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.dts create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.yaml create mode 100644 boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu_defconfig create mode 100644 boards/adafruit/feather_esp32/board.cmake create mode 100644 boards/adafruit/feather_esp32/board.yml create mode 100644 boards/adafruit/feather_esp32/doc/img/adafruit_feather_esp32.webp create mode 100644 boards/adafruit/feather_esp32/doc/index.rst create mode 100644 samples/drivers/led/led_strip/boards/adafruit_feather_esp32_procpu.conf diff --git a/boards/adafruit/feather_esp32/Kconfig b/boards/adafruit/feather_esp32/Kconfig new file mode 100644 index 0000000000000..1efedd6b9e5fb --- /dev/null +++ b/boards/adafruit/feather_esp32/Kconfig @@ -0,0 +1,7 @@ +# Copyright (c) 2025 Lena Voytek +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 4096 if BOARD_ADAFRUIT_FEATHER_ESP32_ESP32_PROCPU + default 256 if BOARD_ADAFRUIT_FEATHER_ESP32_ESP32_APPCPU diff --git a/boards/adafruit/feather_esp32/Kconfig.adafruit_feather_esp32 b/boards/adafruit/feather_esp32/Kconfig.adafruit_feather_esp32 new file mode 100644 index 0000000000000..46b91f8babb89 --- /dev/null +++ b/boards/adafruit/feather_esp32/Kconfig.adafruit_feather_esp32 @@ -0,0 +1,9 @@ +# Adafruit Feather ESP32 board configuration + +# Copyright (c) 2025 Lena Voytek +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_ESP32 + select SOC_ESP32_PICO_V3_02 + select SOC_ESP32_PROCPU if BOARD_ADAFRUIT_FEATHER_ESP32_ESP32_PROCPU + select SOC_ESP32_APPCPU if BOARD_ADAFRUIT_FEATHER_ESP32_ESP32_APPCPU diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32-pinctrl.dtsi b/boards/adafruit/feather_esp32/adafruit_feather_esp32-pinctrl.dtsi new file mode 100644 index 0000000000000..1f5d5e9586840 --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32-pinctrl.dtsi @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Lena Voytek + * + * 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; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + ; + }; + + group2 { + pinmux = ; + output-low; + }; + }; + + spim3_ws2812_led: spi3_ws2812_led { + group1 { + pinmux = ; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + drive-open-drain; + output-high; + }; + }; +}; diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.dts b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.dts new file mode 100644 index 0000000000000..3f01dbda27ab9 --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.dts @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include + +/ { + model = "Adafruit Feather ESP32 APPCPU"; + compatible = "espressif,esp32"; + + chosen { + zephyr,sram = &sram1; + zephyr,ipc_shm = &shm0; + zephyr,ipc = &ipm0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_appcpu_partition; + }; +}; + +&ipm0 { + status = "okay"; +}; + +&trng0 { + status = "okay"; +}; diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.yaml b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.yaml new file mode 100644 index 0000000000000..423360ea7b16f --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: adafruit_feather_esp32/esp32/appcpu +name: Adafruit Feather ESP32 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_esp32/adafruit_feather_esp32_appcpu_defconfig b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu_defconfig new file mode 100644 index 0000000000000..48546641cadd6 --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_appcpu_defconfig @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_CLOCK_CONTROL=y diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.dts b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.dts new file mode 100644 index 0000000000000..d3760f4530686 --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.dts @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2025 Lena Voytek + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include "adafruit_feather_esp32-pinctrl.dtsi" +#include +#include +#include +#include + +/ { + model = "Adafruit Feather ESP32 PROCPU"; + compatible = "adafruit,adafruit_feather_esp32"; + + 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; + }; + + aliases { + sw0 = &user_button_0; + watchdog0 = &wdt0; + i2c-0 = &i2c0; + led-strip = &led_strip; + }; + + leds { + compatible = "gpio-leds"; + status = "okay"; + + led0: led_0 { + label = "Red-LED"; + gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + + user_button_0: button_0 { + label = "User button 0"; + gpios = <&gpio1 6 GPIO_ACTIVE_LOW>; // GPIO 38 + zephyr,code = ; + }; + }; +}; + +&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"; + + neopixel_power_enable { + gpio-hog; + gpios = <2 GPIO_ACTIVE_HIGH>; + output-high; + }; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; + sda-gpios = <&gpio0 22 GPIO_OPEN_DRAIN>; + scl-gpios = <&gpio0 20 GPIO_OPEN_DRAIN>; + +}; + +&timer0 { + status = "okay"; +}; + +&timer1 { + status = "okay"; +}; + +&timer2 { + status = "okay"; +}; + +&timer3 { + status = "okay"; +}; + +&trng0 { + status = "okay"; +}; + +&spi2 { + #address-cells = <1>; + #size-cells = <0>; + pinctrl-0 = <&spim2_default>; + pinctrl-names = "default"; +}; + +/* used for SK6812 */ +&spi3 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + line-idle-low; + pinctrl-0 = <&spim3_ws2812_led>; + pinctrl-names = "default"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + reg = <0>; + spi-max-frequency = ; + + chain-length = <1>; + color-mapping = , + , + ; + spi-one-frame = ; + spi-zero-frame = ; + }; +}; + +&wdt0 { + status = "okay"; +}; + +&esp32_bt_hci { + status = "okay"; +}; + +&wifi { + status = "okay"; +}; diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.yaml b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.yaml new file mode 100644 index 0000000000000..0c0c3fb0f1a0f --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu.yaml @@ -0,0 +1,23 @@ +identifier: adafruit_feather_esp32/esp32/procpu +name: Adafruit Feather ESP32 PROCPU +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - gpio + - i2c + - spi + - watchdog + - uart + - pinmux + - nvs + - counter + - entropy + - pwm + - dma + - input + - feather_serial + - feather_i2c + - feather_spi +vendor: adafruit diff --git a/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu_defconfig b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu_defconfig new file mode 100644 index 0000000000000..bff67f69b1af0 --- /dev/null +++ b/boards/adafruit/feather_esp32/adafruit_feather_esp32_procpu_defconfig @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_GPIO=y +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y diff --git a/boards/adafruit/feather_esp32/board.cmake b/boards/adafruit/feather_esp32/board.cmake new file mode 100644 index 0000000000000..91b3caa2c75d5 --- /dev/null +++ b/boards/adafruit/feather_esp32/board.cmake @@ -0,0 +1,12 @@ +# 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) + +# the default ESP32 baud rate is not supported +board_runner_args(esp32 "--esp-baud-rate=1500000") diff --git a/boards/adafruit/feather_esp32/board.yml b/boards/adafruit/feather_esp32/board.yml new file mode 100644 index 0000000000000..24824fe1d8593 --- /dev/null +++ b/boards/adafruit/feather_esp32/board.yml @@ -0,0 +1,11 @@ +board: + name: adafruit_feather_esp32 + full_name: Adafruit Feather ESP32 + vendor: adafruit + socs: + - name: esp32 + revision: + format: number + default: "2" + revisions: + - name: "2" diff --git a/boards/adafruit/feather_esp32/doc/img/adafruit_feather_esp32.webp b/boards/adafruit/feather_esp32/doc/img/adafruit_feather_esp32.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f50d39efd11d4a6a25d5afd09b9165ef93aba06 GIT binary patch literal 37038 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 option during +``west flash`` (e.g. ``west flash --esp-baud-rate 115200``). + +After flashing, view the serial monitor with the espressif monitor command. + +.. code-block:: shell + + west espressif monitor + +Testing +======= + +On-board LED +------------ + +Test the functionality of the user LED connected to pin 13 with the blinky +sample program. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: adafruit_feather_esp32/esp32/procpu + :goals: build flash + +NeoPixel +-------- + +Test the on-board NeoPixel using the led_strip sample program. + +.. zephyr-app-commands:: + :zephyr-app: samples/drivers/led/led_strip + :board: adafruit_feather_esp32/esp32/procpu + :goals: build flash + +User button +----------- + +Test the button labeled SW38 using the button input sample program. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/button + :board: adafruit_feather_esp32/esp32/procpu + :goals: build flash + +Wi-Fi +----- + +Test ESP32 Wi-Fi functionality using the Wi-Fi shell module. + +.. note:: + The hal_espressif blobs must be fetched first. + +.. zephyr-app-commands:: + :zephyr-app: samples/net/wifi/shell + :board: adafruit_feather_esp32/esp32/procpu + :goals: build flash + +References +********** +- `Adafruit ESP32 Feather V2 `_ +- `Adafruit ESP32 Feather V2 Pinouts `_ +- `Adafruit ESP32 Feather V2 Schematic `_ +- `ESP32-PICO-MINI-02 Datasheet `_ (PDF) +- `STEMMA QT `_ diff --git a/samples/drivers/led/led_strip/boards/adafruit_feather_esp32_procpu.conf b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32_procpu.conf new file mode 100644 index 0000000000000..8230eb9896b4f --- /dev/null +++ b/samples/drivers/led/led_strip/boards/adafruit_feather_esp32_procpu.conf @@ -0,0 +1,2 @@ +CONFIG_GPIO=y +CONFIG_GPIO_HOGS=y