Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Diff: targets/TARGET_NUVOTON/TARGET_M451/dma_api.c
- Revision:
- 166:e614a9f1c9e2
- Parent:
- 161:2cc1468da177
--- a/targets/TARGET_NUVOTON/TARGET_M451/dma_api.c Wed May 10 12:06:41 2017 +0100
+++ b/targets/TARGET_NUVOTON/TARGET_M451/dma_api.c Fri May 26 12:39:01 2017 +0100
@@ -23,6 +23,10 @@
#include "nu_bitutil.h"
#include "dma.h"
+#define NU_PDMA_CH_MAX PDMA_CH_MAX /* Specify maximum channels of PDMA */
+#define NU_PDMA_CH_Pos 0 /* Specify first channel number of PDMA */
+#define NU_PDMA_CH_Msk (((1 << NU_PDMA_CH_MAX) - 1) << NU_PDMA_CH_Pos)
+
struct nu_dma_chn_s {
void (*handler)(uint32_t, uint32_t);
uint32_t id;
@@ -31,7 +35,7 @@
static int dma_inited = 0;
static uint32_t dma_chn_mask = 0;
-static struct nu_dma_chn_s dma_chn_arr[PDMA_CH_MAX];
+static struct nu_dma_chn_s dma_chn_arr[NU_PDMA_CH_MAX];
static void pdma_vec(void);
static const struct nu_modinit_s dma_modinit = {DMA_0, PDMA_MODULE, 0, 0, PDMA_RST, PDMA_IRQn, (void *) pdma_vec};
@@ -44,7 +48,7 @@
}
dma_inited = 1;
- dma_chn_mask = 0;
+ dma_chn_mask = ~NU_PDMA_CH_Msk;
memset(dma_chn_arr, 0x00, sizeof (dma_chn_arr));
// Reset this module
@@ -65,25 +69,12 @@
dma_init();
}
-#if 1
int i = nu_cto(dma_chn_mask);
if (i != 32) {
dma_chn_mask |= 1 << i;
- memset(dma_chn_arr + i, 0x00, sizeof (struct nu_dma_chn_s));
+ memset(dma_chn_arr + i - NU_PDMA_CH_Pos, 0x00, sizeof (struct nu_dma_chn_s));
return i;
}
-#else
- int i;
-
- for (i = 0; i < PDMA_CH_MAX; i ++) {
- if ((dma_chn_mask & (1 << i)) == 0) {
- // Channel available
- dma_chn_mask |= 1 << i;
- memset(dma_chn_arr + i, 0x00, sizeof (struct nu_dma_chn_s));
- return i;
- }
- }
-#endif
// No channel available
return DMA_ERROR_OUT_OF_CHANNELS;
@@ -102,9 +93,9 @@
{
MBED_ASSERT(dma_chn_mask & (1 << channelid));
- dma_chn_arr[channelid].handler = (void (*)(uint32_t, uint32_t)) handler;
- dma_chn_arr[channelid].id = id;
- dma_chn_arr[channelid].event = event;
+ dma_chn_arr[channelid - NU_PDMA_CH_Pos].handler = (void (*)(uint32_t, uint32_t)) handler;
+ dma_chn_arr[channelid - NU_PDMA_CH_Pos].id = id;
+ dma_chn_arr[channelid - NU_PDMA_CH_Pos].event = event;
// Set interrupt vector if someone has removed it.
NVIC_SetVector(dma_modinit.irq_n, (uint32_t) dma_modinit.var);
@@ -127,14 +118,14 @@
PDMA_CLR_ABORT_FLAG(abtsts);
while (abtsts) {
- int chn_id = nu_ctz(abtsts);
+ int chn_id = nu_ctz(abtsts) - PDMA_ABTSTS_ABTIFn_Pos + NU_PDMA_CH_Pos;
if (dma_chn_mask & (1 << chn_id)) {
- struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id;
+ struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id - NU_PDMA_CH_Pos;
if (dma_chn->handler && (dma_chn->event & DMA_EVENT_ABORT)) {
dma_chn->handler(dma_chn->id, DMA_EVENT_ABORT);
}
}
- abtsts &= ~(1 << chn_id);
+ abtsts &= ~(1 << (chn_id - NU_PDMA_CH_Pos + PDMA_ABTSTS_ABTIFn_Pos));
}
}
@@ -145,14 +136,14 @@
PDMA_CLR_TD_FLAG(tdsts);
while (tdsts) {
- int chn_id = nu_ctz(tdsts);
+ int chn_id = nu_ctz(tdsts) - PDMA_TDSTS_TDIFn_Pos + NU_PDMA_CH_Pos;
if (dma_chn_mask & (1 << chn_id)) {
- struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id;
+ struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id - NU_PDMA_CH_Pos;
if (dma_chn->handler && (dma_chn->event & DMA_EVENT_TRANSFER_DONE)) {
dma_chn->handler(dma_chn->id, DMA_EVENT_TRANSFER_DONE);
}
}
- tdsts &= ~(1 << chn_id);
+ tdsts &= ~(1 << (chn_id - NU_PDMA_CH_Pos + PDMA_TDSTS_TDIFn_Pos));
}
}
@@ -170,14 +161,14 @@
PDMA->INTSTS = reqto;
while (reqto) {
- int chn_id = nu_ctz(reqto) - PDMA_INTSTS_REQTOFn_Pos;
+ int chn_id = nu_ctz(reqto) - PDMA_INTSTS_REQTOFn_Pos + NU_PDMA_CH_Pos;
if (dma_chn_mask & (1 << chn_id)) {
- struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id;
+ struct nu_dma_chn_s *dma_chn = dma_chn_arr + chn_id - NU_PDMA_CH_Pos;
if (dma_chn->handler && (dma_chn->event & DMA_EVENT_TIMEOUT)) {
dma_chn->handler(dma_chn->id, DMA_EVENT_TIMEOUT);
}
}
- reqto &= ~(1 << (chn_id + PDMA_INTSTS_REQTOFn_Pos));
+ reqto &= ~(1 << (chn_id - NU_PDMA_CH_Pos + PDMA_INTSTS_REQTOFn_Pos));
}
}
}
