From 7fef853015b3f4c44750908348fe36ec22a12612 Mon Sep 17 00:00:00 2001 From: Lothar Felten Date: Tue, 19 Mar 2024 12:11:30 +0100 Subject: [PATCH] boards: lilygo: ttgo_t8c3: initial support adds initial support for Lilygo TTGO T8-C3 board Signed-off-by: Lothar Felten --- boards/lilygo/index.rst | 10 + boards/lilygo/ttgo_t8c3/Kconfig.defconfig | 9 + boards/lilygo/ttgo_t8c3/Kconfig.sysbuild | 10 + boards/lilygo/ttgo_t8c3/Kconfig.ttgo_t8c3 | 5 + boards/lilygo/ttgo_t8c3/board.cmake | 9 + boards/lilygo/ttgo_t8c3/board.yml | 5 + .../lilygo/ttgo_t8c3/doc/img/ttgo_t8c3.webp | Bin 0 -> 45420 bytes boards/lilygo/ttgo_t8c3/doc/index.rst | 233 ++++++++++++++++++ boards/lilygo/ttgo_t8c3/support/openocd.cfg | 6 + .../lilygo/ttgo_t8c3/ttgo_t8c3-pinctrl.dtsi | 51 ++++ boards/lilygo/ttgo_t8c3/ttgo_t8c3.dts | 133 ++++++++++ boards/lilygo/ttgo_t8c3/ttgo_t8c3.yaml | 18 ++ boards/lilygo/ttgo_t8c3/ttgo_t8c3_defconfig | 8 + dts/bindings/vendor-prefixes.txt | 1 + .../uart/uart_async_api/boards/ttgo_t8c3.conf | 2 + .../uart_async_api/boards/ttgo_t8c3.overlay | 31 +++ 16 files changed, 531 insertions(+) create mode 100644 boards/lilygo/index.rst create mode 100644 boards/lilygo/ttgo_t8c3/Kconfig.defconfig create mode 100644 boards/lilygo/ttgo_t8c3/Kconfig.sysbuild create mode 100644 boards/lilygo/ttgo_t8c3/Kconfig.ttgo_t8c3 create mode 100644 boards/lilygo/ttgo_t8c3/board.cmake create mode 100644 boards/lilygo/ttgo_t8c3/board.yml create mode 100644 boards/lilygo/ttgo_t8c3/doc/img/ttgo_t8c3.webp create mode 100644 boards/lilygo/ttgo_t8c3/doc/index.rst create mode 100644 boards/lilygo/ttgo_t8c3/support/openocd.cfg create mode 100644 boards/lilygo/ttgo_t8c3/ttgo_t8c3-pinctrl.dtsi create mode 100644 boards/lilygo/ttgo_t8c3/ttgo_t8c3.dts create mode 100644 boards/lilygo/ttgo_t8c3/ttgo_t8c3.yaml create mode 100644 boards/lilygo/ttgo_t8c3/ttgo_t8c3_defconfig create mode 100644 tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.conf create mode 100644 tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.overlay diff --git a/boards/lilygo/index.rst b/boards/lilygo/index.rst new file mode 100644 index 00000000000..8333f691867 --- /dev/null +++ b/boards/lilygo/index.rst @@ -0,0 +1,10 @@ +.. _boards-lilygo: + +Lilygo +###### + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/boards/lilygo/ttgo_t8c3/Kconfig.defconfig b/boards/lilygo/ttgo_t8c3/Kconfig.defconfig new file mode 100644 index 00000000000..eb2f107cd0d --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Lothar Felten +# SPDX-License-Identifier: Apache-2.0 + +config HEAP_MEM_POOL_ADD_SIZE_BOARD + int + default 65535 if WIFI && BT + default 51200 if WIFI + default 40960 if BT + default 4096 diff --git a/boards/lilygo/ttgo_t8c3/Kconfig.sysbuild b/boards/lilygo/ttgo_t8c3/Kconfig.sysbuild new file mode 100644 index 00000000000..3a2d17ac5cf --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/Kconfig.sysbuild @@ -0,0 +1,10 @@ +# Copyright (c) 2023 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/lilygo/ttgo_t8c3/Kconfig.ttgo_t8c3 b/boards/lilygo/ttgo_t8c3/Kconfig.ttgo_t8c3 new file mode 100644 index 00000000000..60cd233a9b4 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/Kconfig.ttgo_t8c3 @@ -0,0 +1,5 @@ +# Copyright 2024 Lothar Felten +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_TTGO_T8C3 + select SOC_ESP32C3_FX4 diff --git a/boards/lilygo/ttgo_t8c3/board.cmake b/boards/lilygo/ttgo_t8c3/board.cmake new file mode 100644 index 00000000000..2f04d1fe886 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/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/lilygo/ttgo_t8c3/board.yml b/boards/lilygo/ttgo_t8c3/board.yml new file mode 100644 index 00000000000..8b1084a4493 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/board.yml @@ -0,0 +1,5 @@ +board: + name: ttgo_t8c3 + vendor: lilygo + socs: + - name: esp32c3 diff --git a/boards/lilygo/ttgo_t8c3/doc/img/ttgo_t8c3.webp b/boards/lilygo/ttgo_t8c3/doc/img/ttgo_t8c3.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea11307794fac81e1ad2c490f976a7d2bda99eca GIT binary patch literal 45420 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 A6#xJL literal 0 HcmV?d00001 diff --git a/boards/lilygo/ttgo_t8c3/doc/index.rst b/boards/lilygo/ttgo_t8c3/doc/index.rst new file mode 100644 index 00000000000..73e092bb94c --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/doc/index.rst @@ -0,0 +1,233 @@ +.. _ttgo_t8c3: + +Lilygo TTGO T8-C3 +################# + +Overview +******** + +Lilygo TTGO T8-C3 is an IoT mini development board based on the +Espressif ESP32-C3 WiFi/Bluetooth dual-mode chip. + +It features the following integrated components: + +- ESP32-C3 chip (160MHz single core, 400KB SRAM, Wi-Fi) +- on board antenna and IPEX connector +- USB-C connector for power and communication +- JST GH 2-pin battery connector +- LED + +.. figure:: img/ttgo_t8c3.webp + :align: center + :alt: TTGO T8-C3 + + Lilygo TTGO T8-C3 + +Functional Description +********************** +This board is based on the ESP32-C3 with 4MB of flash, WiFi and BLE support. It +has an USB-C port for programming and debugging, integrated battery charging +and an on-board antenna. The fitted U.FL external antenna connector can be +enabled by moving a 0-ohm resistor. + +Connections and IOs +=================== + +The TTGO T8-C3 board configuration supports the following hardware features: + ++-----------+------------+------------------+ +| Interface | Controller | Driver/Component | ++===========+============+==================+ +| PMP | on-chip | arch/riscv | ++-----------+------------+------------------+ +| INTMTRX | on-chip | intc_esp32c3 | ++-----------+------------+------------------+ +| PINMUX | on-chip | pinctrl_esp32 | ++-----------+------------+------------------+ +| USB UART | on-chip | serial_esp32_usb | ++-----------+------------+------------------+ +| GPIO | on-chip | gpio_esp32 | ++-----------+------------+------------------+ +| UART | on-chip | uart_esp32 | ++-----------+------------+------------------+ +| I2C | on-chip | i2c_esp32 | ++-----------+------------+------------------+ +| SPI | on-chip | spi_esp32_spim | ++-----------+------------+------------------+ +| TWAI | on-chip | can_esp32_twai | ++-----------+------------+------------------+ + +Start Application Development +***************************** + +Before powering up your Lilygo TTGO T8-C3, please make sure that the board is in good +condition with no obvious signs of damage. + +System requirements +******************* + +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-C3 SoC. + +To build the sample application using sysbuild use the command: + +.. zephyr-app-commands:: + :tool: west + :app: samples/hello_world + :board: ttgo_t8c3 + :goals: build + :west-args: --sysbuild + :compact: + +By default, the ESP32-C3 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: ttgo_t8c3 + :goals: build + +The usual ``flash`` target will work with the ``ttgo_t8c3`` board +configuration. Here is an example for the :ref:`hello_world` +application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: ttgo_t8c3 + :goals: flash + +The default baud rate for the Lilygo TTGO T8-C3 is set to 1500000bps. If experiencing issues when flashing, +try using different values by using ``--esp-baud-rate `` option during +``west flash`` (e.g. ``west flash --esp-baud-rate 115200``). + +You can also 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! ttgo_t8c3 + +Sample applications +=================== + +The following samples will run out of the box on the TTGO T8-C3 board. + +To build the blinky sample: + +.. zephyr-app-commands:: + :tool: west + :app: samples/basic/blinky + :board: ttgo_t8c3 + :goals: build + +To build the bluetooth beacon sample: + +.. zephyr-app-commands:: + :tool: west + :app: samples/bluetooth/beacon + :board: ttgo_t8c3 + :goals: build + + +Related Documents +***************** +.. _`Lilygo TTGO T8-C3 schematic`: https://github.com/Xinyuan-LilyGO/T8-C3/blob/main/Schematic/T8-C3_V1.1.pdf +.. _`Lilygo github repo`: https://github.com/Xinyuan-LilyGo +.. _`Espressif ESP32-C3 datasheet`: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf +.. _`Espressif ESP32-C3 technical reference manual`: https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf +.. _`OpenOCD ESP32`: https://github.com/espressif/openocd-esp32/releases diff --git a/boards/lilygo/ttgo_t8c3/support/openocd.cfg b/boards/lilygo/ttgo_t8c3/support/openocd.cfg new file mode 100644 index 00000000000..02754ff2a73 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/support/openocd.cfg @@ -0,0 +1,6 @@ +set ESP_RTOS none + +source [find interface/esp_usb_jtag.cfg] + +source [find target/esp32c3.cfg] +adapter_khz 5000 diff --git a/boards/lilygo/ttgo_t8c3/ttgo_t8c3-pinctrl.dtsi b/boards/lilygo/ttgo_t8c3/ttgo_t8c3-pinctrl.dtsi new file mode 100644 index 00000000000..72cf16f3765 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/ttgo_t8c3-pinctrl.dtsi @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Lothar Felten + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + output-high; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + ; + }; + /* GPIO6 is CS */ + group2 { + pinmux = ; + output-low; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; + + twai_default: twai_default { + group1 { + pinmux = , + ; + }; + }; +}; diff --git a/boards/lilygo/ttgo_t8c3/ttgo_t8c3.dts b/boards/lilygo/ttgo_t8c3/ttgo_t8c3.dts new file mode 100644 index 00000000000..a38f5777762 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/ttgo_t8c3.dts @@ -0,0 +1,133 @@ +/* + * Copyright 2024 Lothar Felten + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include "ttgo_t8c3-pinctrl.dtsi" + +/ { + model = "Lilygo TTGO T8-C3"; + compatible = "lilygo,ttgo-t8c3"; + + aliases { + led0 = &green_led; + i2c-0 = &i2c0; + watchdog0 = &wdt0; + }; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &usb_serial; + zephyr,shell-uart = &usb_serial; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,bt-hci = &esp32_bt_hci; + zephyr,canbus = &twai; + }; + + leds { + compatible = "gpio-leds"; + green_led: led_0 { + gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>; + label = "Green - LED0"; + }; + }; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&usb_serial { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&trng0 { + status = "okay"; +}; + +&spi2 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim2_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&wdt0 { + status = "okay"; +}; + +&timer0 { + status = "okay"; +}; + +&timer1 { + status = "okay"; +}; + +&twai { + status = "okay"; + pinctrl-0 = <&twai_default>; + pinctrl-names = "default"; +}; + +&wifi { + status = "okay"; +}; + +&esp32_bt_hci{ + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x0000F000>; + read-only; + }; + + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00100000>; + }; + + slot1_partition: partition@110000 { + label = "image-1"; + reg = <0x00110000 0x00100000>; + }; + + scratch_partition: partition@210000 { + label = "image-scratch"; + reg = <0x00210000 0x00040000>; + }; + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00006000>; + }; + }; +}; diff --git a/boards/lilygo/ttgo_t8c3/ttgo_t8c3.yaml b/boards/lilygo/ttgo_t8c3/ttgo_t8c3.yaml new file mode 100644 index 00000000000..e2fc320098a --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/ttgo_t8c3.yaml @@ -0,0 +1,18 @@ +identifier: ttgo_t8c3 +name: TTGO T8C3 +type: mcu +arch: riscv +toolchain: + - zephyr +supported: + - gpio + - i2c + - spi + - uart + - watchdog + - can +testing: + ignore_tags: + - net + - bluetooth +vendor: lilygo diff --git a/boards/lilygo/ttgo_t8c3/ttgo_t8c3_defconfig b/boards/lilygo/ttgo_t8c3/ttgo_t8c3_defconfig new file mode 100644 index 00000000000..ef633ce56a1 --- /dev/null +++ b/boards/lilygo/ttgo_t8c3/ttgo_t8c3_defconfig @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_MAIN_STACK_SIZE=2048 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_GPIO=y diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index 30b2e93bc0a..4580131de93 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -368,6 +368,7 @@ lg LG Corporation lgphilips LG Display libretech Shenzhen Libre Technology Co., Ltd licheepi Lichee Pi +lilygo Lilygo Shenzhen Xinyuan Electronic Technology Co., Ltd linaro Linaro Limited linksprite LinkSprite Technologies, Inc. linksys Belkin International, Inc. (Linksys) diff --git a/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.conf b/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.conf new file mode 100644 index 00000000000..76f7644d896 --- /dev/null +++ b/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.conf @@ -0,0 +1,2 @@ +CONFIG_HEAP_MEM_POOL_SIZE=32768 +CONFIG_DMA=y diff --git a/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.overlay b/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.overlay new file mode 100644 index 00000000000..3582e7dcf94 --- /dev/null +++ b/tests/drivers/uart/uart_async_api/boards/ttgo_t8c3.overlay @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + uart1_test: uart1_test { + group1 { + pinmux = ; + input-enable; + }; + group2 { + pinmux = ; + output-enable; + }; + }; +}; + +dut: &uart1 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart1_test>; + pinctrl-names = "default"; + dmas = <&dma 0>, <&dma 1>; + dma-names = "rx", "tx"; +}; + +&dma { + status = "okay"; +};