Skip to content

Commit c01f7e4

Browse files
committed
K64F: Update UART aynchronous API for tickless implementation
Do not allow entry to deep sleep mode when UART transfer is active Signed-off-by: Mahesh Mahadevan <[email protected]>
1 parent a36deb9 commit c01f7e4

File tree

1 file changed

+34
-0
lines changed
  • targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F

1 file changed

+34
-0
lines changed

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
550550
/* Start the transfer */
551551
serial_send_asynch(obj);
552552

553+
/* Can't enter deep sleep as long as UART transmit is active */
554+
sleep_manager_lock_deep_sleep();
555+
553556
return 0;
554557
}
555558

@@ -615,6 +618,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
615618

616619
/* Start the transfer */
617620
serial_receive_asynch(obj);
621+
622+
/* Can't enter deep sleep as long as UART transfer is active */
623+
sleep_manager_lock_deep_sleep();
618624
}
619625

620626
uint8_t serial_tx_active(serial_t *obj)
@@ -647,11 +653,15 @@ int serial_irq_handler_asynch(serial_t *obj)
647653
if ((obj->serial.txstate != kUART_TxIdle) && (obj->serial.uart_dma_handle.txState == kUART_TxIdle)) {
648654
obj->serial.txstate = kUART_TxIdle;
649655
status |= SERIAL_EVENT_TX_COMPLETE;
656+
/* Transmit is complete, re-enable entry to deep sleep mode */
657+
sleep_manager_unlock_deep_sleep();
650658
}
651659

652660
if ((obj->serial.rxstate != kUART_RxIdle) && (obj->serial.uart_dma_handle.rxState == kUART_RxIdle)) {
653661
obj->serial.rxstate = kUART_RxIdle;
654662
status |= SERIAL_EVENT_RX_COMPLETE;
663+
/* Receive is complete, re-enable entry to deep sleep mode */
664+
sleep_manager_unlock_deep_sleep();
655665
}
656666

657667
/* Release the dma channels if they were opportunistically allocated */
@@ -668,11 +678,15 @@ int serial_irq_handler_asynch(serial_t *obj)
668678
if ((obj->serial.txstate != kUART_TxIdle) && (obj->serial.uart_transfer_handle.txState == kUART_TxIdle)) {
669679
obj->serial.txstate = kUART_TxIdle;
670680
status |= SERIAL_EVENT_TX_COMPLETE;
681+
/* Transmit is complete, re-enable entry to deep sleep mode */
682+
sleep_manager_unlock_deep_sleep();
671683
}
672684

673685
if ((obj->serial.rxstate != kUART_RxIdle) && (obj->serial.uart_transfer_handle.rxState == kUART_RxIdle)) {
674686
obj->serial.rxstate = kUART_RxIdle;
675687
status |= SERIAL_EVENT_RX_COMPLETE;
688+
/* Receive is complete, re-enable entry to deep sleep mode */
689+
sleep_manager_unlock_deep_sleep();
676690
}
677691
}
678692
#if 0
@@ -704,6 +718,11 @@ int serial_irq_handler_asynch(serial_t *obj)
704718

705719
void serial_tx_abort_asynch(serial_t *obj)
706720
{
721+
// If we're not currently transferring, then there's nothing to do here
722+
if (serial_tx_active(obj) == 0) {
723+
return;
724+
}
725+
707726
if (obj->serial.uartDmaRx.dmaUsageState == DMA_USAGE_ALLOCATED || obj->serial.uartDmaRx.dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED) {
708727
UART_TransferAbortSendEDMA(uart_addrs[obj->serial.index], &obj->serial.uart_dma_handle);
709728
/* Release the dma channels if they were opportunistically allocated */
@@ -718,10 +737,20 @@ void serial_tx_abort_asynch(serial_t *obj)
718737
} else {
719738
UART_TransferAbortSend(uart_addrs[obj->serial.index], &obj->serial.uart_transfer_handle);
720739
}
740+
741+
obj->serial.txstate = kUART_TxIdle;
742+
743+
/* Re-enable entry to deep sleep mode */
744+
sleep_manager_unlock_deep_sleep();
721745
}
722746

723747
void serial_rx_abort_asynch(serial_t *obj)
724748
{
749+
// If we're not currently transferring, then there's nothing to do here
750+
if (serial_rx_active(obj) == 0) {
751+
return;
752+
}
753+
725754
if (obj->serial.uartDmaRx.dmaUsageState == DMA_USAGE_ALLOCATED || obj->serial.uartDmaRx.dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED) {
726755
UART_TransferAbortReceiveEDMA(uart_addrs[obj->serial.index], &obj->serial.uart_dma_handle);
727756
/* Release the dma channels if they were opportunistically allocated */
@@ -736,6 +765,11 @@ void serial_rx_abort_asynch(serial_t *obj)
736765
} else {
737766
UART_TransferAbortReceive(uart_addrs[obj->serial.index], &obj->serial.uart_transfer_handle);
738767
}
768+
769+
obj->serial.rxstate = kUART_RxIdle;
770+
771+
/* Re-enable entry to deep sleep mode */
772+
sleep_manager_unlock_deep_sleep();
739773
}
740774

741775
#endif

0 commit comments

Comments
 (0)