Skip to content

Commit 1317f51

Browse files
ccli8adbridge
authored andcommitted
Refine serial PDMA code
1 parent da27610 commit 1317f51

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

targets/TARGET_NUVOTON/TARGET_M451/serial_api.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
502502
MBED_ASSERT(modinit != NULL);
503503
MBED_ASSERT(modinit->modname == obj->serial.uart);
504504

505-
PDMA->CHCTL |= 1 << obj->serial.dma_chn_id_tx; // Enable this DMA channel
505+
PDMA_T *pdma_base = dma_modbase();
506+
507+
pdma_base->CHCTL |= 1 << obj->serial.dma_chn_id_tx; // Enable this DMA channel
506508
PDMA_SetTransferMode(obj->serial.dma_chn_id_tx,
507509
((struct nu_uart_var *) modinit->var)->pdma_perp_tx, // Peripheral connected to this PDMA
508510
0, // Scatter-gather disabled
@@ -563,7 +565,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
563565
MBED_ASSERT(modinit != NULL);
564566
MBED_ASSERT(modinit->modname == obj->serial.uart);
565567

566-
PDMA->CHCTL |= 1 << obj->serial.dma_chn_id_rx; // Enable this DMA channel
568+
PDMA_T *pdma_base = dma_modbase();
569+
570+
pdma_base->CHCTL |= 1 << obj->serial.dma_chn_id_rx; // Enable this DMA channel
567571
PDMA_SetTransferMode(obj->serial.dma_chn_id_rx,
568572
((struct nu_uart_var *) modinit->var)->pdma_perp_rx, // Peripheral connected to this PDMA
569573
0, // Scatter-gather disabled
@@ -596,11 +600,13 @@ void serial_tx_abort_asynch(serial_t *obj)
596600
while (! UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))));
597601

598602
if (obj->serial.dma_usage_tx != DMA_USAGE_NEVER) {
603+
PDMA_T *pdma_base = dma_modbase();
604+
599605
if (obj->serial.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) {
600606
PDMA_DisableInt(obj->serial.dma_chn_id_tx, PDMA_INT_TRANS_DONE);
601607
// FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
602608
//PDMA_STOP(obj->serial.dma_chn_id_tx);
603-
PDMA->CHCTL &= ~(1 << obj->serial.dma_chn_id_tx);
609+
pdma_base->CHCTL &= ~(1 << obj->serial.dma_chn_id_tx);
604610
}
605611
UART_DISABLE_INT(((UART_T *) NU_MODBASE(obj->serial.uart)), UART_INTEN_TXPDMAEN_Msk);
606612
}
@@ -615,11 +621,13 @@ void serial_tx_abort_asynch(serial_t *obj)
615621
void serial_rx_abort_asynch(serial_t *obj)
616622
{
617623
if (obj->serial.dma_usage_rx != DMA_USAGE_NEVER) {
624+
PDMA_T *pdma_base = dma_modbase();
625+
618626
if (obj->serial.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) {
619627
PDMA_DisableInt(obj->serial.dma_chn_id_rx, PDMA_INT_TRANS_DONE);
620628
// FIXME: On NUC472, next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
621629
//PDMA_STOP(obj->serial.dma_chn_id_rx);
622-
PDMA->CHCTL &= ~(1 << obj->serial.dma_chn_id_rx);
630+
pdma_base->CHCTL &= ~(1 << obj->serial.dma_chn_id_rx);
623631
}
624632
UART_DISABLE_INT(((UART_T *) NU_MODBASE(obj->serial.uart)), UART_INTEN_RXPDMAEN_Msk);
625633
}

targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,9 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
544544
MBED_ASSERT(modinit != NULL);
545545
MBED_ASSERT(modinit->modname == obj->serial.uart);
546546

547-
PDMA->CHCTL |= 1 << obj->serial.dma_chn_id_tx; // Enable this DMA channel
547+
PDMA_T *pdma_base = dma_modbase();
548+
549+
pdma_base->CHCTL |= 1 << obj->serial.dma_chn_id_tx; // Enable this DMA channel
548550
PDMA_SetTransferMode(obj->serial.dma_chn_id_tx,
549551
((struct nu_uart_var *) modinit->var)->pdma_perp_tx, // Peripheral connected to this PDMA
550552
0, // Scatter-gather disabled
@@ -603,7 +605,9 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
603605
MBED_ASSERT(modinit != NULL);
604606
MBED_ASSERT(modinit->modname == obj->serial.uart);
605607

606-
PDMA->CHCTL |= 1 << obj->serial.dma_chn_id_rx; // Enable this DMA channel
608+
PDMA_T *pdma_base = dma_modbase();
609+
610+
pdma_base->CHCTL |= 1 << obj->serial.dma_chn_id_rx; // Enable this DMA channel
607611
PDMA_SetTransferMode(obj->serial.dma_chn_id_rx,
608612
((struct nu_uart_var *) modinit->var)->pdma_perp_rx, // Peripheral connected to this PDMA
609613
0, // Scatter-gather disabled
@@ -634,11 +638,13 @@ void serial_tx_abort_asynch(serial_t *obj)
634638
while (! UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))));
635639

636640
if (obj->serial.dma_usage_tx != DMA_USAGE_NEVER) {
641+
PDMA_T *pdma_base = dma_modbase();
642+
637643
if (obj->serial.dma_chn_id_tx != DMA_ERROR_OUT_OF_CHANNELS) {
638644
PDMA_DisableInt(obj->serial.dma_chn_id_tx, 0);
639645
// FIXME: Next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
640646
//PDMA_STOP(obj->serial.dma_chn_id_tx);
641-
PDMA->CHCTL &= ~(1 << obj->serial.dma_chn_id_tx);
647+
pdma_base->CHCTL &= ~(1 << obj->serial.dma_chn_id_tx);
642648
}
643649
UART_DISABLE_INT(((UART_T *) NU_MODBASE(obj->serial.uart)), UART_INTEN_TXPDMAEN_Msk);
644650
}
@@ -653,11 +659,13 @@ void serial_tx_abort_asynch(serial_t *obj)
653659
void serial_rx_abort_asynch(serial_t *obj)
654660
{
655661
if (obj->serial.dma_usage_rx != DMA_USAGE_NEVER) {
662+
PDMA_T *pdma_base = dma_modbase();
663+
656664
if (obj->serial.dma_chn_id_rx != DMA_ERROR_OUT_OF_CHANNELS) {
657665
PDMA_DisableInt(obj->serial.dma_chn_id_rx, 0);
658666
// FIXME: Next PDMA transfer will fail with PDMA_STOP() called. Cause is unknown.
659667
//PDMA_STOP(obj->serial.dma_chn_id_rx);
660-
PDMA->CHCTL &= ~(1 << obj->serial.dma_chn_id_rx);
668+
pdma_base->CHCTL &= ~(1 << obj->serial.dma_chn_id_rx);
661669
}
662670
UART_DISABLE_INT(((UART_T *) NU_MODBASE(obj->serial.uart)), UART_INTEN_RXPDMAEN_Msk);
663671
}

0 commit comments

Comments
 (0)