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
5453static 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
6362static 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-
10696void 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
158151void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)
0 commit comments