Remove STM32-specific RX flow control logic from the upper level serial driver to the lower level STM32 serial driver
This commit is contained in:
parent
32fd858dc6
commit
33f7151cd9
@ -2151,23 +2151,39 @@ static bool up_rxflowcontrol(struct uart_dev_s *dev,
|
|||||||
|
|
||||||
if (priv->iflow)
|
if (priv->iflow)
|
||||||
{
|
{
|
||||||
/* Disable Rx interrupt to prevent more data being from peripheral.
|
/* Is the RX buffer full? */
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ie = priv->ie;
|
if (upper)
|
||||||
ie &= ~USART_CR1_RXNEIE;
|
{
|
||||||
up_restoreusartint(priv, ie);
|
/* 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;
|
return false;
|
||||||
|
@ -798,19 +798,19 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen
|
|||||||
if (nbuffered <= watermark)
|
if (nbuffered <= watermark)
|
||||||
{
|
{
|
||||||
/* Let the lower level driver know that the watermark level has been
|
/* 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);
|
(void)uart_rxflowcontrol(dev, nbuffered, false);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
/* If the RX buffer empty */
|
||||||
|
|
||||||
if (rxbuf->head == rxbuf->tail)
|
if (rxbuf->head == rxbuf->tail)
|
||||||
{
|
{
|
||||||
/* We might leave Rx interrupt disabled if full recv buffer was read
|
/* Deactivate RX flow control. */
|
||||||
* empty. Enable Rx interrupt to make sure that more input is received.
|
|
||||||
*/
|
|
||||||
|
|
||||||
uart_enablerxint(dev);
|
(void)uart_rxflowcontrol(dev, 0, false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -186,7 +186,7 @@ void uart_recvchars(FAR uart_dev_t *dev)
|
|||||||
if (nbuffered >= watermark)
|
if (nbuffered >= watermark)
|
||||||
{
|
{
|
||||||
/* Let the lower level driver know that the watermark level has been
|
/* 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))
|
if (uart_rxflowcontrol(dev, nbuffered, true))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user