diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/serial_api.c index b68cccbe25..0fc649eb18 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/serial_api.c @@ -316,14 +316,64 @@ const PinMap *serial_rts_pinmap() return PinMap_UART_RTS; } -void serial_wait_tx_complete(uint32_t uart_index) +static int serial_is_enabled(uint32_t uart_index) { - LPUART_Type *base = uart_addrs[uart_index]; - - /* Wait till data is flushed out of transmit buffer */ - while (!(kLPUART_TransmissionCompleteFlag & LPUART_GetStatusFlags((LPUART_Type *)base))) - { + int clock_enabled = 0; + switch (uart_index) { + case 0: + clock_enabled = (CCM->CCGR5 & CCM_CCGR5_CG12_MASK) >> CCM_CCGR5_CG12_SHIFT; + break; + case 1: + clock_enabled = (CCM->CCGR0 & CCM_CCGR0_CG14_MASK) >> CCM_CCGR0_CG14_SHIFT; + break; + case 2: + clock_enabled = (CCM->CCGR0 & CCM_CCGR0_CG6_MASK) >> CCM_CCGR0_CG6_SHIFT; + break; + case 3: + clock_enabled = (CCM->CCGR1 & CCM_CCGR1_CG12_MASK) >> CCM_CCGR1_CG12_SHIFT; + break; + case 4: + clock_enabled = (CCM->CCGR3 & CCM_CCGR3_CG1_MASK) >> CCM_CCGR3_CG1_SHIFT; + break; + case 5: + clock_enabled = (CCM->CCGR3 & CCM_CCGR3_CG3_MASK) >> CCM_CCGR3_CG3_SHIFT; + break; + case 6: + clock_enabled = (CCM->CCGR5 & CCM_CCGR5_CG13_MASK) >> CCM_CCGR5_CG13_SHIFT; + break; + case 7: + clock_enabled = (CCM->CCGR6 & CCM_CCGR6_CG7_MASK) >> CCM_CCGR6_CG7_SHIFT; + break; + default: + break; } + + return clock_enabled; +} + +bool serial_check_tx_ongoing() +{ + LPUART_Type *base; + int i; + bool uart_tx_ongoing = false; + + for (i = 0; i < FSL_FEATURE_SOC_LPUART_COUNT; i++) { + /* First check if UART is enabled */ + if (!serial_is_enabled(i)) { + /* UART is not enabled, check the next instance */ + continue; + } + + base = uart_addrs[i]; + + /* Check if data is waiting to be written out of transmit buffer */ + if (!(kLPUART_TransmissionCompleteFlag & LPUART_GetStatusFlags((LPUART_Type *)base))) { + uart_tx_ongoing = true; + break; + } + } + + return uart_tx_ongoing; } #endif