mDMA implements DMA APIs for mbed. It is inspired by modDMA and simpleDMA. Compared with other mbed DMA implementations, mDMA has new features like 1) support LLI 2) support more than 4KB data transfer 3) support vectorized transfer. 4) support burst transfer. 5) Improved memory-memory transfer. It could beat memcpy 6) The library implementation fit the code structure of mbed sdk. Currently only support LPC1768 but could be extended to other platforms.

Dependents:   test_mDMA

Committer:
steniu01
Date:
Mon Mar 09 21:47:24 2015 +0000
Revision:
1:9421d79fb372
Parent:
0:8e50c5fd42f6
improved the coding style

Who changed what in which revision?

UserRevisionLine numberNew contents of line
steniu01 0:8e50c5fd42f6 1 #include "dma.h"
steniu01 0:8e50c5fd42f6 2
steniu01 0:8e50c5fd42f6 3 namespace mbed {
steniu01 0:8e50c5fd42f6 4
steniu01 0:8e50c5fd42f6 5
steniu01 0:8e50c5fd42f6 6 DMA::DMA (int priority):
steniu01 0:8e50c5fd42f6 7 channel_num(_channel_num)
steniu01 0:8e50c5fd42f6 8 {
steniu01 0:8e50c5fd42f6 9 chan = chooseFreeChannel(priority) ;
steniu01 0:8e50c5fd42f6 10 // channel_num = _channel_num;
steniu01 0:8e50c5fd42f6 11 DMA_reset(chan);// reset the register value to default and clear the interrupts
steniu01 0:8e50c5fd42f6 12 dma_init_struct = DMA_struct_create(); // initialize the dma data structure to default value
steniu01 0:8e50c5fd42f6 13 }
steniu01 0:8e50c5fd42f6 14
steniu01 0:8e50c5fd42f6 15
steniu01 0:8e50c5fd42f6 16 DMA::~DMA()
steniu01 0:8e50c5fd42f6 17 {
steniu01 0:8e50c5fd42f6 18 DMA_struct_delete(dma_init_struct);
steniu01 0:8e50c5fd42f6 19 DMA_IRQ_detach(chan);
steniu01 0:8e50c5fd42f6 20 }
steniu01 0:8e50c5fd42f6 21
steniu01 0:8e50c5fd42f6 22 // if no channel choosed, choose whichever free channel, otherwise, wait until the channel is free
steniu01 0:8e50c5fd42f6 23 int DMA::chooseFreeChannel (int channel)
steniu01 0:8e50c5fd42f6 24 {
steniu01 0:8e50c5fd42f6 25 int reval=channel;
steniu01 0:8e50c5fd42f6 26 if (channel > (channel_num-1) || channel < 0)
steniu01 0:8e50c5fd42f6 27 {
steniu01 0:8e50c5fd42f6 28 reval = 0;
steniu01 0:8e50c5fd42f6 29 while (1) { //if not chosen channel, round robin checked which channel is free
steniu01 0:8e50c5fd42f6 30 if (!DMA_channel_active(reval))
steniu01 0:8e50c5fd42f6 31 return reval;
steniu01 0:8e50c5fd42f6 32 reval++;
steniu01 0:8e50c5fd42f6 33 if (reval>(channel_num-1))
steniu01 0:8e50c5fd42f6 34 reval=0;
steniu01 0:8e50c5fd42f6 35 }
steniu01 0:8e50c5fd42f6 36 }
steniu01 0:8e50c5fd42f6 37 else
steniu01 0:8e50c5fd42f6 38 {
steniu01 0:8e50c5fd42f6 39 while (DMA_channel_active(reval));//if has chosen the channel, wait until the channel is free
steniu01 0:8e50c5fd42f6 40 }
steniu01 0:8e50c5fd42f6 41
steniu01 0:8e50c5fd42f6 42 return reval;
steniu01 0:8e50c5fd42f6 43 }
steniu01 0:8e50c5fd42f6 44
steniu01 0:8e50c5fd42f6 45 void DMA::TriggerSource(TriggerType trig)
steniu01 0:8e50c5fd42f6 46 {
steniu01 0:8e50c5fd42f6 47 DMA_trigger_source(dma_init_struct, trig);
steniu01 0:8e50c5fd42f6 48 }
steniu01 0:8e50c5fd42f6 49
steniu01 0:8e50c5fd42f6 50 void DMA::TriggerDestination(TriggerType trig)
steniu01 0:8e50c5fd42f6 51 {
steniu01 0:8e50c5fd42f6 52 DMA_trigger_destination(dma_init_struct, trig);
steniu01 0:8e50c5fd42f6 53 }
steniu01 0:8e50c5fd42f6 54
steniu01 0:8e50c5fd42f6 55 /*
steniu01 0:8e50c5fd42f6 56 void DMA::next(LLI* list)
steniu01 0:8e50c5fd42f6 57 {
steniu01 0:8e50c5fd42f6 58 DMA_next(dma_init_struct, list);
steniu01 0:8e50c5fd42f6 59 }
steniu01 0:8e50c5fd42f6 60 */
steniu01 0:8e50c5fd42f6 61
steniu01 0:8e50c5fd42f6 62 void DMA::next(const uint32_t src, const uint32_t dst, uint32_t size)
steniu01 0:8e50c5fd42f6 63 {
steniu01 0:8e50c5fd42f6 64 DMA_next(dma_init_struct, src, dst, size);
steniu01 0:8e50c5fd42f6 65 }
steniu01 0:8e50c5fd42f6 66
steniu01 0:8e50c5fd42f6 67 void DMA::start (unsigned int len)
steniu01 0:8e50c5fd42f6 68 {
steniu01 0:8e50c5fd42f6 69 DMA_init(chan,dma_init_struct);
steniu01 0:8e50c5fd42f6 70 DMA_start(chan, dma_init_struct, len);
steniu01 0:8e50c5fd42f6 71 }
steniu01 0:8e50c5fd42f6 72
steniu01 0:8e50c5fd42f6 73 void DMA::wait()
steniu01 0:8e50c5fd42f6 74 {
steniu01 0:8e50c5fd42f6 75 while (DMA_channel_active(chan));
steniu01 0:8e50c5fd42f6 76 }
steniu01 0:8e50c5fd42f6 77
steniu01 0:8e50c5fd42f6 78 bool DMA::finished()
steniu01 0:8e50c5fd42f6 79 {
steniu01 0:8e50c5fd42f6 80 return !DMA_channel_active(chan);
steniu01 0:8e50c5fd42f6 81 }
steniu01 0:8e50c5fd42f6 82 }