cancel
Showing results for 
Search instead for 
Did you mean: 

how to connect stm32mp157c-dk2 with WM8960 Audio HAT

l_Homme
Associate II

Hello everyone, I would like to connect the stm32mp157c-dk2 card with the wm8960 audio codec,here is the device tree configuration I made.

/* sound card*/
 
 snd_i2s2: snd_i2s2 {
 
            compatible = "audio-graph-card";
            widgets =
                        "Microphone", "Mic Jack",
                        "Line", "Line In",
                        "Line", "Line Out",
                        "Speaker", "Speaker",
                        "Headphone", "Headphone Jack";
 
 
            routing =
                        "Headphone Jack", "HP_L",
                        "Headphone Jack", "HP_R",
                        "Speaker", "SPK_LP",
                        "Speaker", "SPK_LN",
                        "LINPUT1", "Mic Jack",
                        "LINPUT3", "Mic Jack",
                        "RINPUT1", "Mic Jack",
                        "RINPUT2", "Mic Jack";
 
                        
            dais = <&i2s3_port>;
            status = "okay";
    };
 
/* i2s3 pin definition */
 
&pinctrl {
 
		i2s3_pins_a: i2s3-0 {
		
			pins1 {
				pinmux = <STM32_PINMUX('E', 12, AF5)>, /* SCK */
					<STM32_PINMUX('E', 14, AF5)>; /* SDI */
					bias-disable;
					drive-push-pull;
					slew-rate = <1>;
				};
 
				pins2 {
					pinmux = <STM32_PINMUX('E', 13, AF5)>; /* SDO */
					bias-disable;
				};
		};
 
		i2s3_pins_sleep_a:i2s3-1{
			pins {
				pinmux = <STM32_PINMUX('E', 12, ANALOG)>, /* SCK */
					 <STM32_PINMUX('E', 13, ANALOG)>, /* SDI */
					<STM32_PINMUX('E', 14, ANALOG)>; /* SDO */
			};
		};
 
        
};
 
/* codec control using i2c5*/
 
&i2c5 {
		pinctrl-names = "default", "sleep";
		pinctrl-0 = <&i2c5_pins_a>;
		pinctrl-1 = <&i2c5_pins_sleep_a>;
		i2c-scl-rising-time-ns = <185>;
		i2c-scl-falling-time-ns = <20>;
		status = "okay";
		/delete-property/dmas;
		/delete-property/dma-names;
		 
		// Device tree node for Audio Codec
 
		wm8960: wm8960@1a { 
				compatible = "wlf,wm8960";
				reg = <0x1a>;
				AVDD-supply = <&v3v3>;
				clocks = <&rcc SPI3>;
				clock-names = "mclk";
				wlf,shared-lrclk;
				 
				codec_port: port@0 {
					codec_endpoint: endpoint {
						remote-endpoint = <&i2s3_endpoint>;
					};
				};
 
		};
 
};
 
 
 
 
/* audio dai */
 
&i2s3 {
		clocks = <&rcc SPI3>, <&rcc SPI3_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
		clock-names = "pclk", "i2sclk", "x8k", "x11k";
		pinctrl-names = "default", "sleep";
		pinctrl-0 = <&i2s3_pins_a>;
		pinctrl-1 = <&i2s3_pins_sleep_a>;
		status = "okay";
		 
		i2s3_port: port {
			i2s3_endpoint: endpoint {
				remote-endpoint = <&codec_endpoint>;
				format = "i2s";
				mclk-fs = <256>;
			};
		};
};

I have the following error showing when I try to record audio.

arecord: pcm_read:2143: read error: input/output error

[   2.215178] st,stm32-i2s 4000c000.audio-controller: No cache defaults, reading back from HW

thank you in advance

6 REPLIES 6
Christophe Guibout
ST Employee

Hello @l_Homme​ ,

Could you please confirm that you reworked your board to be able to use IIS from Rpi connector ?

  • SB1, SB2, SB3 and SB4 have to be unsoldered (in order to disconnect embedded audio codec)
  • SB13, SB14, SB15 and SB16 have to be closed to connect IIS to SAI2.

The schematic available in the wiki : Link.

I'am not sure to understand the i2s3 entry in the DT, because I think that codec_endpoint needs to be connected to SAI.

	wm8960: wm8960{
	[...]
		ports {
			[...]
			wm8960_tx_endpoint: port@0 {
				reg = <0>;
				remote-endpoint = <&sai2a_endpoint>;
			};
 
			wm8960_rx_endpoint: port@1 {
				reg = <1>;
				remote-endpoint = <&sai2b_endpoint>;
			};
		};
	};

And connect them to SAI like the hereafter patch :

 		sai2a_port: port {
 			sai2a_endpoint: endpoint {
-				remote-endpoint = <&cs42l51_tx_endpoint>;
+				remote-endpoint = <&wm8960_tx_endpoint>;
 				format = "i2s";
 				mclk-fs = <256>;
 				dai-tdm-slot-num = <2>;
 				dai-tdm-slot-width = <32>;
 			};
 
 
 		sai2b_port: port {
 			sai2b_endpoint: endpoint {
-				remote-endpoint = <&cs42l51_rx_endpoint>;
+				remote-endpoint = <&wm8960_rx_endpoint>;
 				format = "i2s";
 				mclk-fs = <256>;
 				dai-tdm-slot-num = <2>;
 				dai-tdm-slot-width = <32>;
 			};
 		};

BR,

Christophe

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
l_Homme
Associate II

thanks for your answer,

however i want to use both codecs, that of the stm32mp1 card (CS42L51) and my new external codec.

so replace the remote-endpoint = <& cs42l51_rx_endpoint>; by remote-endpoint = <& wm8960_rx_endpoint>; don't bother me. you offer me what solution? thank you

hello,

Have you solved the problem? I have the same problem as you。

   sound: sound {
        compatible = "audio-graph-card";
        label = "STM32MP1-DK";
 
        widgets =
            "Microphone", "Mic Jack",
            "Line", "Line In",
            "Line", "Line Out",
            "Speaker", "Speaker",
            "Headphone", "Headphone Jack";
 
        routing =
            "Headphone Jack", "HP_L",
            "Headphone Jack", "HP_R",
            "Speaker", "SPK_LP",
            "Speaker", "SPK_LN",
            "Speaker", "SPK_RP",
            "Speaker", "SPK_RN",
            "LINPUT1", "Mic Jack",
            "LINPUT3", "Mic Jack",
            "RINPUT1", "Mic Jack",
            "RINPUT2", "Mic Jack";
 
        dais = <&sai2a_port &sai2b_port  &sai4a_port &spdifrx_port &i2s2_port>;
        status = "okay";
    };
 
&sai2 {
    clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
    clock-names = "pclk", "x8k", "x11k";
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
    pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
    status = "okay";
 
    sai2a: audio-controller@4400b004 {
        #clock-cells = <0>;
        dma-names = "tx";
        clocks = <&rcc SAI2_K>;
        clock-names = "sai_ck";
        status = "okay";
 
        sai2a_port: port {
            sai2a_endpoint: endpoint {
                remote-endpoint = <&wm8960_tx_endpoint>;
                format = "i2s";
                mclk-fs = <256>;
                dai-tdm-slot-num = <2>;
                dai-tdm-slot-width = <32>;
            };
        };
    };
   sai2b: audio-controller@4400b024 {
        dma-names = "rx";
        st,sync = <&sai2a 2>;
        clocks = <&rcc SAI2_K>, <&sai2a>;
        clock-names = "sai_ck", "MCLK";
        status = "okay";
 
        sai2b_port: port {
            sai2b_endpoint: endpoint {
                remote-endpoint = <&wm8960_rx_endpoint>;
                format = "i2s";
                mclk-fs = <256>;
                dai-tdm-slot-num = <2>;
                dai-tdm-slot-width = <32>;
            };
        };
    };
};
    wm8960: wm8960@1a {
        compatible = "wlf,wm8960";
        reg = <0x1a>;
        #sound-dai-cells = <0>;
        status = "okay";
        //wlf,shared-lrclk;
        wlf,capless;
        clocks = <&sai2a>;
        clock-names = "MCLK1";
 
        ports {
            #address-cells = <1>;
            #size-cells = <0>;
 
            wm8960_tx_port: port@0 {
                reg = <0>;
                wm8960_tx_endpoint: endpoint {
                    remote-endpoint = <&sai2a_endpoint>;
                };
            };
 
            wm8960_rx_port: port@1 {
                reg = <1>;
                wm8960_rx_endpoint: endpoint {
                    remote-endpoint = <&sai2b_endpoint>;
                };
            };
        };

I have the following error showing when I try to record audio.

arecord: pcm_read:2143: read error: input/output error

[  4.369396] st,stm32-i2s 4000b000.audio-controller: No cache defaults, reading back from HW

Hello @l_Homme​ ,

It's not possible to use the 2 channels of both codecs on Disco board because both codecs share same wires / SAI.

BTY, do you plan to use tx and rx for each codec ?

BR,

Christophe

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.

Hello @Christophe Guibout​ ,

no no I would like to use only the RX for each codec

Hello @l_Homme​ ,

In that case, I would recommend to connect sai2a_endpoint to wm8960_rx_endpoint and sai2b_endpoint to cs42l51_rx_endpoint.

You also need to open/close SB1~SB4 and SB13~SB16 accordingly.

BR,

Christophe

In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.