27
27
#include "soc/io_mux_reg.h"
28
28
#include "soc/gpio_sig_map.h"
29
29
#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"
33
31
34
32
#define UART_REG_BASE (u ) ((u==0)?DR_REG_UART_BASE:( (u==1)?DR_REG_UART1_BASE:( (u==2)?DR_REG_UART2_BASE:0)))
35
33
#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 {
45
43
#endif
46
44
uint8_t num ;
47
45
xQueueHandle queue ;
46
+ intr_handle_t intr_handle ;
48
47
};
49
48
50
49
#if CONFIG_DISABLE_HAL_LOCKS
51
50
#define UART_MUTEX_LOCK ()
52
51
#define UART_MUTEX_UNLOCK ()
53
52
54
53
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 }
58
57
};
59
58
#else
60
59
#define UART_MUTEX_LOCK () do {} while (xSemaphoreTake(uart->lock, portMAX_DELAY) != pdPASS)
61
60
#define UART_MUTEX_UNLOCK () xSemaphoreGive(uart->lock)
62
61
63
62
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 }
67
66
};
68
67
#endif
69
68
@@ -75,6 +74,9 @@ static void IRAM_ATTR _uart_isr(void *arg)
75
74
76
75
for (i = 0 ;i < 3 ;i ++ ){
77
76
uart = & _uart_bus_array [i ];
77
+ if (uart -> intr_handle == NULL ){
78
+ continue ;
79
+ }
78
80
uart -> dev -> int_clr .rxfifo_full = 1 ;
79
81
uart -> dev -> int_clr .frm_err = 1 ;
80
82
uart -> dev -> int_clr .rxfifo_tout = 1 ;
@@ -91,18 +93,6 @@ static void IRAM_ATTR _uart_isr(void *arg)
91
93
}
92
94
}
93
95
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
-
106
96
void uartEnableInterrupt (uart_t * uart )
107
97
{
108
98
UART_MUTEX_LOCK ();
@@ -114,7 +104,7 @@ void uartEnableInterrupt(uart_t* uart)
114
104
uart -> dev -> int_ena .rxfifo_tout = 1 ;
115
105
uart -> dev -> int_clr .val = 0xffffffff ;
116
106
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 );
118
108
UART_MUTEX_UNLOCK ();
119
109
}
120
110
@@ -124,6 +114,10 @@ void uartDisableInterrupt(uart_t* uart)
124
114
uart -> dev -> conf1 .val = 0 ;
125
115
uart -> dev -> int_ena .val = 0 ;
126
116
uart -> dev -> int_clr .val = 0xffffffff ;
117
+
118
+ esp_intr_free (uart -> intr_handle );
119
+ uart -> intr_handle = NULL ;
120
+
127
121
UART_MUTEX_UNLOCK ();
128
122
}
129
123
@@ -152,7 +146,6 @@ void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted)
152
146
pinMode (rxPin , INPUT );
153
147
pinMatrixInAttach (rxPin , UART_RXD_IDX (uart -> num ), inverted );
154
148
uartEnableInterrupt (uart );
155
- uartEnableGlobalInterrupt ();
156
149
}
157
150
158
151
void uartAttachTx (uart_t * uart , uint8_t txPin , bool inverted )
0 commit comments