I have a problem with the audio codec - WM8962.
I work on my own platform, modeled on imx8mp-devkit.
Diagram:
Added device to devicetree:
reg_audio_pwr: regulator-audio-pwr {compatible = "regulator-fixed";regulator-name = "audio-pwr";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;gpio = <&gpio4 29 GPIO_ACTIVE_HIGH>;enable-active-high;regulator-always-on;};sound-wm8962 {compatible = "simple-audio-card";simple-audio-card,name = "wm8962";simple-audio-card,format = "i2s";simple-audio-card,widgets ="Headphone", "Headphones","Microphone", "Headset Mic","Speaker", "Speaker";simple-audio-card,routing ="Headphones", "HPOUTL","Headphones", "HPOUTR","Speaker", "SPKOUTL","Speaker", "SPKOUTR","Headset Mic", "MICBIAS","IN3R", "Headset Mic";simple-audio-card,hp-det-gpio = <&gpio4 28 0>;simple-audio-card,cpu {sound-dai = <&sai3>;};simple-audio-card,codec {sound-dai = <&codec>;frame-master;bitclock-master;};};&sai3 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_sai3>;assigned-clocks = <&clk IMX8MP_CLK_SAI3>;assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;assigned-clock-rates = <6144000>;fsl,sai-mclk-direction-output;#sound-dai-cells = <0>;status = "okay";};pinctrl_sai3: sai3grp {fsl,pins = <MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_SAI3_TX_SYNC 0xd6MX8MP_IOMUXC_SAI3_TXC__AUDIOMIX_SAI3_TX_BCLK 0xd6MX8MP_IOMUXC_SAI3_RXD__AUDIOMIX_SAI3_RX_DATA00 0xd6MX8MP_IOMUXC_SAI3_TXD__AUDIOMIX_SAI3_TX_DATA00 0xd6MX8MP_IOMUXC_SAI3_MCLK__AUDIOMIX_SAI3_MCLK 0xd6>;};
[ 6.596032] wm8962 2-001a: customer id 0 revision F[ 6.854604] input: wm8962 Headphones as /devices/platform/sound-wm8962/sound/card2/input1
root@imx8mp-lpddr4-evk:~# aplay -l**** List of PLAYBACK Hardware Devices ****card 0: imxaudioxcvr [imx-audio-xcvr], device 0: XCVR PCM snd-soc-dummy-dai-0 [XCVR PCM snd-soc-dummy-dai-0]Subdevices: 1/1Subdevice #0: subdevice #0card 1: btscoaudio [bt-sco-audio], device 0: 30c20000.sai-bt-sco-pcm-wb bt-sco-pcm-wb-0 [30c20000.sai-bt-sco-pcm-wb bt-sco-pcm-wb-0]Subdevices: 1/1Subdevice #0: subdevice #0card 2: wm8962 [wm8962], device 0: 30c30000.sai-wm8962 wm8962-0 [30c30000.sai-wm8962 wm8962-0]Subdevices: 1/1Subdevice #0: subdevice #0
root@imx8mp-lpddr4-evk:~# gst-launch-1.0 playbin uri=file:///unit_tests/Audio/sample_22_frames.mp3 audio-sink="alsasink device=hw:2,0"[ 27.363409] audit: type=1701 audit(1667923787.928:18): auid=4294967295 uid=0 gid=0 ses=4294967295 pid=682 comm="vsidaemon" exe="/usr/bin/vsidaemon" sig=6 res=1[ 37.603724] audit: type=1701 audit(1667923798.168:19): auid=4294967295 uid=0 gid=0 ses=4294967295 pid=725 comm="vsidaemon" exe="/usr/bin/vsidaemon" sig=6 res=1[ 38.876656] audit: type=1334 audit(1667923799.444:20): prog-id=0 op=UNLOAD[ 38.883569] audit: type=1334 audit(1667923799.444:21): prog-id=0 op=UNLOADSetting pipeline to PAUSED ...Pipeline is PREROLLING ...====== BEEP: 4.7.3 build on Feb 3 2023 05:14:46. ======Core: DSP decoder Wrapper build on Dec 20 2022 13:03:58file: /usr/lib/imx-mm/audio-codec/wrap/lib_dsp_wrap_arm_elinux.so====== BEEP: 4.7.3 build on Feb 3 2023 05:14:46. ======Core: MP3 decoder Wrapper build on Jan 11 2018 10:20:25file: /usr/lib/imx-mm/audio-codec/wrap/lib_mp3d_wrap_arm_elinux.so.3CODEC: BLN_MAD-MMCODECS_MP3D_ARM_02.13.01_ARMV8 build on Sep 16 2022 13:30:45.Redistribute latency...Pipeline is PREROLLED ...Setting pipeline to PLAYING ...Redistribute latency...New clock: GstAudioSinkClockChandling interrupt. (0.0 %)
Yes, I checked the "aplay" function:
aplay -D sysdefault:CARD=wm8962 /unit_tests/Audio/sample_22_frames.mp3
And there was no improvement.
I made a modification in "devicetree":
sound-wm8962 {compatible = "simple-audio-card";simple-audio-card,name = "wm8962";simple-audio-card,format = "i2s";simple-audio-card,bitclock-inversion;simple-audio-card,frame-master = <&wmcpu>;simple-audio-card,bitclock-master = <&wmcpu>;simple-audio-card,widgets ="Headphone", "Headphones","Microphone", "Headset Mic","Speaker", "Speaker";simple-audio-card,routing ="Headphones", "HPOUTL","Headphones", "HPOUTR","Speaker", "SPKOUTL","Speaker", "SPKOUTR","Headset Mic", "MICBIAS","IN3R", "Headset Mic";simple-audio-card,hp-det-gpio = <&gpio4 28 0>;wmcpu: simple-audio-card,cpu {sound-dai = <&sai3>;dai-tdm-slot-num = <2>;dai-tdm-slot-width = <8>;};simple-audio-card,codec {sound-dai = <&codec 0>;};};
Hello,
Got it, once the sound card is detected on Linux it should be correctly configured and ready to be used.
On the path with an audio test .wav file please try with the next command:
aplay -Dplughw:2,0 <your_audio_test >.wav
Where :
-D: selects the device.
In the case of gstreamer I suggest you use the example on i.MX8 Gstreamer User's Guide that is on the chapter 7.
Best regards.
thank you for the hint.
I also used aplay and gst.
root@imx8mp-lpddr4-evk:/home# aplay -D plughw:2,0 audiocheck.net_hdsweep_1Hz_48000Hz_-3dBFS_30s.wav
Playing WAVE 'audiocheck.net_hdsweep_1Hz_48000Hz_-3dBFS_30s.wav' : Signed 16 bit Little Endian, Rate 96000 Hz, Mono
root@imx8mp-lpddr4-evk:/home# gst-launch-1.0 filesrc location=acdc_44000.mp3 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! alsasink device=plughw:2
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstAudioSinkClock
^Chandling interrupt. (9.4 %)
Interrupt: Stopping pipeline ...
Execution ended after 0:00:19.513247750
I checked the signal lines in both cases.
Everything looks correct, but the codec does not output any signals to the speakers.
It looks like a configuration problem but I have no idea what could be wrong.
Hello,
I am a little confused, your image shows data on ADCDAT line. This is an output from the codec. When you are playing audio from the MPU you should see data on DACDAT line.
I think that the image is not showing all the data transfer. Could you confirm it?
Best regards.
Jorge.
Hi,
yes you are right adcdat is the output of the codec. I got the signals wrong and it should be the other way around.
I checked again to make sure and it's just a naming error.
I'm sending the corrected image of the signals again.
Yes, the image does not show the entire data transfer.