diff --git a/CODEOWNERS b/CODEOWNERS index 39a42540676..a0fa8ae4192 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -318,6 +318,7 @@ /drivers/serial/Kconfig.test @str4t0m /drivers/serial/serial_test.c @str4t0m /drivers/serial/*esp32c3* @uLipe +/drivers/serial/*esp32s2* @glaubermaroto /drivers/disk/ @jfischer-no /drivers/disk/sdmmc_sdhc.h @JunYangNXP /drivers/disk/sdmmc_spi.c @JunYangNXP diff --git a/boards/xtensa/esp32s2_saola/esp32s2_saola.dts b/boards/xtensa/esp32s2_saola/esp32s2_saola.dts index 56b63b1363a..7f6e03fa011 100644 --- a/boards/xtensa/esp32s2_saola/esp32s2_saola.dts +++ b/boards/xtensa/esp32s2_saola/esp32s2_saola.dts @@ -14,5 +14,12 @@ chosen { zephyr,sram = &sram0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; }; }; + +&uart0 { + status = "okay"; + current-speed = <115200>; +}; diff --git a/boards/xtensa/esp32s2_saola/esp32s2_saola_defconfig b/boards/xtensa/esp32s2_saola/esp32s2_saola_defconfig index 3c48ed17cfa..aa3545b4e39 100644 --- a/boards/xtensa/esp32s2_saola/esp32s2_saola_defconfig +++ b/boards/xtensa/esp32s2_saola/esp32s2_saola_defconfig @@ -8,6 +8,11 @@ CONFIG_MAIN_STACK_SIZE=2048 CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=240000000 +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_ROM_ESP32S2=y + CONFIG_XTENSA_USE_CORE_CRT1=n CONFIG_GEN_ISR_TABLES=y diff --git a/drivers/serial/CMakeLists.txt b/drivers/serial/CMakeLists.txt index baef5e01cbb..9c078bbd82a 100644 --- a/drivers/serial/CMakeLists.txt +++ b/drivers/serial/CMakeLists.txt @@ -9,6 +9,7 @@ zephyr_library_sources_ifdef(CONFIG_UART_CC32XX uart_cc32xx.c) zephyr_library_sources_ifdef(CONFIG_UART_CMSDK_APB uart_cmsdk_apb.c) zephyr_library_sources_ifdef(CONFIG_UART_ESP32 uart_esp32.c) zephyr_library_sources_ifdef(CONFIG_UART_ROM_ESP32C3 uart_rom_esp32c3.c) +zephyr_library_sources_ifdef(CONFIG_UART_ROM_ESP32S2 uart_rom_esp32s2.c) zephyr_library_sources_ifdef(CONFIG_UART_SIFIVE uart_sifive.c) zephyr_library_sources_ifdef(CONFIG_UART_GECKO uart_gecko.c) zephyr_library_sources_ifdef(CONFIG_LEUART_GECKO leuart_gecko.c) diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 5f77f66c3e5..8fe96f62a16 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -123,6 +123,8 @@ source "drivers/serial/Kconfig.esp32" source "drivers/serial/Kconfig.esp32c3_rom" +source "drivers/serial/Kconfig.esp32s2_rom" + source "drivers/serial/Kconfig.gecko" source "drivers/serial/Kconfig.leuart_gecko" diff --git a/drivers/serial/Kconfig.esp32s2_rom b/drivers/serial/Kconfig.esp32s2_rom new file mode 100644 index 00000000000..bc7dd5143a0 --- /dev/null +++ b/drivers/serial/Kconfig.esp32s2_rom @@ -0,0 +1,10 @@ +# Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd. +# SPDX-License-Identifier: Apache-2.0 + +config UART_ROM_ESP32S2 + bool "ESP32S2 ROM UART driver" + default y + select SERIAL_HAS_DRIVER + depends on SOC_ESP32S2 + help + Enable the ESP32S2 UART using ROM routines. diff --git a/drivers/serial/uart_rom_esp32s2.c b/drivers/serial/uart_rom_esp32s2.c new file mode 100644 index 00000000000..3b8e3148580 --- /dev/null +++ b/drivers/serial/uart_rom_esp32s2.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define DT_DRV_COMPAT espressif_esp32s2_uart + +/* Include esp-idf headers first to avoid redefining BIT() macro */ +#include +#include +#include +#include +#include + +static int uart_rom_esp32s2_poll_in(const struct device *dev, unsigned char *p_char) +{ + ARG_UNUSED(dev); + return (int)esp_rom_uart_rx_one_char(p_char); +} + +static IRAM_ATTR void uart_rom_esp32s2_poll_out(const struct device *dev, + unsigned char c) +{ + ARG_UNUSED(dev); + esp_rom_uart_tx_one_char(c); +} + +static int uart_rom_esp32s2_poll_err_check(const struct device *dev) +{ + ARG_UNUSED(dev); + return 0; +} + +static int uart_rom_esp32s2_init(const struct device *dev) +{ + ARG_UNUSED(dev); + return 0; +} + +static const DRAM_ATTR struct uart_driver_api uart_rom_esp32s2_api = { + .poll_in = uart_rom_esp32s2_poll_in, + .poll_out = uart_rom_esp32s2_poll_out, + .err_check = uart_rom_esp32s2_poll_err_check, +}; + +#define ESP32S2_ROM_UART_INIT(idx) \ +DEVICE_DT_DEFINE(DT_NODELABEL(uart##idx), \ + &uart_rom_esp32s2_init, \ + NULL, \ + NULL, \ + NULL, \ + PRE_KERNEL_1, \ + CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \ + &uart_rom_esp32s2_api); \ + +DT_INST_FOREACH_STATUS_OKAY(ESP32S2_ROM_UART_INIT) diff --git a/dts/bindings/serial/espressif,esp32s2-uart.yaml b/dts/bindings/serial/espressif,esp32s2-uart.yaml new file mode 100644 index 00000000000..94c25e23523 --- /dev/null +++ b/dts/bindings/serial/espressif,esp32s2-uart.yaml @@ -0,0 +1,32 @@ +description: ESP32S2 UART + +compatible: "espressif,esp32s2-uart" + +include: uart-controller.yaml + +properties: + reg: + required: true + + interrupts: + required: false + + tx-pin: + type: int + description: TX pin + required: false + + rx-pin: + type: int + description: RX pin + required: false + + rts-pin: + type: int + description: RTS pin + required: false + + cts-pin: + type: int + description: CTS pin + required: false diff --git a/dts/xtensa/espressif/esp32s2.dtsi b/dts/xtensa/espressif/esp32s2.dtsi index 66991373bfe..62149fa3be4 100644 --- a/dts/xtensa/espressif/esp32s2.dtsi +++ b/dts/xtensa/espressif/esp32s2.dtsi @@ -30,6 +30,13 @@ compatible = "mmio-sram"; reg = <0x3ffb0000 0x50000>; }; + + uart0: uart@3f400000 { + compatible = "espressif,esp32s2-uart"; + reg = <0x3f400000 0x400>; + label = "UART_0"; + status = "disabled"; + }; }; };