Skip to content

Commit aca9038

Browse files
committed
drivers: stm32: Add support for STM32U585 DCMI DMA
1 parent 0d5c066 commit aca9038

File tree

1 file changed

+79
-2
lines changed

1 file changed

+79
-2
lines changed

drivers/video/video_stm32_dcmi.c

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
112160
static 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

Comments
 (0)