int serial_writable(serial_t *obj) { uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); if (status_flags & kLPUART_RxOverrunFlag) LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag); return (status_flags & kLPUART_TxDataRegEmptyFlag); }
int serial_readable(serial_t *obj) { uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); if (status_flags & kLPUART_RxOverrunFlag) { LPUART_ClearStatusFlags(uart_addrs[obj->index], kLPUART_RxOverrunFlag); } return (status_flags & kLPUART_RxDataRegFullFlag); }
/****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index) { LPUART_Type *base = uart_addrs[index]; /* If RX overrun. */ if (LPUART_STAT_OR_MASK & base->STAT) { /* Read base->D, otherwise the RX does not work. */ (void)base->DATA; LPUART_ClearStatusFlags(base, kLPUART_RxOverrunFlag); } if (serial_irq_ids[index] != 0) { if (transmit_empty) irq_handler(serial_irq_ids[index], TxIrq); if (receive_full) irq_handler(serial_irq_ids[index], RxIrq); } }
static int mcux_lpuart_err_check(struct device *dev) { const struct mcux_lpuart_config *config = dev->config->config_info; u32_t flags = LPUART_GetStatusFlags(config->base); int err = 0; if (flags & kLPUART_RxOverrunFlag) { err |= UART_ERROR_OVERRUN; } if (flags & kLPUART_ParityErrorFlag) { err |= UART_ERROR_PARITY; } if (flags & kLPUART_FramingErrorFlag) { err |= UART_ERROR_FRAMING; } LPUART_ClearStatusFlags(config->base, kLPUART_RxOverrunFlag | kLPUART_ParityErrorFlag | kLPUART_FramingErrorFlag); return err; }