From 85ebbc4d190605079889243081b4fa39f5060102 Mon Sep 17 00:00:00 2001 From: Almir Okato Date: Mon, 3 Nov 2025 06:20:28 -0300 Subject: [PATCH] espressif: fix UART init for Serial Recovery and unify adapter code Fix UART initialization for Espressif chips and unify their serial adapter code. Signed-off-by: Almir Okato --- boot/espressif/CMakeLists.txt | 2 +- boot/espressif/port/esp32/bootloader.conf | 2 + boot/espressif/port/esp32/serial_adapter.c | 185 -------------- boot/espressif/port/esp32c2/bootloader.conf | 2 + boot/espressif/port/esp32c2/serial_adapter.c | 190 --------------- boot/espressif/port/esp32c3/bootloader.conf | 2 + boot/espressif/port/esp32c3/serial_adapter.c | 226 ----------------- boot/espressif/port/esp32c6/bootloader.conf | 2 + boot/espressif/port/esp32c6/serial_adapter.c | 226 ----------------- boot/espressif/port/esp32h2/bootloader.conf | 2 + boot/espressif/port/esp32s2/bootloader.conf | 2 + boot/espressif/port/esp32s2/serial_adapter.c | 191 --------------- boot/espressif/port/esp32s3/bootloader.conf | 2 + boot/espressif/port/esp32s3/serial_adapter.c | 228 ------------------ .../port/{esp32h2 => }/serial_adapter.c | 140 ++++++++--- 15 files changed, 119 insertions(+), 1283 deletions(-) delete mode 100644 boot/espressif/port/esp32/serial_adapter.c delete mode 100644 boot/espressif/port/esp32c2/serial_adapter.c delete mode 100644 boot/espressif/port/esp32c3/serial_adapter.c delete mode 100644 boot/espressif/port/esp32c6/serial_adapter.c delete mode 100644 boot/espressif/port/esp32s2/serial_adapter.c delete mode 100644 boot/espressif/port/esp32s3/serial_adapter.c rename boot/espressif/port/{esp32h2 => }/serial_adapter.c (60%) diff --git a/boot/espressif/CMakeLists.txt b/boot/espressif/CMakeLists.txt index 63d5f1eb2e..e77eca83b9 100644 --- a/boot/espressif/CMakeLists.txt +++ b/boot/espressif/CMakeLists.txt @@ -349,7 +349,7 @@ if(CONFIG_ESP_MCUBOOT_SERIAL) ${ZCBOR_DIR}/include ) list(APPEND port_srcs - ${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c + ${CMAKE_CURRENT_LIST_DIR}/port/serial_adapter.c ${MBEDTLS_DIR}/library/base64.c ) list(APPEND CRYPTO_INC diff --git a/boot/espressif/port/esp32/bootloader.conf b/boot/espressif/port/esp32/bootloader.conf index f7912ba574..2c94b7b117 100644 --- a/boot/espressif/port/esp32/bootloader.conf +++ b/boot/espressif/port/esp32/bootloader.conf @@ -42,6 +42,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=25 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=26 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 CONFIG_ESP_CONSOLE_UART=y CONFIG_ESP_CONSOLE_UART_NUM=0 diff --git a/boot/espressif/port/esp32/serial_adapter.c b/boot/espressif/port/esp32/serial_adapter.c deleted file mode 100644 index 2f8a35e3a6..0000000000 --- a/boot/espressif/port/esp32/serial_adapter.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_8 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_9 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -void console_write(const char *str, int cnt) -{ - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -} - -int console_read(char *str, int cnt, int *newline) -{ - volatile uint32_t len = 0; - volatile uint32_t read_len = 0; - volatile bool stop = false; - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt || str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_APB); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_APB); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); - - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32c2/bootloader.conf b/boot/espressif/port/esp32c2/bootloader.conf index b6b3a11347..9fc0994e71 100644 --- a/boot/espressif/port/esp32c2/bootloader.conf +++ b/boot/espressif/port/esp32c2/bootloader.conf @@ -43,6 +43,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=2 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=3 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32c2/serial_adapter.c b/boot/espressif/port/esp32c2/serial_adapter.c deleted file mode 100644 index d10c0d6fb4..0000000000 --- a/boot/espressif/port/esp32c2/serial_adapter.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_18 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_2 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_3 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -void console_write(const char *str, int cnt) -{ - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -} - -int console_read(char *str, int cnt, int *newline) -{ - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len > 0) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_DEFAULT); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_DEFAULT); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); - - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32c3/bootloader.conf b/boot/espressif/port/esp32c3/bootloader.conf index 994e886581..72caf08c88 100644 --- a/boot/espressif/port/esp32c3/bootloader.conf +++ b/boot/espressif/port/esp32c3/bootloader.conf @@ -45,6 +45,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=8 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=9 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32c3/serial_adapter.c b/boot/espressif/port/esp32c3/serial_adapter.c deleted file mode 100644 index 09643a135b..0000000000 --- a/boot/espressif/port/esp32c3/serial_adapter.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifndef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_8 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_9 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -#endif - -void console_write(const char *str, int cnt) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - while (!usb_serial_jtag_ll_txfifo_writable()) { - MCUBOOT_WATCHDOG_FEED(); - } - usb_serial_jtag_ll_write_txfifo((const uint8_t *)str, cnt); - usb_serial_jtag_ll_txfifo_flush(); -#else - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -#endif -} - -int console_read(char *str, int cnt, int *newline) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - uint32_t read_len = 0; - - esp_rom_delay_us(1000); - do { - if (usb_serial_jtag_ll_rxfifo_data_available()) { - usb_serial_jtag_ll_read_rxfifo((uint8_t *)&str[read_len], 1); - read_len++; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!(read_len == cnt || str[read_len - 1] == '\n')); - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - - return read_len; -#else - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len > 0) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -#endif -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - esp_rom_uart_tx_wait_idle(0); -#else - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_APB); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_APB); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); -#endif - - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32c6/bootloader.conf b/boot/espressif/port/esp32c6/bootloader.conf index 1d8481cc08..95cd6e59a6 100644 --- a/boot/espressif/port/esp32c6/bootloader.conf +++ b/boot/espressif/port/esp32c6/bootloader.conf @@ -45,6 +45,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=8 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=9 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32c6/serial_adapter.c b/boot/espressif/port/esp32c6/serial_adapter.c deleted file mode 100644 index 5e6bb593d0..0000000000 --- a/boot/espressif/port/esp32c6/serial_adapter.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_3 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifndef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_10 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_11 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -#endif - -void console_write(const char *str, int cnt) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - while (!usb_serial_jtag_ll_txfifo_writable()) { - MCUBOOT_WATCHDOG_FEED(); - } - usb_serial_jtag_ll_write_txfifo((const uint8_t *)str, cnt); - usb_serial_jtag_ll_txfifo_flush(); -#else - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -#endif -} - -int console_read(char *str, int cnt, int *newline) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - uint32_t read_len = 0; - - esp_rom_delay_us(1000); - do { - if (usb_serial_jtag_ll_rxfifo_data_available()) { - usb_serial_jtag_ll_read_rxfifo((uint8_t *)&str[read_len], 1); - read_len++; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!(read_len == cnt || str[read_len - 1] == '\n')); - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - - return read_len; -#else - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len > 0) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -#endif -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - esp_rom_uart_tx_wait_idle(0); -#else - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_DEFAULT); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_DEFAULT); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); -#endif - - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32h2/bootloader.conf b/boot/espressif/port/esp32h2/bootloader.conf index 0fd5670196..0b99797c2d 100644 --- a/boot/espressif/port/esp32h2/bootloader.conf +++ b/boot/espressif/port/esp32h2/bootloader.conf @@ -45,6 +45,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=8 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=9 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32s2/bootloader.conf b/boot/espressif/port/esp32s2/bootloader.conf index 89fd6a6713..6c40adb488 100644 --- a/boot/espressif/port/esp32s2/bootloader.conf +++ b/boot/espressif/port/esp32s2/bootloader.conf @@ -43,6 +43,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=18 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=17 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32s2/serial_adapter.c b/boot/espressif/port/esp32s2/serial_adapter.c deleted file mode 100644 index e22a6baa70..0000000000 --- a/boot/espressif/port/esp32s2/serial_adapter.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_18 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_17 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -void console_write(const char *str, int cnt) -{ - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -} - -int console_read(char *str, int cnt, int *newline) -{ - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len > 0) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_APB); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_APB); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); - - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32s3/bootloader.conf b/boot/espressif/port/esp32s3/bootloader.conf index 7beb7bc010..b27e509604 100644 --- a/boot/espressif/port/esp32s3/bootloader.conf +++ b/boot/espressif/port/esp32s3/bootloader.conf @@ -65,6 +65,8 @@ CONFIG_ESP_SCRATCH_SIZE=0x40000 # CONFIG_ESP_SERIAL_BOOT_GPIO_RX=18 # GPIO for Serial TX signal # CONFIG_ESP_SERIAL_BOOT_GPIO_TX=17 +# Baudrate for Serial Recovery communication +# CONFIG_ESP_SERIAL_BOOT_BAUDRATE=115200 # Use UART0 for console printing (use either UART or USB alone) CONFIG_ESP_CONSOLE_UART=y diff --git a/boot/espressif/port/esp32s3/serial_adapter.c b/boot/espressif/port/esp32s3/serial_adapter.c deleted file mode 100644 index 7b244a63cf..0000000000 --- a/boot/espressif/port/esp32s3/serial_adapter.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT -#else -#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL -#else -#define SERIAL_BOOT_GPIO_DETECT_VAL 1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#define SERIAL_BOOT_DETECT_DELAY_S CONFIG_ESP_SERIAL_BOOT_DETECT_DELAY_S -#else -#define SERIAL_BOOT_DETECT_DELAY_S 5 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#define SERIAL_BOOT_GPIO_INPUT_TYPE CONFIG_ESP_SERIAL_BOOT_GPIO_INPUT_TYPE -#else -// pull-down -#define SERIAL_BOOT_GPIO_INPUT_TYPE 0 -#endif - -#ifndef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - -#ifdef CONFIG_ESP_SERIAL_BOOT_UART_NUM -#define SERIAL_BOOT_UART_NUM CONFIG_ESP_SERIAL_BOOT_UART_NUM -#else -#define SERIAL_BOOT_UART_NUM ESP_ROM_UART_1 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX -#else -#define SERIAL_BOOT_GPIO_RX GPIO_NUM_18 -#endif - -#ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX -#else -#define SERIAL_BOOT_GPIO_TX GPIO_NUM_17 -#endif - -static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? - &UART0 : - &UART1; - -#endif - -void console_write(const char *str, int cnt) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - while (!usb_serial_jtag_ll_txfifo_writable()) { - MCUBOOT_WATCHDOG_FEED(); - } - usb_serial_jtag_ll_write_txfifo((const uint8_t *)str, cnt); - usb_serial_jtag_ll_txfifo_flush(); -#else - uint32_t tx_len; - uint32_t write_len; - - do { - tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); - if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); -#endif -} - -int console_read(char *str, int cnt, int *newline) -{ -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - - uint32_t read_len = 0; - - esp_rom_delay_us(1000); - do { - if (usb_serial_jtag_ll_rxfifo_data_available()) { - usb_serial_jtag_ll_read_rxfifo((uint8_t *)&str[read_len], 1); - read_len++; - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!(read_len == cnt || str[read_len - 1] == '\n')); - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - - return read_len; -#else - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - - do { - len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - - if (len > 0) { - for (uint32_t i = 0; i < len; i++) { - /* Read the character from the RX FIFO */ - uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); - read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { - stop = true; - break; - } - } - } - MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (!stop); - - *newline = (str[read_len - 1] == '\n') ? 1 : 0; - return read_len; -#endif -} - -int boot_console_init(void) -{ - BOOT_LOG_INF("Initializing serial boot pins"); - -#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - esp_rom_uart_tx_wait_idle(0); -#else - /* Enable GPIO for UART RX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_connect_in_signal(SERIAL_BOOT_GPIO_RX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), - 0); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - - /* Enable GPIO for UART TX */ - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); - esp_rom_gpio_connect_out_signal(SERIAL_BOOT_GPIO_TX, - UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_TX_PIN_IDX), - 0, 0); - gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_APB); - uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_APB); - uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); - uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); - uart_ll_set_rx_tout(serial_boot_uart_dev, 16); - uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); - uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); - uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); - periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); - - uart_ll_txfifo_rst(serial_boot_uart_dev); - uart_ll_rxfifo_rst(serial_boot_uart_dev); - esp_rom_delay_us(50000); -#endif - return 0; -} - -bool boot_serial_detect_pin(void) -{ - bool detected = false; - int pin_value = 0; - - esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_DETECT); - gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_DETECT); - switch (SERIAL_BOOT_GPIO_INPUT_TYPE) { - // Pull-down - case 0: - gpio_ll_pulldown_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - // Pull-up - case 1: - gpio_ll_pullup_en(&GPIO, SERIAL_BOOT_GPIO_DETECT); - break; - } - esp_rom_delay_us(50000); - - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); - - if (detected) { - if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); - pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); - detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - if (!detected) { - break; - } - } - } - } - return detected; -} diff --git a/boot/espressif/port/esp32h2/serial_adapter.c b/boot/espressif/port/serial_adapter.c similarity index 60% rename from boot/espressif/port/esp32h2/serial_adapter.c rename to boot/espressif/port/serial_adapter.c index acd76b0a0d..e279189a20 100644 --- a/boot/espressif/port/esp32h2/serial_adapter.c +++ b/boot/espressif/port/serial_adapter.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -18,14 +19,32 @@ #include #include #include -#include +#include #include +#ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG +#include +#endif #ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT #define SERIAL_BOOT_GPIO_DETECT CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT #else +// default detect pin based on target +#if CONFIG_IDF_TARGET_ESP32 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 +#elif CONFIG_IDF_TARGET_ESP32S2 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 +#elif CONFIG_IDF_TARGET_ESP32C2 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_18 +#elif CONFIG_IDF_TARGET_ESP32C3 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_5 +#elif CONFIG_IDF_TARGET_ESP32C6 +#define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_3 +#elif CONFIG_IDF_TARGET_ESP32H2 #define SERIAL_BOOT_GPIO_DETECT GPIO_NUM_12 #endif +#endif #ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL #define SERIAL_BOOT_GPIO_DETECT_VAL CONFIG_ESP_SERIAL_BOOT_GPIO_DETECT_VAL @@ -57,90 +76,127 @@ #ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_RX #define SERIAL_BOOT_GPIO_RX CONFIG_ESP_SERIAL_BOOT_GPIO_RX #else +// default RX pin based on target +#if CONFIG_IDF_TARGET_ESP32 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_8 +#elif CONFIG_IDF_TARGET_ESP32S2 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_18 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_18 +#elif CONFIG_IDF_TARGET_ESP32C2 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_2 +#elif CONFIG_IDF_TARGET_ESP32C3 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_8 +#elif CONFIG_IDF_TARGET_ESP32C6 +#define SERIAL_BOOT_GPIO_RX GPIO_NUM_10 +#elif CONFIG_IDF_TARGET_ESP32H2 #define SERIAL_BOOT_GPIO_RX GPIO_NUM_10 #endif +#endif #ifdef CONFIG_ESP_SERIAL_BOOT_GPIO_TX #define SERIAL_BOOT_GPIO_TX CONFIG_ESP_SERIAL_BOOT_GPIO_TX #else +// default TX pin based on target +#if CONFIG_IDF_TARGET_ESP32 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_9 +#elif CONFIG_IDF_TARGET_ESP32S2 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_17 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_17 +#elif CONFIG_IDF_TARGET_ESP32C2 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_3 +#elif CONFIG_IDF_TARGET_ESP32C3 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_9 +#elif CONFIG_IDF_TARGET_ESP32C6 +#define SERIAL_BOOT_GPIO_TX GPIO_NUM_11 +#elif CONFIG_IDF_TARGET_ESP32H2 #define SERIAL_BOOT_GPIO_TX GPIO_NUM_11 #endif +#endif + +#ifdef CONFIG_ESP_SERIAL_BOOT_BAUDRATE +#define SERIAL_BOOT_BAUDRATE CONFIG_ESP_SERIAL_BOOT_BAUDRATE +#else +#define SERIAL_BOOT_BAUDRATE 115200 +#endif static uart_dev_t *serial_boot_uart_dev = (SERIAL_BOOT_UART_NUM == 0) ? &UART0 : &UART1; -#endif +#endif // !CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG void console_write(const char *str, int cnt) { #ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - usb_serial_jtag_ll_txfifo_flush(); - while (!usb_serial_jtag_ll_txfifo_writable()) { - MCUBOOT_WATCHDOG_FEED(); + uint32_t write_offset = 0; + int remaining = cnt; + int written = 0; + + while (remaining > 0) { + do { + MCUBOOT_WATCHDOG_FEED(); + } while (!usb_serial_jtag_ll_txfifo_writable()); + written = usb_serial_jtag_ll_write_txfifo((const uint8_t *)&str[write_offset], remaining); + usb_serial_jtag_ll_txfifo_flush(); + write_offset += written; + remaining -= written; } - usb_serial_jtag_ll_write_txfifo((const uint8_t *)str, cnt); - usb_serial_jtag_ll_txfifo_flush(); #else uint32_t tx_len; uint32_t write_len; + uint32_t write_offset = 0; + int remaining = cnt; do { tx_len = uart_ll_get_txfifo_len(serial_boot_uart_dev); if (tx_len > 0) { - write_len = tx_len < cnt ? tx_len : cnt; - uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)str, write_len); - cnt -= write_len; + write_len = tx_len < remaining ? tx_len : remaining; + uart_ll_write_txfifo(serial_boot_uart_dev, (const uint8_t *)&str[write_offset], write_len); + write_offset += write_len; + remaining -= write_len; } MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); - } while (cnt > 0); + } while (remaining > 0); #endif } int console_read(char *str, int cnt, int *newline) { + volatile uint32_t read_len = 0; #ifdef CONFIG_ESP_MCUBOOT_SERIAL_USB_SERIAL_JTAG - uint32_t read_len = 0; - - esp_rom_delay_us(1000); do { if (usb_serial_jtag_ll_rxfifo_data_available()) { usb_serial_jtag_ll_read_rxfifo((uint8_t *)&str[read_len], 1); read_len++; } MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); } while (!(read_len == cnt || str[read_len - 1] == '\n')); - *newline = (str[read_len - 1] == '\n') ? 1 : 0; return read_len; #else - uint32_t len = 0; - uint32_t read_len = 0; - bool stop = false; - + volatile uint32_t len = 0; + volatile bool stop = false; do { len = uart_ll_get_rxfifo_len(serial_boot_uart_dev); - if (len > 0) { + if (len) { for (uint32_t i = 0; i < len; i++) { /* Read the character from the RX FIFO */ uart_ll_read_rxfifo(serial_boot_uart_dev, (uint8_t *)&str[read_len], 1); read_len++; - if (read_len == cnt - 1|| str[read_len - 1] == '\n') { + if (read_len == cnt || str[read_len - 1] == '\n') { stop = true; break; } } } MCUBOOT_WATCHDOG_FEED(); - esp_rom_delay_us(1000); } while (!stop); - +#endif *newline = (str[read_len - 1] == '\n') ? 1 : 0; return read_len; -#endif } int boot_console_init(void) @@ -157,8 +213,6 @@ int boot_console_init(void) UART_PERIPH_SIGNAL(SERIAL_BOOT_UART_NUM, SOC_UART_RX_PIN_IDX), 0); gpio_ll_input_enable(&GPIO, SERIAL_BOOT_GPIO_RX); - esp_rom_gpio_pad_pullup_only(SERIAL_BOOT_GPIO_RX); - /* Enable GPIO for UART TX */ esp_rom_gpio_pad_select_gpio(SERIAL_BOOT_GPIO_TX); @@ -167,22 +221,37 @@ int boot_console_init(void) 0, 0); gpio_ll_output_enable(&GPIO, SERIAL_BOOT_GPIO_TX); - uart_ll_set_sclk(serial_boot_uart_dev, UART_SCLK_DEFAULT); uart_ll_set_mode_normal(serial_boot_uart_dev); - uart_ll_set_baudrate(serial_boot_uart_dev, 115200, UART_SCLK_DEFAULT); uart_ll_set_stop_bits(serial_boot_uart_dev, 1u); uart_ll_set_parity(serial_boot_uart_dev, UART_PARITY_DISABLE); uart_ll_set_rx_tout(serial_boot_uart_dev, 16); uart_ll_set_data_bit_num(serial_boot_uart_dev, UART_DATA_8_BITS); uart_ll_set_tx_idle_num(serial_boot_uart_dev, 0); uart_ll_set_hw_flow_ctrl(serial_boot_uart_dev, UART_HW_FLOWCTRL_DISABLE, 100); + + uart_sclk_t sclk = UART_SCLK_DEFAULT; + uint32_t clock_hz = rtc_clk_apb_freq_get(); + uart_ll_get_sclk(serial_boot_uart_dev, &sclk); +#if ESP_ROM_UART_CLK_IS_XTAL + if (sclk == UART_SCLK_XTAL) { + clock_hz = (uint32_t)rtc_clk_xtal_freq_get() * MHZ; + } +#endif + uart_ll_set_baudrate(serial_boot_uart_dev, SERIAL_BOOT_BAUDRATE, clock_hz); + periph_ll_enable_clk_clear_rst(PERIPH_UART0_MODULE + SERIAL_BOOT_UART_NUM); uart_ll_txfifo_rst(serial_boot_uart_dev); uart_ll_rxfifo_rst(serial_boot_uart_dev); esp_rom_delay_us(50000); -#endif + BOOT_LOG_DBG("UART%d: TX on GPIO%d, RX on GPIO%d " \ + "isEnabled: %d baudrate: %u sclk: %s clock_hz: %u", + SERIAL_BOOT_UART_NUM, SERIAL_BOOT_GPIO_TX, SERIAL_BOOT_GPIO_RX, + uart_ll_is_enabled(SERIAL_BOOT_UART_NUM), + uart_ll_get_baudrate(serial_boot_uart_dev, clock_hz), + sclk == UART_SCLK_DEFAULT ? "UART_SCLK_DEFAULT" : "UART_SCLK_XTAL", clock_hz); +#endif return 0; } @@ -207,19 +276,18 @@ bool boot_serial_detect_pin(void) pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); - esp_rom_delay_us(50000); if (detected) { if (SERIAL_BOOT_DETECT_DELAY_S > 0) { - /* The delay time is an approximation */ - for (int i = 0; i < (SERIAL_BOOT_DETECT_DELAY_S * 100); i++) { - esp_rom_delay_us(10000); + uint32_t delay_sec = SERIAL_BOOT_DETECT_DELAY_S; + uint32_t tm_start = esp_log_early_timestamp(); + do { pin_value = gpio_ll_get_level(&GPIO, SERIAL_BOOT_GPIO_DETECT); detected = (pin_value == SERIAL_BOOT_GPIO_DETECT_VAL); if (!detected) { break; } - } + } while (delay_sec > ((esp_log_early_timestamp() - tm_start) / 1000L)); } } return detected;