From 33f7151cd9b4949b72ca442e88daa53e38c29fd4 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sat, 27 Dec 2014 09:45:45 -0600 Subject: [PATCH] Remove STM32-specific RX flow control logic from the upper level serial driver to the lower level STM32 serial driver --- arch/arm/src/stm32/stm32_serial.c | 46 +++++++++++++++++++++---------- drivers/serial/serial.c | 10 +++---- drivers/serial/serialirq.c | 2 +- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/arch/arm/src/stm32/stm32_serial.c b/arch/arm/src/stm32/stm32_serial.c index 698568bd71..4dd764c192 100644 --- a/arch/arm/src/stm32/stm32_serial.c +++ b/arch/arm/src/stm32/stm32_serial.c @@ -2151,23 +2151,39 @@ static bool up_rxflowcontrol(struct uart_dev_s *dev, if (priv->iflow) { - /* Disable Rx interrupt to prevent more data being from peripheral. - * When hardware RTS is enabled, this will prevent more data from - * coming in. - * - * This function is only called when UART recv buffer is full, that - * is: "dev->recv.head + 1 == dev->recv.tail". - * - * Logic in "uart_read" will automatically toggle Rx interrupts when - * buffer is read empty and thus we do not have to re-enable Rx - * interrupts in any other place. - */ + /* Is the RX buffer full? */ - ie = priv->ie; - ie &= ~USART_CR1_RXNEIE; - up_restoreusartint(priv, ie); + if (upper) + { + /* Disable Rx interrupt to prevent more data being from + * peripheral. When hardware RTS is enabled, this will + * prevent more data from coming in. + * + * This function is only called when UART recv buffer is full, + * that is: "dev->recv.head + 1 == dev->recv.tail". + * + * Logic in "uart_read" will automatically toggle Rx interrupts + * when buffer is read empty and thus we do not have to re- + * enable Rx interrupts. + */ - return true; + ie = priv->ie; + ie &= ~USART_CR1_RXNEIE; + up_restoreusartint(priv, ie); + return true; + } + + /* No.. The RX buffer is empty */ + + else + { + /* We might leave Rx interrupt disabled if full recv buffer was + * read empty. Enable Rx interrupt to make sure that more input is + * received. + */ + + up_rxint(dev, true); + } } return false; diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 526504240a..0014289004 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -798,19 +798,19 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen if (nbuffered <= watermark) { /* Let the lower level driver know that the watermark level has been - * crossed. + * crossed. It will probably deactivate RX flow control. */ (void)uart_rxflowcontrol(dev, nbuffered, false); } #else + /* If the RX buffer empty */ + if (rxbuf->head == rxbuf->tail) { - /* We might leave Rx interrupt disabled if full recv buffer was read - * empty. Enable Rx interrupt to make sure that more input is received. - */ + /* Deactivate RX flow control. */ - uart_enablerxint(dev); + (void)uart_rxflowcontrol(dev, 0, false); } #endif #endif diff --git a/drivers/serial/serialirq.c b/drivers/serial/serialirq.c index dd4c75ea92..3962d985cf 100644 --- a/drivers/serial/serialirq.c +++ b/drivers/serial/serialirq.c @@ -186,7 +186,7 @@ void uart_recvchars(FAR uart_dev_t *dev) if (nbuffered >= watermark) { /* Let the lower level driver know that the watermark level has been - * crossed. + * crossed. It will probably activate RX flow control. */ if (uart_rxflowcontrol(dev, nbuffered, true))