summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/shared/lpc/include/lpc-dma.h
blob: 653370388cc69de0cc2cfd9dbaf69510465d8b7f (plain) (blame)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/**
 * @file
 *
 * @ingroup lpc_dma
 *
 * @brief DMA API.
 */

/*
 * Copyright (c) 2010
 * embedded brains GmbH
 * Obere Lagerstr. 30
 * D-82178 Puchheim
 * Germany
 * <rtems@embedded-brains.de>
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 */

#ifndef LIBBSP_ARM_SHARED_LPC_DMA_H
#define LIBBSP_ARM_SHARED_LPC_DMA_H

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup lpc_dma DMA Support
 *
 * @ingroup lpc
 *
 * @brief DMA support.
 *
 * @{
 */

/**
 * @brief DMA descriptor item.
 */
typedef struct {
  uint32_t src;
  uint32_t dest;
  uint32_t lli;
  uint32_t ctrl;
} lpc_dma_descriptor;

/**
 * @brief DMA channel block.
 */
typedef struct {
  lpc_dma_descriptor desc;
  uint32_t cfg;
  uint32_t reserved [3];
} lpc_dma_channel;

/**
 * @brief DMA control block.
 */
typedef struct {
  uint32_t int_stat;
  uint32_t int_tc_stat;
  uint32_t int_tc_clear;
  uint32_t int_err_stat;
  uint32_t int_err_clear;
  uint32_t raw_tc_stat;
  uint32_t raw_err_stat;
  uint32_t enabled_channels;
  uint32_t soft_burst_req;
  uint32_t soft_single_req;
  uint32_t soft_last_burst_req;
  uint32_t soft_last_single_req;
  uint32_t cfg;
  uint32_t sync;
  uint32_t reserved [50];
  lpc_dma_channel channels [];
} lpc_dma;

/**
 * @name DMA Configuration Register Defines
 *
 * @{
 */

#define LPC_DMA_CFG_EN (1U << 0)
#define LPC_DMA_CFG_M_0 (1U << 1)
#define LPC_DMA_CFG_M_1 (1U << 2)

/** @} */

/**
 * @name DMA Channel Control Register Defines
 *
 * @{
 */

#define LPC_DMA_CH_CTRL_TSZ_MASK 0xfffU
#define LPC_DMA_CH_CTRL_TSZ_MAX 0xfffU

#define LPC_DMA_CH_CTRL_SB_MASK (0x7U << 12)
#define LPC_DMA_CH_CTRL_SB_1 (0x0U << 12)
#define LPC_DMA_CH_CTRL_SB_4 (0x1U << 12)
#define LPC_DMA_CH_CTRL_SB_8 (0x2U << 12)
#define LPC_DMA_CH_CTRL_SB_16 (0x3U << 12)
#define LPC_DMA_CH_CTRL_SB_32 (0x4U << 12)
#define LPC_DMA_CH_CTRL_SB_64 (0x5U << 12)
#define LPC_DMA_CH_CTRL_SB_128 (0x6U << 12)
#define LPC_DMA_CH_CTRL_SB_256 (0x7U << 12)

#define LPC_DMA_CH_CTRL_DB_MASK (0x7U << 15)
#define LPC_DMA_CH_CTRL_DB_1 (0x0U << 15)
#define LPC_DMA_CH_CTRL_DB_4 (0x1U << 15)
#define LPC_DMA_CH_CTRL_DB_8 (0x2U << 15)
#define LPC_DMA_CH_CTRL_DB_16 (0x3U << 15)
#define LPC_DMA_CH_CTRL_DB_32 (0x4U << 15)
#define LPC_DMA_CH_CTRL_DB_64 (0x5U << 15)
#define LPC_DMA_CH_CTRL_DB_128 (0x6U << 15)
#define LPC_DMA_CH_CTRL_DB_256 (0x7U << 15)

#define LPC_DMA_CH_CTRL_SW_MASK (0x7U << 18)
#define LPC_DMA_CH_CTRL_SW_8 (0x0U << 18)
#define LPC_DMA_CH_CTRL_SW_16 (0x1U << 18)
#define LPC_DMA_CH_CTRL_SW_32 (0x2U << 18)

#define LPC_DMA_CH_CTRL_DW_MASK (0x7U << 21)
#define LPC_DMA_CH_CTRL_DW_8 (0x0U << 21)
#define LPC_DMA_CH_CTRL_DW_16 (0x1U << 21)
#define LPC_DMA_CH_CTRL_DW_32 (0x2U << 21)

#define LPC_DMA_CH_CTRL_SM_0 (0U << 24)
#define LPC_DMA_CH_CTRL_SM_1 (1U << 24)

#define LPC_DMA_CH_CTRL_DM_0 (0U << 25)
#define LPC_DMA_CH_CTRL_DM_1 (1U << 25)

#define LPC_DMA_CH_CTRL_SI (1U << 26)
#define LPC_DMA_CH_CTRL_DI (1U << 27)
#define LPC_DMA_CH_CTRL_ITC (1U << 31)

/** @} */

/**
 * @name DMA Channel Configuration Register Defines
 *
 * @{
 */

#define LPC_DMA_CH_CFG_EN (1U << 0)

#define LPC_DMA_CH_CFG_SPER_MASK (0xfU << 1)
#define LPC_DMA_CH_CFG_SPER_SHIFT 1
#define LPC_DMA_CH_CFG_SPER_0 (0x0U << 1)
#define LPC_DMA_CH_CFG_SPER_1 (0x1U << 1)
#define LPC_DMA_CH_CFG_SPER_2 (0x2U << 1)
#define LPC_DMA_CH_CFG_SPER_3 (0x3U << 1)
#define LPC_DMA_CH_CFG_SPER_4 (0x4U << 1)
#define LPC_DMA_CH_CFG_SPER_5 (0x5U << 1)
#define LPC_DMA_CH_CFG_SPER_6 (0x6U << 1)
#define LPC_DMA_CH_CFG_SPER_7 (0x7U << 1)
#define LPC_DMA_CH_CFG_SPER_8 (0x8U << 1)
#define LPC_DMA_CH_CFG_SPER_9 (0x9U << 1)
#define LPC_DMA_CH_CFG_SPER_10 (0xaU << 1)
#define LPC_DMA_CH_CFG_SPER_11 (0xbU << 1)
#define LPC_DMA_CH_CFG_SPER_12 (0xcU << 1)
#define LPC_DMA_CH_CFG_SPER_13 (0xdU << 1)
#define LPC_DMA_CH_CFG_SPER_14 (0xeU << 1)
#define LPC_DMA_CH_CFG_SPER_15 (0xfU << 1)

#define LPC_DMA_CH_CFG_DPER_MASK (0xfU << 6)
#define LPC_DMA_CH_CFG_DPER_SHIFT 6
#define LPC_DMA_CH_CFG_DPER_0 (0x0U << 6)
#define LPC_DMA_CH_CFG_DPER_1 (0x1U << 6)
#define LPC_DMA_CH_CFG_DPER_2 (0x2U << 6)
#define LPC_DMA_CH_CFG_DPER_3 (0x3U << 6)
#define LPC_DMA_CH_CFG_DPER_4 (0x4U << 6)
#define LPC_DMA_CH_CFG_DPER_5 (0x5U << 6)
#define LPC_DMA_CH_CFG_DPER_6 (0x6U << 6)
#define LPC_DMA_CH_CFG_DPER_7 (0x7U << 6)
#define LPC_DMA_CH_CFG_DPER_8 (0x8U << 6)
#define LPC_DMA_CH_CFG_DPER_9 (0x9U << 6)
#define LPC_DMA_CH_CFG_DPER_10 (0xaU << 6)
#define LPC_DMA_CH_CFG_DPER_11 (0xbU << 6)
#define LPC_DMA_CH_CFG_DPER_12 (0xcU << 6)
#define LPC_DMA_CH_CFG_DPER_13 (0xdU << 6)
#define LPC_DMA_CH_CFG_DPER_14 (0xeU << 6)
#define LPC_DMA_CH_CFG_DPER_15 (0xfU << 6)

#define LPC_DMA_CH_CFG_FLOW_MASK (0x7U << 11)
#define LPC_DMA_CH_CFG_FLOW_MEM_TO_MEM_DMA (0x0U << 11)
#define LPC_DMA_CH_CFG_FLOW_MEM_TO_PER_DMA (0x1U << 11)
#define LPC_DMA_CH_CFG_FLOW_PER_TO_MEM_DMA (0x2U << 11)
#define LPC_DMA_CH_CFG_FLOW_PER_TO_PER_DMA (0x3U << 11)
#define LPC_DMA_CH_CFG_FLOW_PER_TO_PER_DEST (0x4U << 11)
#define LPC_DMA_CH_CFG_FLOW_MEM_TO_PER_PER (0x5U << 11)
#define LPC_DMA_CH_CFG_FLOW_PER_TO_MEM_PER (0x6U << 11)
#define LPC_DMA_CH_CFG_FLOW_PER_TO_PER_SRC (0x7U << 11)

#define LPC_DMA_CH_CFG_IE (1U << 14)
#define LPC_DMA_CH_CFG_ITC (1U << 15)
#define LPC_DMA_CH_CFG_LOCK (1U << 16)
#define LPC_DMA_CH_CFG_ACTIVE (1U << 17)
#define LPC_DMA_CH_CFG_HALT (1U << 18)

/** @} */

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* LIBBSP_ARM_SHARED_LPC_DMA_H */