From 4ff4991e16cf02f2a6b6710dc51c32b7a24bc5ce Mon Sep 17 00:00:00 2001 From: Alexander Mihajlovic Date: Sat, 2 Apr 2022 15:21:01 +0200 Subject: [PATCH] drivers: uart_stm32: Add support for tx/rx swap Add a new boolean devicetree property `tx-rx-swap` to the st,stm32-usart binding, used to control TX/RX swap during device initialization. Signed-off-by: Alexander Mihajlovic --- drivers/serial/uart_stm32.c | 7 +++++++ drivers/serial/uart_stm32.h | 2 ++ dts/bindings/serial/st,stm32-usart.yaml | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/drivers/serial/uart_stm32.c b/drivers/serial/uart_stm32.c index f14d1ffe197..460a1b70552 100644 --- a/drivers/serial/uart_stm32.c +++ b/drivers/serial/uart_stm32.c @@ -473,6 +473,12 @@ static int uart_stm32_configure(const struct device *dev, data->baud_rate = cfg->baudrate; } +#ifdef LL_USART_TXRX_SWAPPED + if (config->tx_rx_swap) { + LL_USART_SetTXRXSwap(config->usart, LL_USART_TXRX_SWAPPED); + } +#endif + LL_USART_Enable(config->usart); return 0; }; @@ -1715,6 +1721,7 @@ static const struct uart_stm32_config uart_stm32_cfg_##index = { \ .parity = DT_INST_ENUM_IDX_OR(index, parity, UART_CFG_PARITY_NONE), \ .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(index), \ .single_wire = DT_INST_PROP_OR(index, single_wire, false), \ + .tx_rx_swap = DT_INST_PROP_OR(index, tx_rx_swap, false), \ STM32_UART_IRQ_HANDLER_FUNC(index) \ }; \ \ diff --git a/drivers/serial/uart_stm32.h b/drivers/serial/uart_stm32.h index e47ebc1baf2..abe92415e24 100644 --- a/drivers/serial/uart_stm32.h +++ b/drivers/serial/uart_stm32.h @@ -28,6 +28,8 @@ struct uart_stm32_config { int parity; /* switch to enable single wire / half duplex feature */ bool single_wire; + /* enable tx/rx pin swap */ + bool tx_rx_swap; const struct pinctrl_dev_config *pcfg; #if defined(CONFIG_UART_INTERRUPT_DRIVEN) || defined(CONFIG_UART_ASYNC_API) || \ defined(CONFIG_PM) diff --git a/dts/bindings/serial/st,stm32-usart.yaml b/dts/bindings/serial/st,stm32-usart.yaml index 44044c9e892..eaa11d5fb2a 100644 --- a/dts/bindings/serial/st,stm32-usart.yaml +++ b/dts/bindings/serial/st,stm32-usart.yaml @@ -20,6 +20,12 @@ properties: only TX pin is used afterwards and should be configured. RX/TX conflicts must be handled on user side. + tx-rx-swap: + type: boolean + required: false + description: | + Swap the TX and RX pins. Used in case of a cross-wired connection. + pinctrl-0: required: true