1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include "ds2_dma.h"
//register a DMA transfer request
//ch: channel id request, there are 6 channles,
//irq_handler: the DMA interruption handle
//arg: argument to the handle
//mode: DMA mode, such as port width, address increased/fixed, and so on
//type: DMA request type
extern int dma_request(int ch, void (*irq_handler)(unsigned int), unsigned int arg,
unsigned int mode, unsigned int type);
//start DMA transfer, must request a DMA first
//ch: channel id
//srcAddr: DMA source address
//dstAddr: DMA destination address
//count: DMA transfer count, the total bytes due the mode in dma_request
extern void dma_start(int ch, unsigned int srcAddr, unsigned int dstAddr,
unsigned int count);
int _dmaCopy(int ch, void *dest, void *src, unsigned int size, unsigned int flags){
int test = 0;
if(!(test = dma_request(ch, 0, 0,
//increment dest addr
DMAC_DCMD_DAI | flags,
//auto request type
DMAC_DRSR_RS_AUTO)))
{
dma_start(ch, (unsigned int)src, (unsigned int)dest, size);
}
return test;
}
|