void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { IRQn_Type uart_irqs[] = UART_RX_TX_IRQS; uint32_t vector = 0; switch (obj->index) { case 0: vector = (uint32_t)&uart0_irq; break; case 1: vector = (uint32_t)&uart1_irq; break; case 2: vector = (uint32_t)&uart2_irq; break; default: break; } if (enable) { switch (irq) { case RxIrq: UART_EnableInterrupts(uart_addrs[obj->index], kUART_RxDataRegFullInterruptEnable); break; case TxIrq: UART_EnableInterrupts(uart_addrs[obj->index], kUART_TxDataRegEmptyInterruptEnable); break; default: break; } NVIC_SetVector(uart_irqs[obj->index], vector); NVIC_EnableIRQ(uart_irqs[obj->index]); } else { // disable int all_disabled = 0; SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq); switch (irq) { case RxIrq: UART_DisableInterrupts(uart_addrs[obj->index], kUART_RxDataRegFullInterruptEnable); break; case TxIrq: UART_DisableInterrupts(uart_addrs[obj->index], kUART_TxDataRegEmptyInterruptEnable); break; default: break; } switch (other_irq) { case RxIrq: all_disabled = ((UART_GetEnabledInterrupts(uart_addrs[obj->index]) & kUART_RxDataRegFullInterruptEnable) == 0); break; case TxIrq: all_disabled = ((UART_GetEnabledInterrupts(uart_addrs[obj->index]) & kUART_TxDataRegEmptyInterruptEnable) == 0); break; default: break; } if (all_disabled) NVIC_DisableIRQ(uart_irqs[obj->index]); } }
static void uart_mcux_irq_rx_disable(struct device *dev) { const struct uart_mcux_config *config = dev->config->config_info; u32_t mask = kUART_RxDataRegFullInterruptEnable; UART_DisableInterrupts(config->base, mask); }
static void uart_mcux_irq_err_disable(struct device *dev) { const struct uart_mcux_config *config = dev->config->config_info; u32_t mask = kUART_NoiseErrorInterruptEnable | kUART_FramingErrorInterruptEnable | kUART_ParityErrorInterruptEnable; UART_DisableInterrupts(config->base, mask); }
int hal_uart_close(int port) { struct hal_uart *u; if (port >= FSL_FEATURE_SOC_UART_COUNT) { return -1; } u = &uarts[port]; if (!u->u_open) { return -1; } u->u_open = 0; UART_DisableInterrupts(u->u_base, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable | kUART_TxDataRegEmptyInterruptEnable); DisableIRQ(u->u_irq); UART_EnableTx(u->u_base, false); UART_EnableRx(u->u_base, false); return 0; }