@@ -550,6 +550,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
550
550
/* Start the transfer */
551
551
serial_send_asynch (obj );
552
552
553
+ /* Can't enter deep sleep as long as UART transmit is active */
554
+ sleep_manager_lock_deep_sleep ();
555
+
553
556
return 0 ;
554
557
}
555
558
@@ -615,6 +618,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
615
618
616
619
/* Start the transfer */
617
620
serial_receive_asynch (obj );
621
+
622
+ /* Can't enter deep sleep as long as UART transfer is active */
623
+ sleep_manager_lock_deep_sleep ();
618
624
}
619
625
620
626
uint8_t serial_tx_active (serial_t * obj )
@@ -647,11 +653,15 @@ int serial_irq_handler_asynch(serial_t *obj)
647
653
if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_dma_handle .txState == kUART_TxIdle )) {
648
654
obj -> serial .txstate = kUART_TxIdle ;
649
655
status |= SERIAL_EVENT_TX_COMPLETE ;
656
+ /* Transmit is complete, re-enable entry to deep sleep mode */
657
+ sleep_manager_unlock_deep_sleep ();
650
658
}
651
659
652
660
if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_dma_handle .rxState == kUART_RxIdle )) {
653
661
obj -> serial .rxstate = kUART_RxIdle ;
654
662
status |= SERIAL_EVENT_RX_COMPLETE ;
663
+ /* Receive is complete, re-enable entry to deep sleep mode */
664
+ sleep_manager_unlock_deep_sleep ();
655
665
}
656
666
657
667
/* Release the dma channels if they were opportunistically allocated */
@@ -668,11 +678,15 @@ int serial_irq_handler_asynch(serial_t *obj)
668
678
if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_transfer_handle .txState == kUART_TxIdle )) {
669
679
obj -> serial .txstate = kUART_TxIdle ;
670
680
status |= SERIAL_EVENT_TX_COMPLETE ;
681
+ /* Transmit is complete, re-enable entry to deep sleep mode */
682
+ sleep_manager_unlock_deep_sleep ();
671
683
}
672
684
673
685
if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_transfer_handle .rxState == kUART_RxIdle )) {
674
686
obj -> serial .rxstate = kUART_RxIdle ;
675
687
status |= SERIAL_EVENT_RX_COMPLETE ;
688
+ /* Receive is complete, re-enable entry to deep sleep mode */
689
+ sleep_manager_unlock_deep_sleep ();
676
690
}
677
691
}
678
692
#if 0
@@ -704,6 +718,11 @@ int serial_irq_handler_asynch(serial_t *obj)
704
718
705
719
void serial_tx_abort_asynch (serial_t * obj )
706
720
{
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
+
707
726
if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
708
727
UART_TransferAbortSendEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
709
728
/* Release the dma channels if they were opportunistically allocated */
@@ -718,10 +737,20 @@ void serial_tx_abort_asynch(serial_t *obj)
718
737
} else {
719
738
UART_TransferAbortSend (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
720
739
}
740
+
741
+ obj -> serial .txstate = kUART_TxIdle ;
742
+
743
+ /* Re-enable entry to deep sleep mode */
744
+ sleep_manager_unlock_deep_sleep ();
721
745
}
722
746
723
747
void serial_rx_abort_asynch (serial_t * obj )
724
748
{
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
+
725
754
if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
726
755
UART_TransferAbortReceiveEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
727
756
/* Release the dma channels if they were opportunistically allocated */
@@ -736,6 +765,11 @@ void serial_rx_abort_asynch(serial_t *obj)
736
765
} else {
737
766
UART_TransferAbortReceive (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
738
767
}
768
+
769
+ obj -> serial .rxstate = kUART_RxIdle ;
770
+
771
+ /* Re-enable entry to deep sleep mode */
772
+ sleep_manager_unlock_deep_sleep ();
739
773
}
740
774
741
775
#endif
0 commit comments