aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/libsrc/core/ds2_dma.c
blob: 0b0eca15ea2eca7c441c3b0d5e1b6b7ba7e71f2d (plain)
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;
}