2424#include <string.h>
2525
2626#include "cmsis.h"
27+ #include "mbed_power_mgmt.h"
2728#include "pinmap.h"
2829#include "fsl_uart.h"
2930#include "peripheral_clock_defines.h"
@@ -271,7 +272,7 @@ int serial_getc(serial_t *obj)
271272
272273void serial_putc (serial_t * obj , int c )
273274{
274- UART_Type * base = uart_addrs [obj -> index ];
275+ UART_Type * base = uart_addrs [obj -> serial . index ];
275276
276277 while (!serial_writable (obj ));
277278 UART_WriteByte (base , (uint8_t )c );
@@ -550,6 +551,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
550551 /* Start the transfer */
551552 serial_send_asynch (obj );
552553
554+ /* Can't enter deep sleep as long as UART transmit is active */
555+ sleep_manager_lock_deep_sleep ();
556+
553557 return 0 ;
554558}
555559
@@ -615,6 +619,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
615619
616620 /* Start the transfer */
617621 serial_receive_asynch (obj );
622+
623+ /* Can't enter deep sleep as long as UART transfer is active */
624+ sleep_manager_lock_deep_sleep ();
618625}
619626
620627uint8_t serial_tx_active (serial_t * obj )
@@ -647,11 +654,15 @@ int serial_irq_handler_asynch(serial_t *obj)
647654 if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_dma_handle .txState == kUART_TxIdle )) {
648655 obj -> serial .txstate = kUART_TxIdle ;
649656 status |= SERIAL_EVENT_TX_COMPLETE ;
657+ /* Transmit is complete, re-enable entry to deep sleep mode */
658+ sleep_manager_unlock_deep_sleep ();
650659 }
651660
652661 if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_dma_handle .rxState == kUART_RxIdle )) {
653662 obj -> serial .rxstate = kUART_RxIdle ;
654663 status |= SERIAL_EVENT_RX_COMPLETE ;
664+ /* Receive is complete, re-enable entry to deep sleep mode */
665+ sleep_manager_unlock_deep_sleep ();
655666 }
656667
657668 /* Release the dma channels if they were opportunistically allocated */
@@ -668,11 +679,15 @@ int serial_irq_handler_asynch(serial_t *obj)
668679 if ((obj -> serial .txstate != kUART_TxIdle ) && (obj -> serial .uart_transfer_handle .txState == kUART_TxIdle )) {
669680 obj -> serial .txstate = kUART_TxIdle ;
670681 status |= SERIAL_EVENT_TX_COMPLETE ;
682+ /* Transmit is complete, re-enable entry to deep sleep mode */
683+ sleep_manager_unlock_deep_sleep ();
671684 }
672685
673686 if ((obj -> serial .rxstate != kUART_RxIdle ) && (obj -> serial .uart_transfer_handle .rxState == kUART_RxIdle )) {
674687 obj -> serial .rxstate = kUART_RxIdle ;
675688 status |= SERIAL_EVENT_RX_COMPLETE ;
689+ /* Receive is complete, re-enable entry to deep sleep mode */
690+ sleep_manager_unlock_deep_sleep ();
676691 }
677692 }
678693#if 0
@@ -704,6 +719,11 @@ int serial_irq_handler_asynch(serial_t *obj)
704719
705720void serial_tx_abort_asynch (serial_t * obj )
706721{
722+ // If we're not currently transferring, then there's nothing to do here
723+ if (serial_tx_active (obj ) == 0 ) {
724+ return ;
725+ }
726+
707727 if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
708728 UART_TransferAbortSendEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
709729 /* Release the dma channels if they were opportunistically allocated */
@@ -718,10 +738,20 @@ void serial_tx_abort_asynch(serial_t *obj)
718738 } else {
719739 UART_TransferAbortSend (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
720740 }
741+
742+ obj -> serial .txstate = kUART_TxIdle ;
743+
744+ /* Re-enable entry to deep sleep mode */
745+ sleep_manager_unlock_deep_sleep ();
721746}
722747
723748void serial_rx_abort_asynch (serial_t * obj )
724749{
750+ // If we're not currently transferring, then there's nothing to do here
751+ if (serial_rx_active (obj ) == 0 ) {
752+ return ;
753+ }
754+
725755 if (obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_ALLOCATED || obj -> serial .uartDmaRx .dmaUsageState == DMA_USAGE_TEMPORARY_ALLOCATED ) {
726756 UART_TransferAbortReceiveEDMA (uart_addrs [obj -> serial .index ], & obj -> serial .uart_dma_handle );
727757 /* Release the dma channels if they were opportunistically allocated */
@@ -736,6 +766,11 @@ void serial_rx_abort_asynch(serial_t *obj)
736766 } else {
737767 UART_TransferAbortReceive (uart_addrs [obj -> serial .index ], & obj -> serial .uart_transfer_handle );
738768 }
769+
770+ obj -> serial .rxstate = kUART_RxIdle ;
771+
772+ /* Re-enable entry to deep sleep mode */
773+ sleep_manager_unlock_deep_sleep ();
739774}
740775
741776#endif
0 commit comments