From d4839a1a467ab2b8abe0cc759d9992f076133242 Mon Sep 17 00:00:00 2001 From: Titouan Christophe Date: Wed, 24 Sep 2025 13:38:03 +0200 Subject: [PATCH 1/2] drivers: i2s: ll_stm32: fix missing implementation for i2s_config_get This fixes system crashes in `i2s_buf_write`, because this function internally calls `i2s_config_get`, which resulted in a NULL pointer on stm32 i2s devices. Signed-off-by: Titouan Christophe --- drivers/i2s/i2s_ll_stm32.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/i2s/i2s_ll_stm32.c b/drivers/i2s/i2s_ll_stm32.c index 5c66323bd33dc..f976d13c2a703 100644 --- a/drivers/i2s/i2s_ll_stm32.c +++ b/drivers/i2s/i2s_ll_stm32.c @@ -284,6 +284,21 @@ static int i2s_stm32_configure(const struct device *dev, enum i2s_dir dir, return 0; } +static const struct i2s_config *i2s_stm32_config_get(const struct device *dev, + enum i2s_dir dir) +{ + struct i2s_stm32_data *const dev_data = dev->data; + + switch (dir) { + case I2S_DIR_RX: + return &dev_data->rx.cfg; + case I2S_DIR_TX: + return &dev_data->tx.cfg; + default: + return NULL; + } +} + static int i2s_stm32_trigger(const struct device *dev, enum i2s_dir dir, enum i2s_trigger_cmd cmd) { @@ -441,6 +456,7 @@ static int i2s_stm32_write(const struct device *dev, void *mem_block, static DEVICE_API(i2s, i2s_stm32_driver_api) = { .configure = i2s_stm32_configure, + .config_get = i2s_stm32_config_get, .read = i2s_stm32_read, .write = i2s_stm32_write, .trigger = i2s_stm32_trigger, From ed932c10f512ed09d6f9a7dabcfe8c0c6c258bc1 Mon Sep 17 00:00:00 2001 From: Titouan Christophe Date: Tue, 23 Sep 2025 18:07:23 +0200 Subject: [PATCH 2/2] WIP: Add audio output on stm32h7s78-dk Signed-off-by: Titouan Christophe --- boards/st/stm32h7s78_dk/stm32h7s78_dk.dts | 31 +++++++++++++++++++ drivers/audio/wm8904.c | 8 ++--- dts/arm/st/h7rs/stm32h7rs.dtsi | 14 +++++++++ .../i2s/i2s_codec/boards/stm32h7s78_dk.conf | 4 +++ .../i2s_codec/boards/stm32h7s78_dk.overlay | 10 ++++++ 5 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.conf create mode 100644 samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.overlay diff --git a/boards/st/stm32h7s78_dk/stm32h7s78_dk.dts b/boards/st/stm32h7s78_dk/stm32h7s78_dk.dts index 80ab5ae6d8744..2e1f3b25228d4 100644 --- a/boards/st/stm32h7s78_dk/stm32h7s78_dk.dts +++ b/boards/st/stm32h7s78_dk/stm32h7s78_dk.dts @@ -8,6 +8,7 @@ #include #include #include "arduino_r3_connector.dtsi" +#include #include / { @@ -107,6 +108,18 @@ status = "okay"; }; +&pll2 { + div-m = <5>; + mul-n = <294>; + div-p = <2>; + div-q = <125>; /* Tuned for 44.1kHz 16b stereo w/ MCK on I2S6 */ + div-r = <2>; + div-s = <2>; + div-t = <2>; + clocks = <&clk_hse>; + status = "okay"; +}; + &rcc { clocks = <&pll>; clock-frequency = ; @@ -192,6 +205,24 @@ &i2c1 { pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb9>; pinctrl-names = "default"; + status = "okay"; + + audio_codec: wm8904g@1a { + compatible = "wolfson,wm8904"; + reg = <0x1a>; + clocks = <&rcc STM32_SRC_PLL2_Q 0>; + clock-names = "mclk"; + }; +}; + +&i2s6 { + pinctrl-0 = <&i2s6_mck_pa3 &i2s6_ws_pa4 &i2s6_ck_pa5 &spi6_mosi_pb5 &spi6_miso_pg12>; + pinctrl-names = "default"; + status = "okay"; +}; + +&gpdma1 { + status = "okay"; }; &xspi1 { diff --git a/drivers/audio/wm8904.c b/drivers/audio/wm8904.c index 21918ec2a32d1..b0cbd9bd46617 100644 --- a/drivers/audio/wm8904.c +++ b/drivers/audio/wm8904.c @@ -22,7 +22,7 @@ struct wm8904_driver_config { struct i2c_dt_spec i2c; int clock_source; const struct device *mclk_dev; - clock_control_subsys_t mclk_name; + clock_control_subsys_t mclk_ctrl; }; #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 (uint16_t)(dev_cfg->clock_source)); if (dev_cfg->clock_source == 0) { - int err = clock_control_on(dev_cfg->mclk_dev, dev_cfg->mclk_name); + int err = clock_control_on(dev_cfg->mclk_dev, dev_cfg->mclk_ctrl); if (err < 0) { LOG_ERR("MCLK clock source enable fail: %d", err); } - err = clock_control_get_rate(dev_cfg->mclk_dev, dev_cfg->mclk_name, + err = clock_control_get_rate(dev_cfg->mclk_dev, dev_cfg->mclk_ctrl, &cfg->mclk_freq); if (err < 0) { LOG_ERR("MCLK clock source freq acquire fail: %d", err); @@ -673,7 +673,7 @@ static const struct audio_codec_api wm8904_driver_api = { .i2c = I2C_DT_SPEC_INST_GET(n), \ .clock_source = DT_INST_PROP_OR(n, clk_source, 0), \ .mclk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(n, mclk)), \ - .mclk_name = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(n, mclk, name)}; \ + .mclk_ctrl = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(n, mclk, bus)}; \ \ DEVICE_DT_INST_DEFINE(n, NULL, NULL, NULL, &wm8904_device_config_##n, \ POST_KERNEL, CONFIG_AUDIO_CODEC_INIT_PRIORITY, &wm8904_driver_api); diff --git a/dts/arm/st/h7rs/stm32h7rs.dtsi b/dts/arm/st/h7rs/stm32h7rs.dtsi index 663961d45206e..b8ce313c4350a 100644 --- a/dts/arm/st/h7rs/stm32h7rs.dtsi +++ b/dts/arm/st/h7rs/stm32h7rs.dtsi @@ -503,6 +503,20 @@ status = "disabled"; }; + i2s6: i2s@58001400 { + compatible = "st,stm32h7-i2s", "st,stm32-i2s"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x58001400 0x400>; + clocks = <&rcc STM32_CLOCK(APB4, 5)>, + <&rcc STM32_SRC_PLL2_Q SPI6_SEL(1)>; + interrupts = <63 3>; + dmas = <&gpdma1 0 62 (STM32_DMA_PERIPH_TX | STM32_DMA_16BITS | STM32_DMA_PRIORITY_HIGH) + &gpdma1 1 61 (STM32_DMA_PERIPH_RX | STM32_DMA_16BITS | STM32_DMA_PRIORITY_HIGH)>; + dma-names = "tx", "rx"; + status = "disabled"; + }; + fdcan1: can@4000a000 { compatible = "st,stm32-fdcan"; reg = <0x4000a000 0x400>, <0x4000ac00 0x350>; diff --git a/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.conf b/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.conf new file mode 100644 index 0000000000000..eb7f86132b122 --- /dev/null +++ b/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.conf @@ -0,0 +1,4 @@ +# Copyright 2025 Titouan Christophe +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_SAMPLE_FREQ=5512 diff --git a/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.overlay b/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.overlay new file mode 100644 index 0000000000000..6ae252e4dec10 --- /dev/null +++ b/samples/drivers/i2s/i2s_codec/boards/stm32h7s78_dk.overlay @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2025 Titouan Christophe + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + i2s-codec-tx = &i2s6; + }; +};