Skip to content

Commit db77195

Browse files
committed
Fix Serial
1 parent cc00af3 commit db77195

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

cores/esp32/esp32-hal-uart.c

+16-23
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
#include "soc/io_mux_reg.h"
2828
#include "soc/gpio_sig_map.h"
2929
#include "soc/dport_reg.h"
30-
31-
#define ETS_UART_INUM 5
32-
#define ETS_UART2_INUM ETS_UART_INUM
30+
#include "esp_intr_alloc.h"
3331

3432
#define UART_REG_BASE(u) ((u==0)?DR_REG_UART_BASE:( (u==1)?DR_REG_UART1_BASE:( (u==2)?DR_REG_UART2_BASE:0)))
3533
#define UART_RXD_IDX(u) ((u==0)?U0RXD_IN_IDX:( (u==1)?U1RXD_IN_IDX:( (u==2)?U2RXD_IN_IDX:0)))
@@ -45,25 +43,26 @@ struct uart_struct_t {
4543
#endif
4644
uint8_t num;
4745
xQueueHandle queue;
46+
intr_handle_t intr_handle;
4847
};
4948

5049
#if CONFIG_DISABLE_HAL_LOCKS
5150
#define UART_MUTEX_LOCK()
5251
#define UART_MUTEX_UNLOCK()
5352

5453
static uart_t _uart_bus_array[3] = {
55-
{(volatile uart_dev_t *)(DR_REG_UART_BASE), 0, NULL},
56-
{(volatile uart_dev_t *)(DR_REG_UART1_BASE), 1, NULL},
57-
{(volatile uart_dev_t *)(DR_REG_UART2_BASE), 2, NULL}
54+
{(volatile uart_dev_t *)(DR_REG_UART_BASE), 0, NULL, NULL},
55+
{(volatile uart_dev_t *)(DR_REG_UART1_BASE), 1, NULL, NULL},
56+
{(volatile uart_dev_t *)(DR_REG_UART2_BASE), 2, NULL, NULL}
5857
};
5958
#else
6059
#define UART_MUTEX_LOCK() do {} while (xSemaphoreTake(uart->lock, portMAX_DELAY) != pdPASS)
6160
#define UART_MUTEX_UNLOCK() xSemaphoreGive(uart->lock)
6261

6362
static uart_t _uart_bus_array[3] = {
64-
{(volatile uart_dev_t *)(DR_REG_UART_BASE), NULL, 0, NULL},
65-
{(volatile uart_dev_t *)(DR_REG_UART1_BASE), NULL, 1, NULL},
66-
{(volatile uart_dev_t *)(DR_REG_UART2_BASE), NULL, 2, NULL}
63+
{(volatile uart_dev_t *)(DR_REG_UART_BASE), NULL, 0, NULL, NULL},
64+
{(volatile uart_dev_t *)(DR_REG_UART1_BASE), NULL, 1, NULL, NULL},
65+
{(volatile uart_dev_t *)(DR_REG_UART2_BASE), NULL, 2, NULL, NULL}
6766
};
6867
#endif
6968

@@ -75,6 +74,9 @@ static void IRAM_ATTR _uart_isr(void *arg)
7574

7675
for(i=0;i<3;i++){
7776
uart = &_uart_bus_array[i];
77+
if(uart->intr_handle == NULL){
78+
continue;
79+
}
7880
uart->dev->int_clr.rxfifo_full = 1;
7981
uart->dev->int_clr.frm_err = 1;
8082
uart->dev->int_clr.rxfifo_tout = 1;
@@ -91,18 +93,6 @@ static void IRAM_ATTR _uart_isr(void *arg)
9193
}
9294
}
9395

94-
void uartEnableGlobalInterrupt()
95-
{
96-
xt_set_interrupt_handler(ETS_UART_INUM, _uart_isr, NULL);
97-
ESP_INTR_ENABLE(ETS_UART_INUM);
98-
}
99-
100-
void uartDisableGlobalInterrupt()
101-
{
102-
ESP_INTR_DISABLE(ETS_UART_INUM);
103-
xt_set_interrupt_handler(ETS_UART_INUM, NULL, NULL);
104-
}
105-
10696
void uartEnableInterrupt(uart_t* uart)
10797
{
10898
UART_MUTEX_LOCK();
@@ -114,7 +104,7 @@ void uartEnableInterrupt(uart_t* uart)
114104
uart->dev->int_ena.rxfifo_tout = 1;
115105
uart->dev->int_clr.val = 0xffffffff;
116106

117-
intr_matrix_set(xPortGetCoreID(), UART_INTR_SOURCE(uart->num), ETS_UART_INUM);
107+
esp_intr_alloc(UART_INTR_SOURCE(uart->num), (int)ESP_INTR_FLAG_IRAM, _uart_isr, NULL, &uart->intr_handle);
118108
UART_MUTEX_UNLOCK();
119109
}
120110

@@ -124,6 +114,10 @@ void uartDisableInterrupt(uart_t* uart)
124114
uart->dev->conf1.val = 0;
125115
uart->dev->int_ena.val = 0;
126116
uart->dev->int_clr.val = 0xffffffff;
117+
118+
esp_intr_free(uart->intr_handle);
119+
uart->intr_handle = NULL;
120+
127121
UART_MUTEX_UNLOCK();
128122
}
129123

@@ -152,7 +146,6 @@ void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted)
152146
pinMode(rxPin, INPUT);
153147
pinMatrixInAttach(rxPin, UART_RXD_IDX(uart->num), inverted);
154148
uartEnableInterrupt(uart);
155-
uartEnableGlobalInterrupt();
156149
}
157150

158151
void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)

0 commit comments

Comments
 (0)