summaryrefslogtreecommitdiff
path: root/nuttx
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-12-27 09:45:45 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-12-27 09:45:45 -0600
commit419a64187953a1302ac16bee0125637d8f9bef8a (patch)
tree28c7a74e9e4751c0fa3453e5e0e0c8529c98319a /nuttx
parentf274e8e07b55d0089e943d0ebf35e8f0f4d1451d (diff)
downloadnuttx-419a64187953a1302ac16bee0125637d8f9bef8a.tar.gz
nuttx-419a64187953a1302ac16bee0125637d8f9bef8a.tar.bz2
nuttx-419a64187953a1302ac16bee0125637d8f9bef8a.zip
Remove STM32-specific RX flow control logic from the upper level serial driver to the lower level STM32 serial driver
Diffstat (limited to 'nuttx')
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_serial.c46
-rw-r--r--nuttx/drivers/serial/serial.c10
-rw-r--r--nuttx/drivers/serial/serialirq.c2
3 files changed, 37 insertions, 21 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_serial.c b/nuttx/arch/arm/src/stm32/stm32_serial.c
index 698568bd7..4dd764c19 100644
--- a/nuttx/arch/arm/src/stm32/stm32_serial.c
+++ b/nuttx/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/nuttx/drivers/serial/serial.c b/nuttx/drivers/serial/serial.c
index 526504240..001428900 100644
--- a/nuttx/drivers/serial/serial.c
+++ b/nuttx/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/nuttx/drivers/serial/serialirq.c b/nuttx/drivers/serial/serialirq.c
index dd4c75ea9..3962d985c 100644
--- a/nuttx/drivers/serial/serialirq.c
+++ b/nuttx/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))