24
24
#include <string.h>
25
25
26
26
#include "cmsis.h"
27
+ #include "mbed_power_mgmt.h"
27
28
#include "pinmap.h"
28
29
#include "fsl_uart.h"
29
30
#include "peripheral_clock_defines.h"
@@ -543,6 +544,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
543
544
/* Start the transfer */
544
545
serial_send_asynch (obj );
545
546
547
+ /* Can't enter deep sleep as long as UART transmit is active */
548
+ sleep_manager_lock_deep_sleep ();
549
+
546
550
return 0 ;
547
551
}
548
552
@@ -608,6 +612,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
608
612
609
613
/* Start the transfer */
610
614
serial_receive_asynch (obj );
615
+
616
+ /* Can't enter deep sleep as long as UART transfer is active */
617
+ sleep_manager_lock_deep_sleep ();
611
618
}
612
619
613
620
uint8_t serial_tx_active (serial_t * obj )
@@ -640,11 +647,15 @@ int serial_irq_handler_asynch(serial_t *obj)
640
647
if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_dma_handle .txState == kUART_TxIdle )) {
641
648
obj -> serial .txstate = kUART_TxIdle ;
642
649
status |= SERIAL_EVENT_TX_COMPLETE ;
650
+ /* Transmit is complete, re-enable entry to deep sleep mode */
651
+ sleep_manager_unlock_deep_sleep ();
643
652
}
644
653
645
654
if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_dma_handle .rxState == kUART_RxIdle )) {
646
655
obj -> serial .rxstate = kUART_RxIdle ;
647
656
status |= SERIAL_EVENT_RX_COMPLETE ;
657
+ /* Receive is complete, re-enable entry to deep sleep mode */
658
+ sleep_manager_unlock_deep_sleep ();
648
659
}
649
660
650
661
/* Release the dma channels if they were opportunistically allocated */
@@ -661,11 +672,15 @@ int serial_irq_handler_asynch(serial_t *obj)
661
672
if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_transfer_handle .txState == kUART_TxIdle )) {
662
673
obj -> serial .txstate = kUART_TxIdle ;
663
674
status |= SERIAL_EVENT_TX_COMPLETE ;
675
+ /* Transmit is complete, re-enable entry to deep sleep mode */
676
+ sleep_manager_unlock_deep_sleep ();
664
677
}
665
678
666
679
if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_transfer_handle .rxState == kUART_RxIdle )) {
667
680
obj -> serial .rxstate = kUART_RxIdle ;
668
681
status |= SERIAL_EVENT_RX_COMPLETE ;
682
+ /* Receive is complete, re-enable entry to deep sleep mode */
683
+ sleep_manager_unlock_deep_sleep ();
669
684
}
670
685
}
671
686
#if 0
@@ -697,6 +712,11 @@ int serial_irq_handler_asynch(serial_t *obj)
697
712
698
713
void serial_tx_abort_asynch (serial_t * obj )
699
714
{
715
+ // If we're not currently transferring, then there's nothing to do here
716
+ if (serial_tx_active (obj ) == 0 ) {
717
+ return ;
718
+ }
719
+
700
720
if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
701
721
UART_TransferAbortSendEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
702
722
/* Release the dma channels if they were opportunistically allocated */
@@ -711,10 +731,20 @@ void serial_tx_abort_asynch(serial_t *obj)
711
731
} else {
712
732
UART_TransferAbortSend (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
713
733
}
734
+
735
+ obj -> serial .txstate = kUART_TxIdle ;
736
+
737
+ /* Re-enable entry to deep sleep mode */
738
+ sleep_manager_unlock_deep_sleep ();
714
739
}
715
740
716
741
void serial_rx_abort_asynch (serial_t * obj )
717
742
{
743
+ // If we're not currently transferring, then there's nothing to do here
744
+ if (serial_rx_active (obj ) == 0 ) {
745
+ return ;
746
+ }
747
+
718
748
if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
719
749
UART_TransferAbortReceiveEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
720
750
/* Release the dma channels if they were opportunistically allocated */
@@ -729,6 +759,11 @@ void serial_rx_abort_asynch(serial_t *obj)
729
759
} else {
730
760
UART_TransferAbortReceive (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
731
761
}
762
+
763
+ obj -> serial .rxstate = kUART_RxIdle ;
764
+
765
+ /* Re-enable entry to deep sleep mode */
766
+ sleep_manager_unlock_deep_sleep ();
732
767
}
733
768
734
769
void serial_wait_tx_complete (uint32_t uart_index )
0 commit comments