diff --git a/cores/esp8266/uart.c b/cores/esp8266/uart.c index 74da8b84f..328acca7d 100644 --- a/cores/esp8266/uart.c +++ b/cores/esp8266/uart.c @@ -91,6 +91,31 @@ size_t uart_resize_rx_buffer(uart_t* uart, size_t new_size) return uart->rx_buffer->size; } +inline size_t uart_rx_buffer_available(uart_t* uart) { + if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) { + return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos; + } + return uart->rx_buffer->wpos - uart->rx_buffer->rpos; +} + +inline size_t uart_rx_fifo_available(uart_t* uart) { + return (USS(uart->uart_nr) >> USRXC) & 0x7F; +} + +// Copy all the rx fifo bytes that fit into the rx buffer +inline void uart_rx_copy_fifo_to_buffer(uart_t* uart) { + while(uart_rx_fifo_available(uart)){ + size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; + if(nextPos == uart->rx_buffer->rpos) { + // Stop copying if rx buffer is full + break; + } + uint8_t data = USF(uart->uart_nr); + uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; + uart->rx_buffer->wpos = nextPos; + } +} + int uart_peek_char(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) { @@ -99,6 +124,11 @@ int uart_peek_char(uart_t* uart) if (!uart_rx_available(uart)) { return -1; } + if (uart_rx_buffer_available(uart) == 0) { + ETS_UART_INTR_DISABLE(); + uart_rx_copy_fifo_to_buffer(uart); + ETS_UART_INTR_ENABLE(); + } return uart->rx_buffer->buffer[uart->rx_buffer->rpos]; } @@ -119,10 +149,7 @@ size_t uart_rx_available(uart_t* uart) if(uart == NULL || !uart->rx_enabled) { return 0; } - if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) { - return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos; - } - return uart->rx_buffer->wpos - uart->rx_buffer->rpos; + return uart_rx_buffer_available(uart) + uart_rx_fifo_available(uart); } @@ -135,14 +162,7 @@ void ICACHE_RAM_ATTR uart_isr(void * arg) return; } if(USIS(uart->uart_nr) & ((1 << UIFF) | (1 << UITO))){ - while((USS(uart->uart_nr) >> USRXC) & 0x7F){ - uint8_t data = USF(uart->uart_nr); - size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size; - if(nextPos != uart->rx_buffer->rpos) { - uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data; - uart->rx_buffer->wpos = nextPos; - } - } + uart_rx_copy_fifo_to_buffer(uart); } USIC(uart->uart_nr) = USIS(uart->uart_nr); } @@ -152,7 +172,11 @@ void uart_start_isr(uart_t* uart) if(uart == NULL || !uart->rx_enabled) { return; } - USC1(uart->uart_nr) = (127 << UCFFT) | (0x02 << UCTOT) | (1 <uart_nr) = (100 << UCFFT) | (0x02 << UCTOT) | (1 <uart_nr) = 0xffff; USIE(uart->uart_nr) = (1 << UIFF) | (1 << UIFR) | (1 << UITO); ETS_UART_INTR_ATTACH(uart_isr, (void *)uart);