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