From 4e3a2e177a38db34c0232ff2589b3047a6d4a556 Mon Sep 17 00:00:00 2001 From: Thibo Verheyde Date: Mon, 27 May 2024 12:27:00 +0200 Subject: [PATCH] boards: dptechnics: Add support for Walter board Add board definitions for the DPTechnics Walter board. Signed-off-by: Thibo Verheyde --- boards/dptechnics/index.rst | 10 + boards/dptechnics/walter/Kconfig.defconfig | 24 ++ boards/dptechnics/walter/Kconfig.sysbuild | 10 + boards/dptechnics/walter/Kconfig.walter | 7 + boards/dptechnics/walter/board.cmake | 9 + boards/dptechnics/walter/board.yml | 5 + boards/dptechnics/walter/doc/img/walter.webp | Bin 0 -> 27080 bytes boards/dptechnics/walter/doc/index.rst | 284 ++++++++++++++++++ boards/dptechnics/walter/support/openocd.cfg | 7 + boards/dptechnics/walter/walter-pinctrl.dtsi | 91 ++++++ .../walter/walter_esp32s3_appcpu.dts | 65 ++++ .../walter/walter_esp32s3_appcpu.yaml | 27 ++ .../walter/walter_esp32s3_appcpu_defconfig | 4 + .../walter/walter_esp32s3_procpu.dts | 156 ++++++++++ .../walter/walter_esp32s3_procpu.yaml | 23 ++ .../walter/walter_esp32s3_procpu_defconfig | 10 + 16 files changed, 732 insertions(+) create mode 100644 boards/dptechnics/index.rst create mode 100644 boards/dptechnics/walter/Kconfig.defconfig create mode 100644 boards/dptechnics/walter/Kconfig.sysbuild create mode 100644 boards/dptechnics/walter/Kconfig.walter create mode 100644 boards/dptechnics/walter/board.cmake create mode 100644 boards/dptechnics/walter/board.yml create mode 100644 boards/dptechnics/walter/doc/img/walter.webp create mode 100644 boards/dptechnics/walter/doc/index.rst create mode 100644 boards/dptechnics/walter/support/openocd.cfg create mode 100644 boards/dptechnics/walter/walter-pinctrl.dtsi create mode 100644 boards/dptechnics/walter/walter_esp32s3_appcpu.dts create mode 100644 boards/dptechnics/walter/walter_esp32s3_appcpu.yaml create mode 100644 boards/dptechnics/walter/walter_esp32s3_appcpu_defconfig create mode 100644 boards/dptechnics/walter/walter_esp32s3_procpu.dts create mode 100644 boards/dptechnics/walter/walter_esp32s3_procpu.yaml create mode 100644 boards/dptechnics/walter/walter_esp32s3_procpu_defconfig diff --git a/boards/dptechnics/index.rst b/boards/dptechnics/index.rst new file mode 100644 index 000000000000000..5250730214b3d53 --- /dev/null +++ b/boards/dptechnics/index.rst @@ -0,0 +1,10 @@ +.. _boards-dptechnics: + +DPTechnics +########## + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/boards/dptechnics/walter/Kconfig.defconfig b/boards/dptechnics/walter/Kconfig.defconfig new file mode 100644 index 000000000000000..5c2f7b95e8c7822 --- /dev/null +++ b/boards/dptechnics/walter/Kconfig.defconfig @@ -0,0 +1,24 @@ +# Copyright (c) 2024 DPTechnics bv +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_WALTER_ESP32S3_PROCPU + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 65535 if WIFI && BT + default 51200 if WIFI + default 40960 if BT + default 4096 + +choice BT_HCI_BUS_TYPE + default BT_ESP32 if BT +endchoice + +endif # BOARD_WALTER_ESP32S3_PROCPU + +if BOARD_WALTER_ESP32S3_APPCPU + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + default 256 + +endif # BOARD_WALTER_ESP32S3_APPCPU diff --git a/boards/dptechnics/walter/Kconfig.sysbuild b/boards/dptechnics/walter/Kconfig.sysbuild new file mode 100644 index 000000000000000..2c336571d831154 --- /dev/null +++ b/boards/dptechnics/walter/Kconfig.sysbuild @@ -0,0 +1,10 @@ +# Copyright (c) 2024 DPTechnics bv +# 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/dptechnics/walter/Kconfig.walter b/boards/dptechnics/walter/Kconfig.walter new file mode 100644 index 000000000000000..5e0fe1ae84079e8 --- /dev/null +++ b/boards/dptechnics/walter/Kconfig.walter @@ -0,0 +1,7 @@ +# Copyright (c) 2024 DPTechnics bv +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_WALTER + select SOC_ESP32S3_WROOM_N16R2 + select SOC_ESP32S3_PROCPU if BOARD_WALTER_ESP32S3_PROCPU + select SOC_ESP32S3_APPCPU if BOARD_WALTER_ESP32S3_APPCPU diff --git a/boards/dptechnics/walter/board.cmake b/boards/dptechnics/walter/board.cmake new file mode 100644 index 000000000000000..2f04d1fe8861ea6 --- /dev/null +++ b/boards/dptechnics/walter/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/dptechnics/walter/board.yml b/boards/dptechnics/walter/board.yml new file mode 100644 index 000000000000000..c416d547fb2052f --- /dev/null +++ b/boards/dptechnics/walter/board.yml @@ -0,0 +1,5 @@ +board: + name: walter + vendor: dptechnics + socs: + - name: esp32s3 diff --git a/boards/dptechnics/walter/doc/img/walter.webp b/boards/dptechnics/walter/doc/img/walter.webp new file mode 100644 index 0000000000000000000000000000000000000000..b29c42184e4317a6c3167eda730b6e6fd2c2ef9f GIT binary patch literal 27080 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

xS41U+rH8>C;SbAw7qGf;6$Go zebyPwsOlH|<;+oKnteT8{EbXIe3CjzK`gf-{edpI|3d^#KCI7roph!dkYu~iil*cv zSo3c&OZ+9sMwJ4cqS~MX#1xP@6^-PXACL{%BpexLY)nPL|7dGC$|Ib(P_hKa+0@Ql zswQ3{xJv~uLQv3#<{n1~9D?v)C>6=f4L|~GLBbzOu)9DApme>G0000A!8Y9BM|)K| z@8X(_3p~>VIWtAAa%_){%$2VgZ-y+KZ2-e2Sjx!1EY8P@KhVy&ZWRZ9$U* zQw02!f~*M%Fu%#}v+a@8A^_+)VW}q_EuC2G?@%2;0d66r>z`AY00000000000KrX^ AM*si- literal 0 HcmV?d00001 diff --git a/boards/dptechnics/walter/doc/index.rst b/boards/dptechnics/walter/doc/index.rst new file mode 100644 index 000000000000000..d4024d924125d46 --- /dev/null +++ b/boards/dptechnics/walter/doc/index.rst @@ -0,0 +1,284 @@ +.. _walter: + +DPTechnics Walter +################# + +Overview +******** + +Walter is a compact IoT development board that combines an Espressif ESP32-S3 SoC +with a Sequans Monarch 2 GM02SP LTE-M/NB-IoT/GNSS modem. + +To help you get the most out of Walter, we have published the `schematic`_ and the +`KiCAD footprint`_, along with our `datasheet`_ which describes all pins and test pads. + +.. figure:: img/walter.webp + :align: center + :alt: DPTechnics Walter board + + DPTechnics Walter board (Credit: DPTechnics bv) + +Hardware +******** + +ESP32-S3-WROOM-1-N16R2 microcontroller: + +- Xtensa dual-core 32-bit LX7 CPU +- 16 MiB quad SPI flash memory +- 2 MiB quad SPI PSRAM +- 150 Mbps 802.11 b/g/n Wi-Fi 4 with on-board PCB antenna +- 2 Mbps Bluetooth 5 Low Energy with on-board PCB antenna + +Sequans Monarch 2 GM02SP modem: + +- Dual-mode LTE-M / NB-IoT (NB1, NB2) +- 3GPP LTE release 14 (Upgradable up to release 17) +- Ultra-low, deep-sleep mode in eDRX and PSM +- Adaptive +23 dBm, +20 dBm and +14 dBm output power +- Integrated LNA and SAW filter for GNSS reception +- Assisted and non-assisted GNSS with GPS and Galileo constellations +- Integrated SIM card +- Nano-SIM card slot +- u.FL RF connectors for GNSS and 5G antennas + +Inputs & outputs: + +- 24 GPIO pins for application use +- UART, SPI, I²C, CAN, I²S, and SD available on any of the GPIO pins +- ADC, DAC, and PWM integrated in ESP32-S3 +- 3.3 V software-controllable output +- USB Type-C connector for flashing and debugging +- 22 test points for production programming and testing +- On-board reset button + +Power supply + +- 5.0 V via USB Type-C +- 3.0 - 5.5 V via Vin pin +- Not allowed to use both power inputs simultaneously +- Designed for extremely low quiescent current + +Form factor + +- Easy to integrate via 2.54 mm headers +- 55 mm x 24.8 mm board dimensions +- Pin and footprint compatible with EOL Pycom GPy +- Breadboard friendly + +Supported Features +================== + +Current Zephyr's Walter board supports the following 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 | ++------------+------------+-------------------------------------+ +| RADIO | on-board | modem_cellular | ++------------+------------+-------------------------------------+ + +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. + ``` + 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 + :app: samples/hello_world + :board: walter/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 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: walter/esp32s3/procpu + :goals: build + +The usual ``flash`` target will work with the ``walter`` board +configuration. Here is an example for the :ref:`hello_world` +application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: walter/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! walter/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 :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: walter/esp32s3/procpu + :goals: build flash + +You can debug an application in the usual way. Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: walter/esp32s3/procpu + :goals: debug + +.. _`JTAG debugging for ESP32-S3`: + https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/jtag-debugging/ + +.. _`OpenOCD`: + https://github.com/openocd-org/openocd + +References +********** + +.. target-notes:: + +.. _`schematic`: + https://github.com/QuickSpot/walter-hardware/tree/main/walter/schematic + +.. _`KiCAD footprint`: + https://github.com/QuickSpot/walter-hardware/tree/main/walter/footprint + +.. _`datasheet`: + https://www.quickspot.io/datasheet/walter_datasheet.pdf diff --git a/boards/dptechnics/walter/support/openocd.cfg b/boards/dptechnics/walter/support/openocd.cfg new file mode 100644 index 000000000000000..2f740b4a36ab1f4 --- /dev/null +++ b/boards/dptechnics/walter/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/boards/dptechnics/walter/walter-pinctrl.dtsi b/boards/dptechnics/walter/walter-pinctrl.dtsi new file mode 100644 index 000000000000000..7ee165dd9349db7 --- /dev/null +++ b/boards/dptechnics/walter/walter-pinctrl.dtsi @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2024 DPTechnics bv + * + * 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; + }; + group3 { + pinmux = ; + output-high; + }; + group4 { + pinmux = ; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + spim3_default: spim3_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + twai_default: twai_default { + group1 { + pinmux = , + ; + }; + }; +}; diff --git a/boards/dptechnics/walter/walter_esp32s3_appcpu.dts b/boards/dptechnics/walter/walter_esp32s3_appcpu.dts new file mode 100644 index 000000000000000..c7f853d75f9e3f2 --- /dev/null +++ b/boards/dptechnics/walter/walter_esp32s3_appcpu.dts @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 DPTechnics bv + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +/ { + model = "DPTechnics Walter APPCPU"; + compatible = "espressif,esp32s3"; + + chosen { + zephyr,sram = &sram0; + zephyr,ipc_shm = &shm0; + zephyr,ipc = &ipm0; + }; +}; + +&trng0 { + status = "okay"; +}; + +&ipm0 { + status = "okay"; +}; + +&flash0 { + status = "okay"; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserve 64kB for the bootloader */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00010000>; + read-only; + }; + + /* Reserve 1024kB for the application in slot 0 */ + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00100000>; + }; + + /* Reserve 1024kB for the application in slot 1 */ + slot1_partition: partition@110000 { + label = "image-1"; + reg = <0x00110000 0x00100000>; + }; + + /* Reserve 256kB for the scratch partition */ + scratch_partition: partition@210000 { + label = "image-scratch"; + reg = <0x00210000 0x00040000>; + }; + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00006000>; + }; + }; +}; diff --git a/boards/dptechnics/walter/walter_esp32s3_appcpu.yaml b/boards/dptechnics/walter/walter_esp32s3_appcpu.yaml new file mode 100644 index 000000000000000..4c83151153e4e48 --- /dev/null +++ b/boards/dptechnics/walter/walter_esp32s3_appcpu.yaml @@ -0,0 +1,27 @@ +identifier: walter/esp32s3/appcpu +name: Walter 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: dptechnics diff --git a/boards/dptechnics/walter/walter_esp32s3_appcpu_defconfig b/boards/dptechnics/walter/walter_esp32s3_appcpu_defconfig new file mode 100644 index 000000000000000..9abf2ff0430aba3 --- /dev/null +++ b/boards/dptechnics/walter/walter_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/dptechnics/walter/walter_esp32s3_procpu.dts b/boards/dptechnics/walter/walter_esp32s3_procpu.dts new file mode 100644 index 000000000000000..ac5f4c0bbfdb37f --- /dev/null +++ b/boards/dptechnics/walter/walter_esp32s3_procpu.dts @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2024 DPTechnics bv + * + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include "espressif/esp32s3/esp32s3_wroom_n16r2.dtsi" +#include "walter-pinctrl.dtsi" + +/ { + model = "DPTechnics Walter PROCPU"; + compatible = "espressif,esp32s3"; + + aliases { + modem = &modem; + modem-uart = &uart1; + i2c-0 = &i2c0; + watchdog0 = &wdt0; + uart-0 = &usb_serial; + }; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &usb_serial; + zephyr,shell-uart = &usb_serial; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + }; +}; + +&usb_serial { + status = "okay"; +}; + +&uart0 { + status = "disabled"; +}; + +&uart1 { + status = "okay"; + current-speed = <115200>; + hw-flow-control; + pinctrl-0 = <&uart1_default>; + pinctrl-names = "default"; + modem: modem { + status = "okay"; + compatible = "sqn,gm02s"; + mdm-reset-gpios = <&gpio1 13 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + }; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&i2c1 { + clock-frequency = ; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; +}; + +&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"; +}; + +&twai { + pinctrl-0 = <&twai_default>; + pinctrl-names = "default"; + bus-speed = <125000>; +}; + +&timer0 { + status = "disabled"; +}; + +&timer1 { + status = "disabled"; +}; + +&timer2 { + status = "disabled"; +}; + +&timer3 { + status = "disabled"; +}; + +&wdt0 { + status = "okay"; +}; + +&trng0 { + status = "okay"; +}; + +&flash0 { + status = "okay"; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserve 64kB for the bootloader */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00010000>; + read-only; + }; + + /* Reserve 1024kB for the application in slot 0 */ + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00100000>; + }; + + /* Reserve 1024kB for the application in slot 1 */ + slot1_partition: partition@110000 { + label = "image-1"; + reg = <0x00110000 0x00100000>; + }; + + /* Reserve 256kB for the scratch partition */ + scratch_partition: partition@210000 { + label = "image-scratch"; + reg = <0x00210000 0x00040000>; + }; + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00006000>; + }; + }; +}; diff --git a/boards/dptechnics/walter/walter_esp32s3_procpu.yaml b/boards/dptechnics/walter/walter_esp32s3_procpu.yaml new file mode 100644 index 000000000000000..839c29069a703ab --- /dev/null +++ b/boards/dptechnics/walter/walter_esp32s3_procpu.yaml @@ -0,0 +1,23 @@ +identifier: walter/esp32s3/procpu +name: Walter PROCPU +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - gpio + - uart + - i2c + - spi + - can + - counter + - watchdog + - entropy + - pwm + - dma + - input +testing: + ignore_tags: + - net + - bluetooth +vendor: dptechnics diff --git a/boards/dptechnics/walter/walter_esp32s3_procpu_defconfig b/boards/dptechnics/walter/walter_esp32s3_procpu_defconfig new file mode 100644 index 000000000000000..59f3df7a866cb87 --- /dev/null +++ b/boards/dptechnics/walter/walter_esp32s3_procpu_defconfig @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_GPIO=y +CONFIG_CLOCK_CONTROL=y