@@ -66,9 +66,23 @@ static uart_t _uart_bus_array[3] = {
66
66
};
67
67
#endif
68
68
69
+ static void _uart_rx_flush ( uart_t * uart ){
70
+ uint8_t c ;
71
+ UART_MUTEX_LOCK ();
72
+ UBaseType_t spaces = 0 ;
73
+ if (uart -> queue != NULL ) {
74
+ spaces = uxQueueSpacesAvailable ( uart -> queue );
75
+ }
76
+ while (((spaces -- ) > 0 )&& (uart -> dev -> status .rxfifo_cnt || (uart -> dev -> mem_rx_status .wr_addr != uart -> dev -> mem_rx_status .rd_addr ))) {
77
+ c = uart -> dev -> fifo .rw_byte ;
78
+ xQueueSend (uart -> queue , & c ,0 );
79
+ }
80
+ UART_MUTEX_UNLOCK ();
81
+ }
82
+
69
83
static void IRAM_ATTR _uart_isr (void * arg )
70
84
{
71
- uint8_t i , c ;
85
+ uint8_t i ,c ;
72
86
BaseType_t xHigherPriorityTaskWoken ;
73
87
uart_t * uart ;
74
88
@@ -77,15 +91,15 @@ static void IRAM_ATTR _uart_isr(void *arg)
77
91
if (uart -> intr_handle == NULL ){
78
92
continue ;
79
93
}
94
+ while (uart -> dev -> status .rxfifo_cnt || (uart -> dev -> mem_rx_status .wr_addr != uart -> dev -> mem_rx_status .rd_addr )) {
95
+ c = uart -> dev -> fifo .rw_byte ;
96
+ if (uart -> queue != NULL && !xQueueIsQueueFullFromISR (uart -> queue )) {
97
+ xQueueSendFromISR (uart -> queue , & c , & xHigherPriorityTaskWoken );
98
+ }
80
99
uart -> dev -> int_clr .rxfifo_full = 1 ;
81
100
uart -> dev -> int_clr .frm_err = 1 ;
82
101
uart -> dev -> int_clr .rxfifo_tout = 1 ;
83
- while (uart -> dev -> status .rxfifo_cnt || (uart -> dev -> mem_rx_status .wr_addr != uart -> dev -> mem_rx_status .rd_addr )) {
84
- c = uart -> dev -> fifo .rw_byte ;
85
- if (uart -> queue != NULL && !xQueueIsQueueFullFromISR (uart -> queue )) {
86
- xQueueSendFromISR (uart -> queue , & c , & xHigherPriorityTaskWoken );
87
- }
88
- }
102
+ }
89
103
}
90
104
91
105
if (xHigherPriorityTaskWoken ) {
@@ -96,14 +110,14 @@ static void IRAM_ATTR _uart_isr(void *arg)
96
110
void uartEnableInterrupt (uart_t * uart )
97
111
{
98
112
UART_MUTEX_LOCK ();
99
- uart -> dev -> conf1 .rxfifo_full_thrhd = 112 ;
100
- uart -> dev -> conf1 .rx_tout_thrhd = 2 ;
113
+ uart -> dev -> conf1 .rxfifo_full_thrhd = 112 ; // needs speed compensation?
114
+ uart -> dev -> conf1 .rx_tout_thrhd = 32 ; // no need to force rxFiFo empty, because uartRead() will empty if necessary
101
115
uart -> dev -> conf1 .rx_tout_en = 1 ;
102
116
uart -> dev -> int_ena .rxfifo_full = 1 ;
103
117
uart -> dev -> int_ena .frm_err = 1 ;
104
118
uart -> dev -> int_ena .rxfifo_tout = 1 ;
105
119
uart -> dev -> int_clr .val = 0xffffffff ;
106
-
120
+ // can this share an interrupt?
107
121
esp_intr_alloc (UART_INTR_SOURCE (uart -> num ), (int )ESP_INTR_FLAG_IRAM , _uart_isr , NULL , & uart -> intr_handle );
108
122
UART_MUTEX_UNLOCK ();
109
123
}
@@ -185,12 +199,15 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
185
199
}
186
200
}
187
201
if (uart_nr == 1 ){
202
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART1_RST );
188
203
DPORT_SET_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART1_CLK_EN );
189
204
DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART1_RST );
190
205
} else if (uart_nr == 2 ){
206
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART2_RST );
191
207
DPORT_SET_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART2_CLK_EN );
192
208
DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART2_RST );
193
209
} else {
210
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART_RST );
194
211
DPORT_SET_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART_CLK_EN );
195
212
DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART_RST );
196
213
}
@@ -224,20 +241,32 @@ void uartEnd(uart_t* uart)
224
241
return ;
225
242
}
226
243
244
+ uartDetachRx (uart ); // release pin, disable interrupt
245
+ uartDetachTx (uart ); // release pin
246
+
227
247
UART_MUTEX_LOCK ();
248
+
249
+ uart -> dev -> conf0 .val = 0 ;
250
+ // power down uart, disable clocking
251
+ if (uart -> num == 1 ){
252
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART1_RST );
253
+ DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART1_CLK_EN );
254
+ } else if (uart -> num == 2 ){
255
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART2_RST );
256
+ DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART2_CLK_EN );
257
+ } else {
258
+ DPORT_SET_PERI_REG_MASK (DPORT_PERIP_RST_EN_REG , DPORT_UART_RST );
259
+ DPORT_CLEAR_PERI_REG_MASK (DPORT_PERIP_CLK_EN_REG , DPORT_UART_CLK_EN );
260
+ }
228
261
if (uart -> queue != NULL ) {
229
262
uint8_t c ;
230
263
while (xQueueReceive (uart -> queue , & c , 0 ));
231
264
vQueueDelete (uart -> queue );
232
265
uart -> queue = NULL ;
233
266
}
234
267
235
- uart -> dev -> conf0 .val = 0 ;
236
-
237
268
UART_MUTEX_UNLOCK ();
238
269
239
- uartDetachRx (uart );
240
- uartDetachTx (uart );
241
270
}
242
271
243
272
size_t uartResizeRxBuffer (uart_t * uart , size_t new_size ) {
@@ -265,6 +294,7 @@ uint32_t uartAvailable(uart_t* uart)
265
294
if (uart == NULL || uart -> queue == NULL ) {
266
295
return 0 ;
267
296
}
297
+ _uart_rx_flush (uart );
268
298
return uxQueueMessagesWaiting (uart -> queue );
269
299
}
270
300
@@ -284,6 +314,11 @@ uint8_t uartRead(uart_t* uart)
284
314
uint8_t c ;
285
315
if (xQueueReceive (uart -> queue , & c , 0 )) {
286
316
return c ;
317
+ } else {
318
+ _uart_rx_flush (uart );
319
+ if (xQueueReceive (uart -> queue , & c , 0 )) {
320
+ return c ;
321
+ }
287
322
}
288
323
return 0 ;
289
324
}
@@ -296,6 +331,11 @@ uint8_t uartPeek(uart_t* uart)
296
331
uint8_t c ;
297
332
if (xQueuePeek (uart -> queue , & c , 0 )) {
298
333
return c ;
334
+ } else {
335
+ _uart_rx_flush (uart );
336
+ if (xQueueReceive (uart -> queue , & c , 0 )) {
337
+ return c ;
338
+ }
299
339
}
300
340
return 0 ;
301
341
}
0 commit comments