From 041f9821ca6cd3ddc19a8852cb57f74e70047c0d Mon Sep 17 00:00:00 2001 From: Andriy Gelman Date: Thu, 25 Apr 2024 23:38:46 -0400 Subject: [PATCH] drivers: xmc4xxx_uart: Delay transmit interrupt until byte is sent out Generate the Tx service request after the symbol is shifted out of the UART. This is useful when the UART is connected to an RS485 transducer which has a separate transmit enable gpio/line. Hence it's important to know when the transmission actually finishes so that the drive enable line can be disabled. Signed-off-by: Andriy Gelman --- drivers/serial/uart_xmc4xxx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/serial/uart_xmc4xxx.c b/drivers/serial/uart_xmc4xxx.c index 51ec19cf427..f797e27a11e 100644 --- a/drivers/serial/uart_xmc4xxx.c +++ b/drivers/serial/uart_xmc4xxx.c @@ -116,7 +116,7 @@ static void disable_tx_events(const struct uart_xmc4xxx_config *config) XMC_USIC_CH_TXFIFO_DisableEvent(config->uart, XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); } else { - XMC_USIC_CH_DisableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_BUFFER); + XMC_USIC_CH_DisableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_SHIFT); } } #endif @@ -131,7 +131,7 @@ static void enable_tx_events(const struct uart_xmc4xxx_config *config) XMC_USIC_CH_TXFIFO_EnableEvent(config->uart, XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); } else { - XMC_USIC_CH_EnableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_BUFFER); + XMC_USIC_CH_EnableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_SHIFT); } } @@ -189,7 +189,7 @@ static void uart_xmc4xxx_configure_service_requests(const struct device *dev) data->service_request_tx); } else { XMC_USIC_CH_SetInterruptNodePointer( - config->uart, XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER, + config->uart, XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_SHIFT, data->service_request_tx); } @@ -338,7 +338,7 @@ static void uart_xmc4xxx_irq_tx_disable(const struct device *dev) XMC_USIC_CH_TXFIFO_DisableEvent(config->uart, XMC_USIC_CH_TXFIFO_EVENT_CONF_STANDARD); } else { - XMC_USIC_CH_DisableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_BUFFER); + XMC_USIC_CH_DisableEvent(config->uart, XMC_USIC_CH_EVENT_TRANSMIT_SHIFT); } }