1 /***************************************************************************//**
2 * @file
3 * @brief Direct memory access (LDMA) API
4 *******************************************************************************
5 * # License
6 * <b>Copyright 2018 Silicon Laboratories Inc. www.silabs.com</b>
7 *******************************************************************************
8 *
9 * SPDX-License-Identifier: Zlib
10 *
11 * The licensor of this software is Silicon Laboratories Inc.
12 *
13 * This software is provided 'as-is', without any express or implied
14 * warranty. In no event will the authors be held liable for any damages
15 * arising from the use of this software.
16 *
17 * Permission is granted to anyone to use this software for any purpose,
18 * including commercial applications, and to alter it and redistribute it
19 * freely, subject to the following restrictions:
20 *
21 * 1. The origin of this software must not be misrepresented; you must not
22 * claim that you wrote the original software. If you use this software
23 * in a product, an acknowledgment in the product documentation would be
24 * appreciated but is not required.
25 * 2. Altered source versions must be plainly marked as such, and must not be
26 * misrepresented as being the original software.
27 * 3. This notice may not be removed or altered from any source distribution.
28 *
29 ******************************************************************************/
30
31 #ifndef EM_LDMA_H
32 #define EM_LDMA_H
33
34 #include "em_device.h"
35
36 #if defined(LDMA_PRESENT) && (LDMA_COUNT == 1)
37
38 #include <stdbool.h>
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /***************************************************************************//**
45 * @addtogroup ldma LDMA - Linked DMA
46 * @brief Linked Direct Memory Access (LDMA) Peripheral API
47 *
48 * @details
49 * LDMA API functions provide full support for the LDMA peripheral.
50 *
51 * LDMA supports these DMA transfer types:
52 *
53 * @li Memory to memory.
54 * @li Memory to peripheral.
55 * @li Peripheral to memory.
56 * @li Peripheral to peripheral.
57 * @li Constant value to memory.
58 *
59 * LDMA supports linked lists of DMA descriptors allowing:
60 *
61 * @li Circular and ping-pong buffer transfers.
62 * @li Scatter-gather transfers.
63 * @li Looped transfers.
64 *
65 * LDMA has some advanced features:
66 *
67 * @li Intra-channel synchronization (SYNC), allowing hardware events to
68 * pause and restart a DMA sequence.
69 * @li Immediate-write (WRI), allowing DMA to write a constant anywhere
70 * in the memory map.
71 * @li Complex flow control allowing if-else constructs.
72 *
73 * Basic understanding of LDMA controller is assumed. Please refer to
74 * the reference manual for further details. The LDMA examples described
75 * in the reference manual are particularly helpful in understanding LDMA
76 * operations.
77 *
78 * In order to use the DMA controller, the initialization function @ref
79 * LDMA_Init() must have been executed once (normally during system initialization).
80 *
81 * DMA transfers are initiated by a call to @ref LDMA_StartTransfer(),
82 * transfer properties are controlled by the contents of @ref LDMA_TransferCfg_t
83 * and @ref LDMA_Descriptor_t structure parameters.
84 * The LDMA_Descriptor_t structure parameter may be a
85 * pointer to an array of descriptors, descriptors in array should
86 * be linked together as needed.
87 *
88 * Transfer and descriptor initialization macros are provided for the most common
89 * transfer types. Due to the flexibility of LDMA peripheral, only a small
90 * subset of all possible initializer macros are provided, users should create
91 * new ones when needed.
92 *
93 * <b> Examples of LDMA usage: </b>
94 *
95 * A simple memory to memory transfer:
96 *
97 * @include em_ldma_single.c
98 *
99 * @n A linked list of three memory to memory transfers:
100 *
101 * @include em_ldma_link_memory.c
102 *
103 * @n DMA from serial port peripheral to memory:
104 *
105 * @include em_ldma_peripheral.c
106 *
107 * @n Ping-pong DMA from serial port peripheral to memory:
108 *
109 * @include em_ldma_pingpong.c
110 *
111 * @note LDMA module does not implement LDMA interrupt handler. A
112 * template for an LDMA IRQ handler is included here as an example.
113 *
114 * @include em_ldma_irq.c
115 *
116 * @{
117 ******************************************************************************/
118
119 /*******************************************************************************
120 ******************************** ENUMS ************************************
121 ******************************************************************************/
122
123 /**
124 * Controls the number of unit data transfers per arbitration
125 * cycle, providing a means to balance DMA channels' load on the controller.
126 */
127 typedef enum {
128 ldmaCtrlBlockSizeUnit1 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT1, /**< One transfer per arbitration. */
129 ldmaCtrlBlockSizeUnit2 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT2, /**< Two transfers per arbitration. */
130 ldmaCtrlBlockSizeUnit3 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT3, /**< Three transfers per arbitration. */
131 ldmaCtrlBlockSizeUnit4 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT4, /**< Four transfers per arbitration. */
132 ldmaCtrlBlockSizeUnit6 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT6, /**< Six transfers per arbitration. */
133 ldmaCtrlBlockSizeUnit8 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT8, /**< Eight transfers per arbitration. */
134 ldmaCtrlBlockSizeUnit16 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT16, /**< 16 transfers per arbitration. */
135 ldmaCtrlBlockSizeUnit32 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT32, /**< 32 transfers per arbitration. */
136 ldmaCtrlBlockSizeUnit64 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT64, /**< 64 transfers per arbitration. */
137 ldmaCtrlBlockSizeUnit128 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT128, /**< 128 transfers per arbitration. */
138 ldmaCtrlBlockSizeUnit256 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT256, /**< 256 transfers per arbitration. */
139 ldmaCtrlBlockSizeUnit512 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT512, /**< 512 transfers per arbitration. */
140 ldmaCtrlBlockSizeUnit1024 = _LDMA_CH_CTRL_BLOCKSIZE_UNIT1024, /**< 1024 transfers per arbitration. */
141 ldmaCtrlBlockSizeAll = _LDMA_CH_CTRL_BLOCKSIZE_ALL /**< Lock arbitration during transfer. */
142 } LDMA_CtrlBlockSize_t;
143
144 /** DMA structure type. */
145 typedef enum {
146 ldmaCtrlStructTypeXfer = _LDMA_CH_CTRL_STRUCTTYPE_TRANSFER, /**< TRANSFER transfer type. */
147 ldmaCtrlStructTypeSync = _LDMA_CH_CTRL_STRUCTTYPE_SYNCHRONIZE, /**< SYNCHRONIZE transfer type. */
148 ldmaCtrlStructTypeWrite = _LDMA_CH_CTRL_STRUCTTYPE_WRITE /**< WRITE transfer type. */
149 } LDMA_CtrlStructType_t;
150
151 /** DMA transfer block or cycle selector. */
152 typedef enum {
153 ldmaCtrlReqModeBlock = _LDMA_CH_CTRL_REQMODE_BLOCK, /**< Each DMA request trigger transfer of one block. */
154 ldmaCtrlReqModeAll = _LDMA_CH_CTRL_REQMODE_ALL /**< A DMA request trigger transfer of a complete cycle. */
155 } LDMA_CtrlReqMode_t;
156
157 /** Source address increment unit size. */
158 typedef enum {
159 ldmaCtrlSrcIncOne = _LDMA_CH_CTRL_SRCINC_ONE, /**< Increment source address by one unit data size. */
160 ldmaCtrlSrcIncTwo = _LDMA_CH_CTRL_SRCINC_TWO, /**< Increment source address by two unit data sizes. */
161 ldmaCtrlSrcIncFour = _LDMA_CH_CTRL_SRCINC_FOUR, /**< Increment source address by four unit data sizes. */
162 ldmaCtrlSrcIncNone = _LDMA_CH_CTRL_SRCINC_NONE /**< Do not increment source address. */
163 } LDMA_CtrlSrcInc_t;
164
165 /** DMA transfer unit size. */
166 typedef enum {
167 ldmaCtrlSizeByte = _LDMA_CH_CTRL_SIZE_BYTE, /**< Each unit transfer is a byte. */
168 ldmaCtrlSizeHalf = _LDMA_CH_CTRL_SIZE_HALFWORD, /**< Each unit transfer is a half-word. */
169 ldmaCtrlSizeWord = _LDMA_CH_CTRL_SIZE_WORD /**< Each unit transfer is a word. */
170 } LDMA_CtrlSize_t;
171
172 /** Destination address increment unit size. */
173 typedef enum {
174 ldmaCtrlDstIncOne = _LDMA_CH_CTRL_DSTINC_ONE, /**< Increment destination address by one unit data size. */
175 ldmaCtrlDstIncTwo = _LDMA_CH_CTRL_DSTINC_TWO, /**< Increment destination address by two unit data sizes. */
176 ldmaCtrlDstIncFour = _LDMA_CH_CTRL_DSTINC_FOUR, /**< Increment destination address by four unit data sizes. */
177 ldmaCtrlDstIncNone = _LDMA_CH_CTRL_DSTINC_NONE /**< Do not increment destination address. */
178 } LDMA_CtrlDstInc_t;
179
180 /** Source addressing mode. */
181 typedef enum {
182 ldmaCtrlSrcAddrModeAbs = _LDMA_CH_CTRL_SRCMODE_ABSOLUTE, /**< Address fetched from a linked structure is absolute. */
183 ldmaCtrlSrcAddrModeRel = _LDMA_CH_CTRL_SRCMODE_RELATIVE /**< Address fetched from a linked structure is relative. */
184 } LDMA_CtrlSrcAddrMode_t;
185
186 /** Destination addressing mode. */
187 typedef enum {
188 ldmaCtrlDstAddrModeAbs = _LDMA_CH_CTRL_DSTMODE_ABSOLUTE, /**< Address fetched from a linked structure is absolute. */
189 ldmaCtrlDstAddrModeRel = _LDMA_CH_CTRL_DSTMODE_RELATIVE /**< Address fetched from a linked structure is relative. */
190 } LDMA_CtrlDstAddrMode_t;
191
192 /** DMA link load address mode. */
193 typedef enum {
194 ldmaLinkModeAbs = _LDMA_CH_LINK_LINKMODE_ABSOLUTE, /**< Link address is an absolute address value. */
195 ldmaLinkModeRel = _LDMA_CH_LINK_LINKMODE_RELATIVE /**< Link address is a two's complement relative address. */
196 } LDMA_LinkMode_t;
197
198 /** Insert extra arbitration slots to increase channel arbitration priority. */
199 typedef enum {
200 ldmaCfgArbSlotsAs1 = _LDMA_CH_CFG_ARBSLOTS_ONE, /**< One arbitration slot selected. */
201 ldmaCfgArbSlotsAs2 = _LDMA_CH_CFG_ARBSLOTS_TWO, /**< Two arbitration slots selected. */
202 ldmaCfgArbSlotsAs4 = _LDMA_CH_CFG_ARBSLOTS_FOUR, /**< Four arbitration slots selected. */
203 ldmaCfgArbSlotsAs8 = _LDMA_CH_CFG_ARBSLOTS_EIGHT /**< Eight arbitration slots selected. */
204 } LDMA_CfgArbSlots_t;
205
206 /** Source address increment sign. */
207 typedef enum {
208 ldmaCfgSrcIncSignPos = _LDMA_CH_CFG_SRCINCSIGN_POSITIVE, /**< Increment source address. */
209 ldmaCfgSrcIncSignNeg = _LDMA_CH_CFG_SRCINCSIGN_NEGATIVE /**< Decrement source address. */
210 } LDMA_CfgSrcIncSign_t;
211
212 /** Destination address increment sign. */
213 typedef enum {
214 ldmaCfgDstIncSignPos = _LDMA_CH_CFG_DSTINCSIGN_POSITIVE, /**< Increment destination address. */
215 ldmaCfgDstIncSignNeg = _LDMA_CH_CFG_DSTINCSIGN_NEGATIVE /**< Decrement destination address. */
216 } LDMA_CfgDstIncSign_t;
217
218 #if defined(_LDMA_CH_CFG_STRUCTBUSPORT_MASK)
219 /** Structure fetch operation bus port. */
220 typedef enum {
221 ldmaCfgStructBusPort0 = _LDMA_CH_CFG_STRUCTBUSPORT_AHBM0, /**< AHB Master 0 port. */
222 ldmaCfgStructBusPort1 = _LDMA_CH_CFG_STRUCTBUSPORT_AHBM1 /**< AHB Master 1 port. */
223 } LDMA_CfgStructBusPort_t;
224 #endif
225
226 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
227 /** Source operation bus port. */
228 typedef enum {
229 ldmaCfgSrcBusPort0 = _LDMA_CH_CFG_SRCBUSPORT_AHBM0, /**< AHB Master 0 port. */
230 ldmaCfgSrcBusPort1 = _LDMA_CH_CFG_SRCBUSPORT_AHBM1 /**< AHB Master 1 port. */
231 } LDMA_CfgSrcBusPort_t;
232 #endif
233
234 #if defined(_LDMA_CH_CFG_DSTBUSPORT_MASK)
235 /** Destination operation bus port. */
236 typedef enum {
237 ldmaCfgDstBusPort0 = _LDMA_CH_CFG_DSTBUSPORT_AHBM0, /**< AHB Master 0 port. */
238 ldmaCfgDstBusPort1 = _LDMA_CH_CFG_DSTBUSPORT_AHBM1 /**< AHB Master 1 port. */
239 } LDMA_CfgDstBusPort_t;
240 #endif
241
242 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
243 /** Rules table mode (interleaving destination). */
244 typedef enum {
245 ldmaIlModeAbsolute = _LDMA_CH_XCTRL_ILMODE_ABSOLUTE, /**< Address by value in rules. Size of WORD */
246 ldmaIlModeRelative16 = _LDMA_CH_XCTRL_ILMODE_RELATIVE16, /**< Address by adding rules to DST. size of HALFWORD */
247 ldmaIlModeRelative8 = _LDMA_CH_XCTRL_ILMODE_RELATIVE8 /**< Address by adding rules to DST. size of BYTE */
248 } LDMA_RulesTblMode_t;
249 #endif
250
251 #if defined(LDMAXBAR_COUNT) && (LDMAXBAR_COUNT > 0)
252 /** Peripherals that can trigger LDMA transfers. */
253 typedef enum {
254 ldmaPeripheralSignal_NONE = LDMAXBAR_CH_REQSEL_SOURCESEL_NONE, ///< No peripheral selected for DMA triggering.
255 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_LDMAXBARPRSREQ0
256 ldmaPeripheralSignal_LDMAXBAR_PRSREQ0 = LDMAXBAR_CH_REQSEL_SIGSEL_LDMAXBARPRSREQ0 | LDMAXBAR_CH_REQSEL_SOURCESEL_LDMAXBAR, ///< Trigger on PRS REQ0.
257 #endif
258 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_LDMAXBARPRSREQ1
259 ldmaPeripheralSignal_LDMAXBAR_PRSREQ1 = LDMAXBAR_CH_REQSEL_SIGSEL_LDMAXBARPRSREQ1 | LDMAXBAR_CH_REQSEL_SOURCESEL_LDMAXBAR, ///< Trigger on PRS REQ1.
260 #endif
261 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC0
262 ldmaPeripheralSignal_TIMER0_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC0.
263 #endif
264 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC1
265 ldmaPeripheralSignal_TIMER0_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC1.
266 #endif
267 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC2
268 ldmaPeripheralSignal_TIMER0_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC2.
269 #endif
270 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0UFOF
271 ldmaPeripheralSignal_TIMER0_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER0UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_UFOF.
272 #endif
273 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC0
274 ldmaPeripheralSignal_TIMER1_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC0.
275 #endif
276 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC1
277 ldmaPeripheralSignal_TIMER1_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC1.
278 #endif
279 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC2
280 ldmaPeripheralSignal_TIMER1_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC2.
281 #endif
282 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1UFOF
283 ldmaPeripheralSignal_TIMER1_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER1UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_UFOF.
284 #endif
285 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART0RXDATAV
286 ldmaPeripheralSignal_USART0_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_USART0RXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_RXDATAV.
287 #endif
288 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART0RXDATAVRIGHT
289 ldmaPeripheralSignal_USART0_RXDATAVRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART0RXDATAVRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART0,///< Trigger on USART0_RXDATAVRIGHT.
290 #endif
291 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXBL
292 ldmaPeripheralSignal_USART0_TXBL = LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXBL | LDMAXBAR_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_TXBL.
293 #endif
294 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXBLRIGHT
295 ldmaPeripheralSignal_USART0_TXBLRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXBLRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_TXBLRIGHT.
296 #endif
297 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXEMPTY
298 ldmaPeripheralSignal_USART0_TXEMPTY = LDMAXBAR_CH_REQSEL_SIGSEL_USART0TXEMPTY | LDMAXBAR_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_TXEMPTY.
299 #endif
300 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART1RXDATAV
301 ldmaPeripheralSignal_USART1_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_USART1RXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_RXDATAV.
302 #endif
303 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART1RXDATAVRIGHT
304 ldmaPeripheralSignal_USART1_RXDATAVRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART1RXDATAVRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART1,///< Trigger on USART1_RXDATAVRIGHT.
305 #endif
306 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXBL
307 ldmaPeripheralSignal_USART1_TXBL = LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXBL | LDMAXBAR_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXBL.
308 #endif
309 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXBLRIGHT
310 ldmaPeripheralSignal_USART1_TXBLRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXBLRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXBLRIGHT.
311 #endif
312 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXEMPTY
313 ldmaPeripheralSignal_USART1_TXEMPTY = LDMAXBAR_CH_REQSEL_SIGSEL_USART1TXEMPTY | LDMAXBAR_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXEMPTY.
314 #endif
315 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART2RXDATAV
316 ldmaPeripheralSignal_USART2_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_USART2RXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_RXDATAV.
317 #endif
318 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART2RXDATAVRIGHT
319 ldmaPeripheralSignal_USART2_RXDATAVRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART2RXDATAVRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART2,///< Trigger on USART2_RXDATAVRIGHT.
320 #endif
321 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXBL
322 ldmaPeripheralSignal_USART2_TXBL = LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXBL | LDMAXBAR_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_TXBL.
323 #endif
324 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXBLRIGHT
325 ldmaPeripheralSignal_USART2_TXBLRIGHT = LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXBLRIGHT | LDMAXBAR_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_TXBLRIGHT.
326 #endif
327 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXEMPTY
328 ldmaPeripheralSignal_USART2_TXEMPTY = LDMAXBAR_CH_REQSEL_SIGSEL_USART2TXEMPTY | LDMAXBAR_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_TXEMPTY.
329 #endif
330 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_I2C0RXDATAV
331 ldmaPeripheralSignal_I2C0_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_I2C0RXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_I2C0, ///< Trigger on I2C0_RXDATAV.
332 #endif
333 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_I2C0TXBL
334 ldmaPeripheralSignal_I2C0_TXBL = LDMAXBAR_CH_REQSEL_SIGSEL_I2C0TXBL | LDMAXBAR_CH_REQSEL_SOURCESEL_I2C0, ///< Trigger on I2C0_TXBL.
335 #endif
336 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_I2C1RXDATAV
337 ldmaPeripheralSignal_I2C1_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_I2C1RXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_I2C1, ///< Trigger on I2C1_RXDATAV.
338 #endif
339 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_I2C1TXBL
340 ldmaPeripheralSignal_I2C1_TXBL = LDMAXBAR_CH_REQSEL_SIGSEL_I2C1TXBL | LDMAXBAR_CH_REQSEL_SOURCESEL_I2C1, ///< Trigger on I2C1_TXBL.
341 #endif
342 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_AGCRSSI
343 ldmaPeripheralSignal_AGC_RSSI = LDMAXBAR_CH_REQSEL_SIGSEL_AGCRSSI | LDMAXBAR_CH_REQSEL_SOURCESEL_AGC, ///< Trigger on AGC_RSSI.
344 #endif
345 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_PDMRXDATAV)
346 ldmaPeripheralSignal_PDM_RXDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_PDMRXDATAV | LDMAXBAR_CH_REQSEL_SOURCESEL_PDM, ///< Trigger on PDM_RXDATAV.
347 #endif
348 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERBOF
349 ldmaPeripheralSignal_PROTIMER_BOF = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERBOF | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_BOF.
350 #endif
351 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC0
352 ldmaPeripheralSignal_PROTIMER_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_CC0.
353 #endif
354 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC1
355 ldmaPeripheralSignal_PROTIMER_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_CC1.
356 #endif
357 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC2
358 ldmaPeripheralSignal_PROTIMER_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_CC2.
359 #endif
360 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC3
361 ldmaPeripheralSignal_PROTIMER_CC3 = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC3 | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_CC3.
362 #endif
363 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC4
364 ldmaPeripheralSignal_PROTIMER_CC4 = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERCC4 | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_CC4.
365 #endif
366 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERPOF
367 ldmaPeripheralSignal_PROTIMER_POF = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERPOF | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_POF.
368 #endif
369 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERWOF
370 ldmaPeripheralSignal_PROTIMER_WOF = LDMAXBAR_CH_REQSEL_SIGSEL_PROTIMERWOF | LDMAXBAR_CH_REQSEL_SOURCESEL_PROTIMER, ///< Trigger on PROTIMER_WOF.
371 #endif
372 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_MODEMDEBUG
373 ldmaPeripheralSignal_MODEM_DEBUG = LDMAXBAR_CH_REQSEL_SIGSEL_MODEMDEBUG | LDMAXBAR_CH_REQSEL_SOURCESEL_MODEM, ///< Trigger on MODEM_DEBUG.
374 #endif
375 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_IADC0IADC_SCAN
376 ldmaPeripheralSignal_IADC0_IADC_SCAN = LDMAXBAR_CH_REQSEL_SIGSEL_IADC0IADC_SCAN | LDMAXBAR_CH_REQSEL_SOURCESEL_IADC0, ///< Trigger on IADC0_IADC_SCAN.
377 #endif
378 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_IADC0IADC_SINGLE
379 ldmaPeripheralSignal_IADC0_IADC_SINGLE = LDMAXBAR_CH_REQSEL_SIGSEL_IADC0IADC_SINGLE | LDMAXBAR_CH_REQSEL_SOURCESEL_IADC0, ///< Trigger on IADC0_IADC_SINGLE.
380 #endif
381 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_MSCWDATA
382 ldmaPeripheralSignal_MSC_WDATA = LDMAXBAR_CH_REQSEL_SIGSEL_MSCWDATA | LDMAXBAR_CH_REQSEL_SOURCESEL_MSC, ///< Trigger on MSC_WDATA.
383 #endif
384 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC0
385 ldmaPeripheralSignal_TIMER2_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC0.
386 #endif
387 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC1
388 ldmaPeripheralSignal_TIMER2_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC1.
389 #endif
390 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC2
391 ldmaPeripheralSignal_TIMER2_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC2.
392 #endif
393 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2UFOF
394 ldmaPeripheralSignal_TIMER2_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER2UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_UFOF.
395 #endif
396 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC0
397 ldmaPeripheralSignal_TIMER3_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC0.
398 #endif
399 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC1
400 ldmaPeripheralSignal_TIMER3_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC1.
401 #endif
402 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC2
403 ldmaPeripheralSignal_TIMER3_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC2.
404 #endif
405 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3UFOF
406 ldmaPeripheralSignal_TIMER3_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER3UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_UFOF.
407 #endif
408 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC0
409 ldmaPeripheralSignal_TIMER5_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC0.
410 #endif
411 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC1
412 ldmaPeripheralSignal_TIMER5_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC1.
413 #endif
414 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC2
415 ldmaPeripheralSignal_TIMER5_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC2.
416 #endif
417 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5UFOF
418 ldmaPeripheralSignal_TIMER5_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER5UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_UFOF.
419 #endif
420 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC0
421 ldmaPeripheralSignal_TIMER6_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC0.
422 #endif
423 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC1
424 ldmaPeripheralSignal_TIMER6_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC1.
425 #endif
426 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC2
427 ldmaPeripheralSignal_TIMER6_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC2.
428 #endif
429 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6UFOF
430 ldmaPeripheralSignal_TIMER6_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER6UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_UFOF.
431 #endif
432 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC0
433 ldmaPeripheralSignal_TIMER7_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER7, ///< Trigger on TIMER7_CC0.
434 #endif
435 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC1
436 ldmaPeripheralSignal_TIMER7_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER7, ///< Trigger on TIMER7_CC1.
437 #endif
438 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC2
439 ldmaPeripheralSignal_TIMER7_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER7, ///< Trigger on TIMER7_CC2.
440 #endif
441 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7UFOF
442 ldmaPeripheralSignal_TIMER7_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER7UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER7, ///< Trigger on TIMER7_UFOF.
443 #endif
444 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_LCD
445 ldmaPeripheralSignal_LCD = LDMAXBAR_CH_REQSEL_SIGSEL_LCD | LDMAXBAR_CH_REQSEL_SOURCESEL_LCD,
446 #endif
447 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC0
448 ldmaPeripheralSignal_TIMER4_CC0 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC0 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC0.
449 #endif
450 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC1
451 ldmaPeripheralSignal_TIMER4_CC1 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC1 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC1.
452 #endif
453 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC2
454 ldmaPeripheralSignal_TIMER4_CC2 = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4CC2 | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC2.
455 #endif
456 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4UFOF
457 ldmaPeripheralSignal_TIMER4_UFOF = LDMAXBAR_CH_REQSEL_SIGSEL_TIMER4UFOF | LDMAXBAR_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_UFOF.
458 #endif
459 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_VDAC0CH0_REQ)
460 ldmaPeripheralSignal_VDAC0CH0REQ = LDMAXBAR_CH_REQSEL_SIGSEL_VDAC0CH0_REQ | LDMAXBAR_CH_REQSEL_SOURCESEL_VDAC0, ///< Trigger on VDAC0_CH0REQ.
461 #endif
462 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_VDAC0CH1_REQ)
463 ldmaPeripheralSignal_VDAC0CH1REQ = LDMAXBAR_CH_REQSEL_SIGSEL_VDAC0CH1_REQ | LDMAXBAR_CH_REQSEL_SOURCESEL_VDAC0, ///< Trigger on VDAC0_CH1REQ.
464 #endif
465 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_VDAC1CH0_REQ)
466 ldmaPeripheralSignal_VDAC1CH0REQ = LDMAXBAR_CH_REQSEL_SIGSEL_VDAC1CH0_REQ | LDMAXBAR_CH_REQSEL_SOURCESEL_VDAC1, ///< Trigger on VDAC1_CH0REQ.
467 #endif
468 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_VDAC1CH1_REQ)
469 ldmaPeripheralSignal_VDAC1CH1REQ = LDMAXBAR_CH_REQSEL_SIGSEL_VDAC1CH1_REQ | LDMAXBAR_CH_REQSEL_SOURCESEL_VDAC1, ///< Trigger on VDAC1_CH1REQ.
470 #endif
471 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUART0RXFL
472 ldmaPeripheralSignal_EUART0_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUART0RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUART0, ///< Trigger on EUART0_RXFL.
473 #endif
474 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUART0TXFL
475 ldmaPeripheralSignal_EUART0_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUART0TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUART0, ///< Trigger on EUART0_TXFL.
476 #endif
477 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART0RXFL
478 ldmaPeripheralSignal_EUSART0_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART0RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART0, ///< Trigger on EUSART0_RXFL.
479 #endif
480 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART0TXFL
481 ldmaPeripheralSignal_EUSART0_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART0TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART0, ///< Trigger on EUSART0_TXFL.
482 #endif
483 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART1RXFL
484 ldmaPeripheralSignal_EUSART1_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART1RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART1, ///< Trigger on EUSART1_RXFL.
485 #endif
486 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART1TXFL
487 ldmaPeripheralSignal_EUSART1_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART1TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART1, ///< Trigger on EUSART1_TXFL.
488 #endif
489 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART2RXFL
490 ldmaPeripheralSignal_EUSART2_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART2RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART2, ///< Trigger on EUSART2_RXFL.
491 #endif
492 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART2TXFL
493 ldmaPeripheralSignal_EUSART2_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART2TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART2, ///< Trigger on EUSART2_TXFL.
494 #endif
495 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART3RXFL
496 ldmaPeripheralSignal_EUSART3_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART3RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART3, ///< Trigger on EUSART3_RXFL.
497 #endif
498 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART3TXFL
499 ldmaPeripheralSignal_EUSART3_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART3TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART3, ///< Trigger on EUSART3_TXFL.
500 #endif
501 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART4RXFL
502 ldmaPeripheralSignal_EUSART4_RXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART4RXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART4, ///< Trigger on EUSART4_RXFL.
503 #endif
504 #if defined LDMAXBAR_CH_REQSEL_SIGSEL_EUSART4TXFL
505 ldmaPeripheralSignal_EUSART4_TXFL = LDMAXBAR_CH_REQSEL_SIGSEL_EUSART4TXFL | LDMAXBAR_CH_REQSEL_SOURCESEL_EUSART4, ///< Trigger on EUSART4_TXFL.
506 #endif
507 #if defined(LDMAXBAR_CH_REQSEL_SIGSEL_LESENSEFIFO)
508 ldmaPeripheralSignal_LESENSE_BUFDATAV = LDMAXBAR_CH_REQSEL_SIGSEL_LESENSEFIFO | LDMAXBAR_CH_REQSEL_SOURCESEL_LESENSE, ///< Trigger on LESENSEFIFO.
509 #endif
510 } LDMA_PeripheralSignal_t;
511
512 #else
513 /** Peripherals that can trigger LDMA transfers. */
514 typedef enum {
515 ldmaPeripheralSignal_NONE = LDMA_CH_REQSEL_SOURCESEL_NONE, ///< No peripheral selected for DMA triggering.
516 #if defined(LDMA_CH_REQSEL_SIGSEL_ADC0SCAN)
517 ldmaPeripheralSignal_ADC0_SCAN = LDMA_CH_REQSEL_SIGSEL_ADC0SCAN | LDMA_CH_REQSEL_SOURCESEL_ADC0, ///< Trigger on ADC0_SCAN.
518 #endif
519 #if defined(LDMA_CH_REQSEL_SIGSEL_ADC0SINGLE)
520 ldmaPeripheralSignal_ADC0_SINGLE = LDMA_CH_REQSEL_SIGSEL_ADC0SINGLE | LDMA_CH_REQSEL_SOURCESEL_ADC0, ///< Trigger on ADC0_SINGLE.
521 #endif
522 #if defined(LDMA_CH_REQSEL_SIGSEL_ADC1SCAN)
523 ldmaPeripheralSignal_ADC1_SCAN = LDMA_CH_REQSEL_SIGSEL_ADC1SCAN | LDMA_CH_REQSEL_SOURCESEL_ADC1, ///< Trigger on ADC1_SCAN.
524 #endif
525 #if defined(LDMA_CH_REQSEL_SIGSEL_ADC1SINGLE)
526 ldmaPeripheralSignal_ADC1_SINGLE = LDMA_CH_REQSEL_SIGSEL_ADC1SINGLE | LDMA_CH_REQSEL_SOURCESEL_ADC1, ///< Trigger on ADC1_SINGLE.
527 #endif
528 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0RD)
529 ldmaPeripheralSignal_CRYPTO_DATA0RD = LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO, ///< Trigger on CRYPTO_DATA0RD.
530 #endif
531 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0WR)
532 ldmaPeripheralSignal_CRYPTO_DATA0WR = LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO, ///< Trigger on CRYPTO_DATA0WR.
533 #endif
534 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0XWR)
535 ldmaPeripheralSignal_CRYPTO_DATA0XWR = LDMA_CH_REQSEL_SIGSEL_CRYPTODATA0XWR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO, ///< Trigger on CRYPTO_DATA0XWR.
536 #endif
537 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTODATA1RD)
538 ldmaPeripheralSignal_CRYPTO_DATA1RD = LDMA_CH_REQSEL_SIGSEL_CRYPTODATA1RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO, ///< Trigger on CRYPTO_DATA1RD.
539 #endif
540 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTODATA1WR)
541 ldmaPeripheralSignal_CRYPTO_DATA1WR = LDMA_CH_REQSEL_SIGSEL_CRYPTODATA1WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO, ///< Trigger on CRYPTO_DATA1WR.
542 #endif
543 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0RD)
544 ldmaPeripheralSignal_CRYPTO0_DATA0RD = LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO0, ///< Trigger on CRYPTO0_DATA0RD.
545 #endif
546 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0WR)
547 ldmaPeripheralSignal_CRYPTO0_DATA0WR = LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO0, ///< Trigger on CRYPTO0_DATA0WR.
548 #endif
549 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0XWR)
550 ldmaPeripheralSignal_CRYPTO0_DATA0XWR = LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA0XWR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO0, ///< Trigger on CRYPTO0_DATA0XWR.
551 #endif
552 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA1RD)
553 ldmaPeripheralSignal_CRYPTO0_DATA1RD = LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA1RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO0, ///< Trigger on CRYPTO0_DATA1RD.
554 #endif
555 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA1WR)
556 ldmaPeripheralSignal_CRYPTO0_DATA1WR = LDMA_CH_REQSEL_SIGSEL_CRYPTO0DATA1WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO0, ///< Trigger on CRYPTO0_DATA1WR.
557 #endif
558 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0RD)
559 ldmaPeripheralSignal_CRYPTO1_DATA0RD = LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO1, ///< Trigger on CRYPTO1_DATA0RD.
560 #endif
561 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0WR)
562 ldmaPeripheralSignal_CRYPTO1_DATA0WR = LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO1, ///< Trigger on CRYPTO1_DATA0WR.
563 #endif
564 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0XWR)
565 ldmaPeripheralSignal_CRYPTO1_DATA0XWR = LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA0XWR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO1, ///< Trigger on CRYPTO1_DATA0XWR.
566 #endif
567 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA1RD)
568 ldmaPeripheralSignal_CRYPTO1_DATA1RD = LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA1RD | LDMA_CH_REQSEL_SOURCESEL_CRYPTO1, ///< Trigger on CRYPTO1_DATA1RD.
569 #endif
570 #if defined(LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA1WR)
571 ldmaPeripheralSignal_CRYPTO1_DATA1WR = LDMA_CH_REQSEL_SIGSEL_CRYPTO1DATA1WR | LDMA_CH_REQSEL_SOURCESEL_CRYPTO1, ///< Trigger on CRYPTO1_DATA1WR.
572 #endif
573 #if defined(LDMA_CH_REQSEL_SIGSEL_CSENBSLN)
574 ldmaPeripheralSignal_CSEN_BSLN = LDMA_CH_REQSEL_SIGSEL_CSENBSLN | LDMA_CH_REQSEL_SOURCESEL_CSEN, ///< Trigger on CSEN_BSLN.
575 #endif
576 #if defined(LDMA_CH_REQSEL_SIGSEL_CSENDATA)
577 ldmaPeripheralSignal_CSEN_DATA = LDMA_CH_REQSEL_SIGSEL_CSENDATA | LDMA_CH_REQSEL_SOURCESEL_CSEN, ///< Trigger on CSEN_DATA.
578 #endif
579 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIPXL0EMPTY)
580 ldmaPeripheralSignal_EBI_PXL0EMPTY = LDMA_CH_REQSEL_SIGSEL_EBIPXL0EMPTY | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_PXL0EMPTY.
581 #endif
582 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIPXL1EMPTY)
583 ldmaPeripheralSignal_EBI_PXL1EMPTY = LDMA_CH_REQSEL_SIGSEL_EBIPXL1EMPTY | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_PXL1EMPTY.
584 #endif
585 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIPXLFULL)
586 ldmaPeripheralSignal_EBI_PXLFULL = LDMA_CH_REQSEL_SIGSEL_EBIPXLFULL | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_PXLFULL.
587 #endif
588 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIDDEMPTY)
589 ldmaPeripheralSignal_EBI_DDEMPTY = LDMA_CH_REQSEL_SIGSEL_EBIDDEMPTY | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_DDEMPTY.
590 #endif
591 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIVSYNC)
592 ldmaPeripheralSignal_EBI_VSYNC = LDMA_CH_REQSEL_SIGSEL_EBIVSYNC | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_VSYNC.
593 #endif
594 #if defined(LDMA_CH_REQSEL_SIGSEL_EBIHSYNC)
595 ldmaPeripheralSignal_EBI_HSYNC = LDMA_CH_REQSEL_SIGSEL_EBIHSYNC | LDMA_CH_REQSEL_SOURCESEL_EBI, ///< Trigger on EBI_HSYNC.
596 #endif
597 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C0RXDATAV)
598 ldmaPeripheralSignal_I2C0_RXDATAV = LDMA_CH_REQSEL_SIGSEL_I2C0RXDATAV | LDMA_CH_REQSEL_SOURCESEL_I2C0, ///< Trigger on I2C0_RXDATAV.
599 #endif
600 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C0TXBL)
601 ldmaPeripheralSignal_I2C0_TXBL = LDMA_CH_REQSEL_SIGSEL_I2C0TXBL | LDMA_CH_REQSEL_SOURCESEL_I2C0, ///< Trigger on I2C0_TXBL.
602 #endif
603 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C1RXDATAV)
604 ldmaPeripheralSignal_I2C1_RXDATAV = LDMA_CH_REQSEL_SIGSEL_I2C1RXDATAV | LDMA_CH_REQSEL_SOURCESEL_I2C1, ///< Trigger on I2C1_RXDATAV.
605 #endif
606 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C1TXBL)
607 ldmaPeripheralSignal_I2C1_TXBL = LDMA_CH_REQSEL_SIGSEL_I2C1TXBL | LDMA_CH_REQSEL_SOURCESEL_I2C1, ///< Trigger on I2C1_TXBL.
608 #endif
609 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C2RXDATAV)
610 ldmaPeripheralSignal_I2C2_RXDATAV = LDMA_CH_REQSEL_SIGSEL_I2C2RXDATAV | LDMA_CH_REQSEL_SOURCESEL_I2C2, ///< Trigger on I2C2_RXDATAV.
611 #endif
612 #if defined(LDMA_CH_REQSEL_SIGSEL_I2C2TXBL)
613 ldmaPeripheralSignal_I2C2_TXBL = LDMA_CH_REQSEL_SIGSEL_I2C2TXBL | LDMA_CH_REQSEL_SOURCESEL_I2C2, ///< Trigger on I2C2_TXBL.
614 #endif
615 #if defined(LDMA_CH_REQSEL_SIGSEL_LESENSEBUFDATAV)
616 ldmaPeripheralSignal_LESENSE_BUFDATAV = LDMA_CH_REQSEL_SIGSEL_LESENSEBUFDATAV | LDMA_CH_REQSEL_SOURCESEL_LESENSE, ///< Trigger on LESENSE_BUFDATAV.
617 #endif
618 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART0RXDATAV)
619 ldmaPeripheralSignal_LEUART0_RXDATAV = LDMA_CH_REQSEL_SIGSEL_LEUART0RXDATAV | LDMA_CH_REQSEL_SOURCESEL_LEUART0, ///< Trigger on LEUART0_RXDATAV.
620 #endif
621 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART0TXBL)
622 ldmaPeripheralSignal_LEUART0_TXBL = LDMA_CH_REQSEL_SIGSEL_LEUART0TXBL | LDMA_CH_REQSEL_SOURCESEL_LEUART0, ///< Trigger on LEUART0_TXBL.
623 #endif
624 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART0TXEMPTY)
625 ldmaPeripheralSignal_LEUART0_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_LEUART0TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_LEUART0, ///< Trigger on LEUART0_TXEMPTY.
626 #endif
627 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART1RXDATAV)
628 ldmaPeripheralSignal_LEUART1_RXDATAV = LDMA_CH_REQSEL_SIGSEL_LEUART1RXDATAV | LDMA_CH_REQSEL_SOURCESEL_LEUART1, ///< Trigger on LEUART1_RXDATAV.
629 #endif
630 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART1TXBL)
631 ldmaPeripheralSignal_LEUART1_TXBL = LDMA_CH_REQSEL_SIGSEL_LEUART1TXBL | LDMA_CH_REQSEL_SOURCESEL_LEUART1, ///< Trigger on LEUART1_TXBL.
632 #endif
633 #if defined(LDMA_CH_REQSEL_SIGSEL_LEUART1TXEMPTY)
634 ldmaPeripheralSignal_LEUART1_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_LEUART1TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_LEUART1, ///< Trigger on LEUART1_TXEMPTY.
635 #endif
636 #if defined(LDMA_CH_REQSEL_SIGSEL_MSCWDATA)
637 ldmaPeripheralSignal_MSC_WDATA = LDMA_CH_REQSEL_SIGSEL_MSCWDATA | LDMA_CH_REQSEL_SOURCESEL_MSC, ///< Trigger on MSC_WDATA.
638 #endif
639 #if defined(LDMA_CH_REQSEL_SIGSEL_PDMRXDATAV)
640 ldmaPeripheralSignal_PDM_RXDATAV = LDMA_CH_REQSEL_SIGSEL_PDMRXDATAV | LDMA_CH_REQSEL_SOURCESEL_PDM, ///< Trigger on PDM_RXDATAV.
641 #endif
642 #if defined(LDMA_CH_REQSEL_SIGSEL_PRSREQ0)
643 ldmaPeripheralSignal_PRS_REQ0 = LDMA_CH_REQSEL_SIGSEL_PRSREQ0 | LDMA_CH_REQSEL_SOURCESEL_PRS, ///< Trigger on PRS_REQ0.
644 #endif
645 #if defined(LDMA_CH_REQSEL_SIGSEL_PRSREQ1)
646 ldmaPeripheralSignal_PRS_REQ1 = LDMA_CH_REQSEL_SIGSEL_PRSREQ1 | LDMA_CH_REQSEL_SOURCESEL_PRS, ///< Trigger on PRS_REQ1.
647 #endif
648 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER0CC0)
649 ldmaPeripheralSignal_TIMER0_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER0CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC0.
650 #endif
651 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER0CC1)
652 ldmaPeripheralSignal_TIMER0_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER0CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC1.
653 #endif
654 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER0CC2)
655 ldmaPeripheralSignal_TIMER0_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER0CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_CC2.
656 #endif
657 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER0UFOF)
658 ldmaPeripheralSignal_TIMER0_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER0UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER0, ///< Trigger on TIMER0_UFOF.
659 #endif
660 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER1CC0)
661 ldmaPeripheralSignal_TIMER1_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER1CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC0.
662 #endif
663 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER1CC1)
664 ldmaPeripheralSignal_TIMER1_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER1CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC1.
665 #endif
666 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER1CC2)
667 ldmaPeripheralSignal_TIMER1_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER1CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC2.
668 #endif
669 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER1CC3)
670 ldmaPeripheralSignal_TIMER1_CC3 = LDMA_CH_REQSEL_SIGSEL_TIMER1CC3 | LDMA_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_CC3.
671 #endif
672 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER1UFOF)
673 ldmaPeripheralSignal_TIMER1_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER1UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER1, ///< Trigger on TIMER1_UFOF.
674 #endif
675 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER2CC0)
676 ldmaPeripheralSignal_TIMER2_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER2CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC0.
677 #endif
678 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER2CC1)
679 ldmaPeripheralSignal_TIMER2_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER2CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC1.
680 #endif
681 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER2CC2)
682 ldmaPeripheralSignal_TIMER2_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER2CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_CC2.
683 #endif
684 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER2UFOF)
685 ldmaPeripheralSignal_TIMER2_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER2UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER2, ///< Trigger on TIMER2_UFOF.
686 #endif
687 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER3CC0)
688 ldmaPeripheralSignal_TIMER3_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER3CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC0.
689 #endif
690 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER3CC1)
691 ldmaPeripheralSignal_TIMER3_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER3CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC1.
692 #endif
693 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER3CC2)
694 ldmaPeripheralSignal_TIMER3_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER3CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_CC2.
695 #endif
696 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER3UFOF)
697 ldmaPeripheralSignal_TIMER3_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER3UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER3, ///< Trigger on TIMER3_UFOF.
698 #endif
699 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER4CC0)
700 ldmaPeripheralSignal_TIMER4_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER4CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC0.
701 #endif
702 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER4CC1)
703 ldmaPeripheralSignal_TIMER4_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER4CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC1.
704 #endif
705 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER4CC2)
706 ldmaPeripheralSignal_TIMER4_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER4CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_CC2.
707 #endif
708 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER4UFOF)
709 ldmaPeripheralSignal_TIMER4_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER4UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER4, ///< Trigger on TIMER4_UFOF.
710 #endif
711 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER5CC0)
712 ldmaPeripheralSignal_TIMER5_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER5CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC0.
713 #endif
714 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER5CC1)
715 ldmaPeripheralSignal_TIMER5_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER5CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC1.
716 #endif
717 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER5CC2)
718 ldmaPeripheralSignal_TIMER5_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER5CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_CC2.
719 #endif
720 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER5UFOF)
721 ldmaPeripheralSignal_TIMER5_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER5UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER5, ///< Trigger on TIMER5_UFOF.
722 #endif
723 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER6CC0)
724 ldmaPeripheralSignal_TIMER6_CC0 = LDMA_CH_REQSEL_SIGSEL_TIMER6CC0 | LDMA_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC0.
725 #endif
726 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER6CC1)
727 ldmaPeripheralSignal_TIMER6_CC1 = LDMA_CH_REQSEL_SIGSEL_TIMER6CC1 | LDMA_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC1.
728 #endif
729 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER6CC2)
730 ldmaPeripheralSignal_TIMER6_CC2 = LDMA_CH_REQSEL_SIGSEL_TIMER6CC2 | LDMA_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_CC2.
731 #endif
732 #if defined(LDMA_CH_REQSEL_SIGSEL_TIMER6UFOF)
733 ldmaPeripheralSignal_TIMER6_UFOF = LDMA_CH_REQSEL_SIGSEL_TIMER6UFOF | LDMA_CH_REQSEL_SOURCESEL_TIMER6, ///< Trigger on TIMER6_UFOF.
734 #endif
735 #if defined(LDMA_CH_REQSEL_SIGSEL_UART0RXDATAV)
736 ldmaPeripheralSignal_UART0_RXDATAV = LDMA_CH_REQSEL_SIGSEL_UART0RXDATAV | LDMA_CH_REQSEL_SOURCESEL_UART0, ///< Trigger on UART0_RXDATAV.
737 #endif
738 #if defined(LDMA_CH_REQSEL_SIGSEL_UART0TXBL)
739 ldmaPeripheralSignal_UART0_TXBL = LDMA_CH_REQSEL_SIGSEL_UART0TXBL | LDMA_CH_REQSEL_SOURCESEL_UART0, ///< Trigger on UART0_TXBL.
740 #endif
741 #if defined(LDMA_CH_REQSEL_SIGSEL_UART0TXEMPTY)
742 ldmaPeripheralSignal_UART0_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_UART0TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_UART0, ///< Trigger on UART0_TXEMPTY.
743 #endif
744 #if defined(LDMA_CH_REQSEL_SIGSEL_UART1RXDATAV)
745 ldmaPeripheralSignal_UART1_RXDATAV = LDMA_CH_REQSEL_SIGSEL_UART1RXDATAV | LDMA_CH_REQSEL_SOURCESEL_UART1, ///< Trigger on UART1_RXDATAV.
746 #endif
747 #if defined(LDMA_CH_REQSEL_SIGSEL_UART1TXBL)
748 ldmaPeripheralSignal_UART1_TXBL = LDMA_CH_REQSEL_SIGSEL_UART1TXBL | LDMA_CH_REQSEL_SOURCESEL_UART1, ///< Trigger on UART1_TXBL.
749 #endif
750 #if defined(LDMA_CH_REQSEL_SIGSEL_UART1TXEMPTY)
751 ldmaPeripheralSignal_UART1_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_UART1TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_UART1, ///< Trigger on UART1_TXEMPTY.
752 #endif
753 #if defined(LDMA_CH_REQSEL_SIGSEL_USART0RXDATAV)
754 ldmaPeripheralSignal_USART0_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART0RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_RXDATAV.
755 #endif
756 #if defined(LDMA_CH_REQSEL_SIGSEL_USART0TXBL)
757 ldmaPeripheralSignal_USART0_TXBL = LDMA_CH_REQSEL_SIGSEL_USART0TXBL | LDMA_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_TXBL.
758 #endif
759 #if defined(LDMA_CH_REQSEL_SIGSEL_USART0TXEMPTY)
760 ldmaPeripheralSignal_USART0_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART0TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART0, ///< Trigger on USART0_TXEMPTY.
761 #endif
762 #if defined(LDMA_CH_REQSEL_SIGSEL_USART1RXDATAV)
763 ldmaPeripheralSignal_USART1_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART1RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_RXDATAV.
764 #endif
765 #if defined(LDMA_CH_REQSEL_SIGSEL_USART1RXDATAVRIGHT)
766 ldmaPeripheralSignal_USART1_RXDATAVRIGHT = LDMA_CH_REQSEL_SIGSEL_USART1RXDATAVRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_RXDATAVRIGHT.
767 #endif
768 #if defined(LDMA_CH_REQSEL_SIGSEL_USART1TXBL)
769 ldmaPeripheralSignal_USART1_TXBL = LDMA_CH_REQSEL_SIGSEL_USART1TXBL | LDMA_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXBL.
770 #endif
771 #if defined(LDMA_CH_REQSEL_SIGSEL_USART1TXBLRIGHT)
772 ldmaPeripheralSignal_USART1_TXBLRIGHT = LDMA_CH_REQSEL_SIGSEL_USART1TXBLRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXBLRIGHT.
773 #endif
774 #if defined(LDMA_CH_REQSEL_SIGSEL_USART1TXEMPTY)
775 ldmaPeripheralSignal_USART1_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART1TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART1, ///< Trigger on USART1_TXEMPTY.
776 #endif
777 #if defined(LDMA_CH_REQSEL_SIGSEL_USART2RXDATAV)
778 ldmaPeripheralSignal_USART2_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART2RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_RXDATAV.
779 #endif
780 #if defined(LDMA_CH_REQSEL_SIGSEL_USART2TXBL)
781 ldmaPeripheralSignal_USART2_TXBL = LDMA_CH_REQSEL_SIGSEL_USART2TXBL | LDMA_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_TXBL.
782 #endif
783 #if defined(LDMA_CH_REQSEL_SIGSEL_USART2TXEMPTY)
784 ldmaPeripheralSignal_USART2_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART2TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART2, ///< Trigger on USART2_TXEMPTY.
785 #endif
786 #if defined(LDMA_CH_REQSEL_SIGSEL_USART3RXDATAV)
787 ldmaPeripheralSignal_USART3_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART3RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART3, ///< Trigger on USART3_RXDATAV.
788 #endif
789 #if defined(LDMA_CH_REQSEL_SIGSEL_USART3RXDATAVRIGHT)
790 ldmaPeripheralSignal_USART3_RXDATAVRIGHT = LDMA_CH_REQSEL_SIGSEL_USART3RXDATAVRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART3, ///< Trigger on USART3_RXDATAVRIGHT.
791 #endif
792 #if defined(LDMA_CH_REQSEL_SIGSEL_USART3TXBL)
793 ldmaPeripheralSignal_USART3_TXBL = LDMA_CH_REQSEL_SIGSEL_USART3TXBL | LDMA_CH_REQSEL_SOURCESEL_USART3, ///< Trigger on USART3_TXBL.
794 #endif
795 #if defined(LDMA_CH_REQSEL_SIGSEL_USART3TXBLRIGHT)
796 ldmaPeripheralSignal_USART3_TXBLRIGHT = LDMA_CH_REQSEL_SIGSEL_USART3TXBLRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART3, ///< Trigger on USART3_TXBLRIGHT.
797 #endif
798 #if defined(LDMA_CH_REQSEL_SIGSEL_USART3TXEMPTY)
799 ldmaPeripheralSignal_USART3_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART3TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART3, ///< Trigger on USART3_TXEMPTY.
800 #endif
801 #if defined(LDMA_CH_REQSEL_SIGSEL_USART4RXDATAV)
802 ldmaPeripheralSignal_USART4_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART4RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART4, ///< Trigger on USART4_RXDATAV.
803 #endif
804 #if defined(LDMA_CH_REQSEL_SIGSEL_USART4RXDATAVRIGHT)
805 ldmaPeripheralSignal_USART4_RXDATAVRIGHT = LDMA_CH_REQSEL_SIGSEL_USART4RXDATAVRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART4, ///< Trigger on USART4_RXDATAVRIGHT.
806 #endif
807 #if defined(LDMA_CH_REQSEL_SIGSEL_USART4TXBL)
808 ldmaPeripheralSignal_USART4_TXBL = LDMA_CH_REQSEL_SIGSEL_USART4TXBL | LDMA_CH_REQSEL_SOURCESEL_USART4, ///< Trigger on USART4_TXBL.
809 #endif
810 #if defined(LDMA_CH_REQSEL_SIGSEL_USART4TXBLRIGHT)
811 ldmaPeripheralSignal_USART4_TXBLRIGHT = LDMA_CH_REQSEL_SIGSEL_USART4TXBLRIGHT | LDMA_CH_REQSEL_SOURCESEL_USART4, ///< Trigger on USART4_TXBLRIGHT.
812 #endif
813 #if defined(LDMA_CH_REQSEL_SIGSEL_USART4TXEMPTY)
814 ldmaPeripheralSignal_USART4_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART4TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART4, ///< Trigger on USART4_TXEMPTY.
815 #endif
816 #if defined(LDMA_CH_REQSEL_SIGSEL_USART5RXDATAV)
817 ldmaPeripheralSignal_USART5_RXDATAV = LDMA_CH_REQSEL_SIGSEL_USART5RXDATAV | LDMA_CH_REQSEL_SOURCESEL_USART5, ///< Trigger on USART5_RXDATAV.
818 #endif
819 #if defined(LDMA_CH_REQSEL_SIGSEL_USART5TXBL)
820 ldmaPeripheralSignal_USART5_TXBL = LDMA_CH_REQSEL_SIGSEL_USART5TXBL | LDMA_CH_REQSEL_SOURCESEL_USART5, ///< Trigger on USART5_TXBL.
821 #endif
822 #if defined(LDMA_CH_REQSEL_SIGSEL_USART5TXEMPTY)
823 ldmaPeripheralSignal_USART5_TXEMPTY = LDMA_CH_REQSEL_SIGSEL_USART5TXEMPTY | LDMA_CH_REQSEL_SOURCESEL_USART5, ///< Trigger on USART5_TXEMPTY.
824 #endif
825 #if defined(LDMA_CH_REQSEL_SIGSEL_VDAC0CH0)
826 ldmaPeripheralSignal_VDAC0_CH0 = LDMA_CH_REQSEL_SIGSEL_VDAC0CH0 | LDMA_CH_REQSEL_SOURCESEL_VDAC0, ///< Trigger on VDAC0_CH0.
827 #endif
828 #if defined(LDMA_CH_REQSEL_SIGSEL_VDAC0CH1)
829 ldmaPeripheralSignal_VDAC0_CH1 = LDMA_CH_REQSEL_SIGSEL_VDAC0CH1 | LDMA_CH_REQSEL_SOURCESEL_VDAC0, ///< Trigger on VDAC0_CH1.
830 #endif
831 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER0CC0)
832 ldmaPeripheralSignal_WTIMER0_CC0 = LDMA_CH_REQSEL_SIGSEL_WTIMER0CC0 | LDMA_CH_REQSEL_SOURCESEL_WTIMER0, ///< Trigger on WTIMER0_CC0.
833 #endif
834 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER0CC1)
835 ldmaPeripheralSignal_WTIMER0_CC1 = LDMA_CH_REQSEL_SIGSEL_WTIMER0CC1 | LDMA_CH_REQSEL_SOURCESEL_WTIMER0, ///< Trigger on WTIMER0_CC1.
836 #endif
837 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER0CC2)
838 ldmaPeripheralSignal_WTIMER0_CC2 = LDMA_CH_REQSEL_SIGSEL_WTIMER0CC2 | LDMA_CH_REQSEL_SOURCESEL_WTIMER0, ///< Trigger on WTIMER0_CC2.
839 #endif
840 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER0UFOF)
841 ldmaPeripheralSignal_WTIMER0_UFOF = LDMA_CH_REQSEL_SIGSEL_WTIMER0UFOF | LDMA_CH_REQSEL_SOURCESEL_WTIMER0, ///< Trigger on WTIMER0_UFOF.
842 #endif
843 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER1CC0)
844 ldmaPeripheralSignal_WTIMER1_CC0 = LDMA_CH_REQSEL_SIGSEL_WTIMER1CC0 | LDMA_CH_REQSEL_SOURCESEL_WTIMER1, ///< Trigger on WTIMER1_CC0.
845 #endif
846 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER1CC1)
847 ldmaPeripheralSignal_WTIMER1_CC1 = LDMA_CH_REQSEL_SIGSEL_WTIMER1CC1 | LDMA_CH_REQSEL_SOURCESEL_WTIMER1, ///< Trigger on WTIMER1_CC1.
848 #endif
849 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER1CC2)
850 ldmaPeripheralSignal_WTIMER1_CC2 = LDMA_CH_REQSEL_SIGSEL_WTIMER1CC2 | LDMA_CH_REQSEL_SOURCESEL_WTIMER1, ///< Trigger on WTIMER1_CC2.
851 #endif
852 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER1CC3)
853 ldmaPeripheralSignal_WTIMER1_CC3 = LDMA_CH_REQSEL_SIGSEL_WTIMER1CC3 | LDMA_CH_REQSEL_SOURCESEL_WTIMER1, ///< Trigger on WTIMER1_CC3.
854 #endif
855 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER1UFOF)
856 ldmaPeripheralSignal_WTIMER1_UFOF = LDMA_CH_REQSEL_SIGSEL_WTIMER1UFOF | LDMA_CH_REQSEL_SOURCESEL_WTIMER1, ///< Trigger on WTIMER1_UFOF.
857 #endif
858 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER2CC0)
859 ldmaPeripheralSignal_WTIMER2_CC0 = LDMA_CH_REQSEL_SIGSEL_WTIMER2CC0 | LDMA_CH_REQSEL_SOURCESEL_WTIMER2, ///< Trigger on WTIMER2_CC0.
860 #endif
861 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER2CC1)
862 ldmaPeripheralSignal_WTIMER2_CC1 = LDMA_CH_REQSEL_SIGSEL_WTIMER2CC1 | LDMA_CH_REQSEL_SOURCESEL_WTIMER2, ///< Trigger on WTIMER2_CC1.
863 #endif
864 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER2CC2)
865 ldmaPeripheralSignal_WTIMER2_CC2 = LDMA_CH_REQSEL_SIGSEL_WTIMER2CC2 | LDMA_CH_REQSEL_SOURCESEL_WTIMER2, ///< Trigger on WTIMER2_CC2.
866 #endif
867 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER2UFOF)
868 ldmaPeripheralSignal_WTIMER2_UFOF = LDMA_CH_REQSEL_SIGSEL_WTIMER2UFOF | LDMA_CH_REQSEL_SOURCESEL_WTIMER2, ///< Trigger on WTIMER2_UFOF.
869 #endif
870 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER3CC0)
871 ldmaPeripheralSignal_WTIMER3_CC0 = LDMA_CH_REQSEL_SIGSEL_WTIMER3CC0 | LDMA_CH_REQSEL_SOURCESEL_WTIMER3, ///< Trigger on WTIMER3_CC0.
872 #endif
873 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER3CC1)
874 ldmaPeripheralSignal_WTIMER3_CC1 = LDMA_CH_REQSEL_SIGSEL_WTIMER3CC1 | LDMA_CH_REQSEL_SOURCESEL_WTIMER3, ///< Trigger on WTIMER3_CC1.
875 #endif
876 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER3CC2)
877 ldmaPeripheralSignal_WTIMER3_CC2 = LDMA_CH_REQSEL_SIGSEL_WTIMER3CC2 | LDMA_CH_REQSEL_SOURCESEL_WTIMER3, ///< Trigger on WTIMER3_CC2.
878 #endif
879 #if defined(LDMA_CH_REQSEL_SIGSEL_WTIMER3UFOF)
880 ldmaPeripheralSignal_WTIMER3_UFOF = LDMA_CH_REQSEL_SIGSEL_WTIMER3UFOF | LDMA_CH_REQSEL_SOURCESEL_WTIMER3, ///< Trigger on WTIMER3_UFOF.
881 #endif
882 } LDMA_PeripheralSignal_t;
883 #endif
884
885 /*******************************************************************************
886 ******************************* STRUCTS ***********************************
887 ******************************************************************************/
888
889 /**
890 * @brief
891 * DMA descriptor.
892 * @details
893 * The LDMA DMA controller supports three different DMA descriptors. Each
894 * consists of four WORDs which map directly onto HW control registers for a
895 * given DMA channel. The three descriptor types are XFER, SYNC and WRI.
896 * Refer to the reference manual for further information.
897 */
898 typedef union {
899 /**
900 * TRANSFER DMA descriptor, this is the only descriptor type which can be
901 * used to start a DMA transfer.
902 */
903 struct {
904 uint32_t structType : 2; /**< Set to 0 to select XFER descriptor type. */
905 uint32_t reserved0 : 1; /**< Reserved. */
906 uint32_t structReq : 1; /**< DMA transfer trigger during LINKLOAD. */
907 uint32_t xferCnt : 11; /**< Transfer count minus one. */
908 uint32_t byteSwap : 1; /**< Enable byte swapping transfers. */
909 uint32_t blockSize : 4; /**< Number of unit transfers per arbitration cycle. */
910 uint32_t doneIfs : 1; /**< Generate interrupt when done. */
911 uint32_t reqMode : 1; /**< Block or cycle transfer selector. */
912 uint32_t decLoopCnt : 1; /**< Enable looped transfers. */
913 uint32_t ignoreSrec : 1; /**< Ignore single requests. */
914 uint32_t srcInc : 2; /**< Source address increment unit size. */
915 uint32_t size : 2; /**< DMA transfer unit size. */
916 uint32_t dstInc : 2; /**< Destination address increment unit size. */
917 uint32_t srcAddrMode : 1; /**< Source addressing mode. */
918 uint32_t dstAddrMode : 1; /**< Destination addressing mode. */
919
920 uint32_t srcAddr; /**< DMA source address. */
921 uint32_t dstAddr; /**< DMA destination address. */
922
923 uint32_t linkMode : 1; /**< Select absolute or relative link address. */
924 uint32_t link : 1; /**< Enable LINKLOAD when transfer is done. */
925 int32_t linkAddr : 30; /**< Address of next (linked) descriptor. */
926 } xfer;
927
928 /** SYNCHRONIZE DMA descriptor, used for intra channel transfer
929 * synchronization.
930 */
931 struct {
932 uint32_t structType : 2; /**< Set to 1 to select SYNC descriptor type. */
933 uint32_t reserved0 : 1; /**< Reserved. */
934 uint32_t structReq : 1; /**< DMA transfer trigger during LINKLOAD. */
935 uint32_t xferCnt : 11; /**< Transfer count minus one. */
936 uint32_t byteSwap : 1; /**< Enable byte swapping transfers. */
937 uint32_t blockSize : 4; /**< Number of unit transfers per arbitration cycle. */
938 uint32_t doneIfs : 1; /**< Generate interrupt when done. */
939 uint32_t reqMode : 1; /**< Block or cycle transfer selector. */
940 uint32_t decLoopCnt : 1; /**< Enable looped transfers. */
941 uint32_t ignoreSrec : 1; /**< Ignore single requests. */
942 uint32_t srcInc : 2; /**< Source address increment unit size. */
943 uint32_t size : 2; /**< DMA transfer unit size. */
944 uint32_t dstInc : 2; /**< Destination address increment unit size. */
945 uint32_t srcAddrMode : 1; /**< Source addressing mode. */
946 uint32_t dstAddrMode : 1; /**< Destination addressing mode. */
947
948 uint32_t syncSet : 8; /**< Set bits in LDMA_CTRL.SYNCTRIG register. */
949 uint32_t syncClr : 8; /**< Clear bits in LDMA_CTRL.SYNCTRIG register. */
950 uint32_t reserved1 : 16; /**< Reserved. */
951 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
952 uint32_t matchEn : 8; /**< Sync trigger match enable. */
953 uint32_t matchVal : 8; /**< Sync trigger match value. */
954 #else
955 uint32_t matchVal : 8; /**< Sync trigger match value. */
956 uint32_t matchEn : 8; /**< Sync trigger match enable. */
957 #endif
958 uint32_t reserved2 : 16; /**< Reserved. */
959
960 uint32_t linkMode : 1; /**< Select absolute or relative link address. */
961 uint32_t link : 1; /**< Enable LINKLOAD when transfer is done. */
962 int32_t linkAddr : 30; /**< Address of next (linked) descriptor. */
963 } sync;
964
965 /** WRITE DMA descriptor, used for write immediate operations. */
966 struct {
967 uint32_t structType : 2; /**< Set to 2 to select WRITE descriptor type. */
968 uint32_t reserved0 : 1; /**< Reserved. */
969 uint32_t structReq : 1; /**< DMA transfer trigger during LINKLOAD. */
970 uint32_t xferCnt : 11; /**< Transfer count minus one. */
971 uint32_t byteSwap : 1; /**< Enable byte swapping transfers. */
972 uint32_t blockSize : 4; /**< Number of unit transfers per arbitration cycle. */
973 uint32_t doneIfs : 1; /**< Generate interrupt when done. */
974 uint32_t reqMode : 1; /**< Block or cycle transfer selector. */
975 uint32_t decLoopCnt : 1; /**< Enable looped transfers. */
976 uint32_t ignoreSrec : 1; /**< Ignore single requests. */
977 uint32_t srcInc : 2; /**< Source address increment unit size. */
978 uint32_t size : 2; /**< DMA transfer unit size. */
979 uint32_t dstInc : 2; /**< Destination address increment unit size. */
980 uint32_t srcAddrMode : 1; /**< Source addressing mode. */
981 uint32_t dstAddrMode : 1; /**< Destination addressing mode. */
982
983 uint32_t immVal; /**< Data to be written at dstAddr. */
984 uint32_t dstAddr; /**< DMA write destination address. */
985
986 uint32_t linkMode : 1; /**< Select absolute or relative link address. */
987 uint32_t link : 1; /**< Enable LINKLOAD when transfer is done. */
988 int32_t linkAddr : 30; /**< Address of next (linked) descriptor. */
989 } wri;
990 } LDMA_Descriptor_t;
991
992 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
993 /**
994 * @brief
995 * DMA extended descriptor.
996 * @details
997 * The extended descriptor adds additional fields for the extended features
998 * available on the MMLDMA peripheral: destination interleaving and bufferable.
999 * The same three different DMA descriptors supported by the LDMA DMA controller
1000 * are available. Each consists of seven WORDs (instead of four in non-extended
1001 * descriptors) which map directly onto HW control registers for a given DMA
1002 * channel. The three descriptor types are XFER, SYNC and WRI. But the
1003 * extended fields are true only for XFER. The extended fields are the following:
1004 *
1005 * +- +- CTRL
1006 * | Original | SRC
1007 * | Structure | DST
1008 * Extended | +- LINK
1009 * Structure | XCTRL
1010 * | Reserved for future usage
1011 * +- ILSRC
1012 *
1013 * Refer to the reference manual for further information.
1014 */
1015 typedef struct {
1016 uint32_t structType : 2; /**< Set to 0 to select XFER descriptor type. */
1017 uint32_t extend : 1; /**< Extend data structure. */
1018 uint32_t structReq : 1; /**< DMA transfer trigger during LINKLOAD. */
1019 uint32_t xferCnt : 11; /**< Transfer count minus one. */
1020 uint32_t byteSwap : 1; /**< Enable byte swapping transfers. */
1021 uint32_t blockSize : 4; /**< Number of unit transfers per arbitration cycle. */
1022 uint32_t doneIfs : 1; /**< Generate interrupt when done. */
1023 uint32_t reqMode : 1; /**< Block or cycle transfer selector. */
1024 uint32_t decLoopCnt : 1; /**< Enable looped transfers. */
1025 uint32_t ignoreSrec : 1; /**< Ignore single requests. */
1026 uint32_t srcInc : 2; /**< Source address increment unit size. */
1027 uint32_t size : 2; /**< DMA transfer unit size. */
1028 uint32_t dstInc : 2; /**< Destination address increment unit size. */
1029 uint32_t srcAddrMode : 1; /**< Source addressing mode. */
1030 uint32_t dstAddrMode : 1; /**< Destination addressing mode. */
1031
1032 uint32_t srcAddr; /**< DMA source address. */
1033 uint32_t dstAddr; /**< DMA destination address. */
1034
1035 uint32_t linkMode : 1; /**< Select absolute or relative link address. */
1036 uint32_t link : 1; /**< Enable LINKLOAD when transfer is done. */
1037 int32_t linkAddr : 30; /**< Address of next (linked) descriptor. */
1038
1039 uint32_t reserved1 : 4; /**< Reserved */
1040 uint32_t dstIlEn : 1; /**< Destination interleave. */
1041 uint32_t IlMode : 2; /**< Interleave mode. */
1042 uint32_t bufferable : 1; /**< Allow AHB buffering. */
1043 uint32_t reserved2 : 24; /**< Reserved */
1044
1045 uint32_t reserved3; /**< Reserved */
1046 uint32_t IlSrc; /**< DMA rules table base address in memory. */
1047 } LDMA_DescriptorExtend_t;
1048 #endif
1049
1050 /** @brief LDMA initialization configuration structure. */
1051 typedef struct {
1052 uint8_t ldmaInitCtrlNumFixed; /**< Arbitration mode separator. */
1053 uint8_t ldmaInitCtrlSyncPrsClrEn; /**< PRS Synctrig clear enable. */
1054 uint8_t ldmaInitCtrlSyncPrsSetEn; /**< PRS Synctrig set enable. */
1055 uint8_t ldmaInitIrqPriority; /**< LDMA IRQ priority (0..7). */
1056 } LDMA_Init_t;
1057
1058 /**
1059 * @brief
1060 * DMA transfer configuration structure.
1061 * @details
1062 * This structure configures all aspects of a DMA transfer.
1063 */
1064 typedef struct {
1065 uint32_t ldmaReqSel; /**< Selects DMA trigger source. */
1066 uint8_t ldmaCtrlSyncPrsClrOff; /**< PRS Synctrig clear enables to clear. */
1067 uint8_t ldmaCtrlSyncPrsClrOn; /**< PRS Synctrig clear enables to set. */
1068 uint8_t ldmaCtrlSyncPrsSetOff; /**< PRS Synctrig set enables to clear. */
1069 uint8_t ldmaCtrlSyncPrsSetOn; /**< PRS Synctrig set enables to set. */
1070 bool ldmaReqDis; /**< Mask the PRS trigger input. */
1071 bool ldmaDbgHalt; /**< Dis. DMA trig when CPU is halted. */
1072 LDMA_CfgArbSlots_t ldmaCfgArbSlots; /**< Arbitration slot number. */
1073 LDMA_CfgSrcIncSign_t ldmaCfgSrcIncSign; /**< Source address increment sign. */
1074 LDMA_CfgDstIncSign_t ldmaCfgDstIncSign; /**< Destination address increment sign. */
1075 uint8_t ldmaLoopCnt; /**< Counter for looped transfers. */
1076 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
1077 LDMA_CfgStructBusPort_t ldmaCfgStructBusPort; /**< Structure fetch operation bus port. */
1078 LDMA_CfgSrcBusPort_t ldmaCfgSrcBusPort; /**< Source operation bus port. */
1079 LDMA_CfgDstBusPort_t ldmaCfgDstBusPort; /**< Destination operation bus port. */
1080 #endif
1081 } LDMA_TransferCfg_t;
1082
1083 /*******************************************************************************
1084 ******************************** DEFINES **********************************
1085 ******************************************************************************/
1086
1087 /** @brief Size in words of a non-extended DMA descriptor. */
1088 #define LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD 4
1089
1090 /** @brief Size in words of an extended DMA descriptor. */
1091 #define LDMA_DESCRIPTOR_EXTEND_SIZE_WORD 7
1092
1093 /** @brief Maximum transfer size possible per descriptor. */
1094 #define LDMA_DESCRIPTOR_MAX_XFER_SIZE (((_LDMA_CH_CTRL_XFERCNT_MASK >> _LDMA_CH_CTRL_XFERCNT_SHIFT) + 1))
1095
1096 /** @brief Converts a LDMA_Descriptor_t pointer to the value suitable to write to the linkAddr field of a LDMA_Descriptor_t. */
1097 #define LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(addr) (int32_t) ((((uintptr_t)addr) & _LDMA_CH_LINK_LINKADDR_MASK) >> _LDMA_CH_LINK_LINKADDR_SHIFT)
1098
1099 /** @brief Converts a LDMA_Descriptor_t linkAddr field value back to a LDMA_Descriptor_t pointer. */
1100 #define LDMA_DESCRIPTOR_LINKABS_LINKADDR_TO_ADDR(linkAddr) (LDMA_Descriptor_t *) (linkAddr << _LDMA_CH_LINK_LINKADDR_SHIFT)
1101
1102 /*******************************************************************************
1103 ************************** STRUCT INITIALIZERS ****************************
1104 ******************************************************************************/
1105
1106 /** @brief Default DMA initialization structure. */
1107 #define LDMA_INIT_DEFAULT \
1108 { \
1109 .ldmaInitCtrlNumFixed = _LDMA_CTRL_NUMFIXED_DEFAULT,/* Fixed priority arbitration.*/ \
1110 .ldmaInitCtrlSyncPrsClrEn = 0, /* No PRS Synctrig clear enable*/ \
1111 .ldmaInitCtrlSyncPrsSetEn = 0, /* No PRS Synctrig set enable. */ \
1112 .ldmaInitIrqPriority = 3 /* IRQ priority level 3. */ \
1113 }
1114
1115 /**
1116 * @brief
1117 * Generic DMA transfer configuration for memory to memory transfers.
1118 */
1119 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
1120 #define LDMA_TRANSFER_CFG_MEMORY() \
1121 { \
1122 0, 0, 0, 0, 0, \
1123 false, false, ldmaCfgArbSlotsAs1, \
1124 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, 0, \
1125 ldmaCfgStructBusPort0, ldmaCfgSrcBusPort0, ldmaCfgDstBusPort0 \
1126 }
1127 #else
1128 #define LDMA_TRANSFER_CFG_MEMORY() \
1129 { \
1130 0, 0, 0, 0, 0, \
1131 false, false, ldmaCfgArbSlotsAs1, \
1132 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, 0 \
1133 }
1134 #endif
1135
1136 /**
1137 * @brief
1138 * Generic DMA transfer configuration for looped memory to memory transfers.
1139 */
1140 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
1141 #define LDMA_TRANSFER_CFG_MEMORY_LOOP(loopCnt) \
1142 { \
1143 0, 0, 0, 0, 0, \
1144 false, false, ldmaCfgArbSlotsAs1, \
1145 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, \
1146 loopCnt, \
1147 ldmaCfgStructBusPort0, ldmaCfgSrcBusPort0, ldmaCfgDstBusPort0 \
1148 }
1149 #else
1150 #define LDMA_TRANSFER_CFG_MEMORY_LOOP(loopCnt) \
1151 { \
1152 0, 0, 0, 0, 0, \
1153 false, false, ldmaCfgArbSlotsAs1, \
1154 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, \
1155 loopCnt \
1156 }
1157 #endif
1158
1159 /**
1160 * @brief
1161 * Generic DMA transfer configuration for memory to/from peripheral transfers.
1162 */
1163 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
1164 #define LDMA_TRANSFER_CFG_PERIPHERAL(signal) \
1165 { \
1166 signal, 0, 0, 0, 0, \
1167 false, false, ldmaCfgArbSlotsAs1, \
1168 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, 0, \
1169 ldmaCfgStructBusPort0, ldmaCfgSrcBusPort0, ldmaCfgDstBusPort0 \
1170 }
1171 #else
1172 #define LDMA_TRANSFER_CFG_PERIPHERAL(signal) \
1173 { \
1174 signal, 0, 0, 0, 0, \
1175 false, false, ldmaCfgArbSlotsAs1, \
1176 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, 0 \
1177 }
1178 #endif
1179
1180 /**
1181 * @brief
1182 * Generic DMA transfer configuration for looped memory to/from peripheral transfers.
1183 */
1184 #if defined(_LDMA_CH_CFG_SRCBUSPORT_MASK)
1185 #define LDMA_TRANSFER_CFG_PERIPHERAL_LOOP(signal, loopCnt) \
1186 { \
1187 signal, 0, 0, 0, 0, \
1188 false, false, ldmaCfgArbSlotsAs1, \
1189 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, loopCnt, \
1190 ldmaCfgStructBusPort0, ldmaCfgSrcBusPort0, ldmaCfgDstBusPort0 \
1191 }
1192 #else
1193 #define LDMA_TRANSFER_CFG_PERIPHERAL_LOOP(signal, loopCnt) \
1194 { \
1195 signal, 0, 0, 0, 0, \
1196 false, false, ldmaCfgArbSlotsAs1, \
1197 ldmaCfgSrcIncSignPos, ldmaCfgDstIncSignPos, loopCnt \
1198 }
1199 #endif
1200
1201 /**
1202 * @brief
1203 * DMA descriptor initializer for single memory to memory word transfer.
1204 * @param[in] src Source data address.
1205 * @param[in] dest Destination data address.
1206 * @param[in] count Number of words to transfer.
1207 */
1208 #define LDMA_DESCRIPTOR_SINGLE_M2M_WORD(src, dest, count) \
1209 { \
1210 .xfer = \
1211 { \
1212 .structType = ldmaCtrlStructTypeXfer, \
1213 .structReq = 1, \
1214 .xferCnt = (count) - 1, \
1215 .byteSwap = 0, \
1216 .blockSize = ldmaCtrlBlockSizeUnit1, \
1217 .doneIfs = 1, \
1218 .reqMode = ldmaCtrlReqModeAll, \
1219 .decLoopCnt = 0, \
1220 .ignoreSrec = 0, \
1221 .srcInc = ldmaCtrlSrcIncOne, \
1222 .size = ldmaCtrlSizeWord, \
1223 .dstInc = ldmaCtrlDstIncOne, \
1224 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1225 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1226 .srcAddr = (uint32_t)(src), \
1227 .dstAddr = (uint32_t)(dest), \
1228 .linkMode = 0, \
1229 .link = 0, \
1230 .linkAddr = 0 \
1231 } \
1232 }
1233
1234 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1235 /**
1236 * @brief
1237 * DMA descriptor initializer for single memory to memory word transfer
1238 * using the extended descriptor fields.
1239 * @param[in] src Source data address.
1240 * @param[in] dest Destination data address.
1241 * @param[in] count Number of words to transfer.
1242 */
1243 #define LDMA_DESCRIPTOR_SINGLE_M2M_WORD_EXTEND(src, dest, count) \
1244 { \
1245 .structType = ldmaCtrlStructTypeXfer, \
1246 .extend = 1, \
1247 .structReq = 1, \
1248 .xferCnt = (count) - 1, \
1249 .byteSwap = 0, \
1250 .blockSize = ldmaCtrlBlockSizeUnit1, \
1251 .doneIfs = 1, \
1252 .reqMode = ldmaCtrlReqModeAll, \
1253 .decLoopCnt = 0, \
1254 .ignoreSrec = 0, \
1255 .srcInc = ldmaCtrlSrcIncOne, \
1256 .size = ldmaCtrlSizeWord, \
1257 .dstInc = ldmaCtrlDstIncNone, /* Ignored since destination addressing is non-sequential */ \
1258 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1259 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1260 .srcAddr = (uint32_t)(src), \
1261 .dstAddr = (uint32_t)(dest), \
1262 .linkMode = 0, \
1263 .link = 0, \
1264 .linkAddr = 0, \
1265 .dstIlEn = 0, \
1266 .IlMode = 0, \
1267 .bufferable = 0, \
1268 .IlSrc = 0 \
1269 }
1270 #endif
1271
1272 /**
1273 * @brief
1274 * DMA descriptor initializer for single memory to memory half-word transfer.
1275 * @param[in] src Source data address.
1276 * @param[in] dest Destination data address.
1277 * @param[in] count Number of half-words to transfer.
1278 */
1279 #define LDMA_DESCRIPTOR_SINGLE_M2M_HALF(src, dest, count) \
1280 { \
1281 .xfer = \
1282 { \
1283 .structType = ldmaCtrlStructTypeXfer, \
1284 .structReq = 1, \
1285 .xferCnt = (count) - 1, \
1286 .byteSwap = 0, \
1287 .blockSize = ldmaCtrlBlockSizeUnit1, \
1288 .doneIfs = 1, \
1289 .reqMode = ldmaCtrlReqModeAll, \
1290 .decLoopCnt = 0, \
1291 .ignoreSrec = 0, \
1292 .srcInc = ldmaCtrlSrcIncOne, \
1293 .size = ldmaCtrlSizeHalf, \
1294 .dstInc = ldmaCtrlDstIncOne, \
1295 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1296 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1297 .srcAddr = (uint32_t)(src), \
1298 .dstAddr = (uint32_t)(dest), \
1299 .linkMode = 0, \
1300 .link = 0, \
1301 .linkAddr = 0 \
1302 } \
1303 }
1304
1305 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1306 /**
1307 * @brief
1308 * DMA descriptor initializer for single memory to memory half-word transfer
1309 * using the extended descriptor fields.
1310 * @param[in] src Source data address.
1311 * @param[in] dest Destination data address.
1312 * @param[in] count Number of half-words to transfer.
1313 */
1314 #define LDMA_DESCRIPTOR_SINGLE_M2M_HALF_EXTEND(src, dest, count) \
1315 { \
1316 .structType = ldmaCtrlStructTypeXfer, \
1317 .extend = 1, \
1318 .structReq = 1, \
1319 .xferCnt = (count) - 1, \
1320 .byteSwap = 0, \
1321 .blockSize = ldmaCtrlBlockSizeUnit1, \
1322 .doneIfs = 1, \
1323 .reqMode = ldmaCtrlReqModeAll, \
1324 .decLoopCnt = 0, \
1325 .ignoreSrec = 0, \
1326 .srcInc = ldmaCtrlSrcIncOne, \
1327 .size = ldmaCtrlSizeHalf, \
1328 .dstInc = ldmaCtrlDstIncNone, \
1329 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1330 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1331 .srcAddr = (uint32_t)(src), \
1332 .dstAddr = (uint32_t)(dest), \
1333 .linkMode = 0, \
1334 .link = 0, \
1335 .linkAddr = 0, \
1336 .dstIlEn = 0, \
1337 .IlMode = 0, \
1338 .bufferable = 0, \
1339 .IlSrc = 0 \
1340 }
1341 #endif
1342
1343 /**
1344 * @brief
1345 * DMA descriptor initializer for single memory to memory byte transfer.
1346 * @param[in] src Source data address.
1347 * @param[in] dest Destination data address.
1348 * @param[in] count Number of bytes to transfer.
1349 */
1350 #define LDMA_DESCRIPTOR_SINGLE_M2M_BYTE(src, dest, count) \
1351 { \
1352 .xfer = \
1353 { \
1354 .structType = ldmaCtrlStructTypeXfer, \
1355 .structReq = 1, \
1356 .xferCnt = (count) - 1, \
1357 .byteSwap = 0, \
1358 .blockSize = ldmaCtrlBlockSizeUnit1, \
1359 .doneIfs = 1, \
1360 .reqMode = ldmaCtrlReqModeAll, \
1361 .decLoopCnt = 0, \
1362 .ignoreSrec = 0, \
1363 .srcInc = ldmaCtrlSrcIncOne, \
1364 .size = ldmaCtrlSizeByte, \
1365 .dstInc = ldmaCtrlDstIncOne, \
1366 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1367 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1368 .srcAddr = (uint32_t)(src), \
1369 .dstAddr = (uint32_t)(dest), \
1370 .linkMode = 0, \
1371 .link = 0, \
1372 .linkAddr = 0 \
1373 } \
1374 }
1375
1376 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1377 /**
1378 * @brief
1379 * DMA descriptor initializer for single memory to memory byte transfer
1380 * using the extended descriptor fields.
1381 * @param[in] src Source data address.
1382 * @param[in] dest Destination data address.
1383 * @param[in] count Number of bytes to transfer.
1384 */
1385 #define LDMA_DESCRIPTOR_SINGLE_M2M_BYTE_EXTEND(src, dest, count) \
1386 { \
1387 .structType = ldmaCtrlStructTypeXfer, \
1388 .extend = 1, \
1389 .structReq = 1, \
1390 .xferCnt = (count) - 1, \
1391 .byteSwap = 0, \
1392 .blockSize = ldmaCtrlBlockSizeUnit1, \
1393 .doneIfs = 1, \
1394 .reqMode = ldmaCtrlReqModeAll, \
1395 .decLoopCnt = 0, \
1396 .ignoreSrec = 0, \
1397 .srcInc = ldmaCtrlSrcIncOne, \
1398 .size = ldmaCtrlSizeByte, \
1399 .dstInc = ldmaCtrlDstIncNone, \
1400 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1401 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1402 .srcAddr = (uint32_t)(src), \
1403 .dstAddr = (uint32_t)(dest), \
1404 .linkMode = 0, \
1405 .link = 0, \
1406 .linkAddr = 0, \
1407 .dstIlEn = 0, \
1408 .IlMode = 0, \
1409 .bufferable = 0, \
1410 .IlSrc = 0 \
1411 }
1412 #endif
1413
1414 /**
1415 * @brief
1416 * DMA descriptor initializer for linked memory to memory word transfer.
1417 *
1418 * Link address must be an absolute address.
1419 * @note
1420 * The linkAddr member of the transfer descriptor is not initialized.
1421 * linkAddr must be initialized by using the proper bits right-shift
1422 * to get the correct bits from the absolute address.
1423 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1424 * @code
1425 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1426 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1427 * if linkAddr is read.
1428 * @param[in] src Source data address.
1429 * @param[in] dest Destination data address.
1430 * @param[in] count Number of words to transfer.
1431 */
1432 #define LDMA_DESCRIPTOR_LINKABS_M2M_WORD(src, dest, count) \
1433 { \
1434 .xfer = \
1435 { \
1436 .structType = ldmaCtrlStructTypeXfer, \
1437 .structReq = 1, \
1438 .xferCnt = (count) - 1, \
1439 .byteSwap = 0, \
1440 .blockSize = ldmaCtrlBlockSizeUnit1, \
1441 .doneIfs = 0, \
1442 .reqMode = ldmaCtrlReqModeAll, \
1443 .decLoopCnt = 0, \
1444 .ignoreSrec = 0, \
1445 .srcInc = ldmaCtrlSrcIncOne, \
1446 .size = ldmaCtrlSizeWord, \
1447 .dstInc = ldmaCtrlDstIncOne, \
1448 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1449 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1450 .srcAddr = (uint32_t)(src), \
1451 .dstAddr = (uint32_t)(dest), \
1452 .linkMode = ldmaLinkModeAbs, \
1453 .link = 1, \
1454 .linkAddr = 0 /* Must be set runtime ! */ \
1455 } \
1456 }
1457
1458 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1459 /**
1460 * @brief
1461 * DMA descriptor initializer for linked memory to memory word transfer
1462 * using the extended descriptor fields.
1463 *
1464 * Link address must be an absolute address.
1465 * @note
1466 * The linkAddr member of the transfer descriptor is not initialized.
1467 * linkAddr must be initialized by using the proper bits right-shift
1468 * to get the correct bits from the absolute address.
1469 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1470 * @code
1471 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1472 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1473 * if linkAddr is read.
1474 * @param[in] src Source data address.
1475 * @param[in] dest Destination data address.
1476 * @param[in] count Number of words to transfer.
1477 */
1478 #define LDMA_DESCRIPTOR_LINKABS_M2M_WORD_EXTEND(src, dest, count) \
1479 { \
1480 .structType = ldmaCtrlStructTypeXfer, \
1481 .extend = 1, \
1482 .structReq = 1, \
1483 .xferCnt = (count) - 1, \
1484 .byteSwap = 0, \
1485 .blockSize = ldmaCtrlBlockSizeUnit1, \
1486 .doneIfs = 0, \
1487 .reqMode = ldmaCtrlReqModeAll, \
1488 .decLoopCnt = 0, \
1489 .ignoreSrec = 0, \
1490 .srcInc = ldmaCtrlSrcIncOne, \
1491 .size = ldmaCtrlSizeWord, \
1492 .dstInc = ldmaCtrlDstIncNone, \
1493 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1494 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1495 .srcAddr = (uint32_t)(src), \
1496 .dstAddr = (uint32_t)(dest), \
1497 .linkMode = ldmaLinkModeAbs, \
1498 .link = 1, \
1499 .linkAddr = 0, /* Must be set runtime ! */ \
1500 .dstIlEn = 0, \
1501 .IlMode = 0, \
1502 .bufferable = 0, \
1503 .IlSrc = 0 \
1504 }
1505 #endif
1506
1507 /**
1508 * @brief
1509 * DMA descriptor initializer for linked memory to memory half-word transfer.
1510 *
1511 * Link address must be an absolute address.
1512 * @note
1513 * The linkAddr member of the transfer descriptor is not initialized.
1514 * linkAddr must be initialized by using the proper bits right-shift
1515 * to get the correct bits from the absolute address.
1516 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1517 * @code
1518 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1519 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1520 * if linkAddr is read.
1521 * @param[in] src Source data address.
1522 * @param[in] dest Destination data address.
1523 * @param[in] count Number of half-words to transfer.
1524 */
1525 #define LDMA_DESCRIPTOR_LINKABS_M2M_HALF(src, dest, count) \
1526 { \
1527 .xfer = \
1528 { \
1529 .structType = ldmaCtrlStructTypeXfer, \
1530 .structReq = 1, \
1531 .xferCnt = (count) - 1, \
1532 .byteSwap = 0, \
1533 .blockSize = ldmaCtrlBlockSizeUnit1, \
1534 .doneIfs = 0, \
1535 .reqMode = ldmaCtrlReqModeAll, \
1536 .decLoopCnt = 0, \
1537 .ignoreSrec = 0, \
1538 .srcInc = ldmaCtrlSrcIncOne, \
1539 .size = ldmaCtrlSizeHalf, \
1540 .dstInc = ldmaCtrlDstIncOne, \
1541 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1542 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1543 .srcAddr = (uint32_t)(src), \
1544 .dstAddr = (uint32_t)(dest), \
1545 .linkMode = ldmaLinkModeAbs, \
1546 .link = 1, \
1547 .linkAddr = 0 /* Must be set runtime ! */ \
1548 } \
1549 }
1550
1551 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1552 /**
1553 * @brief
1554 * DMA descriptor initializer for linked memory to memory half-word transfer
1555 * using the extended descriptor fields.
1556 *
1557 * Link address must be an absolute address.
1558 * @note
1559 * The linkAddr member of the transfer descriptor is not initialized.
1560 * linkAddr must be initialized by using the proper bits right-shift
1561 * to get the correct bits from the absolute address.
1562 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1563 * @code
1564 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1565 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1566 * if linkAddr is read.
1567 * @param[in] src Source data address.
1568 * @param[in] dest Destination data address.
1569 * @param[in] count Number of half-words to transfer.
1570 */
1571 #define LDMA_DESCRIPTOR_LINKABS_M2M_HALF_EXTEND(src, dest, count) \
1572 { \
1573 .structType = ldmaCtrlStructTypeXfer, \
1574 .extend = 1, \
1575 .structReq = 1, \
1576 .xferCnt = (count) - 1, \
1577 .byteSwap = 0, \
1578 .blockSize = ldmaCtrlBlockSizeUnit1, \
1579 .doneIfs = 0, \
1580 .reqMode = ldmaCtrlReqModeAll, \
1581 .decLoopCnt = 0, \
1582 .ignoreSrec = 0, \
1583 .srcInc = ldmaCtrlSrcIncOne, \
1584 .size = ldmaCtrlSizeHalf, \
1585 .dstInc = ldmaCtrlDstIncNone, \
1586 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1587 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1588 .srcAddr = (uint32_t)(src), \
1589 .dstAddr = (uint32_t)(dest), \
1590 .linkMode = ldmaLinkModeAbs, \
1591 .link = 1, \
1592 .linkAddr = 0, /* Must be set runtime ! */ \
1593 .dstIlEn = 0, \
1594 .IlMode = 0, \
1595 .bufferable = 0, \
1596 .IlSrc = 0 \
1597 }
1598 #endif
1599
1600 /**
1601 * @brief
1602 * DMA descriptor initializer for linked memory to memory byte transfer.
1603 *
1604 * Link address must be an absolute address.
1605 * @note
1606 * The linkAddr member of the transfer descriptor is not initialized.
1607 * linkAddr must be initialized by using the proper bits right-shift
1608 * to get the correct bits from the absolute address.
1609 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1610 * @code
1611 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1612 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1613 * if linkAddr is read.
1614 * @param[in] src Source data address.
1615 * @param[in] dest Destination data address.
1616 * @param[in] count Number of bytes to transfer.
1617 */
1618 #define LDMA_DESCRIPTOR_LINKABS_M2M_BYTE(src, dest, count) \
1619 { \
1620 .xfer = \
1621 { \
1622 .structType = ldmaCtrlStructTypeXfer, \
1623 .structReq = 1, \
1624 .xferCnt = (count) - 1, \
1625 .byteSwap = 0, \
1626 .blockSize = ldmaCtrlBlockSizeUnit1, \
1627 .doneIfs = 0, \
1628 .reqMode = ldmaCtrlReqModeAll, \
1629 .decLoopCnt = 0, \
1630 .ignoreSrec = 0, \
1631 .srcInc = ldmaCtrlSrcIncOne, \
1632 .size = ldmaCtrlSizeByte, \
1633 .dstInc = ldmaCtrlDstIncOne, \
1634 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1635 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1636 .srcAddr = (uint32_t)(src), \
1637 .dstAddr = (uint32_t)(dest), \
1638 .linkMode = ldmaLinkModeAbs, \
1639 .link = 1, \
1640 .linkAddr = 0 /* Must be set runtime ! */ \
1641 } \
1642 }
1643
1644 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1645 /**
1646 * @brief
1647 * DMA descriptor initializer for linked memory to memory byte transfer
1648 * using the extended descriptor fields.
1649 *
1650 * Link address must be an absolute address.
1651 * @note
1652 * The linkAddr member of the transfer descriptor is not initialized.
1653 * linkAddr must be initialized by using the proper bits right-shift
1654 * to get the correct bits from the absolute address.
1655 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR macro should be used for that operation:
1656 * @code
1657 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
1658 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
1659 * if linkAddr is read.
1660 * @param[in] src Source data address.
1661 * @param[in] dest Destination data address.
1662 * @param[in] count Number of bytes to transfer.
1663 */
1664 #define LDMA_DESCRIPTOR_LINKABS_M2M_BYTE_EXTEND(src, dest, count) \
1665 { \
1666 .structType = ldmaCtrlStructTypeXfer, \
1667 .extend = 1, \
1668 .structReq = 1, \
1669 .xferCnt = (count) - 1, \
1670 .byteSwap = 0, \
1671 .blockSize = ldmaCtrlBlockSizeUnit1, \
1672 .doneIfs = 0, \
1673 .reqMode = ldmaCtrlReqModeAll, \
1674 .decLoopCnt = 0, \
1675 .ignoreSrec = 0, \
1676 .srcInc = ldmaCtrlSrcIncOne, \
1677 .size = ldmaCtrlSizeByte, \
1678 .dstInc = ldmaCtrlDstIncNone, \
1679 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1680 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1681 .srcAddr = (uint32_t)(src), \
1682 .dstAddr = (uint32_t)(dest), \
1683 .linkMode = ldmaLinkModeAbs, \
1684 .link = 1, \
1685 .linkAddr = 0, /* Must be set runtime ! */ \
1686 .dstIlEn = 0, \
1687 .IlMode = 0, \
1688 .bufferable = 0, \
1689 .IlSrc = 0 \
1690 }
1691 #endif
1692
1693 /**
1694 * @brief
1695 * DMA descriptor initializer for linked memory to memory word transfer.
1696 *
1697 * Link address is a relative address.
1698 * @note
1699 * The linkAddr member of the transfer descriptor is initialized to 4
1700 * (regular descriptor) or 7 (extended descriptor), assuming that
1701 * the next descriptor immediately follows this descriptor (in memory).
1702 * @param[in] src Source data address.
1703 * @param[in] dest Destination data address.
1704 * @param[in] count Number of words to transfer.
1705 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1706 * signed number of descriptors from "here".
1707 * 1=one descriptor forward in memory,
1708 * 0=this descriptor,
1709 * -1=one descriptor back in memory.
1710 */
1711 #define LDMA_DESCRIPTOR_LINKREL_M2M_WORD(src, dest, count, linkjmp) \
1712 { \
1713 .xfer = \
1714 { \
1715 .structType = ldmaCtrlStructTypeXfer, \
1716 .structReq = 1, \
1717 .xferCnt = (count) - 1, \
1718 .byteSwap = 0, \
1719 .blockSize = ldmaCtrlBlockSizeUnit1, \
1720 .doneIfs = 0, \
1721 .reqMode = ldmaCtrlReqModeAll, \
1722 .decLoopCnt = 0, \
1723 .ignoreSrec = 0, \
1724 .srcInc = ldmaCtrlSrcIncOne, \
1725 .size = ldmaCtrlSizeWord, \
1726 .dstInc = ldmaCtrlDstIncOne, \
1727 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1728 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1729 .srcAddr = (uint32_t)(src), \
1730 .dstAddr = (uint32_t)(dest), \
1731 .linkMode = ldmaLinkModeRel, \
1732 .link = 1, \
1733 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
1734 } \
1735 }
1736
1737 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1738 /**
1739 * @brief
1740 * DMA descriptor initializer for linked memory to memory word transfer
1741 * using the extended descriptor fields.
1742 *
1743 * Link address is a relative address.
1744 * @note
1745 * The linkAddr member of the transfer descriptor is initialized to 4
1746 * (regular descriptor) or 7 (extended descriptor), assuming that
1747 * the next descriptor immediately follows this descriptor (in memory).
1748 * @param[in] src Source data address.
1749 * @param[in] dest Destination data address.
1750 * @param[in] count Number of words to transfer.
1751 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1752 * signed number of descriptors from "here".
1753 * 1=one descriptor forward in memory,
1754 * 0=this descriptor,
1755 * -1=one descriptor back in memory.
1756 */
1757 #define LDMA_DESCRIPTOR_LINKREL_M2M_WORD_EXTEND(src, dest, count, linkjmp) \
1758 { \
1759 .structType = ldmaCtrlStructTypeXfer, \
1760 .extend = 1, \
1761 .structReq = 1, \
1762 .xferCnt = (count) - 1, \
1763 .byteSwap = 0, \
1764 .blockSize = ldmaCtrlBlockSizeUnit1, \
1765 .doneIfs = 0, \
1766 .reqMode = ldmaCtrlReqModeAll, \
1767 .decLoopCnt = 0, \
1768 .ignoreSrec = 0, \
1769 .srcInc = ldmaCtrlSrcIncOne, \
1770 .size = ldmaCtrlSizeWord, \
1771 .dstInc = ldmaCtrlDstIncNone, \
1772 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1773 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1774 .srcAddr = (uint32_t)(src), \
1775 .dstAddr = (uint32_t)(dest), \
1776 .linkMode = ldmaLinkModeRel, \
1777 .link = 1, \
1778 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
1779 .dstIlEn = 0, \
1780 .IlMode = 0, \
1781 .bufferable = 0, \
1782 .IlSrc = 0 \
1783 }
1784 #endif
1785
1786 /**
1787 * @brief
1788 * DMA descriptor initializer for linked memory to memory half-word transfer.
1789 *
1790 * Link address is a relative address.
1791 * @note
1792 * The linkAddr member of the transfer descriptor is initialized to 4
1793 * (regular descriptor) or 7 (extended descriptor), assuming that
1794 * the next descriptor immediately follows this descriptor (in memory).
1795 * @param[in] src Source data address.
1796 * @param[in] dest Destination data address.
1797 * @param[in] count Number of half-words to transfer.
1798 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1799 * signed number of descriptors from "here".
1800 * 1=one descriptor forward in memory,
1801 * 0=this descriptor,
1802 * -1=one descriptor back in memory.
1803 */
1804 #define LDMA_DESCRIPTOR_LINKREL_M2M_HALF(src, dest, count, linkjmp) \
1805 { \
1806 .xfer = \
1807 { \
1808 .structType = ldmaCtrlStructTypeXfer, \
1809 .structReq = 1, \
1810 .xferCnt = (count) - 1, \
1811 .byteSwap = 0, \
1812 .blockSize = ldmaCtrlBlockSizeUnit1, \
1813 .doneIfs = 0, \
1814 .reqMode = ldmaCtrlReqModeAll, \
1815 .decLoopCnt = 0, \
1816 .ignoreSrec = 0, \
1817 .srcInc = ldmaCtrlSrcIncOne, \
1818 .size = ldmaCtrlSizeHalf, \
1819 .dstInc = ldmaCtrlDstIncOne, \
1820 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1821 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1822 .srcAddr = (uint32_t)(src), \
1823 .dstAddr = (uint32_t)(dest), \
1824 .linkMode = ldmaLinkModeRel, \
1825 .link = 1, \
1826 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
1827 } \
1828 }
1829
1830 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1831 /**
1832 * @brief
1833 * DMA descriptor initializer for linked memory to memory half-word transfer
1834 * using the extended descriptor fields.
1835 *
1836 * Link address is a relative address.
1837 * @note
1838 * The linkAddr member of the transfer descriptor is initialized to 4
1839 * (regular descriptor) or 7 (extended descriptor), assuming that
1840 * the next descriptor immediately follows this descriptor (in memory).
1841 * @param[in] src Source data address.
1842 * @param[in] dest Destination data address.
1843 * @param[in] count Number of half-words to transfer.
1844 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1845 * signed number of descriptors from "here".
1846 * 1=one descriptor forward in memory,
1847 * 0=this descriptor,
1848 * -1=one descriptor back in memory.
1849 */
1850 #define LDMA_DESCRIPTOR_LINKREL_M2M_HALF_EXTEND(src, dest, count, linkjmp) \
1851 { \
1852 .structType = ldmaCtrlStructTypeXfer, \
1853 .extend = 1, \
1854 .structReq = 1, \
1855 .xferCnt = (count) - 1, \
1856 .byteSwap = 0, \
1857 .blockSize = ldmaCtrlBlockSizeUnit1, \
1858 .doneIfs = 0, \
1859 .reqMode = ldmaCtrlReqModeAll, \
1860 .decLoopCnt = 0, \
1861 .ignoreSrec = 0, \
1862 .srcInc = ldmaCtrlSrcIncOne, \
1863 .size = ldmaCtrlSizeHalf, \
1864 .dstInc = ldmaCtrlDstIncNone, \
1865 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1866 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1867 .srcAddr = (uint32_t)(src), \
1868 .dstAddr = (uint32_t)(dest), \
1869 .linkMode = ldmaLinkModeRel, \
1870 .link = 1, \
1871 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
1872 .dstIlEn = 0, \
1873 .IlMode = 0, \
1874 .bufferable = 0, \
1875 .IlSrc = 0 \
1876 }
1877 #endif
1878
1879 /**
1880 * @brief
1881 * DMA descriptor initializer for linked memory to memory byte transfer.
1882 *
1883 * Link address is a relative address.
1884 * @note
1885 * The linkAddr member of the transfer descriptor is initialized to 4
1886 * (regular descriptor) or 7 (extended descriptor), assuming that
1887 * the next descriptor immediately follows this descriptor (in memory).
1888 * @param[in] src Source data address.
1889 * @param[in] dest Destination data address.
1890 * @param[in] count Number of bytes to transfer.
1891 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1892 * signed number of descriptors from "here".
1893 * 1=one descriptor forward in memory,
1894 * 0=this descriptor,
1895 * -1=one descriptor back in memory.
1896 */
1897 #define LDMA_DESCRIPTOR_LINKREL_M2M_BYTE(src, dest, count, linkjmp) \
1898 { \
1899 .xfer = \
1900 { \
1901 .structType = ldmaCtrlStructTypeXfer, \
1902 .structReq = 1, \
1903 .xferCnt = (count) - 1, \
1904 .byteSwap = 0, \
1905 .blockSize = ldmaCtrlBlockSizeUnit1, \
1906 .doneIfs = 0, \
1907 .reqMode = ldmaCtrlReqModeAll, \
1908 .decLoopCnt = 0, \
1909 .ignoreSrec = 0, \
1910 .srcInc = ldmaCtrlSrcIncOne, \
1911 .size = ldmaCtrlSizeByte, \
1912 .dstInc = ldmaCtrlDstIncOne, \
1913 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1914 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1915 .srcAddr = (uint32_t)(src), \
1916 .dstAddr = (uint32_t)(dest), \
1917 .linkMode = ldmaLinkModeRel, \
1918 .link = 1, \
1919 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
1920 } \
1921 }
1922
1923 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
1924 /**
1925 * @brief
1926 * DMA descriptor initializer for linked memory to memory byte transfer
1927 * using the extended descriptor fields.
1928 *
1929 * Link address is a relative address.
1930 * @note
1931 * The linkAddr member of the transfer descriptor is initialized to 4
1932 * (regular descriptor) or 7 (extended descriptor), assuming that
1933 * the next descriptor immediately follows this descriptor (in memory).
1934 * @param[in] src Source data address.
1935 * @param[in] dest Destination data address.
1936 * @param[in] count Number of bytes to transfer.
1937 * @param[in] linkjmp Address of descriptor to link to, expressed as a
1938 * signed number of descriptors from "here".
1939 * 1=one descriptor forward in memory,
1940 * 0=this descriptor,
1941 * -1=one descriptor back in memory.
1942 */
1943 #define LDMA_DESCRIPTOR_LINKREL_M2M_BYTE_EXTEND(src, dest, count, linkjmp) \
1944 { \
1945 .structType = ldmaCtrlStructTypeXfer, \
1946 .extend = 1, \
1947 .structReq = 1, \
1948 .xferCnt = (count) - 1, \
1949 .byteSwap = 0, \
1950 .blockSize = ldmaCtrlBlockSizeUnit1, \
1951 .doneIfs = 0, \
1952 .reqMode = ldmaCtrlReqModeAll, \
1953 .decLoopCnt = 0, \
1954 .ignoreSrec = 0, \
1955 .srcInc = ldmaCtrlSrcIncOne, \
1956 .size = ldmaCtrlSizeByte, \
1957 .dstInc = ldmaCtrlDstIncNone, \
1958 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1959 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1960 .srcAddr = (uint32_t)(src), \
1961 .dstAddr = (uint32_t)(dest), \
1962 .linkMode = ldmaLinkModeRel, \
1963 .link = 1, \
1964 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
1965 .dstIlEn = 0, \
1966 .IlMode = 0, \
1967 .bufferable = 0, \
1968 .IlSrc = 0 \
1969 }
1970 #endif
1971
1972 /**
1973 * @brief
1974 * DMA descriptor initializer for byte transfers from a peripheral to memory.
1975 * @param[in] src Peripheral data source register address.
1976 * @param[in] dest Destination data address.
1977 * @param[in] count Number of bytes to transfer.
1978 */
1979 #define LDMA_DESCRIPTOR_SINGLE_P2M_BYTE(src, dest, count) \
1980 { \
1981 .xfer = \
1982 { \
1983 .structType = ldmaCtrlStructTypeXfer, \
1984 .structReq = 0, \
1985 .xferCnt = (count) - 1, \
1986 .byteSwap = 0, \
1987 .blockSize = ldmaCtrlBlockSizeUnit1, \
1988 .doneIfs = 1, \
1989 .reqMode = ldmaCtrlReqModeBlock, \
1990 .decLoopCnt = 0, \
1991 .ignoreSrec = 0, \
1992 .srcInc = ldmaCtrlSrcIncNone, \
1993 .size = ldmaCtrlSizeByte, \
1994 .dstInc = ldmaCtrlDstIncOne, \
1995 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
1996 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
1997 .srcAddr = (uint32_t)(src), \
1998 .dstAddr = (uint32_t)(dest), \
1999 .linkMode = 0, \
2000 .link = 0, \
2001 .linkAddr = 0 \
2002 } \
2003 }
2004
2005 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2006 /**
2007 * @brief
2008 * DMA descriptor initializer for byte transfers from a peripheral to memory
2009 * using the extended descriptor fields.
2010 * @param[in] src Peripheral data source register address.
2011 * @param[in] dest Destination data address.
2012 * @param[in] count Number of bytes to transfer.
2013 */
2014 #define LDMA_DESCRIPTOR_SINGLE_P2M_BYTE_EXTEND(src, dest, count) \
2015 { \
2016 .structType = ldmaCtrlStructTypeXfer, \
2017 .extend = 1, \
2018 .structReq = 0, \
2019 .xferCnt = (count) - 1, \
2020 .byteSwap = 0, \
2021 .blockSize = ldmaCtrlBlockSizeUnit1, \
2022 .doneIfs = 1, \
2023 .reqMode = ldmaCtrlReqModeBlock, \
2024 .decLoopCnt = 0, \
2025 .ignoreSrec = 0, \
2026 .srcInc = ldmaCtrlSrcIncNone, \
2027 .size = ldmaCtrlSizeByte, \
2028 .dstInc = ldmaCtrlDstIncNone, \
2029 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2030 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2031 .srcAddr = (uint32_t)(src), \
2032 .dstAddr = (uint32_t)(dest), \
2033 .linkMode = 0, \
2034 .link = 0, \
2035 .linkAddr = 0, \
2036 .dstIlEn = 0, \
2037 .IlMode = 0, \
2038 .bufferable = 0, \
2039 .IlSrc = 0 \
2040 }
2041 #endif
2042
2043 /**
2044 * @brief
2045 * DMA descriptor initializer for byte transfers from a peripheral to a peripheral.
2046 * @param[in] src Peripheral data source register address.
2047 * @param[in] dest Peripheral data destination register address.
2048 * @param[in] count Number of bytes to transfer.
2049 */
2050 #define LDMA_DESCRIPTOR_SINGLE_P2P_BYTE(src, dest, count) \
2051 { \
2052 .xfer = \
2053 { \
2054 .structType = ldmaCtrlStructTypeXfer, \
2055 .structReq = 0, \
2056 .xferCnt = (count) - 1, \
2057 .byteSwap = 0, \
2058 .blockSize = ldmaCtrlBlockSizeUnit1, \
2059 .doneIfs = 1, \
2060 .reqMode = ldmaCtrlReqModeBlock, \
2061 .decLoopCnt = 0, \
2062 .ignoreSrec = 0, \
2063 .srcInc = ldmaCtrlSrcIncNone, \
2064 .size = ldmaCtrlSizeByte, \
2065 .dstInc = ldmaCtrlDstIncNone, \
2066 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2067 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2068 .srcAddr = (uint32_t)(src), \
2069 .dstAddr = (uint32_t)(dest), \
2070 .linkMode = 0, \
2071 .link = 0, \
2072 .linkAddr = 0 \
2073 } \
2074 }
2075
2076 /**
2077 * @brief
2078 * DMA descriptor initializer for byte transfers from memory to a peripheral.
2079 * @param[in] src Source data address.
2080 * @param[in] dest Peripheral data register destination address.
2081 * @param[in] count Number of bytes to transfer.
2082 */
2083 #define LDMA_DESCRIPTOR_SINGLE_M2P_BYTE(src, dest, count) \
2084 { \
2085 .xfer = \
2086 { \
2087 .structType = ldmaCtrlStructTypeXfer, \
2088 .structReq = 0, \
2089 .xferCnt = (count) - 1, \
2090 .byteSwap = 0, \
2091 .blockSize = ldmaCtrlBlockSizeUnit1, \
2092 .doneIfs = 1, \
2093 .reqMode = ldmaCtrlReqModeBlock, \
2094 .decLoopCnt = 0, \
2095 .ignoreSrec = 0, \
2096 .srcInc = ldmaCtrlSrcIncOne, \
2097 .size = ldmaCtrlSizeByte, \
2098 .dstInc = ldmaCtrlDstIncNone, \
2099 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2100 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2101 .srcAddr = (uint32_t)(src), \
2102 .dstAddr = (uint32_t)(dest), \
2103 .linkMode = 0, \
2104 .link = 0, \
2105 .linkAddr = 0 \
2106 } \
2107 }
2108
2109 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2110 /**
2111 * @brief
2112 * DMA descriptor initializer for byte transfers from memory to a peripheral
2113 * using the extended descriptor fields.
2114 * @note
2115 * For the extended descriptor, if IlMode uses the absolute addressing, the
2116 * rules are used directly as the destination addresses of the corresponding
2117 * data. Thus the argument 'dest' will be ignored by the DMA engine.
2118 * @param[in] src Source data address.
2119 * @param[in] dest Peripheral data register destination address.
2120 * @param[in] count Number of bytes to transfer.
2121 */
2122 #define LDMA_DESCRIPTOR_SINGLE_M2P_BYTE_EXTEND(src, dest, count) \
2123 { \
2124 .structType = ldmaCtrlStructTypeXfer, \
2125 .extend = 1, \
2126 .structReq = 0, \
2127 .xferCnt = (count) - 1, \
2128 .byteSwap = 0, \
2129 .blockSize = ldmaCtrlBlockSizeUnit1, \
2130 .doneIfs = 1, \
2131 .reqMode = ldmaCtrlReqModeBlock, \
2132 .decLoopCnt = 0, \
2133 .ignoreSrec = 0, \
2134 .srcInc = ldmaCtrlSrcIncOne, \
2135 .size = ldmaCtrlSizeByte, \
2136 .dstInc = ldmaCtrlDstIncNone, \
2137 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2138 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2139 .srcAddr = (uint32_t)(src), \
2140 .dstAddr = (uint32_t)(dest), \
2141 .linkMode = 0, \
2142 .link = 0, \
2143 .linkAddr = 0, \
2144 .dstIlEn = 0, \
2145 .IlMode = 0, \
2146 .bufferable = 0, \
2147 .IlSrc = 0 \
2148 }
2149 #endif
2150
2151 /**
2152 * @brief
2153 * DMA descriptor initializer for byte transfers from a peripheral to memory.
2154 * @param[in] src Peripheral data source register address.
2155 * @param[in] dest Destination data address.
2156 * @param[in] count Number of bytes to transfer.
2157 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2158 * signed number of descriptors from "here".
2159 * 1=one descriptor forward in memory,
2160 * 0=this descriptor,
2161 * -1=one descriptor back in memory.
2162 */
2163 #define LDMA_DESCRIPTOR_LINKREL_P2M_BYTE(src, dest, count, linkjmp) \
2164 { \
2165 .xfer = \
2166 { \
2167 .structType = ldmaCtrlStructTypeXfer, \
2168 .structReq = 0, \
2169 .xferCnt = (count) - 1, \
2170 .byteSwap = 0, \
2171 .blockSize = ldmaCtrlBlockSizeUnit1, \
2172 .doneIfs = 1, \
2173 .reqMode = ldmaCtrlReqModeBlock, \
2174 .decLoopCnt = 0, \
2175 .ignoreSrec = 0, \
2176 .srcInc = ldmaCtrlSrcIncNone, \
2177 .size = ldmaCtrlSizeByte, \
2178 .dstInc = ldmaCtrlDstIncOne, \
2179 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2180 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2181 .srcAddr = (uint32_t)(src), \
2182 .dstAddr = (uint32_t)(dest), \
2183 .linkMode = ldmaLinkModeRel, \
2184 .link = 1, \
2185 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
2186 } \
2187 }
2188
2189 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2190 /**
2191 * @brief
2192 * DMA descriptor initializer for byte transfers from a peripheral to memory
2193 * using the extended descriptor fields.
2194 * @param[in] src Peripheral data source register address.
2195 * @param[in] dest Destination data address.
2196 * @param[in] count Number of bytes to transfer.
2197 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2198 * signed number of descriptors from "here".
2199 * 1=one descriptor forward in memory,
2200 * 0=this descriptor,
2201 * -1=one descriptor back in memory.
2202 */
2203 #define LDMA_DESCRIPTOR_LINKREL_P2M_BYTE_EXTEND(src, dest, count, linkjmp) \
2204 { \
2205 .structType = ldmaCtrlStructTypeXfer, \
2206 .extend = 1, \
2207 .structReq = 0, \
2208 .xferCnt = (count) - 1, \
2209 .byteSwap = 0, \
2210 .blockSize = ldmaCtrlBlockSizeUnit1, \
2211 .doneIfs = 1, \
2212 .reqMode = ldmaCtrlReqModeBlock, \
2213 .decLoopCnt = 0, \
2214 .ignoreSrec = 0, \
2215 .srcInc = ldmaCtrlSrcIncNone, \
2216 .size = ldmaCtrlSizeByte, \
2217 .dstInc = ldmaCtrlDstIncNone, \
2218 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2219 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2220 .srcAddr = (uint32_t)(src), \
2221 .dstAddr = (uint32_t)(dest), \
2222 .linkMode = ldmaLinkModeRel, \
2223 .link = 1, \
2224 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
2225 .dstIlEn = 0, \
2226 .IlMode = 0, \
2227 .bufferable = 0, \
2228 .IlSrc = 0 \
2229 }
2230 #endif
2231
2232 /**
2233 * @brief
2234 * DMA descriptor initializer for word transfers from a peripheral to memory.
2235 * @param[in] src Peripheral data source register address.
2236 * @param[in] dest Destination data address.
2237 * @param[in] count Number of words to transfer.
2238 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2239 * signed number of descriptors from "here".
2240 * 1=one descriptor forward in memory,
2241 * 0=this descriptor,
2242 * -1=one descriptor back in memory.
2243 */
2244 #define LDMA_DESCRIPTOR_LINKREL_P2M_WORD(src, dest, count, linkjmp) \
2245 { \
2246 .xfer = \
2247 { \
2248 .structType = ldmaCtrlStructTypeXfer, \
2249 .structReq = 0, \
2250 .xferCnt = (count) - 1, \
2251 .byteSwap = 0, \
2252 .blockSize = ldmaCtrlBlockSizeUnit1, \
2253 .doneIfs = 1, \
2254 .reqMode = ldmaCtrlReqModeBlock, \
2255 .decLoopCnt = 0, \
2256 .ignoreSrec = 0, \
2257 .srcInc = ldmaCtrlSrcIncNone, \
2258 .size = ldmaCtrlSizeWord, \
2259 .dstInc = ldmaCtrlDstIncOne, \
2260 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2261 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2262 .srcAddr = (uint32_t)(src), \
2263 .dstAddr = (uint32_t)(dest), \
2264 .linkMode = ldmaLinkModeRel, \
2265 .link = 1, \
2266 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
2267 } \
2268 }
2269
2270 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2271 /**
2272 * @brief
2273 * DMA descriptor initializer for word transfers from a peripheral to memory
2274 * using the extended descriptor fields.
2275 * @param[in] src Peripheral data source register address.
2276 * @param[in] dest Destination data address.
2277 * @param[in] count Number of words to transfer.
2278 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2279 * signed number of descriptors from "here".
2280 * 1=one descriptor forward in memory,
2281 * 0=this descriptor,
2282 * -1=one descriptor back in memory.
2283 */
2284 #define LDMA_DESCRIPTOR_LINKREL_P2M_WORD_EXTEND(src, dest, count, linkjmp) \
2285 { \
2286 .structType = ldmaCtrlStructTypeXfer, \
2287 .extend = 1, \
2288 .structReq = 0, \
2289 .xferCnt = (count) - 1, \
2290 .byteSwap = 0, \
2291 .blockSize = ldmaCtrlBlockSizeUnit1, \
2292 .doneIfs = 1, \
2293 .reqMode = ldmaCtrlReqModeBlock, \
2294 .decLoopCnt = 0, \
2295 .ignoreSrec = 0, \
2296 .srcInc = ldmaCtrlSrcIncNone, \
2297 .size = ldmaCtrlSizeWord, \
2298 .dstInc = ldmaCtrlDstIncNone, \
2299 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2300 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2301 .srcAddr = (uint32_t)(src), \
2302 .dstAddr = (uint32_t)(dest), \
2303 .linkMode = ldmaLinkModeRel, \
2304 .link = 1, \
2305 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
2306 .dstIlEn = 0, \
2307 .IlMode = 0, \
2308 .bufferable = 0, \
2309 .IlSrc = 0 \
2310 }
2311 #endif
2312
2313 /**
2314 * @brief
2315 * DMA descriptor initializer for byte transfers from memory to a peripheral.
2316 * @param[in] src Source data address.
2317 * @param[in] dest Peripheral data register destination address.
2318 * @param[in] count Number of bytes to transfer.
2319 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2320 * signed number of descriptors from "here".
2321 * 1=one descriptor forward in memory,
2322 * 0=this descriptor,
2323 * -1=one descriptor back in memory.
2324 */
2325 #define LDMA_DESCRIPTOR_LINKREL_M2P_BYTE(src, dest, count, linkjmp) \
2326 { \
2327 .xfer = \
2328 { \
2329 .structType = ldmaCtrlStructTypeXfer, \
2330 .structReq = 0, \
2331 .xferCnt = (count) - 1, \
2332 .byteSwap = 0, \
2333 .blockSize = ldmaCtrlBlockSizeUnit1, \
2334 .doneIfs = 1, \
2335 .reqMode = ldmaCtrlReqModeBlock, \
2336 .decLoopCnt = 0, \
2337 .ignoreSrec = 0, \
2338 .srcInc = ldmaCtrlSrcIncOne, \
2339 .size = ldmaCtrlSizeByte, \
2340 .dstInc = ldmaCtrlDstIncNone, \
2341 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2342 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2343 .srcAddr = (uint32_t)(src), \
2344 .dstAddr = (uint32_t)(dest), \
2345 .linkMode = ldmaLinkModeRel, \
2346 .link = 1, \
2347 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
2348 } \
2349 }
2350
2351 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2352 /**
2353 * @brief
2354 * DMA descriptor initializer for byte transfers from memory to a peripheral
2355 * using the extended descriptor fields.
2356 * @note
2357 * For the extended descriptor, if IlMode uses the absolute addressing, the
2358 * rules are used directly as the destination addresses of the corresponding
2359 * data. Thus the argument 'dest' will be ignored by the DMA engine.
2360 * @param[in] src Source data address.
2361 * @param[in] dest Peripheral data register destination address.
2362 * @param[in] count Number of bytes to transfer.
2363 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2364 * signed number of descriptors from "here".
2365 * 1=one descriptor forward in memory,
2366 * 0=this descriptor,
2367 * -1=one descriptor back in memory.
2368 */
2369 #define LDMA_DESCRIPTOR_LINKREL_M2P_BYTE_EXTEND(src, dest, count, linkjmp) \
2370 { \
2371 .structType = ldmaCtrlStructTypeXfer, \
2372 .extend = 1, \
2373 .structReq = 0, \
2374 .xferCnt = (count) - 1, \
2375 .byteSwap = 0, \
2376 .blockSize = ldmaCtrlBlockSizeUnit1, \
2377 .doneIfs = 1, \
2378 .reqMode = ldmaCtrlReqModeBlock, \
2379 .decLoopCnt = 0, \
2380 .ignoreSrec = 0, \
2381 .srcInc = ldmaCtrlSrcIncOne, \
2382 .size = ldmaCtrlSizeByte, \
2383 .dstInc = ldmaCtrlDstIncNone, \
2384 .srcAddrMode = ldmaCtrlSrcAddrModeAbs, \
2385 .dstAddrMode = ldmaCtrlDstAddrModeAbs, \
2386 .srcAddr = (uint32_t)(src), \
2387 .dstAddr = (uint32_t)(dest), \
2388 .linkMode = ldmaLinkModeRel, \
2389 .link = 1, \
2390 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_EXTEND_SIZE_WORD, \
2391 .dstIlEn = 0, \
2392 .IlMode = 0, \
2393 .bufferable = 0, \
2394 .IlSrc = 0 \
2395 }
2396 #endif
2397
2398 /**
2399 * @brief
2400 * DMA descriptor initializer for Immediate WRITE transfer
2401 * @param[in] value Immediate value to write.
2402 * @param[in] address Write address.
2403 */
2404 #define LDMA_DESCRIPTOR_SINGLE_WRITE(value, address) \
2405 { \
2406 .wri = \
2407 { \
2408 .structType = ldmaCtrlStructTypeWrite, \
2409 .structReq = 1, \
2410 .xferCnt = 0, \
2411 .byteSwap = 0, \
2412 .blockSize = 0, \
2413 .doneIfs = 1, \
2414 .reqMode = 0, \
2415 .decLoopCnt = 0, \
2416 .ignoreSrec = 0, \
2417 .srcInc = 0, \
2418 .size = 0, \
2419 .dstInc = 0, \
2420 .srcAddrMode = 0, \
2421 .dstAddrMode = 0, \
2422 .immVal = (value), \
2423 .dstAddr = (uint32_t)(address), \
2424 .linkMode = 0, \
2425 .link = 0, \
2426 .linkAddr = 0 \
2427 } \
2428 }
2429
2430 /**
2431 * @brief
2432 * DMA descriptor initializer for Immediate WRITE transfer
2433 *
2434 * Link address must be an absolute address.
2435 * @note
2436 * The linkAddr member of the transfer descriptor is not initialized.
2437 * linkAddr must be initialized by using the proper bits right-shift
2438 * to get the correct bits from the absolute address.
2439 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR should be used for that operation:
2440 * @code
2441 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
2442 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
2443 * if linkAddr is read.
2444 * @param[in] value Immediate value to write.
2445 * @param[in] address Write address.
2446 */
2447 #define LDMA_DESCRIPTOR_LINKABS_WRITE(value, address) \
2448 { \
2449 .wri = \
2450 { \
2451 .structType = ldmaCtrlStructTypeWrite, \
2452 .structReq = 1, \
2453 .xferCnt = 0, \
2454 .byteSwap = 0, \
2455 .blockSize = 0, \
2456 .doneIfs = 0, \
2457 .reqMode = 0, \
2458 .decLoopCnt = 0, \
2459 .ignoreSrec = 0, \
2460 .srcInc = 0, \
2461 .size = 0, \
2462 .dstInc = 0, \
2463 .srcAddrMode = 0, \
2464 .dstAddrMode = 0, \
2465 .immVal = (value), \
2466 .dstAddr = (uint32_t)(address), \
2467 .linkMode = ldmaLinkModeAbs, \
2468 .link = 1, \
2469 .linkAddr = 0 /* Must be set runtime ! */ \
2470 } \
2471 }
2472
2473 /**
2474 * @brief
2475 * DMA descriptor initializer for Immediate WRITE transfer
2476 * @param[in] value Immediate value to write.
2477 * @param[in] address Write address.
2478 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2479 * signed number of descriptors from "here".
2480 * 1=one descriptor forward in memory,
2481 * 0=this descriptor,
2482 * -1=one descriptor back in memory.
2483 */
2484 #define LDMA_DESCRIPTOR_LINKREL_WRITE(value, address, linkjmp) \
2485 { \
2486 .wri = \
2487 { \
2488 .structType = ldmaCtrlStructTypeWrite, \
2489 .structReq = 1, \
2490 .xferCnt = 0, \
2491 .byteSwap = 0, \
2492 .blockSize = 0, \
2493 .doneIfs = 0, \
2494 .reqMode = 0, \
2495 .decLoopCnt = 0, \
2496 .ignoreSrec = 0, \
2497 .srcInc = 0, \
2498 .size = 0, \
2499 .dstInc = 0, \
2500 .srcAddrMode = 0, \
2501 .dstAddrMode = 0, \
2502 .immVal = (value), \
2503 .dstAddr = (uint32_t)(address), \
2504 .linkMode = ldmaLinkModeRel, \
2505 .link = 1, \
2506 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
2507 } \
2508 }
2509
2510 /**
2511 * @brief
2512 * DMA descriptor initializer for SYNC transfer
2513 * @param[in] set Sync pattern bits to set.
2514 * @param[in] clr Sync pattern bits to clear.
2515 * @param[in] matchValue Sync pattern to match.
2516 * @param[in] matchEnable Sync pattern bits to enable for match.
2517 */
2518 #define LDMA_DESCRIPTOR_SINGLE_SYNC(set, clr, matchValue, matchEnable) \
2519 { \
2520 .sync = \
2521 { \
2522 .structType = ldmaCtrlStructTypeSync, \
2523 .structReq = 1, \
2524 .xferCnt = 0, \
2525 .byteSwap = 0, \
2526 .blockSize = 0, \
2527 .doneIfs = 1, \
2528 .reqMode = 0, \
2529 .decLoopCnt = 0, \
2530 .ignoreSrec = 0, \
2531 .srcInc = 0, \
2532 .size = 0, \
2533 .dstInc = 0, \
2534 .srcAddrMode = 0, \
2535 .dstAddrMode = 0, \
2536 .syncSet = (set), \
2537 .syncClr = (clr), \
2538 .matchVal = (matchValue), \
2539 .matchEn = (matchEnable), \
2540 .linkMode = 0, \
2541 .link = 0, \
2542 .linkAddr = 0 \
2543 } \
2544 }
2545
2546 /**
2547 * @brief
2548 * DMA descriptor initializer for SYNC transfer
2549 *
2550 * Link address must be an absolute address.
2551 * @note
2552 * The linkAddr member of the transfer descriptor is not initialized.
2553 * linkAddr must be initialized by using the proper bits right-shift
2554 * to get the correct bits from the absolute address.
2555 * LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR should be used for that operation:
2556 * @code
2557 desc.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(&next_desc);@endcode
2558 * The opposite bit shift (left) must be done with LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR
2559 * if linkAddr is read.
2560 * @param[in] set Sync pattern bits to set.
2561 * @param[in] clr Sync pattern bits to clear.
2562 * @param[in] matchValue Sync pattern to match.
2563 * @param[in] matchEnable Sync pattern bits to enable for match.
2564 */
2565 #define LDMA_DESCRIPTOR_LINKABS_SYNC(set, clr, matchValue, matchEnable) \
2566 { \
2567 .sync = \
2568 { \
2569 .structType = ldmaCtrlStructTypeSync, \
2570 .structReq = 1, \
2571 .xferCnt = 0, \
2572 .byteSwap = 0, \
2573 .blockSize = 0, \
2574 .doneIfs = 0, \
2575 .reqMode = 0, \
2576 .decLoopCnt = 0, \
2577 .ignoreSrec = 0, \
2578 .srcInc = 0, \
2579 .size = 0, \
2580 .dstInc = 0, \
2581 .srcAddrMode = 0, \
2582 .dstAddrMode = 0, \
2583 .syncSet = (set), \
2584 .syncClr = (clr), \
2585 .matchVal = (matchValue), \
2586 .matchEn = (matchEnable), \
2587 .linkMode = ldmaLinkModeAbs, \
2588 .link = 1, \
2589 .linkAddr = 0 /* Must be set runtime ! */ \
2590 } \
2591 }
2592
2593 /**
2594 * @brief
2595 * DMA descriptor initializer for SYNC transfer
2596 * @param[in] set Sync pattern bits to set.
2597 * @param[in] clr Sync pattern bits to clear.
2598 * @param[in] matchValue Sync pattern to match.
2599 * @param[in] matchEnable Sync pattern bits to enable for match.
2600 * @param[in] linkjmp Address of descriptor to link to, expressed as a
2601 * signed number of descriptors from "here".
2602 * 1=one descriptor forward in memory,
2603 * 0=this descriptor,
2604 * -1=one descriptor back in memory.
2605 */
2606 #define LDMA_DESCRIPTOR_LINKREL_SYNC(set, clr, matchValue, matchEnable, linkjmp) \
2607 { \
2608 .sync = \
2609 { \
2610 .structType = ldmaCtrlStructTypeSync, \
2611 .structReq = 1, \
2612 .xferCnt = 0, \
2613 .byteSwap = 0, \
2614 .blockSize = 0, \
2615 .doneIfs = 0, \
2616 .reqMode = 0, \
2617 .decLoopCnt = 0, \
2618 .ignoreSrec = 0, \
2619 .srcInc = 0, \
2620 .size = 0, \
2621 .dstInc = 0, \
2622 .srcAddrMode = 0, \
2623 .dstAddrMode = 0, \
2624 .syncSet = (set), \
2625 .syncClr = (clr), \
2626 .matchVal = (matchValue), \
2627 .matchEn = (matchEnable), \
2628 .linkMode = ldmaLinkModeRel, \
2629 .link = 1, \
2630 .linkAddr = (linkjmp) * LDMA_DESCRIPTOR_NON_EXTEND_SIZE_WORD \
2631 } \
2632 }
2633
2634 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2635 /**
2636 * @brief
2637 * Initializer for the destination interleaving portion of the DMA extended descriptor.
2638 * @param[in] desc Transfer-type descriptor.
2639 * @param[in] ilmode Rules table addressing mode for interleaved data.
2640 * @param[in] ilsrc Base address for rules table in memory.
2641 */
2642 #define LDMA_DESCRIPTOR_EXTEND_DST_IL_CFG(desc, ilmode, ilsrc) \
2643 { \
2644 (desc).dstIlEn = true; \
2645 (desc).IlMode = (ilmode); \
2646 (desc).IlSrc = (uint32_t)(ilsrc); \
2647 }
2648 #endif
2649
2650 /*******************************************************************************
2651 ***************************** PROTOTYPES **********************************
2652 ******************************************************************************/
2653
2654 void LDMA_DeInit(void);
2655 void LDMA_EnableChannelRequest(int ch, bool enable);
2656 void LDMA_Init(const LDMA_Init_t *init);
2657 void LDMA_StartTransfer(int ch,
2658 const LDMA_TransferCfg_t *transfer,
2659 const LDMA_Descriptor_t *descriptor);
2660 #if defined(_LDMA_CH_CTRL_EXTEND_MASK)
2661 void LDMA_StartTransferExtend(int ch,
2662 const LDMA_TransferCfg_t *transfer,
2663 const LDMA_DescriptorExtend_t *descriptor_ext);
2664 #endif
2665 void LDMA_StopTransfer(int ch);
2666 bool LDMA_TransferDone(int ch);
2667 uint32_t LDMA_TransferRemainingCount(int ch);
2668
2669 #if defined(_LDMA_SWRST_MASK)
2670 /***************************************************************************//**
2671 * @brief
2672 * Reset the LDMA.
2673 ******************************************************************************/
LDMA_Reset(void)2674 __STATIC_INLINE void LDMA_Reset(void)
2675 {
2676 LDMA->SWRST_SET = LDMA_SWRST_SWRST;
2677
2678 /* Wait for reset to complete. */
2679 while (0UL != (LDMA->SWRST & _LDMA_SWRST_RESETTING_MASK)) {
2680 }
2681 }
2682 #endif
2683
2684 /***************************************************************************//**
2685 * @brief
2686 * Check if a certain channel is enabled.
2687 *
2688 * @param[in] ch
2689 * LDMA channel to check.
2690 *
2691 * @return
2692 * return true if the LDMA channel is enabled and false if the channel is not
2693 * enabled.
2694 ******************************************************************************/
LDMA_ChannelEnabled(int ch)2695 __STATIC_INLINE bool LDMA_ChannelEnabled(int ch)
2696 {
2697 if ((ch < 0) || (ch > 31)) {
2698 return false;
2699 }
2700 #if defined(_LDMA_CHSTATUS_MASK)
2701 return (0UL != (LDMA->CHSTATUS & (1UL << (uint8_t)ch)));
2702 #else
2703 // We've already confirmed ch is between 0 and 31,
2704 // so it's now safe to cast it to uint8_t
2705 return (0UL != (LDMA->CHEN & (1 << (uint8_t)ch)));
2706 #endif
2707 }
2708
2709 /***************************************************************************//**
2710 * @brief
2711 * Clear one or more pending LDMA interrupts.
2712 *
2713 * @param[in] flags
2714 * Pending LDMA interrupt sources to clear. Use one or more valid
2715 * interrupt flags for the LDMA module. The flags are LDMA_IFC_ERROR
2716 * and one done flag for each channel.
2717 ******************************************************************************/
LDMA_IntClear(uint32_t flags)2718 __STATIC_INLINE void LDMA_IntClear(uint32_t flags)
2719 {
2720 #if defined (LDMA_HAS_SET_CLEAR)
2721 LDMA->IF_CLR = flags;
2722 #else
2723 LDMA->IFC = flags;
2724 #endif
2725 }
2726
2727 /***************************************************************************//**
2728 * @brief
2729 * Disable one or more LDMA interrupts.
2730 *
2731 * @param[in] flags
2732 * LDMA interrupt sources to disable. Use one or more valid
2733 * interrupt flags for LDMA module. The flags are LDMA_IEN_ERROR
2734 * and one done flag for each channel.
2735 ******************************************************************************/
LDMA_IntDisable(uint32_t flags)2736 __STATIC_INLINE void LDMA_IntDisable(uint32_t flags)
2737 {
2738 LDMA->IEN &= ~flags;
2739 }
2740
2741 /***************************************************************************//**
2742 * @brief
2743 * Enable one or more LDMA interrupts.
2744 *
2745 * @note
2746 * Depending on the use, a pending interrupt may already be set prior to
2747 * enabling the interrupt. To ignore a pending interrupt, consider using
2748 * LDMA_IntClear() prior to enabling the interrupt.
2749 *
2750 * @param[in] flags
2751 * LDMA interrupt sources to enable. Use one or more valid
2752 * interrupt flags for LDMA module. The flags are LDMA_IEN_ERROR
2753 * and one done flag for each channel.
2754 ******************************************************************************/
LDMA_IntEnable(uint32_t flags)2755 __STATIC_INLINE void LDMA_IntEnable(uint32_t flags)
2756 {
2757 LDMA->IEN |= flags;
2758 }
2759
2760 /***************************************************************************//**
2761 * @brief
2762 * Get pending LDMA interrupt flags.
2763 *
2764 * @note
2765 * Event bits are not cleared by the use of this function.
2766 *
2767 * @return
2768 * LDMA interrupt sources pending. Returns one or more valid
2769 * interrupt flags for LDMA module. The flags are LDMA_IF_ERROR and
2770 * one flag for each LDMA channel.
2771 ******************************************************************************/
LDMA_IntGet(void)2772 __STATIC_INLINE uint32_t LDMA_IntGet(void)
2773 {
2774 return LDMA->IF;
2775 }
2776
2777 /***************************************************************************//**
2778 * @brief
2779 * Get enabled and pending LDMA interrupt flags.
2780 * Useful for handling more interrupt sources in the same interrupt handler.
2781 *
2782 * @note
2783 * Interrupt flags are not cleared by the use of this function.
2784 *
2785 * @return
2786 * Pending and enabled LDMA interrupt sources
2787 * Return value is the bitwise AND of
2788 * - the enabled interrupt sources in LDMA_IEN and
2789 * - the pending interrupt flags LDMA_IF
2790 ******************************************************************************/
LDMA_IntGetEnabled(void)2791 __STATIC_INLINE uint32_t LDMA_IntGetEnabled(void)
2792 {
2793 uint32_t ien;
2794
2795 ien = LDMA->IEN;
2796 return LDMA->IF & ien;
2797 }
2798
2799 /***************************************************************************//**
2800 * @brief
2801 * Set one or more pending LDMA interrupts
2802 *
2803 * @param[in] flags
2804 * LDMA interrupt sources to set to pending. Use one or more valid
2805 * interrupt flags for LDMA module. The flags are LDMA_IFS_ERROR and
2806 * one done flag for each LDMA channel.
2807 ******************************************************************************/
LDMA_IntSet(uint32_t flags)2808 __STATIC_INLINE void LDMA_IntSet(uint32_t flags)
2809 {
2810 #if defined (LDMA_HAS_SET_CLEAR)
2811 LDMA->IF_SET = flags;
2812 #else
2813 LDMA->IFS = flags;
2814 #endif
2815 }
2816
2817 /** @} (end addtogroup ldma) */
2818
2819 #ifdef __cplusplus
2820 }
2821 #endif
2822
2823 #endif /* defined( LDMA_PRESENT ) && ( LDMA_COUNT == 1 ) */
2824 #endif /* EM_LDMA_H */
2825