Skip to content

Commit d1d17d2

Browse files
committed
When rx_avaiable is checked return rx_buffer plus rx_fifo. Then during rx_read and rx_peek functions copy over the data in the fifo as needed.
1 parent aa16f80 commit d1d17d2

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

cores/esp8266/uart.c

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,33 @@ size_t uart_resize_rx_buffer(uart_t* uart, size_t new_size)
9191
return uart->rx_buffer->size;
9292
}
9393

94+
inline size_t uart_rx_buffer_available(uart_t* uart) {
95+
if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) {
96+
return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos;
97+
}
98+
return uart->rx_buffer->wpos - uart->rx_buffer->rpos;
99+
}
100+
101+
inline size_t uart_rx_fifo_available(uart_t* uart) {
102+
return (USS(uart->uart_nr) >> USRXC) & 0x7F;
103+
}
104+
105+
// Copy all the rx fifo bytes that fit into the rx buffer
106+
inline void uart_rx_copy_fifo_to_buffer(uart_t* uart) {
107+
while(uart_rx_fifo_available(uart)){
108+
size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size;
109+
if(nextPos != uart->rx_buffer->rpos) {
110+
uint8_t data = USF(uart->uart_nr);
111+
uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data;
112+
uart->rx_buffer->wpos = nextPos;
113+
}
114+
else {
115+
// Stop copying if rx buffer is full
116+
break;
117+
}
118+
}
119+
}
120+
94121
int uart_peek_char(uart_t* uart)
95122
{
96123
if(uart == NULL || !uart->rx_enabled) {
@@ -99,6 +126,11 @@ int uart_peek_char(uart_t* uart)
99126
if (!uart_rx_available(uart)) {
100127
return -1;
101128
}
129+
if (uart_rx_buffer_available(uart) == 0) {
130+
ETS_UART_INTR_DISABLE();
131+
uart_rx_copy_fifo_to_buffer(uart);
132+
ETS_UART_INTR_ENABLE();
133+
}
102134
return uart->rx_buffer->buffer[uart->rx_buffer->rpos];
103135
}
104136

@@ -119,20 +151,7 @@ size_t uart_rx_available(uart_t* uart)
119151
if(uart == NULL || !uart->rx_enabled) {
120152
return 0;
121153
}
122-
ETS_UART_INTR_DISABLE();
123-
while((USS(uart->uart_nr) >> USRXC) & 0x7F){
124-
uint8_t data = USF(uart->uart_nr);
125-
size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size;
126-
if(nextPos != uart->rx_buffer->rpos) {
127-
uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data;
128-
uart->rx_buffer->wpos = nextPos;
129-
}
130-
}
131-
ETS_UART_INTR_ENABLE();
132-
if(uart->rx_buffer->wpos < uart->rx_buffer->rpos) {
133-
return (uart->rx_buffer->wpos + uart->rx_buffer->size) - uart->rx_buffer->rpos;
134-
}
135-
return uart->rx_buffer->wpos - uart->rx_buffer->rpos;
154+
return uart_rx_buffer_available(uart) + uart_rx_fifo_available(uart);
136155
}
137156

138157

@@ -145,14 +164,7 @@ void ICACHE_RAM_ATTR uart_isr(void * arg)
145164
return;
146165
}
147166
if(USIS(uart->uart_nr) & ((1 << UIFF) | (1 << UITO))){
148-
while((USS(uart->uart_nr) >> USRXC) & 0x7F){
149-
uint8_t data = USF(uart->uart_nr);
150-
size_t nextPos = (uart->rx_buffer->wpos + 1) % uart->rx_buffer->size;
151-
if(nextPos != uart->rx_buffer->rpos) {
152-
uart->rx_buffer->buffer[uart->rx_buffer->wpos] = data;
153-
uart->rx_buffer->wpos = nextPos;
154-
}
155-
}
167+
uart_rx_copy_fifo_to_buffer(uart);
156168
}
157169
USIC(uart->uart_nr) = USIS(uart->uart_nr);
158170
}

0 commit comments

Comments
 (0)