@@ -109,6 +109,54 @@ void HAL_DMA_ErrorCallback(DMA_HandleTypeDef *hdma)
109109 LOG_WRN ("%s" , __func__ );
110110}
111111
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+
112160static int stm32_dma_init (const struct device * dev )
113161{
114162 struct video_stm32_dcmi_data * data = dev -> data ;
@@ -147,7 +195,19 @@ static int stm32_dma_init(const struct device *dev)
147195
148196 /*** Configure the DMA ***/
149197 /* 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
151211 hdma .Init .Request = GPDMA1_REQUEST_DCMI ;
152212 hdma .Init .BlkHWRequest = DMA_BREQ_SINGLE_BURST ;
153213 hdma .Init .Direction = DMA_PERIPH_TO_MEMORY ;
@@ -178,17 +238,34 @@ static int stm32_dma_init(const struct device *dev)
178238#if defined(CONFIG_SOC_SERIES_STM32F7X ) || defined(CONFIG_SOC_SERIES_STM32H7X )
179239 hdma .Instance = __LL_DMA_GET_STREAM_INSTANCE (config -> dma .reg ,
180240 config -> dma .channel );
181- #elif defined(CONFIG_SOC_SERIES_STM32L4X )
241+ #elif defined(CONFIG_SOC_SERIES_STM32L4X ) || defined( CONFIG_SOC_SERIES_STM32U5X )
182242 hdma .Instance = __LL_DMA_GET_CHANNEL_INSTANCE (config -> dma .reg , config -> dma .channel );
183243#endif
184244
185245 /* Initialize DMA HAL */
186246 __HAL_LINKDMA (& data -> hdcmi , DMA_Handle , hdma );
187247
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
188264 if (HAL_DMA_Init (& hdma ) != HAL_OK ) {
189265 LOG_ERR ("DCMI DMA Init failed" );
190266 return - EIO ;
191267 }
268+ #endif
192269
193270 return 0 ;
194271}
0 commit comments