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 void mcux_lpuart_irq_rx_disable(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_RxDataRegFullInterruptEnable; LPUART_DisableInterrupts(config->base, mask); }
static rt_err_t imxrt_control(struct rt_serial_device *serial, int cmd, void *arg) { struct imxrt_uart *uart; RT_ASSERT(serial != RT_NULL); uart = (struct imxrt_uart *)serial->parent.user_data; switch (cmd) { case RT_DEVICE_CTRL_CLR_INT: /* disable interrupt */ LPUART_DisableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); /* disable rx irq */ DisableIRQ(uart->irqn); break; case RT_DEVICE_CTRL_SET_INT: /* enable interrupt */ LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); /* enable rx irq */ EnableIRQ(uart->irqn); break; } return RT_EOK; }
static void mcux_lpuart_irq_err_disable(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t mask = kLPUART_NoiseErrorInterruptEnable | kLPUART_FramingErrorInterruptEnable | kLPUART_ParityErrorInterruptEnable; LPUART_DisableInterrupts(config->base, mask); }