uart: fix uart_tx_wait_idle to wait for fifo empty
In some cases, when data was just written into UART FIFO, transmitter state could be still zero while the FIFO did contain some data. This resulted in uart_tx_wait_idle occasionally returning before all the data was sent out. Fix by checking both UART transmitter state and TX FIFO count.
This commit is contained in:
parent
88625a2501
commit
508fb79a26
2 changed files with 8 additions and 4 deletions
|
@ -267,9 +267,11 @@ void uart_tx_flush(uint8_t uart_no);
|
||||||
* here for compatibility.
|
* here for compatibility.
|
||||||
*/
|
*/
|
||||||
static inline void IRAM_ATTR uart_tx_wait_idle(uint8_t uart_no) {
|
static inline void IRAM_ATTR uart_tx_wait_idle(uint8_t uart_no) {
|
||||||
while(REG_GET_FIELD(UART_STATUS_REG(uart_no), UART_ST_UTX_OUT)) {
|
uint32_t status;
|
||||||
;
|
do {
|
||||||
}
|
status = READ_PERI_REG(UART_STATUS_REG(uart_no));
|
||||||
|
/* either tx count or state is non-zero */
|
||||||
|
} while ((status & (UART_ST_UTX_OUT_M | UART_TXFIFO_CNT_M)) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -159,7 +159,9 @@ static void IRAM_ATTR suspend_uarts()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 3; ++i) {
|
||||||
REG_SET_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XOFF);
|
REG_SET_BIT(UART_FLOW_CONF_REG(i), UART_FORCE_XOFF);
|
||||||
uart_tx_wait_idle(i);
|
while (REG_GET_FIELD(UART_STATUS_REG(i), UART_ST_UTX_OUT) != 0) {
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue