@@ -109,6 +109,54 @@ void HAL_DMA_ErrorCallback(DMA_HandleTypeDef *hdma)
109
109
LOG_WRN ("%s" , __func__ );
110
110
}
111
111
112
+ #if defined(CONFIG_SOC_SERIES_STM32U585X )
113
+ DMA_NodeTypeDef DCMINode1 ;
114
+ DMA_QListTypeDef DCMIQueue ;
115
+ DMA_NodeTypeDef DCMINode2 ;
116
+
117
+ int MX_DCMIQueue_Config (void )
118
+ {
119
+ int ret = HAL_OK ;
120
+ DMA_NodeConfTypeDef pNodeConfig ;
121
+
122
+ /* Set node configuration ################################################*/
123
+ pNodeConfig .NodeType = DMA_GPDMA_2D_NODE ;
124
+ pNodeConfig .Init .Request = GPDMA1_REQUEST_DCMI ;
125
+ pNodeConfig .Init .BlkHWRequest = DMA_BREQ_SINGLE_BURST ;
126
+ pNodeConfig .Init .Direction = DMA_PERIPH_TO_MEMORY ;
127
+ pNodeConfig .Init .SrcInc = DMA_SINC_FIXED ;
128
+ pNodeConfig .Init .DestInc = DMA_DINC_INCREMENTED ;
129
+ pNodeConfig .Init .SrcDataWidth = DMA_SRC_DATAWIDTH_WORD ;
130
+ pNodeConfig .Init .DestDataWidth = DMA_DEST_DATAWIDTH_WORD ;
131
+ pNodeConfig .Init .SrcBurstLength = 1 ;
132
+ pNodeConfig .Init .DestBurstLength = 1 ;
133
+ pNodeConfig .Init .TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 |DMA_DEST_ALLOCATED_PORT0 ;
134
+ pNodeConfig .Init .TransferEventMode = DMA_TCEM_BLOCK_TRANSFER ;
135
+ pNodeConfig .RepeatBlockConfig .RepeatCount = 1 ;
136
+ pNodeConfig .RepeatBlockConfig .SrcAddrOffset = 0 ;
137
+ pNodeConfig .RepeatBlockConfig .DestAddrOffset = 0 ;
138
+ pNodeConfig .RepeatBlockConfig .BlkSrcAddrOffset = 0 ;
139
+ pNodeConfig .RepeatBlockConfig .BlkDestAddrOffset = 0 ;
140
+ pNodeConfig .TriggerConfig .TriggerPolarity = DMA_TRIG_POLARITY_MASKED ;
141
+ pNodeConfig .DataHandlingConfig .DataExchange = DMA_EXCHANGE_NONE ;
142
+ pNodeConfig .DataHandlingConfig .DataAlignment = DMA_DATA_RIGHTALIGN_ZEROPADDED ;
143
+ pNodeConfig .SrcAddress = 0 ;
144
+ pNodeConfig .DstAddress = 0 ;
145
+ pNodeConfig .DataSize = 0 ;
146
+
147
+ /* Build DCMINode1 Node */
148
+ ret |= HAL_DMAEx_List_BuildNode (& pNodeConfig , & DCMINode1 );
149
+ ret |= HAL_DMAEx_List_InsertNode_Tail (& DCMIQueue , & DCMINode1 );
150
+
151
+ /* Build DCMINode2 Node */
152
+ ret |= HAL_DMAEx_List_BuildNode (& pNodeConfig , & DCMINode2 );
153
+ ret |= HAL_DMAEx_List_InsertNode_Tail (& DCMIQueue , & DCMINode2 );
154
+
155
+ ret |= HAL_DMAEx_List_SetCircularModeConfig (& DCMIQueue , & DCMINode1 );
156
+ return ret ;
157
+ }
158
+ #endif
159
+
112
160
static int stm32_dma_init (const struct device * dev )
113
161
{
114
162
struct video_stm32_dcmi_data * data = dev -> data ;
@@ -147,7 +195,19 @@ static int stm32_dma_init(const struct device *dev)
147
195
148
196
/*** Configure the DMA ***/
149
197
/* Set the parameters to be configured */
150
- #if defined(GPDMA1 ) // GPDMA
198
+ #if defined(CONFIG_SOC_SERIES_STM32U585X )
199
+ ret = MX_DCMIQueue_Config ();
200
+ if (ret ) {
201
+ LOG_ERR ("DCMI Queue configuration failed, %d" , ret );
202
+ return ret ;
203
+ }
204
+
205
+ hdma .InitLinkedList .Priority = DMA_HIGH_PRIORITY ;
206
+ hdma .InitLinkedList .LinkStepMode = DMA_LSM_FULL_EXECUTION ;
207
+ hdma .InitLinkedList .LinkAllocatedPort = DMA_LINK_ALLOCATED_PORT1 ;
208
+ hdma .InitLinkedList .TransferEventMode = DMA_TCEM_LAST_LL_ITEM_TRANSFER ;
209
+ hdma .InitLinkedList .LinkedListMode = DMA_LINKEDLIST_CIRCULAR ;
210
+ #elif defined(GPDMA1 ) // GPDMA
151
211
hdma .Init .Request = GPDMA1_REQUEST_DCMI ;
152
212
hdma .Init .BlkHWRequest = DMA_BREQ_SINGLE_BURST ;
153
213
hdma .Init .Direction = DMA_PERIPH_TO_MEMORY ;
@@ -178,17 +238,34 @@ static int stm32_dma_init(const struct device *dev)
178
238
#if defined(CONFIG_SOC_SERIES_STM32F7X ) || defined(CONFIG_SOC_SERIES_STM32H7X )
179
239
hdma .Instance = __LL_DMA_GET_STREAM_INSTANCE (config -> dma .reg ,
180
240
config -> dma .channel );
181
- #elif defined(CONFIG_SOC_SERIES_STM32L4X )
241
+ #elif defined(CONFIG_SOC_SERIES_STM32L4X ) || defined( CONFIG_SOC_SERIES_STM32U5X )
182
242
hdma .Instance = __LL_DMA_GET_CHANNEL_INSTANCE (config -> dma .reg , config -> dma .channel );
183
243
#endif
184
244
185
245
/* Initialize DMA HAL */
186
246
__HAL_LINKDMA (& data -> hdcmi , DMA_Handle , hdma );
187
247
248
+ #if defined(CONFIG_SOC_SERIES_STM32U585X )
249
+ if (HAL_DMAEx_List_Init (& hdma ) != HAL_OK ) {
250
+ LOG_ERR ("DCMI DMA List Init failed" );
251
+ return - EIO ;
252
+ }
253
+
254
+ if (HAL_DMA_ConfigChannelAttributes (& hdma , DMA_CHANNEL_NPRIV ) != HAL_OK ) {
255
+ LOG_ERR ("DCMI DMA Config Channel Attributes failed" );
256
+ return - EIO ;
257
+ }
258
+
259
+ if (HAL_DMAEx_List_LinkQ (& hdma , & DCMIQueue )) {
260
+ LOG_ERR ("DCMI DMA List Link failed" );
261
+ return - EIO ;
262
+ }
263
+ #else
188
264
if (HAL_DMA_Init (& hdma ) != HAL_OK ) {
189
265
LOG_ERR ("DCMI DMA Init failed" );
190
266
return - EIO ;
191
267
}
268
+ #endif
192
269
193
270
return 0 ;
194
271
}
0 commit comments