@@ -103,6 +103,7 @@ typedef struct {
103
103
uint8_t * rx_head_ptr ; /*!< pointer to the head of RX item*/
104
104
uint8_t rx_data_buf [SOC_UART_FIFO_LEN ]; /*!< Data buffer to stash FIFO data*/
105
105
uint8_t rx_stash_len ; /*!< stashed data length.(When using flow control, after reading out FIFO data, if we fail to push to buffer, we can just stash them.) */
106
+ uint32_t rx_int_usr_mask ; /*!< RX interrupt status. Valid at any time, regardless of RX buffer status. */
106
107
uart_pat_rb_t rx_pattern_pos ;
107
108
int tx_buf_size ; /*!< TX ring buffer size */
108
109
bool tx_waiting_fifo ; /*!< this flag indicates that some task is waiting for FIFO empty interrupt, used to send all data without any data buffer*/
@@ -346,16 +347,45 @@ esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask)
346
347
{
347
348
ESP_RETURN_ON_FALSE ((uart_num < UART_NUM_MAX ), ESP_FAIL , UART_TAG , "uart_num error" );
348
349
UART_ENTER_CRITICAL (& (uart_context [uart_num ].spinlock ));
350
+ /* Keep track of the interrupt toggling. In fact, without such variable,
351
+ * once the RX buffer is full and the RX interrupts disabled, it is
352
+ * impossible what was the previous state (enabled/disabled) of these
353
+ * interrupt masks. Thus, this will be very particularly handy when
354
+ * emptying a filled RX buffer. */
355
+ p_uart_obj [uart_num ]-> rx_int_usr_mask |= enable_mask ;
349
356
uart_hal_clr_intsts_mask (& (uart_context [uart_num ].hal ), enable_mask );
350
357
uart_hal_ena_intr_mask (& (uart_context [uart_num ].hal ), enable_mask );
351
358
UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
352
359
return ESP_OK ;
353
360
}
354
361
362
+ /**
363
+ * @brief Function re-enabling the given interrupts (mask) if and only if
364
+ * they have not been disabled by the user.
365
+ *
366
+ * @param uart_num UART number to perform the operation on
367
+ * @param enable_mask Interrupts (flags) to be re-enabled
368
+ *
369
+ * @return ESP_OK in success, ESP_FAIL if uart_num is incorrect
370
+ */
371
+ static esp_err_t uart_reenable_intr_mask (uart_port_t uart_num , uint32_t enable_mask )
372
+ {
373
+ ESP_RETURN_ON_FALSE ((uart_num < UART_NUM_MAX ), ESP_FAIL , UART_TAG , "uart_num error" );
374
+ UART_ENTER_CRITICAL (& (uart_context [uart_num ].spinlock ));
375
+ /* Mask will only contain the interrupt flags that needs to be re-enabled
376
+ * AND which have NOT been explicitly disabled by the user. */
377
+ uint32_t mask = p_uart_obj [uart_num ]-> rx_int_usr_mask & enable_mask ;
378
+ uart_hal_clr_intsts_mask (& (uart_context [uart_num ].hal ), mask );
379
+ uart_hal_ena_intr_mask (& (uart_context [uart_num ].hal ), mask );
380
+ UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
381
+ return ESP_OK ;
382
+ }
383
+
355
384
esp_err_t uart_disable_intr_mask (uart_port_t uart_num , uint32_t disable_mask )
356
385
{
357
386
ESP_RETURN_ON_FALSE ((uart_num < UART_NUM_MAX ), ESP_FAIL , UART_TAG , "uart_num error" );
358
387
UART_ENTER_CRITICAL (& (uart_context [uart_num ].spinlock ));
388
+ p_uart_obj [uart_num ]-> rx_int_usr_mask &= ~disable_mask ;
359
389
uart_hal_disable_intr_mask (& (uart_context [uart_num ].hal ), disable_mask );
360
390
UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
361
391
return ESP_OK ;
@@ -1218,7 +1248,9 @@ static bool uart_check_buf_full(uart_port_t uart_num)
1218
1248
p_uart_obj [uart_num ]-> rx_buffered_len += p_uart_obj [uart_num ]-> rx_stash_len ;
1219
1249
p_uart_obj [uart_num ]-> rx_buffer_full_flg = false;
1220
1250
UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
1221
- uart_enable_rx_intr (p_uart_obj [uart_num ]-> uart_num );
1251
+ /* Only re-activate UART_INTR_RXFIFO_TOUT or UART_INTR_RXFIFO_FULL
1252
+ * interrupts if they were NOT explicitly disabled by the user. */
1253
+ uart_reenable_intr_mask (p_uart_obj [uart_num ]-> uart_num , UART_INTR_RXFIFO_TOUT | UART_INTR_RXFIFO_FULL );
1222
1254
return true;
1223
1255
}
1224
1256
}
@@ -1296,28 +1328,19 @@ esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t *size)
1296
1328
1297
1329
esp_err_t uart_flush (uart_port_t uart_num ) __attribute__((alias ("uart_flush_input" )));
1298
1330
1299
- static esp_err_t uart_disable_intr_mask_and_return_prev (uart_port_t uart_num , uint32_t disable_mask , uint32_t * prev_mask )
1300
- {
1301
- ESP_RETURN_ON_FALSE ((uart_num < UART_NUM_MAX ), ESP_FAIL , UART_TAG , "uart_num error" );
1302
- UART_ENTER_CRITICAL (& (uart_context [uart_num ].spinlock ));
1303
- * prev_mask = uart_hal_get_intr_ena_status (& uart_context [uart_num ].hal ) & disable_mask ;
1304
- uart_hal_disable_intr_mask (& (uart_context [uart_num ].hal ), disable_mask );
1305
- UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
1306
- return ESP_OK ;
1307
- }
1308
-
1309
1331
esp_err_t uart_flush_input (uart_port_t uart_num )
1310
1332
{
1311
1333
ESP_RETURN_ON_FALSE ((uart_num < UART_NUM_MAX ), ESP_FAIL , UART_TAG , "uart_num error" );
1312
1334
ESP_RETURN_ON_FALSE ((p_uart_obj [uart_num ]), ESP_FAIL , UART_TAG , "uart driver error" );
1313
1335
uart_obj_t * p_uart = p_uart_obj [uart_num ];
1314
1336
uint8_t * data ;
1315
1337
size_t size ;
1316
- uint32_t prev_mask ;
1317
1338
1318
1339
//rx sem protect the ring buffer read related functions
1319
1340
xSemaphoreTake (p_uart -> rx_mux , (portTickType )portMAX_DELAY );
1320
- uart_disable_intr_mask_and_return_prev (uart_num , UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT , & prev_mask );
1341
+ UART_ENTER_CRITICAL (& (uart_context [uart_num ].spinlock ));
1342
+ uart_hal_disable_intr_mask (& (uart_context [uart_num ].hal ), UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT );
1343
+ UART_EXIT_CRITICAL (& (uart_context [uart_num ].spinlock ));
1321
1344
while (true) {
1322
1345
if (p_uart -> rx_head_ptr ) {
1323
1346
vRingbufferReturnItem (p_uart -> rx_ring_buf , p_uart -> rx_head_ptr );
@@ -1365,7 +1388,9 @@ esp_err_t uart_flush_input(uart_port_t uart_num)
1365
1388
p_uart -> rx_cur_remain = 0 ;
1366
1389
p_uart -> rx_head_ptr = NULL ;
1367
1390
uart_hal_rxfifo_rst (& (uart_context [uart_num ].hal ));
1368
- uart_enable_intr_mask (uart_num , prev_mask );
1391
+ /* Only re-enable UART_INTR_RXFIFO_TOUT or UART_INTR_RXFIFO_FULL if they
1392
+ * were explicitly enabled by the user. */
1393
+ uart_reenable_intr_mask (uart_num , UART_INTR_RXFIFO_TOUT | UART_INTR_RXFIFO_FULL );
1369
1394
xSemaphoreGive (p_uart -> rx_mux );
1370
1395
return ESP_OK ;
1371
1396
}
@@ -1544,6 +1569,7 @@ esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_b
1544
1569
p_uart_obj [uart_num ]-> tx_waiting_fifo = false;
1545
1570
p_uart_obj [uart_num ]-> rx_ptr = NULL ;
1546
1571
p_uart_obj [uart_num ]-> rx_cur_remain = 0 ;
1572
+ p_uart_obj [uart_num ]-> rx_int_usr_mask = UART_INTR_RXFIFO_FULL | UART_INTR_RXFIFO_TOUT ;
1547
1573
p_uart_obj [uart_num ]-> rx_head_ptr = NULL ;
1548
1574
p_uart_obj [uart_num ]-> tx_buf_size = tx_buffer_size ;
1549
1575
p_uart_obj [uart_num ]-> uart_select_notif_callback = NULL ;
0 commit comments