Skip to content

Commit 5e063be

Browse files
authored
Update esp32-hal-uart.c
1 parent cee23f1 commit 5e063be

File tree

1 file changed

+105
-31
lines changed

1 file changed

+105
-31
lines changed

cores/esp32/esp32-hal-uart.c

Lines changed: 105 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ struct uart_struct_t {
3434
uint8_t num;
3535
bool has_peek;
3636
uint8_t peek_byte;
37-
37+
QueueHandle_t uart_event_queue;
38+
void (*onReceive)(void);
39+
TaskHandle_t envent_task;
3840
};
3941

4042
#if CONFIG_DISABLE_HAL_LOCKS
@@ -43,12 +45,12 @@ struct uart_struct_t {
4345
#define UART_MUTEX_UNLOCK()
4446

4547
static uart_t _uart_bus_array[] = {
46-
{0, false, 0},
48+
{0, false, 0, NULL, NULL, NULL},
4749
#if SOC_UART_NUM > 1
48-
{1, false, 0},
50+
{1, false, 0, NULL, NULL, NULL},
4951
#endif
5052
#if SOC_UART_NUM > 2
51-
{2, false, 0},
53+
{2, false, 0, NULL, NULL, NULL},
5254
#endif
5355
};
5456

@@ -58,20 +60,20 @@ static uart_t _uart_bus_array[] = {
5860
#define UART_MUTEX_UNLOCK() xSemaphoreGive(uart->lock)
5961

6062
static uart_t _uart_bus_array[] = {
61-
{NULL, 0, false, 0},
63+
{NULL, 0, false, 0, NULL, NULL, NULL},
6264
#if SOC_UART_NUM > 1
63-
{NULL, 1, false, 0},
65+
{NULL, 1, false, 0, NULL, NULL, NULL},
6466
#endif
6567
#if SOC_UART_NUM > 2
66-
{NULL, 2, false, 0},
68+
{NULL, 2, false, 0, NULL, NULL, NULL},
6769
#endif
6870
};
6971

7072
#endif
7173

7274
// solves issue https://github.com/espressif/arduino-esp32/issues/6032
7375
// baudrate must be multiplied when CPU Frequency is lower than APB 80MHz
74-
uint32_t _get_effective_baudrate(uint32_t baudrate)
76+
uint32_t _get_effective_baudrate(uint32_t baudrate)
7577
{
7678
uint32_t Freq = getApbFrequency()/1000000;
7779
if (Freq < 80) {
@@ -82,7 +84,68 @@ uint32_t _get_effective_baudrate(uint32_t baudrate)
8284
}
8385
}
8486

85-
bool uartIsDriverInstalled(uart_t* uart)
87+
88+
void uartOnReceive(uart_t* uart, void(*function)(void))
89+
{
90+
if(uart == NULL || function == NULL) {
91+
return;
92+
}
93+
UART_MUTEX_LOCK();
94+
uart->onReceive = function;
95+
UART_MUTEX_UNLOCK();
96+
}
97+
98+
99+
static void uart_event_task(void *args)
100+
{
101+
uart_t* uart = (uart_t *)args;
102+
uart_event_t event;
103+
for(;;) {
104+
//Waiting for UART event.
105+
if(xQueueReceive(uart->uart_event_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
106+
switch(event.type) {
107+
//Event of UART receving data
108+
case UART_DATA:
109+
UART_MUTEX_LOCK();
110+
if(uart->onReceive) uart->onReceive();
111+
UART_MUTEX_UNLOCK();
112+
break;
113+
//Event of HW FIFO overflow detected
114+
case UART_FIFO_OVF:
115+
log_w("UART%d FIFO Overflow. Flushing data. Consider adding Flow Control to your Application.", uart->num);
116+
uart_flush_input(uart->num);
117+
xQueueReset(uart->uart_event_queue);
118+
break;
119+
//Event of UART ring buffer full
120+
case UART_BUFFER_FULL:
121+
log_w("UART%d Buffer Full. Flushing data. Consider encreasing your buffer size of your Application.", uart->num);
122+
uart_flush_input(uart->num);
123+
xQueueReset(uart->uart_event_queue);
124+
break;
125+
//Event of UART RX break detected
126+
case UART_BREAK:
127+
log_w("UART%d RX break.", uart->num);
128+
break;
129+
//Event of UART parity check error
130+
case UART_PARITY_ERR:
131+
log_w("UART%d parity error.", uart->num);
132+
break;
133+
//Event of UART frame error
134+
case UART_FRAME_ERR:
135+
log_w("UART%d frame error.", uart->num);
136+
break;
137+
//Others
138+
default:
139+
log_w("UART%d unknown event type %d.", uart->num, event.type);
140+
break;
141+
}
142+
}
143+
}
144+
vTaskDelete(NULL);
145+
}
146+
147+
148+
bool uartIsDriverInstalled(uart_t* uart)
86149
{
87150
if(uart == NULL) {
88151
return 0;
@@ -100,9 +163,9 @@ void uartSetPins(uart_t* uart, uint8_t rxPin, uint8_t txPin)
100163
return;
101164
}
102165
UART_MUTEX_LOCK();
103-
ESP_ERROR_CHECK(uart_set_pin(uart->num, txPin, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
166+
ESP_ERROR_CHECK(uart_set_pin(uart->num, txPin, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
104167
UART_MUTEX_UNLOCK();
105-
168+
106169
}
107170

108171

@@ -143,14 +206,20 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
143206
uart_config.source_clk = UART_SCLK_APB;
144207

145208

146-
ESP_ERROR_CHECK(uart_driver_install(uart_nr, 2*queueLen, 0, 0, NULL, 0));
209+
ESP_ERROR_CHECK(uart_driver_install(uart_nr, 2*queueLen, 0, 20, &(uart->uart_event_queue), 0));
147210
ESP_ERROR_CHECK(uart_param_config(uart_nr, &uart_config));
148211
ESP_ERROR_CHECK(uart_set_pin(uart_nr, txPin, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
149212

150-
// Is it right or the idea is to swap rx and tx pins?
213+
// Is it right or the idea is to swap rx and tx pins?
151214
if (inverted) {
152215
// invert signal for both Rx and Tx
153-
ESP_ERROR_CHECK(uart_set_line_inverse(uart_nr, UART_SIGNAL_TXD_INV | UART_SIGNAL_RXD_INV));
216+
ESP_ERROR_CHECK(uart_set_line_inverse(uart_nr, UART_SIGNAL_TXD_INV | UART_SIGNAL_RXD_INV));
217+
}
218+
219+
// Creating UART event Task
220+
xTaskCreate(uart_event_task, "uart_event_task", 2048, uart, configMAX_PRIORITIES - 1, &(uart->envent_task));
221+
if (!uart->envent_task) {
222+
log_e(" -- UART%d Event Task not Created!", uart_nr);
154223
}
155224

156225
UART_MUTEX_UNLOCK();
@@ -164,9 +233,14 @@ void uartEnd(uart_t* uart)
164233
if(uart == NULL) {
165234
return;
166235
}
167-
236+
168237
UART_MUTEX_LOCK();
169238
uart_driver_delete(uart->num);
239+
if (uart->envent_task) {
240+
vTaskDelete(uart->envent_task);
241+
uart->envent_task = NULL;
242+
uart->onReceive = NULL;
243+
}
170244
UART_MUTEX_UNLOCK();
171245
}
172246

@@ -176,13 +250,13 @@ void uartSetRxInvert(uart_t* uart, bool invert)
176250
if (uart == NULL)
177251
return;
178252
#if 0
179-
// POTENTIAL ISSUE :: original code only set/reset rxd_inv bit
253+
// POTENTIAL ISSUE :: original code only set/reset rxd_inv bit
180254
// IDF or LL set/reset the whole inv_mask!
181255
if (invert)
182256
ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_RXD_INV));
183257
else
184258
ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_INV_DISABLE));
185-
259+
186260
#else
187261
// this implementation is better over IDF API because it only affects RXD
188262
// this is supported in ESP32, ESP32-S2 and ESP32-C3
@@ -191,7 +265,7 @@ void uartSetRxInvert(uart_t* uart, bool invert)
191265
hw->conf0.rxd_inv = 1;
192266
else
193267
hw->conf0.rxd_inv = 0;
194-
#endif
268+
#endif
195269
}
196270

197271

@@ -217,7 +291,7 @@ uint32_t uartAvailableForWrite(uart_t* uart)
217291
return 0;
218292
}
219293
UART_MUTEX_LOCK();
220-
uint32_t available = uart_ll_get_txfifo_len(UART_LL_GET_HW(uart->num));
294+
uint32_t available = uart_ll_get_txfifo_len(UART_LL_GET_HW(uart->num));
221295
UART_MUTEX_UNLOCK();
222296
return available;
223297
}
@@ -301,7 +375,7 @@ void uartFlushTxOnly(uart_t* uart, bool txOnly)
301375
if(uart == NULL) {
302376
return;
303377
}
304-
378+
305379
UART_MUTEX_LOCK();
306380
while(!uart_ll_is_tx_idle(UART_LL_GET_HW(uart->num)));
307381

@@ -414,7 +488,7 @@ int log_printf(const char *format, ...)
414488
xSemaphoreTake(_uart_bus_array[s_uart_debug_nr].lock, portMAX_DELAY);
415489
}
416490
#endif
417-
491+
418492
vsnprintf(temp, len+1, format, arg);
419493
ets_printf("%s", temp);
420494

@@ -491,22 +565,22 @@ unsigned long uartBaudrateDetect(uart_t *uart, bool flg)
491565
* To start detection of baud rate with the uart the auto_baud.en bit needs to be cleared and set. The bit period is
492566
* detected calling uartBadrateDetect(). The raw baudrate is computed using the UART_CLK_FREQ. The raw baudrate is
493567
* rounded to the closed real baudrate.
494-
*
568+
*
495569
* ESP32-C3 reports wrong baud rate detection as shown below:
496-
*
570+
*
497571
* This will help in a future recall for the C3.
498572
* Baud Sent: Baud Read:
499573
* 300 --> 19536
500574
* 2400 --> 19536
501-
* 4800 --> 19536
502-
* 9600 --> 28818
575+
* 4800 --> 19536
576+
* 9600 --> 28818
503577
* 19200 --> 57678
504578
* 38400 --> 115440
505579
* 57600 --> 173535
506580
* 115200 --> 347826
507581
* 230400 --> 701754
508-
*
509-
*
582+
*
583+
*
510584
*/
511585
void uartStartDetectBaudrate(uart_t *uart) {
512586
if(uart == NULL) {
@@ -516,10 +590,10 @@ void uartStartDetectBaudrate(uart_t *uart) {
516590
uart_dev_t *hw = UART_LL_GET_HW(uart->num);
517591

518592
#ifdef CONFIG_IDF_TARGET_ESP32C3
519-
593+
520594
// ESP32-C3 requires further testing
521-
// Baud rate detection returns wrong values
522-
595+
// Baud rate detection returns wrong values
596+
523597
log_e("ESP32-C3 baud rate detection is not supported.");
524598
return;
525599

@@ -535,7 +609,7 @@ void uartStartDetectBaudrate(uart_t *uart) {
535609
hw->auto_baud.en = 1;
536610
#endif
537611
}
538-
612+
539613
unsigned long
540614
uartDetectBaudrate(uart_t *uart)
541615
{

0 commit comments

Comments
 (0)