Skip to content

Commit fc13550

Browse files
mmahadevan108adbridge
authored andcommitted
MCUXpresso: Update the MXRT Serial driver for MBED_TICKLESS
We should not block in case the UART is busy transmitting. The API has been updated to check the status of all UART's and return 1 in case any of them is busy transmitting. Signed-off-by: Mahesh Mahadevan <[email protected]>
1 parent 7171031 commit fc13550

File tree

1 file changed

+55
-5
lines changed
  • targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX

1 file changed

+55
-5
lines changed

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/serial_api.c

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,14 +316,64 @@ const PinMap *serial_rts_pinmap()
316316
return PinMap_UART_RTS;
317317
}
318318

319-
void serial_wait_tx_complete(uint32_t uart_index)
319+
static int serial_is_enabled(uint32_t uart_index)
320320
{
321-
LPUART_Type *base = uart_addrs[uart_index];
321+
int clock_enabled = 0;
322+
switch (uart_index) {
323+
case 0:
324+
clock_enabled = (CCM->CCGR5 & CCM_CCGR5_CG12_MASK) >> CCM_CCGR5_CG12_SHIFT;
325+
break;
326+
case 1:
327+
clock_enabled = (CCM->CCGR0 & CCM_CCGR0_CG14_MASK) >> CCM_CCGR0_CG14_SHIFT;
328+
break;
329+
case 2:
330+
clock_enabled = (CCM->CCGR0 & CCM_CCGR0_CG6_MASK) >> CCM_CCGR0_CG6_SHIFT;
331+
break;
332+
case 3:
333+
clock_enabled = (CCM->CCGR1 & CCM_CCGR1_CG12_MASK) >> CCM_CCGR1_CG12_SHIFT;
334+
break;
335+
case 4:
336+
clock_enabled = (CCM->CCGR3 & CCM_CCGR3_CG1_MASK) >> CCM_CCGR3_CG1_SHIFT;
337+
break;
338+
case 5:
339+
clock_enabled = (CCM->CCGR3 & CCM_CCGR3_CG3_MASK) >> CCM_CCGR3_CG3_SHIFT;
340+
break;
341+
case 6:
342+
clock_enabled = (CCM->CCGR5 & CCM_CCGR5_CG13_MASK) >> CCM_CCGR5_CG13_SHIFT;
343+
break;
344+
case 7:
345+
clock_enabled = (CCM->CCGR6 & CCM_CCGR6_CG7_MASK) >> CCM_CCGR6_CG7_SHIFT;
346+
break;
347+
default:
348+
break;
349+
}
350+
351+
return clock_enabled;
352+
}
353+
354+
bool serial_check_tx_ongoing()
355+
{
356+
LPUART_Type *base;
357+
int i;
358+
bool uart_tx_ongoing = false;
359+
360+
for (i = 0; i < FSL_FEATURE_SOC_LPUART_COUNT; i++) {
361+
/* First check if UART is enabled */
362+
if (!serial_is_enabled(i)) {
363+
/* UART is not enabled, check the next instance */
364+
continue;
365+
}
366+
367+
base = uart_addrs[i];
322368

323-
/* Wait till data is flushed out of transmit buffer */
324-
while (!(kLPUART_TransmissionCompleteFlag & LPUART_GetStatusFlags((LPUART_Type *)base)))
325-
{
369+
/* Check if data is waiting to be written out of transmit buffer */
370+
if (!(kLPUART_TransmissionCompleteFlag & LPUART_GetStatusFlags((LPUART_Type *)base))) {
371+
uart_tx_ongoing = true;
372+
break;
373+
}
326374
}
375+
376+
return uart_tx_ongoing;
327377
}
328378

329379
#endif

0 commit comments

Comments
 (0)