void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { IRQn_Type uart_irqs[] = LPUART_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; default: break; } if (enable) { switch (irq) { case RxIrq: LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable); break; case TxIrq: LPUART_EnableInterrupts(uart_addrs[obj->index], kLPUART_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: LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_RxDataRegFullInterruptEnable); break; case TxIrq: LPUART_DisableInterrupts(uart_addrs[obj->index], kLPUART_TxDataRegEmptyInterruptEnable); break; default: break; } switch (other_irq) { case RxIrq: all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_RxDataRegFullInterruptEnable) == 0); break; case TxIrq: all_disabled = ((LPUART_GetEnabledInterrupts(uart_addrs[obj->index]) & kLPUART_TxDataRegEmptyInterruptEnable) == 0); break; default: break; } if (all_disabled) NVIC_DisableIRQ(uart_irqs[obj->index]); } }
static int mcux_lpuart_irq_rx_ready(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_RxDataRegFullInterruptEnable; return (LPUART_GetEnabledInterrupts(config->base) & mask) && mcux_lpuart_irq_rx_full(dev); }
static int mcux_lpuart_irq_tx_ready(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_TxDataRegEmptyInterruptEnable; return (LPUART_GetEnabledInterrupts(config->base) & mask) && mcux_lpuart_irq_tx_complete(dev); }