boards: waveshare: esp32s3_matrix: Bring up board for ESP32-S3-Matrix

ESP32-S3-Matrix is a tiny board from Waveshare, shipped with an
ESP32-S3FH4R2, a QMI8658C IMU and an 8x8 WS2812 RGB matrix.

Signed-off-by: Chen Xingyu <hi@xingrz.me>
This commit is contained in:
Chen Xingyu 2025-01-28 13:34:31 +08:00 committed by Benjamin Cabé
commit d4e302cc97
15 changed files with 485 additions and 0 deletions

View file

@ -0,0 +1,8 @@
# Copyright (c) 2024 Joel Guittet
# Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
# SPDX-License-Identifier: Apache-2.0
config HEAP_MEM_POOL_ADD_SIZE_BOARD
int
default 4096 if BOARD_ESP32S3_MATRIX_ESP32S3_PROCPU
default 256 if BOARD_ESP32S3_MATRIX_ESP32S3_APPCPU

View file

@ -0,0 +1,8 @@
# Copyright (c) 2024 Joel Guittet
# Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
# SPDX-License-Identifier: Apache-2.0
config BOARD_ESP32S3_MATRIX
select SOC_ESP32S3_R2
select SOC_ESP32S3_PROCPU if BOARD_ESP32S3_MATRIX_ESP32S3_PROCPU
select SOC_ESP32S3_APPCPU if BOARD_ESP32S3_MATRIX_ESP32S3_APPCPU

View file

@ -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

View file

@ -0,0 +1,10 @@
# Copyright (c) 2024 Joel Guittet
# SPDX-License-Identifier: Apache-2.0
if(NOT "${OPENOCD}" MATCHES "^${ESPRESSIF_TOOLCHAIN_PATH}/.*")
set(OPENOCD OPENOCD-NOTFOUND)
endif()
find_program(OPENOCD openocd PATHS ${ESPRESSIF_TOOLCHAIN_PATH}/openocd-esp32/bin NO_DEFAULT_PATH)
include(${ZEPHYR_BASE}/boards/common/esp32.board.cmake)
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)

View file

@ -0,0 +1,6 @@
board:
name: esp32s3_matrix
full_name: ESP32-S3-Matrix
vendor: waveshare
socs:
- name: esp32s3

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,229 @@
.. zephyr:board:: esp32s3_matrix
Overview
********
The ESP32-S3-Matrix is an ESP32S3 development board from Waveshare with a 8x8
RGB LED matrix. This board integrates complete Wi-Fi and Bluetooth Low Energy
functions, an accelerometer and gyroscope, a battery charger and GPIO extension
port.
Hardware
********
ESP32-S3 is a low-power MCU-based system on a chip (SoC) with integrated 2.4 GHz Wi-Fi
and Bluetooth® Low Energy (Bluetooth LE). It consists of high-performance dual-core microprocessor
(Xtensa® 32-bit LX7), a low power coprocessor, a Wi-Fi baseband, a Bluetooth LE baseband,
RF module, and numerous peripherals.
ESP32-S3-Matrix includes the following features:
- Dual core 32-bit Xtensa Microprocessor (Tensilica LX7), running up to 240MHz
- Additional vector instructions support for AI acceleration
- 512KB of SRAM
- 2MB of PSRAM
- 4MB of FLASH
- Wi-Fi 802.11b/g/n
- Bluetooth LE 5.0 with long-range support and up to 2Mbps data rate
- 8x8 RGB LED matrix
- Accelerometer/gyroscope
Digital interfaces:
- 15 programmable GPIOs
Low Power:
- Power Management Unit with five power modes
- Ultra-Low-Power (ULP) coprocessors: ULP-RISC-V and ULP-FSM
Security:
- Secure boot
- Flash encryption
- 4-Kbit OTP, up to 1792 bits for users
- Cryptographic hardware acceleration: (AES-128/256, Hash, RSA, RNG, HMAC, Digital signature)
Asymmetric Multiprocessing (AMP)
********************************
ESP32-S3 allows 2 different applications to be executed in ESP32-S3 SoC. 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`_ or the technical reference
manual at `ESP32-S3 Technical Reference Manual`_.
Supported Features
==================
.. zephyr:board-supported-hw::
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
*******************
.. zephyr:board-supported-runners::
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 built (and flashed) 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: esp32s3_matrix/esp32s3/procpu
:goals: build
:west-args: --sysbuild
:compact:
By default, the ESP32 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 built 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: esp32s3_matrix/esp32s3/procpu
:goals: build
The usual ``flash`` target will work with the ``esp32s3_matrix`` board
configuration. Here is an example for the :zephyr:code-sample:`hello_world`
application.
.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: esp32s3_matrix/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! esp32s3_matrix
Debugging
*********
ESP32-S3 support on OpenOCD is available at `OpenOCD ESP32`_.
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: esp32s3_matrix/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: esp32s3_matrix/esp32s3/procpu
:goals: debug
References
**********
.. target-notes::
.. _ESP32-S3-Matrix Waveshare Wiki: https://www.waveshare.com/wiki/ESP32-S3-Matrix
.. _ESP32-S3 Datasheet: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf
.. _ESP32-S3 Technical Reference Manual: https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf
.. _`JTAG debugging for ESP32-S3`: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/jtag-debugging/
.. _`OpenOCD ESP32`: https://github.com/espressif/openocd-esp32/releases

View file

@ -0,0 +1,18 @@
/*
* Copyright (c) 2024 Joel Guittet
* Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
* SPDX-License-Identifier: Apache-2.0
*/
#include <dt-bindings/pinctrl/esp32s3-pinctrl.h>
#include <zephyr/dt-bindings/pinctrl/esp-pinctrl-common.h>
#include <zephyr/dt-bindings/pinctrl/esp32s3-gpio-sigmap.h>
&pinctrl {
spim2_ws2812_led: spim2_ws2812_led {
group1 {
pinmux = <SPIM2_MOSI_GPIO14>;
output-low;
};
};
};

View file

@ -0,0 +1,30 @@
/*
* Copyright (c) 2024 Joel Guittet
* Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
* SPDX-License-Identifier: Apache-2.0
*/
/dts-v1/;
#include <espressif/esp32s3/esp32s3_r2.dtsi>
#include <espressif/partitions_0x0_amp_4M.dtsi>
/ {
model = "ESP32-S3-Matrix APPCPU";
compatible = "waveshare,esp32-s3-matrix";
chosen {
zephyr,sram = &sram1;
zephyr,ipc_shm = &shm0;
zephyr,ipc = &ipm0;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_appcpu_partition;
};
};
&flash0 {
reg = <0x0 DT_SIZE_M(4)>;
};
&trng0 {
status = "okay";
};

View file

@ -0,0 +1,27 @@
identifier: esp32s3_matrix/esp32s3/appcpu
name: ESP32-S3-Matrix 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: waveshare

View file

@ -0,0 +1,4 @@
# Copyright (c) 2024 Joel Guittet
# SPDX-License-Identifier: Apache-2.0
CONFIG_CLOCK_CONTROL=y

View file

@ -0,0 +1,102 @@
/*
* Copyright (c) 2024 Joel Guittet
* Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
* SPDX-License-Identifier: Apache-2.0
*/
/dts-v1/;
#include <espressif/esp32s3/esp32s3_r2.dtsi>
#include <espressif/partitions_0x0_amp_4M.dtsi>
#include <zephyr/dt-bindings/input/input-event-codes.h>
#include <zephyr/dt-bindings/led/led.h>
#include <zephyr/dt-bindings/led/worldsemi_ws2812c.h>
#include "esp32s3_matrix-pinctrl.dtsi"
/ {
model = "ESP32-S3-Matrix PROCPU";
compatible = "waveshare,esp32-s3-matrix";
aliases {
sw0 = &button0;
watchdog0 = &wdt0;
led-strip = &led_strip;
};
chosen {
zephyr,sram = &sram1;
zephyr,console = &usb_serial;
zephyr,shell-uart = &usb_serial;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_partition;
zephyr,display = &rgb_matrix;
zephyr,bt-hci = &esp32_bt_hci;
};
buttons {
compatible = "gpio-keys";
button0: button_0 {
gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "BOOT Button";
zephyr,code = <INPUT_KEY_0>;
};
};
rgb_matrix: rgb-matrix {
compatible = "led-strip-matrix";
status = "okay";
width = <8>;
height = <8>;
circulative;
led-strips = <&led_strip>;
};
};
&flash0 {
reg = <0x0 DT_SIZE_M(4)>;
};
&gpio0 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&spi2 {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
pinctrl-0 = <&spim2_ws2812_led>;
pinctrl-names = "default";
line-idle-low;
led_strip: ws2812@0 {
compatible = "worldsemi,ws2812-spi";
reg = <0>;
spi-max-frequency = <WS2812C_SPI_FREQ>;
chain-length = <64>;
color-mapping = <LED_COLOR_ID_RED>,
<LED_COLOR_ID_GREEN>,
<LED_COLOR_ID_BLUE>;
spi-one-frame = <WS2812C_ONE_FRAME>;
spi-zero-frame = <WS2812C_ZERO_FRAME>;
};
};
&usb_serial {
status = "okay";
};
&trng0 {
status = "okay";
};
&wdt0 {
status = "okay";
};
&esp32_bt_hci {
status = "okay";
};

View file

@ -0,0 +1,14 @@
identifier: esp32s3_matrix/esp32s3/procpu
name: ESP32-S3-Matrix PROCPU
type: mcu
arch: xtensa
toolchain:
- zephyr
supported:
- gpio
- spi
- watchdog
- pinmux
- nvs
- display
vendor: waveshare

View file

@ -0,0 +1,9 @@
# Copyright (c) 2024 Joel Guittet
# Copyright (c) 2025 Chen Xingyu <hi@xingrz.me>
# SPDX-License-Identifier: Apache-2.0
CONFIG_GPIO=y
CONFIG_CONSOLE=y
CONFIG_SERIAL=y
CONFIG_UART_CONSOLE=y
CONFIG_CLOCK_CONTROL=y

View file

@ -0,0 +1,10 @@
# Copyright (c) 2024 Joel Guittet
# SPDX-License-Identifier: Apache-2.0
set ESP_RTOS none
set ESP32_ONLYCPU 1
# Source the JTAG interface configuration file
source [find interface/esp_usb_jtag.cfg]
# Source the ESP32-S3 configuration file
source [find target/esp32s3.cfg]