1 /**
2 ******************************************************************************
3 * @file stm32n6xx_ll_dma.c
4 * @author MCD Application Team
5 * @brief DMA LL module driver.
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2023 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 @verbatim
18 ==============================================================================
19 ##### LL DMA driver acronyms #####
20 ==============================================================================
21 [..] Acronyms table :
22 =========================================
23 || Acronym || ||
24 =========================================
25 || SRC || Source ||
26 || DEST || Destination ||
27 || ADDR || Address ||
28 || ADDRS || Addresses ||
29 || INC || Increment / Incremented ||
30 || DEC || Decrement / Decremented ||
31 || BLK || Block ||
32 || RPT || Repeat / Repeated ||
33 || TRIG || Trigger ||
34 =========================================
35 @endverbatim
36 ******************************************************************************
37 */
38
39 #if defined (USE_FULL_LL_DRIVER)
40
41 /* Includes ------------------------------------------------------------------*/
42 #include "stm32n6xx_ll_dma.h"
43 #include "stm32n6xx_ll_bus.h"
44 #ifdef USE_FULL_ASSERT
45 #include "stm32_assert.h"
46 #else
47 #define assert_param(expr) ((void)0U)
48 #endif /* USE_FULL_ASSERT */
49
50 /** @addtogroup STM32N6xx_LL_Driver
51 * @{
52 */
53
54 #if (defined (GPDMA1) || defined (HPDMA1))
55
56 /** @addtogroup DMA_LL
57 * @{
58 */
59
60 /* Private types -------------------------------------------------------------*/
61 /* Private variables ---------------------------------------------------------*/
62 /* Private constants ---------------------------------------------------------*/
63 /* Private macros ------------------------------------------------------------*/
64
65 /** @addtogroup DMA_LL_Private_Macros
66 * @{
67 */
68 #define IS_LL_DMA_ALL_CHANNEL_INSTANCE(INSTANCE, Channel) ((((INSTANCE) == HPDMA1) && \
69 (((Channel) == LL_DMA_CHANNEL_0) || \
70 ((Channel) == LL_DMA_CHANNEL_1) || \
71 ((Channel) == LL_DMA_CHANNEL_2) || \
72 ((Channel) == LL_DMA_CHANNEL_3) || \
73 ((Channel) == LL_DMA_CHANNEL_4) || \
74 ((Channel) == LL_DMA_CHANNEL_5) || \
75 ((Channel) == LL_DMA_CHANNEL_6) || \
76 ((Channel) == LL_DMA_CHANNEL_7) || \
77 ((Channel) == LL_DMA_CHANNEL_8) || \
78 ((Channel) == LL_DMA_CHANNEL_9) || \
79 ((Channel) == LL_DMA_CHANNEL_10) || \
80 ((Channel) == LL_DMA_CHANNEL_11) || \
81 ((Channel) == LL_DMA_CHANNEL_12) || \
82 ((Channel) == LL_DMA_CHANNEL_13) || \
83 ((Channel) == LL_DMA_CHANNEL_14) || \
84 ((Channel) == LL_DMA_CHANNEL_15) || \
85 ((Channel) == LL_DMA_CHANNEL_ALL))) || \
86 (((INSTANCE) == GPDMA1) && \
87 (((Channel) == LL_DMA_CHANNEL_0) || \
88 ((Channel) == LL_DMA_CHANNEL_1) || \
89 ((Channel) == LL_DMA_CHANNEL_2) || \
90 ((Channel) == LL_DMA_CHANNEL_3) || \
91 ((Channel) == LL_DMA_CHANNEL_4) || \
92 ((Channel) == LL_DMA_CHANNEL_5) || \
93 ((Channel) == LL_DMA_CHANNEL_6) || \
94 ((Channel) == LL_DMA_CHANNEL_7) || \
95 ((Channel) == LL_DMA_CHANNEL_8) || \
96 ((Channel) == LL_DMA_CHANNEL_9) || \
97 ((Channel) == LL_DMA_CHANNEL_10) || \
98 ((Channel) == LL_DMA_CHANNEL_11) || \
99 ((Channel) == LL_DMA_CHANNEL_12) || \
100 ((Channel) == LL_DMA_CHANNEL_13) || \
101 ((Channel) == LL_DMA_CHANNEL_14) || \
102 ((Channel) == LL_DMA_CHANNEL_15) || \
103 ((Channel) == LL_DMA_CHANNEL_ALL))))
104
105 #define IS_LL_HPDMA_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == HPDMA1) && \
106 (((Channel) == LL_DMA_CHANNEL_0) || \
107 ((Channel) == LL_DMA_CHANNEL_1) || \
108 ((Channel) == LL_DMA_CHANNEL_2) || \
109 ((Channel) == LL_DMA_CHANNEL_3) || \
110 ((Channel) == LL_DMA_CHANNEL_4) || \
111 ((Channel) == LL_DMA_CHANNEL_5) || \
112 ((Channel) == LL_DMA_CHANNEL_6) || \
113 ((Channel) == LL_DMA_CHANNEL_7) || \
114 ((Channel) == LL_DMA_CHANNEL_8) || \
115 ((Channel) == LL_DMA_CHANNEL_9) || \
116 ((Channel) == LL_DMA_CHANNEL_10) || \
117 ((Channel) == LL_DMA_CHANNEL_11) || \
118 ((Channel) == LL_DMA_CHANNEL_12) || \
119 ((Channel) == LL_DMA_CHANNEL_13) || \
120 ((Channel) == LL_DMA_CHANNEL_14) || \
121 ((Channel) == LL_DMA_CHANNEL_15)))
122
123 #define IS_LL_GPDMA_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == GPDMA1) && \
124 (((Channel) == LL_DMA_CHANNEL_0) || \
125 ((Channel) == LL_DMA_CHANNEL_1) || \
126 ((Channel) == LL_DMA_CHANNEL_2) || \
127 ((Channel) == LL_DMA_CHANNEL_3) || \
128 ((Channel) == LL_DMA_CHANNEL_4) || \
129 ((Channel) == LL_DMA_CHANNEL_5) || \
130 ((Channel) == LL_DMA_CHANNEL_6) || \
131 ((Channel) == LL_DMA_CHANNEL_7) || \
132 ((Channel) == LL_DMA_CHANNEL_8) || \
133 ((Channel) == LL_DMA_CHANNEL_9) || \
134 ((Channel) == LL_DMA_CHANNEL_10) || \
135 ((Channel) == LL_DMA_CHANNEL_11) || \
136 ((Channel) == LL_DMA_CHANNEL_12) || \
137 ((Channel) == LL_DMA_CHANNEL_13) || \
138 ((Channel) == LL_DMA_CHANNEL_14) || \
139 ((Channel) == LL_DMA_CHANNEL_15)))
140
141 #define IS_LL_DMA_2D_CHANNEL_INSTANCE(INSTANCE, Channel) ((((INSTANCE) == HPDMA1) && \
142 (((Channel) == LL_DMA_CHANNEL_12) || \
143 ((Channel) == LL_DMA_CHANNEL_13) || \
144 ((Channel) == LL_DMA_CHANNEL_14) || \
145 ((Channel) == LL_DMA_CHANNEL_15))) || \
146 (((INSTANCE) == GPDMA1) && \
147 (((Channel) == LL_DMA_CHANNEL_12) || \
148 ((Channel) == LL_DMA_CHANNEL_13) || \
149 ((Channel) == LL_DMA_CHANNEL_14) || \
150 ((Channel) == LL_DMA_CHANNEL_15))))
151
152 #define IS_LL_DMA_MODE(__VALUE__) (((__VALUE__) == LL_DMA_NORMAL) || \
153 ((__VALUE__) == LL_DMA_PFCTRL))
154
155 #define IS_LL_DMA_PFREQ_INSTANCE(INSTANCE, Channel) ((((INSTANCE) == HPDMA1) && \
156 (((Channel) == LL_DMA_CHANNEL_0) || \
157 ((Channel) == LL_DMA_CHANNEL_1) || \
158 ((Channel) == LL_DMA_CHANNEL_15))) || \
159 (((INSTANCE) == GPDMA1) && \
160 (((Channel) == LL_DMA_CHANNEL_0) || \
161 ((Channel) == LL_DMA_CHANNEL_1) || \
162 ((Channel) == LL_DMA_CHANNEL_15))))
163
164 #define IS_LL_DMA_DIRECTION(__VALUE__) (((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_MEMORY) || \
165 ((__VALUE__) == LL_DMA_DIRECTION_PERIPH_TO_MEMORY) || \
166 ((__VALUE__) == LL_DMA_DIRECTION_MEMORY_TO_PERIPH))
167
168 #define IS_LL_DMA_DATA_ALIGNMENT(__VALUE__) (((__VALUE__) == LL_DMA_DATA_ALIGN_ZEROPADD) || \
169 ((__VALUE__) == LL_DMA_DATA_ALIGN_SIGNEXTPADD) || \
170 ((__VALUE__) == LL_DMA_DATA_PACK_UNPACK))
171
172 #define IS_LL_DMA_BURST_LENGTH(__VALUE__) (((__VALUE__) > 0U) && ((__VALUE__) <= 64U))
173
174 #define IS_LL_DMA_SRC_DATA_WIDTH(__VALUE__) (((__VALUE__) == LL_DMA_SRC_DATAWIDTH_BYTE) || \
175 ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_HALFWORD) || \
176 ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_WORD) || \
177 ((__VALUE__) == LL_DMA_SRC_DATAWIDTH_DOUBLEWORD))
178
179 #define IS_LL_DMA_DEST_DATA_WIDTH(__VALUE__) (((__VALUE__) == LL_DMA_DEST_DATAWIDTH_BYTE) || \
180 ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_HALFWORD) || \
181 ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_WORD) || \
182 ((__VALUE__) == LL_DMA_DEST_DATAWIDTH_DOUBLEWORD))
183
184 #define IS_LL_DMA_SRC_INCREMENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_SRC_FIXED) || \
185 ((__VALUE__) == LL_DMA_SRC_INCREMENT))
186
187 #define IS_LL_DMA_DEST_INCREMENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_FIXED) || \
188 ((__VALUE__) == LL_DMA_DEST_INCREMENT))
189
190 #define IS_LL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == LL_DMA_LOW_PRIORITY_LOW_WEIGHT) || \
191 ((__VALUE__) == LL_DMA_LOW_PRIORITY_MID_WEIGHT) || \
192 ((__VALUE__) == LL_DMA_LOW_PRIORITY_HIGH_WEIGHT) || \
193 ((__VALUE__) == LL_DMA_HIGH_PRIORITY))
194
195 #define IS_LL_DMA_BLK_DATALENGTH(__VALUE__) ((__VALUE__) <= 0xFFFFU)
196
197 #define IS_LL_DMA_BLK_REPEATCOUNT(__VALUE__) ((__VALUE__) <= 0x0EFFU)
198
199 #define IS_LL_DMA_TRIGGER_MODE(__VALUE__) (((__VALUE__) == LL_DMA_TRIGM_BLK_TRANSFER) || \
200 ((__VALUE__) == LL_DMA_TRIGM_RPT_BLK_TRANSFER) || \
201 ((__VALUE__) == LL_DMA_TRIGM_LLI_LINK_TRANSFER) || \
202 ((__VALUE__) == LL_DMA_TRIGM_SINGLBURST_TRANSFER ))
203
204 #define IS_LL_DMA_TRIGGER_POLARITY(__VALUE__) (((__VALUE__) == LL_DMA_TRIG_POLARITY_MASKED) || \
205 ((__VALUE__) == LL_DMA_TRIG_POLARITY_RISING) || \
206 ((__VALUE__) == LL_DMA_TRIG_POLARITY_FALLING))
207
208 #define IS_LL_DMA_BLKHW_REQUEST(__VALUE__) (((__VALUE__) == LL_DMA_HWREQUEST_SINGLEBURST) || \
209 ((__VALUE__) == LL_DMA_HWREQUEST_BLK))
210
211 #define IS_LL_DMA_TRIGGER_SELECTION(__VALUE__) ((__VALUE__) <= LL_HPDMA1_TRIGGER_EXTIT15_SYNC)
212
213 #define IS_LL_DMA_REQUEST_SELECTION(__VALUE__) ((__VALUE__) <= LL_HPDMA1_REQUEST_I3C2_RS)
214
215 #define IS_LL_DMA_TRANSFER_EVENT_MODE(__VALUE__) (((__VALUE__) == LL_DMA_TCEM_BLK_TRANSFER) || \
216 ((__VALUE__) == LL_DMA_TCEM_RPT_BLK_TRANSFER) || \
217 ((__VALUE__) == LL_DMA_TCEM_EACH_LLITEM_TRANSFER) || \
218 ((__VALUE__) == LL_DMA_TCEM_LAST_LLITEM_TRANSFER))
219
220 #define IS_LL_DMA_DEST_WORD_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_WORD_PRESERVE) || \
221 ((__VALUE__) == LL_DMA_DEST_WORD_EXCHANGE))
222
223 #define IS_LL_DMA_DEST_HALFWORD_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_HALFWORD_PRESERVE) || \
224 ((__VALUE__) == LL_DMA_DEST_HALFWORD_EXCHANGE))
225
226 #define IS_LL_DMA_DEST_BYTE_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_DEST_BYTE_PRESERVE) || \
227 ((__VALUE__) == LL_DMA_DEST_BYTE_EXCHANGE))
228
229 #define IS_LL_DMA_SRC_BYTE_EXCHANGE(__VALUE__) (((__VALUE__) == LL_DMA_SRC_BYTE_PRESERVE) || \
230 ((__VALUE__) == LL_DMA_SRC_BYTE_EXCHANGE))
231
232 #define IS_LL_DMA_LINK_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT0) || \
233 ((__VALUE__) == LL_DMA_LINK_ALLOCATED_PORT1))
234
235 #define IS_LL_DMA_SRC_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT0) || \
236 ((__VALUE__) == LL_DMA_SRC_ALLOCATED_PORT1))
237
238 #define IS_LL_DMA_DEST_ALLOCATED_PORT(__VALUE__) (((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT0) || \
239 ((__VALUE__) == LL_DMA_DEST_ALLOCATED_PORT1))
240
241 #define IS_LL_DMA_LINK_STEP_MODE(__VALUE__) (((__VALUE__) == LL_DMA_LSM_FULL_EXECUTION) || \
242 ((__VALUE__) == LL_DMA_LSM_1LINK_EXECUTION))
243
244 #define IS_LL_DMA_BURST_SRC_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BURST_SRC_ADDR_INCREMENT) || \
245 ((__VALUE__) == LL_DMA_BURST_SRC_ADDR_DECREMENT))
246
247 #define IS_LL_DMA_BURST_DEST_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BURST_DEST_ADDR_INCREMENT) || \
248 ((__VALUE__) == LL_DMA_BURST_DEST_ADDR_DECREMENT))
249
250 #define IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(__VALUE__) ((__VALUE__) <= 0x1FFFU)
251
252 #define IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_INCREMENT) || \
253 ((__VALUE__) == LL_DMA_BLKRPT_SRC_ADDR_DECREMENT))
254
255 #define IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(__VALUE__) (((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_INCREMENT) || \
256 ((__VALUE__) == LL_DMA_BLKRPT_DEST_ADDR_DECREMENT))
257
258 #define IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(__VALUE__) ((__VALUE__) <= 0xFFFFU)
259
260 #define IS_LL_DMA_LINK_BASEADDR(__VALUE__) (((__VALUE__) & 0xFFFFU) == 0U)
261
262 #define IS_LL_DMA_LINK_ADDR_OFFSET(__VALUE__) (((__VALUE__) & 0x03U) == 0U)
263
264 #define IS_LL_DMA_LINK_UPDATE_REGISTERS(__VALUE__) ((((__VALUE__) & 0x01FE0000U) == 0U) && ((__VALUE__) != 0U))
265
266 #define IS_LL_DMA_LINK_NODETYPE(__VALUE__) (((__VALUE__) == LL_DMA_HPDMA_2D_NODE) || \
267 ((__VALUE__) == LL_DMA_HPDMA_LINEAR_NODE) || \
268 ((__VALUE__) == LL_DMA_GPDMA_2D_NODE) || \
269 ((__VALUE__) == LL_DMA_GPDMA_LINEAR_NODE))
270
271 #if defined (CPU_IN_SECURE_STATE)
272 #define IS_LL_DMA_CHANNEL_SRC_SEC(__VALUE__) (((__VALUE__) == LL_DMA_CHANNEL_SRC_NSEC) || \
273 ((__VALUE__) == LL_DMA_CHANNEL_SRC_SEC))
274
275 #define IS_LL_DMA_CHANNEL_DEST_SEC(__VALUE__) (((__VALUE__) == LL_DMA_CHANNEL_DEST_NSEC) || \
276 ((__VALUE__) == LL_DMA_CHANNEL_DEST_SEC))
277
278 #endif /* CPU_IN_SECURE_STATE */
279 #define IS_LL_DMA_LIMIT_CHANNEL_INSTANCE(INSTANCE, Channel) (((INSTANCE) == HPDMA1) && \
280 (((Channel) == LL_DMA_CHANNEL_12) || \
281 ((Channel) == LL_DMA_CHANNEL_13) || \
282 ((Channel) == LL_DMA_CHANNEL_14) || \
283 ((Channel) == LL_DMA_CHANNEL_15)))
284
285 /**
286 * @}
287 */
288
289 /* Private function prototypes -----------------------------------------------*/
290 /* Exported functions --------------------------------------------------------*/
291
292 /** @addtogroup DMA_LL_Exported_Functions
293 * @{
294 */
295
296 /** @addtogroup DMA_LL_EF_Init
297 * @{
298 */
299
300 /**
301 * @brief De-initialize the DMA registers to their default reset values.
302 * @note This API is used for all available DMA channels.
303 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
304 * helper macros :
305 * @arg @ref LL_DMA_GET_INSTANCE
306 * @arg @ref LL_DMA_GET_CHANNEL
307 * @param DMAx DMAx Instance
308 * @param Channel This parameter can be one of the following values:
309 * @arg @ref LL_DMA_CHANNEL_0
310 * @arg @ref LL_DMA_CHANNEL_1
311 * @arg @ref LL_DMA_CHANNEL_2
312 * @arg @ref LL_DMA_CHANNEL_3
313 * @arg @ref LL_DMA_CHANNEL_4
314 * @arg @ref LL_DMA_CHANNEL_5
315 * @arg @ref LL_DMA_CHANNEL_6
316 * @arg @ref LL_DMA_CHANNEL_7
317 * @arg @ref LL_DMA_CHANNEL_8
318 * @arg @ref LL_DMA_CHANNEL_9
319 * @arg @ref LL_DMA_CHANNEL_10
320 * @arg @ref LL_DMA_CHANNEL_11
321 * @arg @ref LL_DMA_CHANNEL_12
322 * @arg @ref LL_DMA_CHANNEL_13
323 * @arg @ref LL_DMA_CHANNEL_14
324 * @arg @ref LL_DMA_CHANNEL_15
325 * @retval An ErrorStatus enumeration value:
326 * - SUCCESS : DMA registers are de-initialized.
327 * - ERROR : DMA registers are not de-initialized.
328 */
LL_DMA_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)329 uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
330 {
331 DMA_Channel_TypeDef *tmp;
332 ErrorStatus status = SUCCESS;
333
334 /* Check the DMA Instance DMAx and Channel parameters */
335 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
336
337 if (Channel == LL_DMA_CHANNEL_ALL)
338 {
339 if (DMAx == GPDMA1)
340 {
341 /* Force reset of DMA clock */
342 LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
343
344 /* Release reset of DMA clock */
345 LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPDMA1);
346 }
347 else
348 {
349 /* Force reset of DMA clock */
350 LL_AHB5_GRP1_ForceReset(LL_AHB5_GRP1_PERIPH_HPDMA1);
351
352 /* Release reset of DMA clock */
353 LL_AHB5_GRP1_ReleaseReset(LL_AHB5_GRP1_PERIPH_HPDMA1);
354 }
355 }
356 else
357 {
358 /* Get the DMA Channel Instance */
359 tmp = (DMA_Channel_TypeDef *)(LL_DMA_GET_CHANNEL_INSTANCE(DMAx, Channel));
360
361 /* Suspend DMA channel */
362 LL_DMA_SuspendChannel(DMAx, Channel);
363
364 /* Disable the selected Channel */
365 LL_DMA_ResetChannel(DMAx, Channel);
366
367 /* Reset DMAx_Channely control register */
368 LL_DMA_WriteReg(tmp, CLBAR, 0U);
369
370 /* Reset DMAx_Channely control register */
371 LL_DMA_WriteReg(tmp, CCR, 0U);
372
373 /* Reset DMAx_Channely Configuration register */
374 LL_DMA_WriteReg(tmp, CTR1, 0U);
375
376 /* Reset DMAx_Channely transfer register 2 */
377 LL_DMA_WriteReg(tmp, CTR2, 0U);
378
379 /* Reset DMAx_Channely block number of data register */
380 LL_DMA_WriteReg(tmp, CBR1, 0U);
381
382 /* Reset DMAx_Channely source address register */
383 LL_DMA_WriteReg(tmp, CSAR, 0U);
384
385 /* Reset DMAx_Channely destination address register */
386 LL_DMA_WriteReg(tmp, CDAR, 0U);
387
388 /* Check DMA channel */
389 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
390 {
391 /* Reset DMAx_Channely transfer register 3 */
392 LL_DMA_WriteReg(tmp, CTR3, 0U);
393
394 /* Reset DMAx_Channely Block register 2 */
395 LL_DMA_WriteReg(tmp, CBR2, 0U);
396 }
397
398 /* Reset DMAx_Channely Linked list address register */
399 LL_DMA_WriteReg(tmp, CLLR, 0U);
400
401 /* Reset DMAx_Channely pending flags */
402 LL_DMA_WriteReg(tmp, CFCR, 0x00003F00U);
403
404 /* Reset DMAx_Channely attribute */
405 LL_DMA_DisableChannelPrivilege(DMAx, Channel);
406
407 #if defined (CPU_IN_SECURE_STATE)
408 LL_DMA_DisableChannelSecure(DMAx, Channel);
409 #endif /* CPU_IN_SECURE_STATE */
410 }
411
412 return (uint32_t)status;
413 }
414
415 /**
416 * @brief Initialize the DMA registers according to the specified parameters
417 * in DMA_InitStruct.
418 * @note This API is used for all available DMA channels.
419 * @note A software request transfer can be done once programming the direction
420 * field in memory to memory value.
421 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
422 * helper macros :
423 * @arg @ref LL_DMA_GET_INSTANCE
424 * @arg @ref LL_DMA_GET_CHANNEL
425 * @note Warning if AXI port is selected with HPDMA, the maximum source (and destination) length should be less
426 * than 17. Otherwise, an error will be returned and no initialization performed.
427 * @param DMAx DMAx Instance
428 * @param Channel This parameter can be one of the following values:
429 * @arg @ref LL_DMA_CHANNEL_0
430 * @arg @ref LL_DMA_CHANNEL_1
431 * @arg @ref LL_DMA_CHANNEL_2
432 * @arg @ref LL_DMA_CHANNEL_3
433 * @arg @ref LL_DMA_CHANNEL_4
434 * @arg @ref LL_DMA_CHANNEL_5
435 * @arg @ref LL_DMA_CHANNEL_6
436 * @arg @ref LL_DMA_CHANNEL_7
437 * @arg @ref LL_DMA_CHANNEL_8
438 * @arg @ref LL_DMA_CHANNEL_9
439 * @arg @ref LL_DMA_CHANNEL_10
440 * @arg @ref LL_DMA_CHANNEL_11
441 * @arg @ref LL_DMA_CHANNEL_12
442 * @arg @ref LL_DMA_CHANNEL_13
443 * @arg @ref LL_DMA_CHANNEL_14
444 * @arg @ref LL_DMA_CHANNEL_15
445 * @param DMA_InitStruct pointer to a @ref LL_DMA_InitTypeDef structure.
446 * @retval An ErrorStatus enumeration value:
447 * - SUCCESS : DMA registers are initialized.
448 * - ERROR : Not applicable.
449 */
LL_DMA_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitTypeDef * DMA_InitStruct)450 uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct)
451 {
452 /* Check the DMA Instance DMAx and Channel parameters*/
453 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
454
455 /* Check the DMA parameters from DMA_InitStruct */
456 assert_param(IS_LL_DMA_DIRECTION(DMA_InitStruct->Direction));
457
458 /* Check direction */
459 if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
460 {
461 assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitStruct->Request));
462 }
463
464 assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitStruct->DataAlignment));
465 assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitStruct->SrcDataWidth));
466 assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitStruct->DestDataWidth));
467 assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitStruct->SrcIncMode));
468 assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitStruct->DestIncMode));
469 assert_param(IS_LL_DMA_PRIORITY(DMA_InitStruct->Priority));
470 assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitStruct->BlkDataLength));
471 assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitStruct->TriggerPolarity));
472 assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitStruct->BlkHWRequest));
473 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitStruct->TransferEventMode));
474 assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitStruct->LinkStepMode));
475 assert_param(IS_LL_DMA_LINK_BASEADDR(DMA_InitStruct->LinkedListBaseAddr));
476 assert_param(IS_LL_DMA_LINK_ADDR_OFFSET(DMA_InitStruct->LinkedListAddrOffset));
477 assert_param(IS_LL_DMA_MODE(DMA_InitStruct->Mode));
478 if (DMA_InitStruct->Mode == LL_DMA_PFCTRL)
479 {
480 assert_param(IS_LL_DMA_PFREQ_INSTANCE(DMAx, Channel));
481 }
482
483 /* Check DMA instance */
484 if ((IS_LL_HPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U) || (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U))
485 {
486 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->SrcBurstLength));
487 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitStruct->DestBurstLength));
488 assert_param(IS_LL_DMA_DEST_WORD_EXCHANGE(DMA_InitStruct->DestWordExchange));
489 assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitStruct->DestHWordExchange));
490 assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitStruct->DestByteExchange));
491 assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitStruct->SrcByteExchange));
492 assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitStruct->LinkAllocatedPort));
493 assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitStruct->SrcAllocatedPort));
494 assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitStruct->DestAllocatedPort));
495 }
496
497 /* Check trigger polarity */
498 if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
499 {
500 assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitStruct->TriggerMode));
501 assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitStruct->TriggerSelection));
502 }
503
504 /* Check DMA channel */
505 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
506 {
507 assert_param(IS_LL_DMA_BLK_REPEATCOUNT(DMA_InitStruct->BlkRptCount));
508 assert_param(IS_LL_DMA_BURST_SRC_ADDR_UPDATE(DMA_InitStruct->SrcAddrUpdateMode));
509 assert_param(IS_LL_DMA_BURST_DEST_ADDR_UPDATE(DMA_InitStruct->DestAddrUpdateMode));
510 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitStruct->SrcAddrOffset));
511 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitStruct->DestAddrOffset));
512 assert_param(IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(DMA_InitStruct->BlkRptSrcAddrUpdateMode));
513 assert_param(IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(DMA_InitStruct->BlkRptDestAddrUpdateMode));
514 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitStruct->BlkRptSrcAddrOffset));
515 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitStruct->BlkRptDestAddrOffset));
516 }
517
518 if (DMAx == HPDMA1)
519 {
520 if ((DMA_InitStruct->SrcAllocatedPort == LL_DMA_SRC_ALLOCATED_PORT0) &&
521 (DMA_InitStruct->SrcBurstLength > 16U))
522 {
523 return (uint32_t)ERROR;
524 }
525 if ((DMA_InitStruct->DestAllocatedPort == LL_DMA_DEST_ALLOCATED_PORT0) &&
526 (DMA_InitStruct->DestBurstLength > 16U))
527 {
528 return (uint32_t)ERROR;
529 }
530 }
531
532 /*-------------------------- DMAx CLBAR Configuration ------------------------
533 * Configure the Transfer linked list address with parameter :
534 * - LinkedListBaseAdd: DMA_CLBAR_LBA[31:16] bits
535 */
536 LL_DMA_SetLinkedListBaseAddr(DMAx, Channel, DMA_InitStruct->LinkedListBaseAddr);
537
538 /*-------------------------- DMAx CCR Configuration --------------------------
539 * Configure the control parameter :
540 * - LinkAllocatedPort: DMA_CCR_LAP bit
541 * - LinkStepMode: DMA_CCR_LSM bit
542 * - Priority: DMA_CCR_PRIO [23:22] bits
543 */
544 LL_DMA_ConfigControl(DMAx, Channel, DMA_InitStruct->Priority | \
545 DMA_InitStruct->LinkAllocatedPort | \
546 DMA_InitStruct->LinkStepMode);
547
548 /*-------------------------- DMAx CTR1 Configuration -------------------------
549 * Configure the Data transfer parameter :
550 * - DestAllocatedPort: DMA_CTR1_DAP bit
551 * - DestWordExchange: DMA_CTR1_DWX bit
552 * - DestHWordExchange: DMA_CTR1_DHX bit
553 * - DestByteExchange: DMA_CTR1_DBX bit
554 * - DestIncMode: DMA_CTR1_DINC bit
555 * - DestDataWidth: DMA_CTR1_DDW_LOG2 [17:16] bits
556 * - SrcAllocatedPort: DMA_CTR1_SAP bit
557 * - SrcByteExchange: DMA_CTR1_SBX bit
558 * - DataAlignment: DMA_CTR1_PAM [12:11] bits
559 * - SrcIncMode: DMA_CTR1_SINC bit
560 * - SrcDataWidth: DMA_CTR1_SDW_LOG2 [1:0] bits
561 * - SrcBurstLength: DMA_CTR1_SBL_1 [9:4] bits
562 * - DestBurstLength: DMA_CTR1_DBL_1 [25:20] bits
563 */
564 LL_DMA_ConfigTransfer(DMAx, Channel, DMA_InitStruct->DestAllocatedPort | \
565 DMA_InitStruct->DestWordExchange | \
566 DMA_InitStruct->DestHWordExchange | \
567 DMA_InitStruct->DestByteExchange | \
568 DMA_InitStruct->DestIncMode | \
569 DMA_InitStruct->DestDataWidth | \
570 DMA_InitStruct->SrcAllocatedPort | \
571 DMA_InitStruct->SrcByteExchange | \
572 DMA_InitStruct->DataAlignment | \
573 DMA_InitStruct->SrcIncMode | \
574 DMA_InitStruct->SrcDataWidth);
575 /* Check DMA instance */
576 if ((IS_LL_HPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U) || (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U))
577 {
578 LL_DMA_ConfigBurstLength(DMAx, Channel, DMA_InitStruct->SrcBurstLength,
579 DMA_InitStruct->DestBurstLength);
580 }
581
582 /*-------------------------- DMAx CTR2 Configuration -------------------------
583 * Configure the channel transfer parameter :
584 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
585 * - TriggerPolarity: DMA_CTR2_TRIGPOL [25:24] bits
586 * - TriggerMode: DMA_CTR2_TRIGM [15:14] bits
587 * - BlkHWRequest: DMA_CTR2_BREQ bit
588 * - Mode: DMA_CTR2_PFREQ bit
589 * - Direction: DMA_CTR2_DREQ bit
590 * - Direction: DMA_CTR2_SWREQ bit
591 * - TriggerSelection: DMA_CTR2_TRIGSEL [21:16] bits
592 * - Request: DMA_CTR2_REQSEL [6:0] bits
593 */
594 LL_DMA_ConfigChannelTransfer(DMAx, Channel, DMA_InitStruct->TransferEventMode | \
595 DMA_InitStruct->TriggerPolarity | \
596 DMA_InitStruct->BlkHWRequest | \
597 DMA_InitStruct->Mode | \
598 DMA_InitStruct->Direction);
599
600 /* Check direction */
601 if (DMA_InitStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
602 {
603 LL_DMA_SetPeriphRequest(DMAx, Channel, DMA_InitStruct->Request);
604 }
605
606 /* Check trigger polarity */
607 if (DMA_InitStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
608 {
609 LL_DMA_SetHWTrigger(DMAx, Channel, DMA_InitStruct->TriggerSelection);
610 LL_DMA_SetTriggerMode(DMAx, Channel, DMA_InitStruct->TriggerMode);
611 }
612
613 /*-------------------------- DMAx CBR1 Configuration -------------------------
614 * Configure the Transfer Block counters and update mode with parameter :
615 * - BlkDataLength: DMA_CBR1_BNDT[15:0] bits
616 * - BlkRptCount: DMA_CBR1_BRC[26:16] bits
617 * BlkRptCount field is supported only by 2D addressing channels.
618 * - BlkRptSrcAddrUpdateMode: DMA_CBR1_BRSDEC bit
619 * BlkRptSrcAddrUpdateMode field is supported only by 2D addressing channels.
620 * - BlkRptDestAddrUpdateMode: DMA_CBR1_BRDDEC bit
621 * BlkRptDestAddrUpdateMode field is supported only by 2D addressing channels.
622 * - SrcAddrUpdateMode: DMA_CBR1_SDEC bit
623 * SrcAddrUpdateMode field is supported only by 2D addressing channels.
624 * - DestAddrUpdateMode: DMA_CBR1_DDEC bit
625 * DestAddrUpdateMode field is supported only by 2D addressing channels.
626 */
627 LL_DMA_SetBlkDataLength(DMAx, Channel, DMA_InitStruct->BlkDataLength);
628
629 /* Check DMA channel */
630 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
631 {
632 LL_DMA_SetBlkRptCount(DMAx, Channel, DMA_InitStruct->BlkRptCount);
633 LL_DMA_ConfigBlkRptAddrUpdate(DMAx, Channel, DMA_InitStruct->BlkRptSrcAddrUpdateMode | \
634 DMA_InitStruct->BlkRptDestAddrUpdateMode | \
635 DMA_InitStruct->SrcAddrUpdateMode | \
636 DMA_InitStruct->DestAddrUpdateMode);
637 }
638
639 /*-------------------------- DMAx CSAR and CDAR Configuration ----------------
640 * Configure the Transfer source address with parameter :
641 * - SrcAddress: DMA_CSAR_SA[31:0] bits
642 * - DestAddress: DMA_CDAR_DA[31:0] bits
643 */
644 LL_DMA_ConfigAddresses(DMAx, Channel, DMA_InitStruct->SrcAddress, DMA_InitStruct->DestAddress);
645
646 /* Check DMA channel */
647 if (IS_LL_DMA_2D_CHANNEL_INSTANCE(DMAx, Channel) != 0U)
648 {
649 /*------------------------ DMAx CTR3 Configuration -------------------------
650 * Configure the Transfer Block counters and update mode with parameter :
651 * - SrcAddrOffset: DMA_CTR3_SAO[28:16] bits
652 * SrcAddrOffset field is supported only by 2D addressing channels.
653 * - DestAddrOffset: DMA_CTR3_DAO[12:0] bits
654 * DestAddrOffset field is supported only by 2D addressing channels.
655 */
656 LL_DMA_ConfigAddrUpdateValue(DMAx, Channel, DMA_InitStruct->SrcAddrOffset, DMA_InitStruct->DestAddrOffset);
657
658 /*------------------------ DMAx CBR2 Configuration -----------------------
659 * Configure the Transfer Block counters and update mode with parameter :
660 * - BlkRptSrcAddrOffset: DMA_CBR2_BRSAO[15:0] bits
661 * BlkRptSrcAddrOffset field is supported only by 2D addressing channels.
662 * - BlkRptDestAddrOffset: DMA_CBR2_BRDAO[31:16] bits
663 * BlkRptDestAddrOffset field is supported only by 2D addressing channels.
664 */
665 LL_DMA_ConfigBlkRptAddrUpdateValue(DMAx, Channel, DMA_InitStruct->BlkRptSrcAddrOffset,
666 DMA_InitStruct->BlkRptDestAddrOffset);
667 }
668
669 /*-------------------------- DMAx CLLR Configuration -------------------------
670 * Configure the Transfer linked list address with parameter :
671 * - DestAddrOffset: DMA_CLLR_LA[15:2] bits
672 */
673 LL_DMA_SetLinkedListAddrOffset(DMAx, Channel, DMA_InitStruct->LinkedListAddrOffset);
674
675 return (uint32_t)SUCCESS;
676 }
677
678 /**
679 * @brief Set each @ref LL_DMA_InitTypeDef field to default value.
680 * @param DMA_InitStruct Pointer to a @ref LL_DMA_InitTypeDef structure.
681 * @retval None.
682 */
LL_DMA_StructInit(LL_DMA_InitTypeDef * DMA_InitStruct)683 void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct)
684 {
685 /* Set DMA_InitStruct fields to default values */
686 DMA_InitStruct->SrcAddress = 0x00000000U;
687 DMA_InitStruct->DestAddress = 0x00000000U;
688 DMA_InitStruct->Direction = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
689 DMA_InitStruct->BlkHWRequest = LL_DMA_HWREQUEST_SINGLEBURST;
690 DMA_InitStruct->DataAlignment = LL_DMA_DATA_ALIGN_ZEROPADD;
691 DMA_InitStruct->SrcBurstLength = 1U;
692 DMA_InitStruct->DestBurstLength = 1U;
693 DMA_InitStruct->SrcDataWidth = LL_DMA_SRC_DATAWIDTH_BYTE;
694 DMA_InitStruct->DestDataWidth = LL_DMA_DEST_DATAWIDTH_BYTE;
695 DMA_InitStruct->SrcIncMode = LL_DMA_SRC_FIXED;
696 DMA_InitStruct->DestIncMode = LL_DMA_DEST_FIXED;
697 DMA_InitStruct->Priority = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
698 DMA_InitStruct->BlkDataLength = 0x00000000U;
699 DMA_InitStruct->Mode = LL_DMA_NORMAL;
700 DMA_InitStruct->BlkRptCount = 0x00000000U;
701 DMA_InitStruct->TriggerMode = LL_DMA_TRIGM_BLK_TRANSFER;
702 DMA_InitStruct->TriggerPolarity = LL_DMA_TRIG_POLARITY_MASKED;
703 DMA_InitStruct->TriggerSelection = 0x00000000U;
704 DMA_InitStruct->Request = 0x00000000U;
705 DMA_InitStruct->TransferEventMode = LL_DMA_TCEM_BLK_TRANSFER;
706 DMA_InitStruct->DestWordExchange = LL_DMA_DEST_WORD_PRESERVE;
707 DMA_InitStruct->DestHWordExchange = LL_DMA_DEST_HALFWORD_PRESERVE;
708 DMA_InitStruct->DestByteExchange = LL_DMA_DEST_BYTE_PRESERVE;
709 DMA_InitStruct->SrcByteExchange = LL_DMA_SRC_BYTE_PRESERVE;
710 DMA_InitStruct->SrcAllocatedPort = LL_DMA_SRC_ALLOCATED_PORT0;
711 DMA_InitStruct->DestAllocatedPort = LL_DMA_DEST_ALLOCATED_PORT0;
712 DMA_InitStruct->LinkAllocatedPort = LL_DMA_LINK_ALLOCATED_PORT0;
713 DMA_InitStruct->LinkStepMode = LL_DMA_LSM_FULL_EXECUTION;
714 DMA_InitStruct->SrcAddrUpdateMode = LL_DMA_BURST_SRC_ADDR_INCREMENT;
715 DMA_InitStruct->DestAddrUpdateMode = LL_DMA_BURST_DEST_ADDR_INCREMENT;
716 DMA_InitStruct->SrcAddrOffset = 0x00000000U;
717 DMA_InitStruct->DestAddrOffset = 0x00000000U;
718 DMA_InitStruct->BlkRptSrcAddrUpdateMode = LL_DMA_BLKRPT_SRC_ADDR_INCREMENT;
719 DMA_InitStruct->BlkRptDestAddrUpdateMode = LL_DMA_BLKRPT_DEST_ADDR_INCREMENT;
720 DMA_InitStruct->BlkRptSrcAddrOffset = 0x00000000U;
721 DMA_InitStruct->BlkRptDestAddrOffset = 0x00000000U;
722 DMA_InitStruct->LinkedListBaseAddr = 0x00000000U;
723 DMA_InitStruct->LinkedListAddrOffset = 0x00000000U;
724 }
725
726 /**
727 * @brief Set each @ref LL_DMA_InitLinkedListTypeDef field to default value.
728 * @param DMA_InitLinkedListStruct Pointer to
729 * a @ref LL_DMA_InitLinkedListTypeDef structure.
730 * @retval None.
731 */
LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)732 void LL_DMA_ListStructInit(LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
733 {
734 /* Set LL_DMA_InitLinkedListTypeDef fields to default values */
735 DMA_InitLinkedListStruct->Priority = LL_DMA_LOW_PRIORITY_LOW_WEIGHT;
736 DMA_InitLinkedListStruct->LinkStepMode = LL_DMA_LSM_FULL_EXECUTION;
737 DMA_InitLinkedListStruct->TransferEventMode = LL_DMA_TCEM_LAST_LLITEM_TRANSFER;
738 DMA_InitLinkedListStruct->LinkAllocatedPort = LL_DMA_LINK_ALLOCATED_PORT0;
739 }
740
741 /**
742 * @brief De-initialize the DMA linked list.
743 * @note This API is used for all available DMA channels.
744 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
745 * helper macros :
746 * @arg @ref LL_DMA_GET_INSTANCE
747 * @arg @ref LL_DMA_GET_CHANNEL
748 * @param DMAx DMAx Instance
749 * @param Channel This parameter can be one of the following values:
750 * @arg @ref LL_DMA_CHANNEL_0
751 * @arg @ref LL_DMA_CHANNEL_1
752 * @arg @ref LL_DMA_CHANNEL_2
753 * @arg @ref LL_DMA_CHANNEL_3
754 * @arg @ref LL_DMA_CHANNEL_4
755 * @arg @ref LL_DMA_CHANNEL_5
756 * @arg @ref LL_DMA_CHANNEL_6
757 * @arg @ref LL_DMA_CHANNEL_7
758 * @arg @ref LL_DMA_CHANNEL_8
759 * @arg @ref LL_DMA_CHANNEL_9
760 * @arg @ref LL_DMA_CHANNEL_10
761 * @arg @ref LL_DMA_CHANNEL_11
762 * @arg @ref LL_DMA_CHANNEL_12
763 * @arg @ref LL_DMA_CHANNEL_13
764 * @arg @ref LL_DMA_CHANNEL_14
765 * @arg @ref LL_DMA_CHANNEL_15
766 * @retval An ErrorStatus enumeration value:
767 * - SUCCESS : DMA registers are de-initialized.
768 * - ERROR : DMA registers are not de-initialized.
769 */
LL_DMA_List_DeInit(DMA_TypeDef * DMAx,uint32_t Channel)770 uint32_t LL_DMA_List_DeInit(DMA_TypeDef *DMAx, uint32_t Channel)
771 {
772 return LL_DMA_DeInit(DMAx, Channel);
773 }
774
775 /**
776 * @brief Initialize the DMA linked list according to the specified parameters
777 * in LL_DMA_InitLinkedListTypeDef.
778 * @note This API is used for all available DMA channels.
779 * @note To convert DMAx_Channely Instance to DMAx Instance and Channely, use
780 * helper macros :
781 * @arg @ref LL_DMA_GET_INSTANCE
782 * @arg @ref LL_DMA_GET_CHANNEL
783 * @param DMAx DMAx Instance
784 * @param Channel This parameter can be one of the following values:
785 * @arg @ref LL_DMA_CHANNEL_0
786 * @arg @ref LL_DMA_CHANNEL_1
787 * @arg @ref LL_DMA_CHANNEL_2
788 * @arg @ref LL_DMA_CHANNEL_3
789 * @arg @ref LL_DMA_CHANNEL_4
790 * @arg @ref LL_DMA_CHANNEL_5
791 * @arg @ref LL_DMA_CHANNEL_6
792 * @arg @ref LL_DMA_CHANNEL_7
793 * @arg @ref LL_DMA_CHANNEL_8
794 * @arg @ref LL_DMA_CHANNEL_9
795 * @arg @ref LL_DMA_CHANNEL_10
796 * @arg @ref LL_DMA_CHANNEL_11
797 * @arg @ref LL_DMA_CHANNEL_12
798 * @arg @ref LL_DMA_CHANNEL_13
799 * @arg @ref LL_DMA_CHANNEL_14
800 * @arg @ref LL_DMA_CHANNEL_15
801 * @param DMA_InitLinkedListStruct pointer to
802 * a @ref LL_DMA_InitLinkedListTypeDef structure.
803 * @retval An ErrorStatus enumeration value:
804 * - SUCCESS : DMA registers are initialized.
805 * - ERROR : Not applicable.
806 */
LL_DMA_List_Init(DMA_TypeDef * DMAx,uint32_t Channel,LL_DMA_InitLinkedListTypeDef * DMA_InitLinkedListStruct)807 uint32_t LL_DMA_List_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitLinkedListTypeDef *DMA_InitLinkedListStruct)
808 {
809 /* Check the DMA Instance DMAx and Channel parameters*/
810 assert_param(IS_LL_DMA_ALL_CHANNEL_INSTANCE(DMAx, Channel));
811
812 /* Check the DMA parameters from DMA_InitLinkedListStruct */
813 assert_param(IS_LL_DMA_PRIORITY(DMA_InitLinkedListStruct->Priority));
814 assert_param(IS_LL_DMA_LINK_STEP_MODE(DMA_InitLinkedListStruct->LinkStepMode));
815 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitLinkedListStruct->TransferEventMode));
816 /* Check DMA instance */
817 if ((IS_LL_HPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U) || (IS_LL_GPDMA_CHANNEL_INSTANCE(DMAx, Channel) != 0U))
818 {
819 assert_param(IS_LL_DMA_LINK_ALLOCATED_PORT(DMA_InitLinkedListStruct->LinkAllocatedPort));
820 }
821
822 /*-------------------------- DMAx CCR Configuration --------------------------
823 * Configure the control parameter :
824 * - LinkAllocatedPort: DMA_CCR_LAP bit
825 * LinkAllocatedPort field is supported only by GPDMA channels.
826 * - LinkStepMode: DMA_CCR_LSM bit
827 * - Priority: DMA_CCR_PRIO [23:22] bits
828 */
829 LL_DMA_ConfigControl(DMAx, Channel, DMA_InitLinkedListStruct->Priority | \
830 DMA_InitLinkedListStruct->LinkAllocatedPort | \
831 DMA_InitLinkedListStruct->LinkStepMode);
832
833 /*-------------------------- DMAx CTR2 Configuration -------------------------
834 * Configure the channel transfer parameter :
835 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
836 */
837 LL_DMA_SetTransferEventMode(DMAx, Channel, DMA_InitLinkedListStruct->TransferEventMode);
838
839 return (uint32_t)SUCCESS;
840 }
841
842 /**
843 * @brief Set each @ref LL_DMA_InitNodeTypeDef field to default value.
844 * @param DMA_InitNodeStruct Pointer to a @ref LL_DMA_InitNodeTypeDef
845 * structure.
846 * @retval None.
847 */
LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct)848 void LL_DMA_NodeStructInit(LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct)
849 {
850 /* Set DMA_InitNodeStruct fields to default values */
851 #if defined (CPU_IN_SECURE_STATE)
852 DMA_InitNodeStruct->DestSecure = LL_DMA_CHANNEL_DEST_NSEC;
853 #endif /* CPU_IN_SECURE_STATE */
854 DMA_InitNodeStruct->DestAllocatedPort = LL_DMA_DEST_ALLOCATED_PORT0;
855 DMA_InitNodeStruct->DestWordExchange = LL_DMA_DEST_WORD_PRESERVE;
856 DMA_InitNodeStruct->DestHWordExchange = LL_DMA_DEST_HALFWORD_PRESERVE;
857 DMA_InitNodeStruct->DestByteExchange = LL_DMA_DEST_BYTE_PRESERVE;
858 DMA_InitNodeStruct->DestBurstLength = 1U;
859 DMA_InitNodeStruct->DestIncMode = LL_DMA_DEST_FIXED;
860 DMA_InitNodeStruct->DestDataWidth = LL_DMA_DEST_DATAWIDTH_BYTE;
861 #if defined (CPU_IN_SECURE_STATE)
862 DMA_InitNodeStruct->SrcSecure = LL_DMA_CHANNEL_SRC_NSEC;
863 #endif /* CPU_IN_SECURE_STATE */
864 DMA_InitNodeStruct->SrcAllocatedPort = LL_DMA_SRC_ALLOCATED_PORT0;
865 DMA_InitNodeStruct->SrcByteExchange = LL_DMA_SRC_BYTE_PRESERVE;
866 DMA_InitNodeStruct->DataAlignment = LL_DMA_DATA_ALIGN_ZEROPADD;
867 DMA_InitNodeStruct->SrcBurstLength = 1U;
868 DMA_InitNodeStruct->SrcIncMode = LL_DMA_SRC_FIXED;
869 DMA_InitNodeStruct->SrcDataWidth = LL_DMA_SRC_DATAWIDTH_BYTE;
870 DMA_InitNodeStruct->TransferEventMode = LL_DMA_TCEM_BLK_TRANSFER;
871 DMA_InitNodeStruct->TriggerPolarity = LL_DMA_TRIG_POLARITY_MASKED;
872 DMA_InitNodeStruct->TriggerSelection = 0x00000000U;
873 DMA_InitNodeStruct->TriggerMode = LL_DMA_TRIGM_BLK_TRANSFER;
874 DMA_InitNodeStruct->BlkHWRequest = LL_DMA_HWREQUEST_SINGLEBURST;
875 DMA_InitNodeStruct->Direction = LL_DMA_DIRECTION_MEMORY_TO_MEMORY;
876 DMA_InitNodeStruct->Request = 0x00000000U;
877 DMA_InitNodeStruct->Mode = LL_DMA_NORMAL;
878 DMA_InitNodeStruct->BlkRptDestAddrUpdateMode = LL_DMA_BLKRPT_DEST_ADDR_INCREMENT;
879 DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode = LL_DMA_BLKRPT_SRC_ADDR_INCREMENT;
880 DMA_InitNodeStruct->DestAddrUpdateMode = LL_DMA_BURST_DEST_ADDR_INCREMENT;
881 DMA_InitNodeStruct->SrcAddrUpdateMode = LL_DMA_BURST_SRC_ADDR_INCREMENT;
882 DMA_InitNodeStruct->BlkRptCount = 0x00000000U;
883 DMA_InitNodeStruct->BlkDataLength = 0x00000000U;
884 DMA_InitNodeStruct->SrcAddress = 0x00000000U;
885 DMA_InitNodeStruct->DestAddress = 0x00000000U;
886 DMA_InitNodeStruct->DestAddrOffset = 0x00000000U;
887 DMA_InitNodeStruct->SrcAddrOffset = 0x00000000U;
888 DMA_InitNodeStruct->BlkRptDestAddrOffset = 0x00000000U;
889 DMA_InitNodeStruct->BlkRptSrcAddrOffset = 0x00000000U;
890 DMA_InitNodeStruct->UpdateRegisters = (LL_DMA_UPDATE_CTR1 | LL_DMA_UPDATE_CTR2 | \
891 LL_DMA_UPDATE_CBR1 | LL_DMA_UPDATE_CSAR | \
892 LL_DMA_UPDATE_CDAR | LL_DMA_UPDATE_CTR3 | \
893 LL_DMA_UPDATE_CBR2 | LL_DMA_UPDATE_CLLR);
894 DMA_InitNodeStruct->NodeType = LL_DMA_GPDMA_LINEAR_NODE;
895 }
896
897 /**
898 * @brief Initializes DMA linked list node according to the specified
899 * parameters in the DMA_InitNodeStruct.
900 * @note Warning: the maximum allowed AXI burst length shall not exceed 16.
901 * Otherwise, an error will be returned and no initialization performed.
902 * @param DMA_InitNodeStruct Pointer to a LL_DMA_InitNodeTypeDef structure
903 * that contains linked list node
904 * registers configurations.
905 * @param pNode Pointer to linked list node to fill according to
906 * LL_DMA_LinkNodeTypeDef parameters.
907 * @retval None
908 */
LL_DMA_CreateLinkNode(const LL_DMA_InitNodeTypeDef * DMA_InitNodeStruct,LL_DMA_LinkNodeTypeDef * pNode)909 uint32_t LL_DMA_CreateLinkNode(const LL_DMA_InitNodeTypeDef *DMA_InitNodeStruct, LL_DMA_LinkNodeTypeDef *pNode)
910 {
911 uint32_t reg_counter = 0U;
912
913 /* Check the DMA Node type */
914 assert_param(IS_LL_DMA_LINK_NODETYPE(DMA_InitNodeStruct->NodeType));
915
916 /* Check the DMA parameters from DMA_InitNodeStruct */
917 assert_param(IS_LL_DMA_DIRECTION(DMA_InitNodeStruct->Direction));
918
919 /* Check direction */
920 if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
921 {
922 assert_param(IS_LL_DMA_REQUEST_SELECTION(DMA_InitNodeStruct->Request));
923 }
924
925 assert_param(IS_LL_DMA_DATA_ALIGNMENT(DMA_InitNodeStruct->DataAlignment));
926 assert_param(IS_LL_DMA_SRC_DATA_WIDTH(DMA_InitNodeStruct->SrcDataWidth));
927 assert_param(IS_LL_DMA_DEST_DATA_WIDTH(DMA_InitNodeStruct->DestDataWidth));
928 assert_param(IS_LL_DMA_SRC_INCREMENT_MODE(DMA_InitNodeStruct->SrcIncMode));
929 assert_param(IS_LL_DMA_DEST_INCREMENT_MODE(DMA_InitNodeStruct->DestIncMode));
930 assert_param(IS_LL_DMA_BLK_DATALENGTH(DMA_InitNodeStruct->BlkDataLength));
931 assert_param(IS_LL_DMA_TRIGGER_POLARITY(DMA_InitNodeStruct->TriggerPolarity));
932 assert_param(IS_LL_DMA_BLKHW_REQUEST(DMA_InitNodeStruct->BlkHWRequest));
933 assert_param(IS_LL_DMA_TRANSFER_EVENT_MODE(DMA_InitNodeStruct->TransferEventMode));
934 assert_param(IS_LL_DMA_LINK_UPDATE_REGISTERS(DMA_InitNodeStruct->UpdateRegisters));
935 assert_param(IS_LL_DMA_MODE(DMA_InitNodeStruct->Mode));
936
937 #if defined (CPU_IN_SECURE_STATE)
938 assert_param(IS_LL_DMA_CHANNEL_SRC_SEC(DMA_InitNodeStruct->SrcSecure));
939 assert_param(IS_LL_DMA_CHANNEL_DEST_SEC(DMA_InitNodeStruct->DestSecure));
940 #endif /* CPU_IN_SECURE_STATE */
941
942 /* Check trigger polarity */
943 if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
944 {
945 assert_param(IS_LL_DMA_TRIGGER_MODE(DMA_InitNodeStruct->TriggerMode));
946 assert_param(IS_LL_DMA_TRIGGER_SELECTION(DMA_InitNodeStruct->TriggerSelection));
947 }
948
949 {
950 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitNodeStruct->SrcBurstLength));
951 assert_param(IS_LL_DMA_BURST_LENGTH(DMA_InitNodeStruct->DestBurstLength));
952 assert_param(IS_LL_DMA_DEST_WORD_EXCHANGE(DMA_InitNodeStruct->DestWordExchange));
953 assert_param(IS_LL_DMA_DEST_HALFWORD_EXCHANGE(DMA_InitNodeStruct->DestHWordExchange));
954 assert_param(IS_LL_DMA_DEST_BYTE_EXCHANGE(DMA_InitNodeStruct->DestByteExchange));
955 assert_param(IS_LL_DMA_SRC_BYTE_EXCHANGE(DMA_InitNodeStruct->SrcByteExchange));
956 assert_param(IS_LL_DMA_SRC_ALLOCATED_PORT(DMA_InitNodeStruct->SrcAllocatedPort));
957 assert_param(IS_LL_DMA_DEST_ALLOCATED_PORT(DMA_InitNodeStruct->DestAllocatedPort));
958 }
959
960 /* Check DMA channel */
961 if ((DMA_InitNodeStruct->NodeType == LL_DMA_HPDMA_2D_NODE) || \
962 (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE))
963 {
964 assert_param(IS_LL_DMA_BLK_REPEATCOUNT(DMA_InitNodeStruct->BlkRptCount));
965 assert_param(IS_LL_DMA_BURST_SRC_ADDR_UPDATE(DMA_InitNodeStruct->SrcAddrUpdateMode));
966 assert_param(IS_LL_DMA_BURST_DEST_ADDR_UPDATE(DMA_InitNodeStruct->DestAddrUpdateMode));
967 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->SrcAddrOffset));
968 assert_param(IS_LL_DMA_BURST_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->DestAddrOffset));
969 assert_param(IS_LL_DMA_BLKRPT_SRC_ADDR_UPDATE(DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode));
970 assert_param(IS_LL_DMA_BLKRPT_DEST_ADDR_UPDATE(DMA_InitNodeStruct->BlkRptDestAddrUpdateMode));
971 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->BlkRptSrcAddrOffset));
972 assert_param(IS_LL_DMA_BLKRPT_ADDR_UPDATE_VALUE(DMA_InitNodeStruct->BlkRptDestAddrOffset));
973 }
974
975 if ((DMA_InitNodeStruct->NodeType & (LL_DMA_HPDMA_2D_NODE | LL_DMA_HPDMA_LINEAR_NODE)) != 0U)
976 {
977 if (((DMA_InitNodeStruct->SrcAllocatedPort & DMA_CTR1_SAP) == LL_DMA_SRC_ALLOCATED_PORT0) &&
978 (DMA_InitNodeStruct->SrcBurstLength > 16U))
979 {
980 return (uint32_t)ERROR;
981 }
982 if (((DMA_InitNodeStruct->DestAllocatedPort & DMA_CTR1_DAP) == LL_DMA_DEST_ALLOCATED_PORT0) &&
983 (DMA_InitNodeStruct->DestBurstLength > 16U))
984 {
985 return (uint32_t)ERROR;
986 }
987 }
988
989 /* Check if CTR1 register update is enabled */
990 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR1) == LL_DMA_UPDATE_CTR1)
991 {
992 /*-------------------------- DMAx CTR1 Configuration -----------------------
993 * Configure the Data transfer parameter :
994 * - DestAllocatedPort: DMA_CTR1_DAP bit
995 * - DestWordExchange: DMA_CTR1_DWX bit
996 * - DestHWordExchange: DMA_CTR1_DHX bit
997 * - DestByteExchange: DMA_CTR1_DBX bit
998 * - DestIncMode: DMA_CTR1_DINC bit
999 * - DestDataWidth: DMA_CTR1_DDW_LOG2 [17:16] bits
1000 * - SrcAllocatedPort: DMA_CTR1_SAP bit
1001 * - SrcByteExchange: DMA_CTR1_SBX bit
1002 * - DataAlignment: DMA_CTR1_PAM [12:11] bits
1003 * - SrcIncMode: DMA_CTR1_SINC bit
1004 * - SrcDataWidth: DMA_CTR1_SDW_LOG2 [1:0] bits
1005 * - SrcBurstLength: DMA_CTR1_SBL_1 [9:4] bits
1006 * - DestBurstLength: DMA_CTR1_DBL_1 [25:20] bits
1007 */
1008
1009 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->DestIncMode | \
1010 DMA_InitNodeStruct->DestDataWidth | \
1011 DMA_InitNodeStruct->DataAlignment | \
1012 DMA_InitNodeStruct->SrcIncMode | \
1013 DMA_InitNodeStruct->SrcDataWidth);
1014
1015 #if defined (CPU_IN_SECURE_STATE)
1016 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestSecure | \
1017 DMA_InitNodeStruct->SrcSecure);
1018 #endif /* CPU_IN_SECURE_STATE */
1019
1020 /* Update CTR1 register fields */
1021 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->DestAllocatedPort | \
1022 DMA_InitNodeStruct->DestWordExchange | \
1023 DMA_InitNodeStruct->DestHWordExchange | \
1024 DMA_InitNodeStruct->DestByteExchange | \
1025 ((DMA_InitNodeStruct->DestBurstLength - 1U) << DMA_CTR1_DBL_1_Pos) | \
1026 DMA_InitNodeStruct->SrcAllocatedPort | \
1027 DMA_InitNodeStruct->SrcByteExchange | \
1028 ((DMA_InitNodeStruct->SrcBurstLength - 1U) << DMA_CTR1_SBL_1_Pos));
1029
1030 /* Increment counter for the next register */
1031 reg_counter++;
1032 }
1033
1034
1035 /* Check if CTR2 register update is enabled */
1036 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR2) == LL_DMA_UPDATE_CTR2)
1037 {
1038 /*-------------------------- DMAx CTR2 Configuration -----------------------
1039 * Configure the channel transfer parameter :
1040 * - TransferEventMode: DMA_CTR2_TCEM [31:30] bits
1041 * - TriggerPolarity: DMA_CTR2_TRIGPOL [25:24] bits
1042 * - TriggerMode: DMA_CTR2_TRIGM [15:14] bits
1043 * - Mode: DMA_CTR2_PFREQ bit
1044 * - BlkHWRequest: DMA_CTR2_BREQ bit
1045 * - Direction: DMA_CTR2_DREQ bit
1046 * - Direction: DMA_CTR2_SWREQ bit
1047 * - TriggerSelection: DMA_CTR2_TRIGSEL [21:16] bits
1048 * - Request: DMA_CTR2_REQSEL [6:0] bits
1049 */
1050 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->TransferEventMode | \
1051 DMA_InitNodeStruct->TriggerPolarity | \
1052 DMA_InitNodeStruct->BlkHWRequest | \
1053 DMA_InitNodeStruct->Mode | \
1054 DMA_InitNodeStruct->Direction);
1055
1056 /* Check direction */
1057 if (DMA_InitNodeStruct->Direction != LL_DMA_DIRECTION_MEMORY_TO_MEMORY)
1058 {
1059 pNode->LinkRegisters[reg_counter] |= DMA_InitNodeStruct->Request & DMA_CTR2_REQSEL;
1060 }
1061
1062 /* Check trigger polarity */
1063 if (DMA_InitNodeStruct->TriggerPolarity != LL_DMA_TRIG_POLARITY_MASKED)
1064 {
1065 pNode->LinkRegisters[reg_counter] |= (((DMA_InitNodeStruct->TriggerSelection << DMA_CTR2_TRIGSEL_Pos) & \
1066 DMA_CTR2_TRIGSEL) | DMA_InitNodeStruct->TriggerMode);
1067 }
1068
1069
1070 /* Increment counter for the next register */
1071 reg_counter++;
1072 }
1073
1074 /* Check if CBR1 register update is enabled */
1075 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CBR1) == LL_DMA_UPDATE_CBR1)
1076 {
1077 /*-------------------------- DMAx CBR1 Configuration -----------------------
1078 * Configure the Transfer Block counters and update mode with parameter :
1079 * - BlkDataLength: DMA_CBR1_BNDT[15:0] bits
1080 * - BlkRptCount: DMA_CBR1_BRC[26:16] bits
1081 * BlkRptCount field is supported only by 2D addressing channels.
1082 * - BlkRptSrcAddrUpdateMode: DMA_CBR1_BRSDEC bit
1083 * BlkRptSrcAddrUpdateMode field is supported only by 2D addressing channels.
1084 * - BlkRptDestAddrUpdateMode: DMA_CBR1_BRDDEC bit
1085 * BlkRptDestAddrUpdateMode field is supported only by 2D addressing channels.
1086 * - SrcAddrUpdateMode: DMA_CBR1_SDEC bit
1087 * SrcAddrUpdateMode field is supported only by 2D addressing channels.
1088 * - DestAddrUpdateMode: DMA_CBR1_DDEC bit
1089 * DestAddrUpdateMode field is supported only by 2D addressing channels.
1090 */
1091 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->BlkDataLength;
1092
1093 /* Update CBR1 register fields for 2D addressing channels */
1094 if ((DMA_InitNodeStruct->NodeType == LL_DMA_HPDMA_2D_NODE) || \
1095 (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE))
1096 {
1097 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->BlkRptDestAddrUpdateMode | \
1098 DMA_InitNodeStruct->BlkRptSrcAddrUpdateMode | \
1099 DMA_InitNodeStruct->DestAddrUpdateMode | \
1100 DMA_InitNodeStruct->SrcAddrUpdateMode | \
1101 ((DMA_InitNodeStruct->BlkRptCount << DMA_CBR1_BRC_Pos) & DMA_CBR1_BRC));
1102 }
1103
1104 /* Increment counter for the next register */
1105 reg_counter++;
1106 }
1107
1108 /* Check if CSAR register update is enabled */
1109 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CSAR) == LL_DMA_UPDATE_CSAR)
1110 {
1111 /*-------------------------- DMAx CSAR Configuration -----------------------
1112 * Configure the Transfer Block counters and update mode with parameter :
1113 * - SrcAddress: DMA_CSAR_SA[31:0] bits
1114 */
1115 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->SrcAddress;
1116
1117 /* Increment counter for the next register */
1118 reg_counter++;
1119 }
1120
1121
1122 /* Check if CDAR register update is enabled */
1123 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CDAR) == LL_DMA_UPDATE_CDAR)
1124 {
1125 /*-------------------------- DMAx CDAR Configuration -----------------------
1126 * Configure the Transfer Block counters and update mode with parameter :
1127 * - DestAddress: DMA_CDAR_DA[31:0] bits
1128 */
1129 pNode->LinkRegisters[reg_counter] = DMA_InitNodeStruct->DestAddress;
1130
1131 /* Increment counter for the next register */
1132 reg_counter++;
1133 }
1134
1135 /* Update CTR3 register fields for 2D addressing channels */
1136 if ((DMA_InitNodeStruct->NodeType == LL_DMA_HPDMA_2D_NODE) || (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE))
1137 {
1138 /* Check if CTR3 register update is enabled */
1139 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CTR3) == LL_DMA_UPDATE_CTR3)
1140 {
1141 /*-------------------------- DMAx CTR3 Configuration ---------------------
1142 * Configure the Block counters and update mode with parameter :
1143 * - DestAddressOffset: DMA_CTR3_DAO[12:0] bits
1144 * DestAddressOffset field is supported only by 2D addressing channels.
1145 * - SrcAddressOffset: DMA_CTR3_SAO[12:0] bits
1146 * SrcAddressOffset field is supported only by 2D addressing channels.
1147 */
1148 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->SrcAddrOffset | \
1149 ((DMA_InitNodeStruct->DestAddrOffset << DMA_CTR3_DAO_Pos) & DMA_CTR3_DAO));
1150
1151 /* Increment counter for the next register */
1152 reg_counter++;
1153 }
1154 }
1155
1156
1157 /* Update CBR2 register fields for 2D addressing channels */
1158 if ((DMA_InitNodeStruct->NodeType == LL_DMA_HPDMA_2D_NODE) || (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE))
1159 {
1160 /* Check if CBR2 register update is enabled */
1161 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CBR2) == LL_DMA_UPDATE_CBR2)
1162 {
1163 /*-------------------------- DMAx CBR2 Configuration ---------------------
1164 * Configure the Block counters and update mode with parameter :
1165 * - BlkRptDestAddrOffset: DMA_CBR2_BRDAO[31:16] bits
1166 * BlkRptDestAddrOffset field is supported only by 2D addressing channels.
1167 * - BlkRptSrcAddrOffset: DMA_CBR2_BRSAO[15:0] bits
1168 * BlkRptSrcAddrOffset field is supported only by 2D addressing channels.
1169 */
1170 pNode->LinkRegisters[reg_counter] = (DMA_InitNodeStruct->BlkRptSrcAddrOffset | \
1171 ((DMA_InitNodeStruct->BlkRptDestAddrOffset << DMA_CBR2_BRDAO_Pos) & \
1172 DMA_CBR2_BRDAO));
1173
1174 /* Increment counter for the next register */
1175 reg_counter++;
1176 }
1177 }
1178
1179 /* Check if CLLR register update is enabled */
1180 if ((DMA_InitNodeStruct->UpdateRegisters & LL_DMA_UPDATE_CLLR) == LL_DMA_UPDATE_CLLR)
1181 {
1182 /*-------------------------- DMAx CLLR Configuration -----------------------
1183 * Configure the Transfer Block counters and update mode with parameter :
1184 * - UpdateRegisters DMA_CLLR_UT1 bit
1185 * - UpdateRegisters DMA_CLLR_UT2 bit
1186 * - UpdateRegisters DMA_CLLR_UB1 bit
1187 * - UpdateRegisters DMA_CLLR_USA bit
1188 * - UpdateRegisters DMA_CLLR_UDA bit
1189 * - UpdateRegisters DMA_CLLR_UT3 bit
1190 * DMA_CLLR_UT3 bit is discarded for linear addressing channels.
1191 * - UpdateRegisters DMA_CLLR_UB2 bit
1192 * DMA_CLLR_UB2 bit is discarded for linear addressing channels.
1193 * - UpdateRegisters DMA_CLLR_ULL bit
1194 */
1195 pNode->LinkRegisters[reg_counter] = ((DMA_InitNodeStruct->UpdateRegisters & (DMA_CLLR_UT1 | DMA_CLLR_UT2 | \
1196 DMA_CLLR_UB1 | DMA_CLLR_USA | \
1197 DMA_CLLR_UDA | DMA_CLLR_ULL)));
1198
1199 /* Update CLLR register fields for 2D addressing channels */
1200 if ((DMA_InitNodeStruct->NodeType == LL_DMA_HPDMA_2D_NODE) || \
1201 (DMA_InitNodeStruct->NodeType == LL_DMA_GPDMA_2D_NODE))
1202 {
1203 pNode->LinkRegisters[reg_counter] |= (DMA_InitNodeStruct->UpdateRegisters & (DMA_CLLR_UT3 | DMA_CLLR_UB2));
1204 }
1205 }
1206 else
1207 {
1208 /* Reset of the CLLR of the node being created */
1209 pNode->LinkRegisters[reg_counter] = 0U;
1210 }
1211
1212 return (uint32_t)SUCCESS;
1213 }
1214
1215 /**
1216 * @brief Connect Linked list Nodes.
1217 * @param pPrevLinkNode Pointer to previous linked list node to be connected to new Linked list node.
1218 * @param PrevNodeCLLRIdx Offset of Previous Node CLLR register.
1219 * This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
1220 * @param pNewLinkNode Pointer to new Linked list.
1221 * @param NewNodeCLLRIdx Offset of New Node CLLR register.
1222 * This parameter can be a value of @ref DMA_LL_EC_CLLR_OFFSET.
1223 * @retval None
1224 */
LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef * pPrevLinkNode,uint32_t PrevNodeCLLRIdx,LL_DMA_LinkNodeTypeDef * pNewLinkNode,uint32_t NewNodeCLLRIdx)1225 void LL_DMA_ConnectLinkNode(LL_DMA_LinkNodeTypeDef *pPrevLinkNode, uint32_t PrevNodeCLLRIdx,
1226 LL_DMA_LinkNodeTypeDef *pNewLinkNode, uint32_t NewNodeCLLRIdx)
1227 {
1228 pPrevLinkNode->LinkRegisters[PrevNodeCLLRIdx] = (((uint32_t)pNewLinkNode & DMA_CLLR_LA) | \
1229 (pNewLinkNode->LinkRegisters[NewNodeCLLRIdx] & (DMA_CLLR_UT1 | \
1230 DMA_CLLR_UT2 | DMA_CLLR_UB1 | DMA_CLLR_USA | DMA_CLLR_UDA | \
1231 DMA_CLLR_UT3 | DMA_CLLR_UB2 | DMA_CLLR_ULL)));
1232 }
1233
1234 /**
1235 * @brief Disconnect the next linked list node.
1236 * @param pLinkNode Pointer to linked list node to be disconnected from the next one.
1237 * @param LinkNodeCLLRIdx Offset of Link Node CLLR register.
1238 * @retval None.
1239 */
LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef * pLinkNode,uint32_t LinkNodeCLLRIdx)1240 void LL_DMA_DisconnectNextLinkNode(LL_DMA_LinkNodeTypeDef *pLinkNode, uint32_t LinkNodeCLLRIdx)
1241 {
1242 pLinkNode->LinkRegisters[LinkNodeCLLRIdx] = 0;
1243 }
1244
1245 /**
1246 * @}
1247 */
1248
1249 /**
1250 * @}
1251 */
1252
1253 /**
1254 * @}
1255 */
1256
1257 #endif /* GPDMA1 || HPDMA1 */
1258
1259 /**
1260 * @}
1261 */
1262
1263 #endif /* USE_FULL_LL_DRIVER */
1264
1265