@@ -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
620626uint8_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
705719void 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
723747void 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