aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/include/ds2_dma.h
blob: c7cd267a446cb7f22e879335d1c8a96bae14ffba (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifndef _DS2_DMA_H__
#define _DS2_DMA_H__

#ifdef __cplusplus
extern "C" {
#endif


#define MAX_DMA_NUM 6  /* max 6 channels */


// DMA request source register
#define DMAC_DRSR_RS_BIT    0
#define DMAC_DRSR_RS_AUTO (8 << DMAC_DRSR_RS_BIT)


// DMA channel command register
#define DMAC_DCMD_SAI       (1 << 23) /* source address increment */
#define DMAC_DCMD_DAI       (1 << 22) /* dest address increment */

#define DMAC_DCMD_SWDH_BIT  14  /* source port width */
#define DMAC_DCMD_SWDH_32 (0 << DMAC_DCMD_SWDH_BIT)
#define DMAC_DCMD_SWDH_8  (1 << DMAC_DCMD_SWDH_BIT)
#define DMAC_DCMD_SWDH_16 (2 << DMAC_DCMD_SWDH_BIT)

#define DMAC_DCMD_DWDH_BIT  12  /* dest port width */
#define DMAC_DCMD_DWDH_32 (0 << DMAC_DCMD_DWDH_BIT)
#define DMAC_DCMD_DWDH_8  (1 << DMAC_DCMD_DWDH_BIT)
 #define DMAC_DCMD_DWDH_16 (2 << DMAC_DCMD_DWDH_BIT)

#define DMAC_DCMD_DS_BIT    8  /* transfer data size of a data unit */
#define DMAC_DCMD_DS_32BIT    (0 << DMAC_DCMD_DS_BIT)
#define DMAC_DCMD_DS_8BIT (1 << DMAC_DCMD_DS_BIT)
#define DMAC_DCMD_DS_16BIT    (2 << DMAC_DCMD_DS_BIT)
#define DMAC_DCMD_DS_16BYTE   (3 << DMAC_DCMD_DS_BIT)
#define DMAC_DCMD_DS_32BYTE   (4 << DMAC_DCMD_DS_BIT)

#define DMAC_DCMD_TM        (1 << 7)  /* transfer mode: 0-single 1-block */


//detect if channel has completed job
#define DMAC_DCCSR_TT   (1 << 3)  /* transfer terminated */
#define DMAC_BASE 0xB3020000
#define REG32(addr) *((volatile u32 *)(addr))
#define DMAC_DCCSR(n) (DMAC_BASE + (0x10 + (n) * 0x20)) /* DMA control/status */
#define REG_DMAC_DCCSR(n) REG32(DMAC_DCCSR((n)))

#define ds2_DMA_isBusy(n) \
  !(  REG_DMAC_DCCSR((n)) & DMAC_DCCSR_TT )


/*
Copy modes

*/

#define DMA_MODE32BYTE DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | \
                   DMAC_DCMD_DS_32BYTE | DMAC_DCMD_TM

#define DMA_MODE16BYTE DMAC_DCMD_SWDH_16 | DMAC_DCMD_DWDH_16 | \
                   DMAC_DCMD_DS_16BYTE | DMAC_DCMD_TM

#define DMA_MODE32BIT DMAC_DCMD_SWDH_32 | DMAC_DCMD_DWDH_32 | \
                   DMAC_DCMD_DS_32BIT

#define DMA_MODE16BIT DMAC_DCMD_SWDH_16 | DMAC_DCMD_DWDH_16 | \
                   DMAC_DCMD_DS_16BIT

#define DMA_MODE8BIT DMAC_DCMD_SWDH_8 | DMAC_DCMD_DWDH_8 | \
                   DMAC_DCMD_DS_8BIT | DMAC_DCMD_TM

#define DMA_MODECOPY DMAC_DCMD_SAI



extern int _dmaCopy(int ch, void *dest, void *src, unsigned int size, unsigned int flags);

//copy from 32 bit source to 32 bit dest
//data must be 32 byte aligned
#define ds2_DMAcopy_32Byte(ch, dest, src, size)\
  _dmaCopy(ch, dest, src, size, DMA_MODECOPY | DMA_MODE32BYTE)

//copy from 16 bit source to 16 bit dest
//data must be 16 byte aligned
#define ds2_DMAcopy_16Byte(ch, dest, src, size)\
  _dmaCopy(ch, dest, src, size, DMA_MODECOPY | DMA_MODE16BYTE);

//copy from 32 bit source to 32 bit dest
//data must be 32 bit aligned
#define ds2_DMAcopy_32Bit(ch, dest, src, size)\
  _dmaCopy(ch, dest, src, size, DMA_MODECOPY | DMA_MODE32BIT);

//copy from 16 bit source to 16 bit dest
//data must be 16 bit aligned
#define ds2_DMAcopy_16Bit(ch, dest, src, size)\
  _dmaCopy(ch, dest, src, size, DMA_MODECOPY | DMA_MODE16BIT)

//copy from 8 bit source to 8 bit dest
//data must be 8 bit aligned
#define ds2_DMAcopy_8Bit(ch, dest, src, size)\
  _dmaCopy(ch, dest, src, size, DMA_MODECOPY | DMA_MODE8BIT)



//Stop DMA transfer
extern void dma_stop(int ch);

#define ds2_DMA_stop(ch)\
  dma_stop(ch)

//Wait DMA transfer over
extern int dma_wait_finish(int ch);

#define ds2_DMA_wait(ch)\
  dma_wait_finish(ch)



#ifdef __cplusplus
}
#endif

#endif //__DMA_H__