Skip to content

Commit 222416f

Browse files
mariopajakartben
authored andcommitted
drivers: i2s: stm32 sai add support for stm32f4xx series
STM32F4xx series shares several DMA configurations with the other platforms. These changes aim to enable platform specific DMA configuration and align them to other platforms. Signed-off-by: Mario Paja <[email protected]>
1 parent 0dde13e commit 222416f

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

drivers/i2s/Kconfig.stm32

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ menuconfig I2S_STM32_SAI
3535
select USE_STM32_HAL_DMA
3636
select USE_STM32_HAL_DMA_EX
3737
select USE_STM32_HAL_SAI
38+
select USE_STM32_HAL_SAI_EX if SOC_SERIES_STM32F4X
3839
help
3940
Enable SAI support on the STM32 family of processors.
4041

drivers/i2s/i2s_stm32_sai.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -283,11 +283,17 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
283283
}
284284

285285
hdma->Instance = STM32_DMA_GET_INSTANCE(stream->reg, stream->dma_channel);
286+
#if defined(CONFIG_SOC_SERIES_STM32F4X)
287+
hdma->Init.Channel = dma_cfg.dma_slot * DMA_CHANNEL_1;
288+
#else
286289
hdma->Init.Request = dma_cfg.dma_slot;
290+
#endif
287291
hdma->Init.Mode = DMA_NORMAL;
288292

289293
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32L4X) || \
290-
defined(CONFIG_SOC_SERIES_STM32G4X) || defined(CONFIG_SOC_SERIES_STM32L5X)
294+
defined(CONFIG_SOC_SERIES_STM32G4X) || defined(CONFIG_SOC_SERIES_STM32L5X) || \
295+
defined(CONFIG_SOC_SERIES_STM32F4X)
296+
291297
hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
292298
hdma->Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
293299
hdma->Init.Priority = DMA_PRIORITY_HIGH;
@@ -304,15 +310,16 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
304310
hdma->Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
305311
#endif
306312

307-
#if defined(CONFIG_SOC_SERIES_STM32H7X)
313+
#if defined(CONFIG_SOC_SERIES_STM32H7X) || defined(CONFIG_SOC_SERIES_STM32F4X)
308314
hdma->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
309315
#endif
310316

311317
if (stream->dma_cfg.channel_direction == (enum dma_channel_direction)MEMORY_TO_PERIPHERAL) {
312318
hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
313319

314320
#if !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_SOC_SERIES_STM32L4X) && \
315-
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X)
321+
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X) && \
322+
!defined(CONFIG_SOC_SERIES_STM32F4X)
316323
hdma->Init.SrcInc = DMA_SINC_INCREMENTED;
317324
hdma->Init.DestInc = DMA_DINC_FIXED;
318325
#endif
@@ -322,7 +329,8 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
322329
hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
323330

324331
#if !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_SOC_SERIES_STM32L4X) && \
325-
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X)
332+
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X) && \
333+
!defined(CONFIG_SOC_SERIES_STM32F4X)
326334
hdma->Init.SrcInc = DMA_SINC_FIXED;
327335
hdma->Init.DestInc = DMA_DINC_INCREMENTED;
328336
#endif
@@ -342,7 +350,8 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
342350
return -EIO;
343351
}
344352
#elif !defined(CONFIG_SOC_SERIES_STM32H7X) && !defined(CONFIG_SOC_SERIES_STM32L4X) && \
345-
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X)
353+
!defined(CONFIG_SOC_SERIES_STM32G4X) && !defined(CONFIG_SOC_SERIES_STM32L5X) && \
354+
!defined(CONFIG_SOC_SERIES_STM32F4X)
346355
if (HAL_DMA_ConfigChannelAttributes(&dev_data->hdma, DMA_CHANNEL_NPRIV) != HAL_OK) {
347356
LOG_ERR("HAL_DMA_ConfigChannelAttributes: <Failed>");
348357
return -EIO;
@@ -458,7 +467,7 @@ static int i2s_stm32_sai_configure(const struct device *dev, enum i2s_dir dir,
458467
}
459468

460469
/* Control of MCLK output from SAI configuration is not possible on STM32L4xx MCUs */
461-
#if !defined(CONFIG_SOC_SERIES_STM32L4X)
470+
#if !defined(CONFIG_SOC_SERIES_STM32L4X) && !defined(CONFIG_SOC_SERIES_STM32F4X)
462471
if (cfg->mclk_enable && stream->master) {
463472
hsai->Init.MckOutput = SAI_MCK_OUTPUT_ENABLE;
464473
} else {
@@ -472,7 +481,7 @@ static int i2s_stm32_sai_configure(const struct device *dev, enum i2s_dir dir,
472481
hsai->Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;
473482

474483
/* MckOverSampling is not supported by all STM32L4xx MCUs */
475-
#if !defined(CONFIG_SOC_SERIES_STM32L4X)
484+
#if !defined(CONFIG_SOC_SERIES_STM32L4X) && !defined(CONFIG_SOC_SERIES_STM32F4X)
476485
if (cfg->mclk_div == (enum mclk_divider)MCLK_DIV_256) {
477486
hsai->Init.MckOverSampling = SAI_MCK_OVERSAMPLING_DISABLE;
478487
} else {

0 commit comments

Comments
 (0)