Skip to content

Commit 7b59e4c

Browse files
committed
drivers: i2s: add sai support for stm32h7xx
Define SAI1 node for STM32H7xx series. Add STM32H7xx related DMA configs. Enable samples/drivers/i2s/output for nucleo_h745zi_q/m7 Signed-off-by: Mario Paja <[email protected]>
1 parent 6413185 commit 7b59e4c

File tree

4 files changed

+97
-5
lines changed

4 files changed

+97
-5
lines changed

drivers/i2s/i2s_stm32_sai.c

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (c) 2024 ZAL Zentrum für Angewandte Luftfahrtforschung GmbH
3-
* Copyright (c) 2024 Mario Paja
2+
* Copyright (c) 2024-2025 ZAL Zentrum für Angewandte Luftfahrtforschung GmbH
3+
* Copyright (c) 2024-2025 Mario Paja
44
*
55
* SPDX-License-Identifier: Apache-2.0
66
*/
@@ -276,17 +276,23 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
276276
/* HACK: This field is used to inform driver that it is overridden */
277277
dma_cfg.linked_channel = STM32_DMA_HAL_OVERRIDE;
278278

279-
/* Because of the STREAM OFFSET, the DMA channel given here is from 1 - */
280-
ret = dma_config(stream->dma_dev, stream->dma_channel, &dma_cfg);
279+
/* Because of the STREAM OFFSET, the DMA channel given here is from 1 - 8 */
280+
ret = dma_config(stream->dma_dev, stream->dma_channel + STM32_DMA_STREAM_OFFSET, &dma_cfg);
281281

282282
if (ret != 0) {
283283
LOG_ERR("Failed to configure DMA channel %d",
284284
stream->dma_channel + STM32_DMA_STREAM_OFFSET);
285285
return ret;
286286
}
287287

288+
#if defined(CONFIG_SOC_SERIES_STM32H7X)
289+
hdma->Instance = __LL_DMA_GET_STREAM_INSTANCE(stream->reg, stream->dma_channel);
290+
hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
291+
hdma->Init.MemDataAlignment = DMA_PDATAALIGN_HALFWORD;
292+
hdma->Init.Priority = DMA_PRIORITY_HIGH;
293+
hdma->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
294+
#else
288295
hdma->Instance = LL_DMA_GET_CHANNEL_INSTANCE(stream->reg, stream->dma_channel);
289-
hdma->Init.Request = dma_cfg.dma_slot;
290296
hdma->Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
291297
hdma->Init.SrcDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;
292298
hdma->Init.DestDataWidth = DMA_DEST_DATAWIDTH_HALFWORD;
@@ -295,17 +301,34 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
295301
hdma->Init.DestBurstLength = 1;
296302
hdma->Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 | DMA_DEST_ALLOCATED_PORT0;
297303
hdma->Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
304+
#endif
305+
306+
hdma->Init.Request = dma_cfg.dma_slot;
298307
hdma->Init.Mode = DMA_NORMAL;
299308

300309
if (stream->dma_cfg.channel_direction == (enum dma_channel_direction)MEMORY_TO_PERIPHERAL) {
301310
hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
311+
312+
#if defined(CONFIG_SOC_SERIES_STM32H7X)
313+
hdma->Init.PeriphInc = DMA_PINC_DISABLE;
314+
hdma->Init.MemInc = DMA_MINC_ENABLE;
315+
#else
302316
hdma->Init.SrcInc = DMA_SINC_INCREMENTED;
303317
hdma->Init.DestInc = DMA_DINC_FIXED;
318+
#endif
319+
304320
__HAL_LINKDMA(hsai, hdmatx, dev_data->hdma);
305321
} else {
306322
hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
323+
324+
#if defined(CONFIG_SOC_SERIES_STM32H7X)
325+
hdma->Init.PeriphInc = DMA_PINC_ENABLE;
326+
hdma->Init.MemInc = DMA_MINC_DISABLE;
327+
#else
307328
hdma->Init.SrcInc = DMA_SINC_FIXED;
308329
hdma->Init.DestInc = DMA_DINC_INCREMENTED;
330+
#endif
331+
309332
__HAL_LINKDMA(hsai, hdmarx, dev_data->hdma);
310333
}
311334

@@ -314,10 +337,12 @@ static int i2s_stm32_sai_dma_init(const struct device *dev)
314337
return -EIO;
315338
}
316339

340+
#ifndef CONFIG_SOC_SERIES_STM32H7X
317341
if (HAL_DMA_ConfigChannelAttributes(&dev_data->hdma, DMA_CHANNEL_NPRIV) != HAL_OK) {
318342
LOG_ERR("HAL_DMA_ConfigChannelAttributes: <Failed>");
319343
return -EIO;
320344
}
345+
#endif
321346

322347
return 0;
323348
}

dts/arm/st/h7/stm32h7.dtsi

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright (c) 2019 Centaur Analytics, Inc
44
* Copyright (c) 2020 Teslabs Engineering S.L.
55
* Copyright (c) 2024 STMicroelectronics
6+
* Copyright (c) 2025 ZAL Zentrum für Angewandte Luftfahrtforschung GmbH
67
*
78
* SPDX-License-Identifier: Apache-2.0
89
*/
@@ -1091,6 +1092,30 @@
10911092
STM32_DMA_PRIORITY_HIGH) STM32_DMA_FIFO_1_4>;
10921093
status = "disabled";
10931094
};
1095+
1096+
sai1_a: sai1@40015804 {
1097+
compatible = "st,stm32-sai";
1098+
#address-cells = <1>;
1099+
#size-cells = <0>;
1100+
reg = <0x40015804 0x20>;
1101+
clocks = <&rcc STM32_CLOCK(APB2, 22)>,
1102+
<&rcc STM32_SRC_PLL2_P SAI1_SEL(1)>;
1103+
dmas = <&dma1 1 87 (STM32_DMA_MODE_NORMAL | STM32_DMA_PRIORITY_HIGH |
1104+
STM32_DMA_16BITS) STM32_DMA_FIFO_1_4>;
1105+
status = "disabled";
1106+
};
1107+
1108+
sai1_b: sai1@40015824 {
1109+
compatible = "st,stm32-sai";
1110+
#address-cells = <1>;
1111+
#size-cells = <0>;
1112+
reg = <0x40015824 0x20>;
1113+
clocks = <&rcc STM32_CLOCK(APB2, 22)>,
1114+
<&rcc STM32_SRC_PLL2_P SAI1_SEL(1)>;
1115+
dmas = <&dma1 0 88 (STM32_DMA_MODE_NORMAL | STM32_DMA_PRIORITY_HIGH |
1116+
STM32_DMA_16BITS) 0>;
1117+
status = "disabled";
1118+
};
10941119
};
10951120

10961121
die_temp: dietemp {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CONFIG_HEAP_MEM_POOL_SIZE=4192
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2025 ZAL Zentrum für Angewandte Luftfahrtforschung GmbH
3+
* Copyright (c) 2025 Mario Paja
4+
*
5+
* SPDX-License-Identifier: Apache-2.0
6+
*/
7+
8+
/ {
9+
aliases {
10+
i2s-tx = &sai1_b;
11+
};
12+
};
13+
14+
&pll2 {
15+
/* 44.1KHz (0.03% Error) */
16+
div-m = <8>;
17+
mul-n = <192>;
18+
div-q = <2>;
19+
div-r = <2>;
20+
div-p = <17>;
21+
clocks = <&clk_hse>;
22+
status = "okay";
23+
};
24+
25+
&sai1_b {
26+
pinctrl-0 = <&sai1_mclk_b_pf7 &sai1_sd_b_pe3
27+
&sai1_fs_b_pf9 &sai1_sck_b_pf8>;
28+
pinctrl-names = "default";
29+
status = "okay";
30+
mclk-enable;
31+
mclk-divider = "div-256";
32+
dma-names = "tx";
33+
};
34+
35+
&dmamux1{
36+
status = "okay";
37+
};
38+
39+
&dma1{
40+
status = "okay";
41+
};

0 commit comments

Comments
 (0)