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