From 3e79787bccb3a6f4574ee61b6124040266f2bc27 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Wed, 27 Mar 2019 08:55:29 +0100 Subject: [PATCH 1/3] cpu/esp32: UART configuration approach changed UART devices are now configured using static array in header files instead of static variables in implementation to be able to define UART_NUMOF using the size of the array instead of a variable. --- cpu/esp32/include/periph_cpu.h | 22 ++++++---- cpu/esp32/periph/uart.c | 74 ++++++++++++++-------------------- 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/cpu/esp32/include/periph_cpu.h b/cpu/esp32/include/periph_cpu.h index fea86d734f..b7d514887f 100644 --- a/cpu/esp32/include/periph_cpu.h +++ b/cpu/esp32/include/periph_cpu.h @@ -423,25 +423,33 @@ extern const unsigned spi_bus_num; * configuration and is always available. All ESP32 boards use it as standard * configuration for the console. * - * UART_DEV(0).TXD GPIO1 - * UART_DEV(0).RXD GPIO3 + * UART_DEV(0).TXD GPIO1 + * UART_DEV(0).RXD GPIO3 * * The pin configuration of UART_DEV(1) and UART_DEV(2) are defined in * board specific peripheral configuration by * - * UARTn_TXD, the GPIO used as TxD signal, and - * UARTn_RXD, the GPIO used as RxD signal, + * - UARTn_TXD, the GPIO used as TxD signal, and + * - UARTn_RXD, the GPIO used as RxD signal, * - * where n can be 2 or 3. If they are not defined, the UART interface + * where n can be 1 or 2. If they are not defined, the according UART interface * UART_DEV(n) is not used. * * UART_NUMOF is determined automatically from the board-specific peripheral - * definitions of UARTn_TXD and UARTn_RXD. + * definitions of UARTn_*. * * @{ */ -/** @} */ +/** + * @brief UART configuration structure type + */ +typedef struct { + gpio_t txd; /**< GPIO used as TxD pin */ + gpio_t rxd; /**< GPIO used as RxD pin */ +} uart_conf_t; + +/** @} */ #ifdef __cplusplus } diff --git a/cpu/esp32/periph/uart.c b/cpu/esp32/periph/uart.c index 366dc5d6f4..a06f96abee 100644 --- a/cpu/esp32/periph/uart.c +++ b/cpu/esp32/periph/uart.c @@ -74,8 +74,11 @@ static struct uart_hw_t _uarts[] = { .data = UART_DATA_BITS_8, .stop = UART_STOP_BITS_1, .parity = UART_PARITY_NONE, + .mod = PERIPH_UART0_MODULE, .signal_txd = U0TXD_OUT_IDX, .signal_rxd = U0RXD_IN_IDX, + .baudrate = STDIO_UART_BAUDRATE, + .used = false, .int_src = ETS_UART0_INTR_SOURCE }, #if defined(UART1_TXD) && defined(UART1_RXD) @@ -87,8 +90,13 @@ static struct uart_hw_t _uarts[] = { .data = UART_DATA_BITS_8, .stop = UART_STOP_BITS_1, .parity = UART_PARITY_NONE, + { + .regs = &UART1, + .mod = PERIPH_UART1_MODULE, .signal_txd = U1TXD_OUT_IDX, .signal_rxd = U1RXD_IN_IDX, + .baudrate = STDIO_UART_BAUDRATE, + .used = false, .int_src = ETS_UART1_INTR_SOURCE }, #endif @@ -101,11 +109,15 @@ static struct uart_hw_t _uarts[] = { .data = UART_DATA_BITS_8, .stop = UART_STOP_BITS_1, .parity = UART_PARITY_NONE, + { + .regs = &UART2, + .mod = PERIPH_UART2_MODULE, .signal_txd = U2TXD_OUT_IDX, .signal_rxd = U2RXD_IN_IDX, + .baudrate = STDIO_UART_BAUDRATE, + .used = false, .int_src = ETS_UART2_INTR_SOURCE } - #endif }; /* declaration of external functions */ @@ -131,30 +143,29 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg) if (uart == UART_DEV(1) || uart == UART_DEV(2)) { /* reset the pins when they were already used as UART pins */ - if (gpio_get_pin_usage(_uarts[uart].pin_txd) == _UART) { - gpio_set_pin_usage(_uarts[uart].pin_txd, _GPIO); + if (gpio_get_pin_usage(uart_config[uart].txd) == _UART) { + gpio_set_pin_usage(uart_config[uart].txd, _GPIO); } - if (gpio_get_pin_usage(_uarts[uart].pin_rxd) == _UART) { - gpio_set_pin_usage(_uarts[uart].pin_rxd, _GPIO); + if (gpio_get_pin_usage(uart_config[uart].rxd) == _UART) { + gpio_set_pin_usage(uart_config[uart].rxd, _GPIO); } /* try to initialize the pins as GPIOs first */ - if (gpio_init (_uarts[uart].pin_rxd, GPIO_IN) || - gpio_init (_uarts[uart].pin_txd, GPIO_OUT)) { + if (gpio_init (uart_config[uart].rxd, GPIO_IN) || + gpio_init (uart_config[uart].txd, GPIO_OUT)) { return -1; } /* store the usage type in GPIO table */ - gpio_set_pin_usage(_uarts[uart].pin_txd, _UART); - gpio_set_pin_usage(_uarts[uart].pin_rxd, _UART); + gpio_set_pin_usage(uart_config[uart].txd, _UART); + gpio_set_pin_usage(uart_config[uart].rxd, _UART); /* connect TxD pin to the TxD output signal through the GPIO matrix */ - GPIO.func_out_sel_cfg[_uarts[uart].pin_txd].func_sel = _uarts[uart].signal_txd; - + GPIO.func_out_sel_cfg[uart_config[uart].txd].func_sel = _uarts[uart].signal_txd; /* connect RxD input signal to the RxD pin through the GPIO matrix */ GPIO.func_in_sel_cfg[_uarts[uart].signal_rxd].sig_in_sel = 1; GPIO.func_in_sel_cfg[_uarts[uart].signal_rxd].sig_in_inv = 0; - GPIO.func_in_sel_cfg[_uarts[uart].signal_rxd].func_sel = _uarts[uart].pin_rxd; + GPIO.func_in_sel_cfg[_uarts[uart].signal_rxd].func_sel = uart_config[uart].rxd; } _uarts[uart].baudrate = baudrate; @@ -187,40 +198,17 @@ void uart_write(uart_t uart, const uint8_t *data, size_t len) void uart_poweron (uart_t uart) { - switch (uart) { - #if UART_NUMOF - case 0: periph_module_enable(PERIPH_UART0_MODULE); - _uart_config(uart); - break; - #endif - #if UART_NUMOF > 1 - case 1: periph_module_enable(PERIPH_UART1_MODULE); - _uart_config(uart); - break; - #endif - #if UART_NUMOF > 2 - case 2: periph_module_enable(PERIPH_UART2_MODULE); - _uart_config(uart); - break; - #endif - default: break; - } + CHECK_PARAM (uart < UART_NUMOF); + + periph_module_enable(_uarts[uart].mod); + _uart_config(uart); } void uart_poweroff (uart_t uart) { - switch (uart) { - #if UART_NUMOF - case 0: periph_module_disable(PERIPH_UART0_MODULE); break; - #endif - #if UART_NUMOF > 1 - case 1: periph_module_disable(PERIPH_UART1_MODULE); break; - #endif - #if UART_NUMOF > 2 - case 2: periph_module_disable(PERIPH_UART2_MODULE); break; - #endif - default: break; - } + CHECK_PARAM (uart < UART_NUMOF); + + periph_module_disable(_uarts[uart].mod); } /* systemwide UART initializations */ @@ -236,7 +224,7 @@ void uart_print_config(void) { for (unsigned uart = 0; uart < UART_NUMOF; uart++) { ets_printf("\tUART_DEV(%d)\ttxd=%d rxd=%d\n", uart, - _uarts[uart].pin_txd, _uarts[uart].pin_rxd); + uart_config[uart].txd, uart_config[uart].rxd); } } From 008f1c5d5500b5953c83e1fd9d60e62b29752558 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Wed, 27 Mar 2019 08:55:56 +0100 Subject: [PATCH 2/3] boards/esp32: UART configuration approach changed UART devices are now configured using static array in header files instead of static variables in implementation to be able to define UART_NUMOF using the size of the array instead of a variable. --- .../common/esp32/include/periph_conf_common.h | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/boards/common/esp32/include/periph_conf_common.h b/boards/common/esp32/include/periph_conf_common.h index d6595b369c..3d4187be80 100644 --- a/boards/common/esp32/include/periph_conf_common.h +++ b/boards/common/esp32/include/periph_conf_common.h @@ -144,6 +144,35 @@ static const gpio_t adc_channels[] = ADC_GPIOS; * @name UART configuration */ +#ifndef UART0_TXD +#define UART0_TXD (GPIO1) /**< TxD of UART_DEV(0) used on all ESP32 boards */ +#endif +#ifndef UART0_RXD +#define UART0_RXD (GPIO3) /**< RxD of UART_DEV(0) used on all ESP32 boards */ +#endif + +/** + * @brief Static array with configuration for declared I2C devices + */ +static const uart_conf_t uart_config[] = { + { + .txd = UART0_TXD, + .rxd = UART0_RXD, + }, + #if defined(UART1_TXD) && defined(UART1_RXD) + { + .txd = UART1_TXD, + .rxd = UART1_RXD, + }, + #endif + #if defined(UART2_TXD) && defined(UART2_RXD) + { + .txd = UART2_TXD, + .rxd = UART2_RXD, + }, + #endif +}; + /** * @brief Number of UART interfaces * From 3cb08e9e993cfece730eda01c5a0995f63a305f0 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Fri, 29 Mar 2019 08:25:57 +0100 Subject: [PATCH 3/3] cpu/esp32: fixup after rebase --- cpu/esp32/periph/uart.c | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/cpu/esp32/periph/uart.c b/cpu/esp32/periph/uart.c index a06f96abee..6e5d4d2522 100644 --- a/cpu/esp32/periph/uart.c +++ b/cpu/esp32/periph/uart.c @@ -50,8 +50,7 @@ struct uart_hw_t { uart_dev_t* regs; /* pointer to register data struct of the UART device */ - uint8_t pin_txd; /* TxD pin */ - uint8_t pin_rxd; /* RxD pin */ + uint8_t mod; /* peripheral hardware module of the UART interface */ bool used; /* indicates whether UART is used */ uint32_t baudrate; /* used baudrate */ uart_data_bits_t data; /* used data bits */ @@ -67,55 +66,38 @@ struct uart_hw_t { static struct uart_hw_t _uarts[] = { { .regs = &UART0, - .pin_txd = GPIO1, - .pin_rxd = GPIO3, + .mod = PERIPH_UART0_MODULE, .used = false, .baudrate = STDIO_UART_BAUDRATE, .data = UART_DATA_BITS_8, .stop = UART_STOP_BITS_1, .parity = UART_PARITY_NONE, - .mod = PERIPH_UART0_MODULE, .signal_txd = U0TXD_OUT_IDX, .signal_rxd = U0RXD_IN_IDX, - .baudrate = STDIO_UART_BAUDRATE, - .used = false, .int_src = ETS_UART0_INTR_SOURCE }, - #if defined(UART1_TXD) && defined(UART1_RXD) - { .regs = &UART1, - .pin_txd = UART1_TXD, - .pin_rxd = UART1_RXD, - .used = false, - .baudrate = STDIO_UART_BAUDRATE, - .data = UART_DATA_BITS_8, - .stop = UART_STOP_BITS_1, - .parity = UART_PARITY_NONE, { .regs = &UART1, .mod = PERIPH_UART1_MODULE, - .signal_txd = U1TXD_OUT_IDX, - .signal_rxd = U1RXD_IN_IDX, - .baudrate = STDIO_UART_BAUDRATE, - .used = false, - .int_src = ETS_UART1_INTR_SOURCE - }, - #endif - #if defined(UART2_TXD) && defined(UART2_RXD) - { .regs = &UART2, - .pin_txd = UART2_TXD, - .pin_rxd = UART2_RXD, .used = false, .baudrate = STDIO_UART_BAUDRATE, .data = UART_DATA_BITS_8, .stop = UART_STOP_BITS_1, .parity = UART_PARITY_NONE, + .signal_txd = U1TXD_OUT_IDX, + .signal_rxd = U1RXD_IN_IDX, + .int_src = ETS_UART1_INTR_SOURCE + }, { .regs = &UART2, .mod = PERIPH_UART2_MODULE, + .used = false, + .baudrate = STDIO_UART_BAUDRATE, + .data = UART_DATA_BITS_8, + .stop = UART_STOP_BITS_1, + .parity = UART_PARITY_NONE, .signal_txd = U2TXD_OUT_IDX, .signal_rxd = U2RXD_IN_IDX, - .baudrate = STDIO_UART_BAUDRATE, - .used = false, .int_src = ETS_UART2_INTR_SOURCE } };