From db771954044928358f725a698d9e5d965d165f6b Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 27 Sep 2017 13:50:05 +0800 Subject: [PATCH] Fix Serial --- cores/esp32/esp32-hal-uart.c | 39 +++++++++++++++--------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/cores/esp32/esp32-hal-uart.c b/cores/esp32/esp32-hal-uart.c index 20e7a9b9..66126689 100644 --- a/cores/esp32/esp32-hal-uart.c +++ b/cores/esp32/esp32-hal-uart.c @@ -27,9 +27,7 @@ #include "soc/io_mux_reg.h" #include "soc/gpio_sig_map.h" #include "soc/dport_reg.h" - -#define ETS_UART_INUM 5 -#define ETS_UART2_INUM ETS_UART_INUM +#include "esp_intr_alloc.h" #define UART_REG_BASE(u) ((u==0)?DR_REG_UART_BASE:( (u==1)?DR_REG_UART1_BASE:( (u==2)?DR_REG_UART2_BASE:0))) #define UART_RXD_IDX(u) ((u==0)?U0RXD_IN_IDX:( (u==1)?U1RXD_IN_IDX:( (u==2)?U2RXD_IN_IDX:0))) @@ -45,6 +43,7 @@ struct uart_struct_t { #endif uint8_t num; xQueueHandle queue; + intr_handle_t intr_handle; }; #if CONFIG_DISABLE_HAL_LOCKS @@ -52,18 +51,18 @@ struct uart_struct_t { #define UART_MUTEX_UNLOCK() static uart_t _uart_bus_array[3] = { - {(volatile uart_dev_t *)(DR_REG_UART_BASE), 0, NULL}, - {(volatile uart_dev_t *)(DR_REG_UART1_BASE), 1, NULL}, - {(volatile uart_dev_t *)(DR_REG_UART2_BASE), 2, NULL} + {(volatile uart_dev_t *)(DR_REG_UART_BASE), 0, NULL, NULL}, + {(volatile uart_dev_t *)(DR_REG_UART1_BASE), 1, NULL, NULL}, + {(volatile uart_dev_t *)(DR_REG_UART2_BASE), 2, NULL, NULL} }; #else #define UART_MUTEX_LOCK() do {} while (xSemaphoreTake(uart->lock, portMAX_DELAY) != pdPASS) #define UART_MUTEX_UNLOCK() xSemaphoreGive(uart->lock) static uart_t _uart_bus_array[3] = { - {(volatile uart_dev_t *)(DR_REG_UART_BASE), NULL, 0, NULL}, - {(volatile uart_dev_t *)(DR_REG_UART1_BASE), NULL, 1, NULL}, - {(volatile uart_dev_t *)(DR_REG_UART2_BASE), NULL, 2, NULL} + {(volatile uart_dev_t *)(DR_REG_UART_BASE), NULL, 0, NULL, NULL}, + {(volatile uart_dev_t *)(DR_REG_UART1_BASE), NULL, 1, NULL, NULL}, + {(volatile uart_dev_t *)(DR_REG_UART2_BASE), NULL, 2, NULL, NULL} }; #endif @@ -75,6 +74,9 @@ static void IRAM_ATTR _uart_isr(void *arg) for(i=0;i<3;i++){ uart = &_uart_bus_array[i]; + if(uart->intr_handle == NULL){ + continue; + } uart->dev->int_clr.rxfifo_full = 1; uart->dev->int_clr.frm_err = 1; uart->dev->int_clr.rxfifo_tout = 1; @@ -91,18 +93,6 @@ static void IRAM_ATTR _uart_isr(void *arg) } } -void uartEnableGlobalInterrupt() -{ - xt_set_interrupt_handler(ETS_UART_INUM, _uart_isr, NULL); - ESP_INTR_ENABLE(ETS_UART_INUM); -} - -void uartDisableGlobalInterrupt() -{ - ESP_INTR_DISABLE(ETS_UART_INUM); - xt_set_interrupt_handler(ETS_UART_INUM, NULL, NULL); -} - void uartEnableInterrupt(uart_t* uart) { UART_MUTEX_LOCK(); @@ -114,7 +104,7 @@ void uartEnableInterrupt(uart_t* uart) uart->dev->int_ena.rxfifo_tout = 1; uart->dev->int_clr.val = 0xffffffff; - intr_matrix_set(xPortGetCoreID(), UART_INTR_SOURCE(uart->num), ETS_UART_INUM); + esp_intr_alloc(UART_INTR_SOURCE(uart->num), (int)ESP_INTR_FLAG_IRAM, _uart_isr, NULL, &uart->intr_handle); UART_MUTEX_UNLOCK(); } @@ -124,6 +114,10 @@ void uartDisableInterrupt(uart_t* uart) uart->dev->conf1.val = 0; uart->dev->int_ena.val = 0; uart->dev->int_clr.val = 0xffffffff; + + esp_intr_free(uart->intr_handle); + uart->intr_handle = NULL; + UART_MUTEX_UNLOCK(); } @@ -152,7 +146,6 @@ void uartAttachRx(uart_t* uart, uint8_t rxPin, bool inverted) pinMode(rxPin, INPUT); pinMatrixInAttach(rxPin, UART_RXD_IDX(uart->num), inverted); uartEnableInterrupt(uart); - uartEnableGlobalInterrupt(); } void uartAttachTx(uart_t* uart, uint8_t txPin, bool inverted)