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 int uart_mcux_irq_rx_ready(struct device *dev) { const struct uart_mcux_config *config = dev->config->config_info; u32_t mask = kUART_RxDataRegFullInterruptEnable; return (UART_GetEnabledInterrupts(config->base) & mask) && uart_mcux_irq_rx_full(dev); }
static int uart_mcux_irq_tx_ready(struct device *dev) { const struct uart_mcux_config *config = dev->config->config_info; u32_t mask = kUART_TxDataRegEmptyInterruptEnable; return (UART_GetEnabledInterrupts(config->base) & mask) && uart_mcux_irq_tx_complete(dev); }