Skip to content

Commit 7d2632c

Browse files
stickbreakerme-no-dev
authored andcommitted
Implement Tx only Flush (espressif#3433)
* add option to Flush() to only clear txQueue Add the option to cause Flush() to just wait for tx data to clear the tx fifo and uart, leave the rx queue and rx fifo as is. * support tx only flush() * support tx only Flush() * support txOnly for Flush() * compatibility to Stream() * compatibility for Stream() * default value error * default value error * Update esp32-hal-uart.h * Update esp32-hal-uart.c * Update HardwareSerial.cpp * sp * correctly implement flushTxOnly()
1 parent e59355d commit 7d2632c

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

Diff for: cores/esp32/HardwareSerial.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,16 @@ int HardwareSerial::read(void)
131131
return -1;
132132
}
133133

134-
void HardwareSerial::flush()
134+
void HardwareSerial::flush(void)
135135
{
136136
uartFlush(_uart);
137137
}
138138

139+
void HardwareSerial::flush(bool txOnly)
140+
{
141+
uartFlushTxOnly(_uart, txOnly);
142+
}
143+
139144
size_t HardwareSerial::write(uint8_t c)
140145
{
141146
uartWrite(_uart, c);

Diff for: cores/esp32/HardwareSerial.h

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class HardwareSerial: public Stream
6363
int peek(void);
6464
int read(void);
6565
void flush(void);
66+
void flush( bool txOnly);
6667
size_t write(uint8_t);
6768
size_t write(const uint8_t *buffer, size_t size);
6869

Diff for: cores/esp32/esp32-hal-uart.c

+15-8
Original file line numberDiff line numberDiff line change
@@ -327,24 +327,31 @@ void uartWriteBuf(uart_t* uart, const uint8_t * data, size_t len)
327327
}
328328

329329
void uartFlush(uart_t* uart)
330+
{
331+
uartFlushTxOnly(uart,false);
332+
}
333+
334+
void uartFlushTxOnly(uart_t* uart, bool txOnly)
330335
{
331336
if(uart == NULL) {
332337
return;
333338
}
334339

335340
UART_MUTEX_LOCK();
336341
while(uart->dev->status.txfifo_cnt || uart->dev->status.st_utx_out);
342+
343+
if( !txOnly ){
344+
//Due to hardware issue, we can not use fifo_rst to reset uart fifo.
345+
//See description about UART_TXFIFO_RST and UART_RXFIFO_RST in <<esp32_technical_reference_manual>> v2.6 or later.
337346

338-
//Due to hardware issue, we can not use fifo_rst to reset uart fifo.
339-
//See description about UART_TXFIFO_RST and UART_RXFIFO_RST in <<esp32_technical_reference_manual>> v2.6 or later.
347+
// we read the data out and make `fifo_len == 0 && rd_addr == wr_addr`.
348+
while(uart->dev->status.rxfifo_cnt != 0 || (uart->dev->mem_rx_status.wr_addr != uart->dev->mem_rx_status.rd_addr)) {
349+
READ_PERI_REG(UART_FIFO_REG(uart->num));
350+
}
340351

341-
// we read the data out and make `fifo_len == 0 && rd_addr == wr_addr`.
342-
while(uart->dev->status.rxfifo_cnt != 0 || (uart->dev->mem_rx_status.wr_addr != uart->dev->mem_rx_status.rd_addr)) {
343-
READ_PERI_REG(UART_FIFO_REG(uart->num));
352+
xQueueReset(uart->queue);
344353
}
345-
346-
xQueueReset(uart->queue);
347-
354+
348355
UART_MUTEX_UNLOCK();
349356
}
350357

Diff for: cores/esp32/esp32-hal-uart.h

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void uartWrite(uart_t* uart, uint8_t c);
6363
void uartWriteBuf(uart_t* uart, const uint8_t * data, size_t len);
6464

6565
void uartFlush(uart_t* uart);
66+
void uartFlushTxOnly(uart_t* uart, bool txOnly );
6667

6768
void uartSetBaudRate(uart_t* uart, uint32_t baud_rate);
6869
uint32_t uartGetBaudRate(uart_t* uart);

0 commit comments

Comments
 (0)