Skip to content

Commit 76983c7

Browse files
committed
WIP: Add audio output on stm32h7s78-dk
Signed-off-by: Titouan Christophe <[email protected]>
1 parent b8e446b commit 76983c7

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

boards/st/stm32h7s78_dk/stm32h7s78_dk.dts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <st/h7rs/stm32h7s7X8.dtsi>
99
#include <st/h7/stm32h7s7l8hxh-pinctrl.dtsi>
1010
#include "arduino_r3_connector.dtsi"
11+
#include <zephyr/dt-bindings/clock/stm32h7rs_clock.h>
1112
#include <zephyr/dt-bindings/input/input-event-codes.h>
1213

1314
/ {
@@ -107,6 +108,18 @@
107108
status = "okay";
108109
};
109110

111+
&pll2 {
112+
div-m = <25>;
113+
mul-n = <147>;
114+
div-p = <2>;
115+
div-q = <25>; /* Tuned for 44.1kHz 16b with MCK on I2S6 */
116+
div-r = <2>;
117+
div-s = <2>;
118+
div-t = <2>;
119+
clocks = <&clk_hse>;
120+
status = "okay";
121+
};
122+
110123
&rcc {
111124
clocks = <&pll>;
112125
clock-frequency = <DT_FREQ_M(250)>;
@@ -192,6 +205,24 @@
192205
&i2c1 {
193206
pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb9>;
194207
pinctrl-names = "default";
208+
status = "okay";
209+
210+
audio_codec: wm8904g@1a {
211+
compatible = "wolfson,wm8904";
212+
reg = <0x1a>;
213+
clocks = <&rcc STM32_SRC_PLL2_Q 0>;
214+
clock-names = "mclk";
215+
};
216+
};
217+
218+
&i2s6 {
219+
pinctrl-0 = <&i2s6_mck_pa3 &i2s6_ws_pa4 &i2s6_ck_pa5 &spi6_mosi_pb5 &spi6_miso_pg12>;
220+
pinctrl-names = "default";
221+
status = "okay";
222+
};
223+
224+
&gpdma1 {
225+
status = "okay";
195226
};
196227

197228
&xspi1 {

drivers/audio/wm8904.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct wm8904_driver_config {
2222
struct i2c_dt_spec i2c;
2323
int clock_source;
2424
const struct device *mclk_dev;
25-
clock_control_subsys_t mclk_name;
25+
clock_control_subsys_t mclk_ctrl;
2626
};
2727

2828
#define DEV_CFG(dev) ((const struct wm8904_driver_config *const)dev->config)
@@ -489,13 +489,13 @@ static int wm8904_configure(const struct device *dev, struct audio_codec_cfg *cf
489489
(uint16_t)(dev_cfg->clock_source));
490490

491491
if (dev_cfg->clock_source == 0) {
492-
int err = clock_control_on(dev_cfg->mclk_dev, dev_cfg->mclk_name);
492+
int err = clock_control_on(dev_cfg->mclk_dev, dev_cfg->mclk_ctrl);
493493

494494
if (err < 0) {
495495
LOG_ERR("MCLK clock source enable fail: %d", err);
496496
}
497497

498-
err = clock_control_get_rate(dev_cfg->mclk_dev, dev_cfg->mclk_name,
498+
err = clock_control_get_rate(dev_cfg->mclk_dev, dev_cfg->mclk_ctrl,
499499
&cfg->mclk_freq);
500500
if (err < 0) {
501501
LOG_ERR("MCLK clock source freq acquire fail: %d", err);
@@ -673,7 +673,7 @@ static const struct audio_codec_api wm8904_driver_api = {
673673
.i2c = I2C_DT_SPEC_INST_GET(n), \
674674
.clock_source = DT_INST_PROP_OR(n, clk_source, 0), \
675675
.mclk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(n, mclk)), \
676-
.mclk_name = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(n, mclk, name)}; \
676+
.mclk_ctrl = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(n, mclk, bus)}; \
677677
\
678678
DEVICE_DT_INST_DEFINE(n, NULL, NULL, NULL, &wm8904_device_config_##n, \
679679
POST_KERNEL, CONFIG_AUDIO_CODEC_INIT_PRIORITY, &wm8904_driver_api);

dts/arm/st/h7rs/stm32h7rs.dtsi

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,20 @@
503503
status = "disabled";
504504
};
505505

506+
i2s6: i2s@58001400 {
507+
compatible = "st,stm32h7-i2s", "st,stm32-i2s";
508+
#address-cells = <1>;
509+
#size-cells = <0>;
510+
reg = <0x58001400 0x400>;
511+
clocks = <&rcc STM32_CLOCK(APB4, 5)>,
512+
<&rcc STM32_SRC_PLL2_Q SPI6_SEL(1)>;
513+
interrupts = <63 3>;
514+
dmas = <&gpdma1 0 62 (STM32_DMA_PERIPH_TX | STM32_DMA_16BITS | STM32_DMA_PRIORITY_HIGH)
515+
&gpdma1 1 61 (STM32_DMA_PERIPH_RX | STM32_DMA_16BITS | STM32_DMA_PRIORITY_HIGH)>;
516+
dma-names = "tx", "rx";
517+
status = "disabled";
518+
};
519+
506520
fdcan1: can@4000a000 {
507521
compatible = "st,stm32-fdcan";
508522
reg = <0x4000a000 0x400>, <0x4000ac00 0x350>;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright 2025 Titouan Christophe
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
CONFIG_SAMPLE_FREQ=5512
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Copyright (c) 2025 Titouan Christophe
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
/ {
7+
aliases {
8+
i2s-codec-tx = &i2s6;
9+
};
10+
};

0 commit comments

Comments
 (0)