[alsa-devel] No sound captured with SGTL5000 on i.MX6 in I²S master mode

Jean-Michel Hautbois jean-michel.hautbois at vodalys.com
Thu Sep 18 16:09:02 CEST 2014


2014-09-18 15:55 GMT+02:00 Michael Trimarchi <michael at amarulasolutions.com>:
> Hi
>
> On Thu, Sep 18, 2014 at 3:45 PM, Jean-Michel Hautbois
> <jean-michel.hautbois at vodalys.com> wrote:
>> 2014-09-18 15:35 GMT+02:00 Michael Trimarchi <michael at amarulasolutions.com>:
>>> Hi
>>>
>>> On Thu, Sep 18, 2014 at 3:30 PM, Fabio Estevam <festevam at gmail.com> wrote:
>>>> Hi Jean-Michel,
>>>>
>>>> On Thu, Sep 18, 2014 at 9:56 AM, Jean-Michel Hautbois
>>>> <jean-michel.hautbois at vodalys.com> wrote:
>>>>> Hi,
>>>>>
>>>>> Sorry if double posting, I have not received confirmation on
>>>>> subscription yesterday... So I try again :/.
>>>>>
>>>>> I have a custom i.MX6 board, and have a sgtl5000 connected on it. I
>>>>> would like to have it used in master mode (it is used only for audio
>>>>> capture) but I get a "pcm_read:2031: read error: Input/output error"
>>>>> when using arecord.
>>>>> I have checked my signals and I get something on I²S which seems to be good.
>>>>> I launch :
>>>>> $> arecord -f cd -Dhw:0,0 -v -V stereo
>>>>> Receive Frame Sync is 44.1KHz
>>>>> Receive Clock Signal is ~1MHz (I can be more precise if needed)
>>>>> Data Receive is present, only when arecord is launched. It stops when
>>>>> there is no capture asked.
>>>>> Both clocks are still present even when no arecord is running.
>>>>>
>>>>> This suggests, for me, that master mode is working.
>>>>> So, I don't know why I can't get any data to my arecord. Is this a
>>>>> left/right justified master mode ? Anything else ?
>>>>
>>>
>>> Yes, can you check if the direction of the mux-port is correct and you
>>> are really get data.
>>
>> Mmh, can you explain in more details, I don't get it...
>>
>
> ssi is the peripheral that is rooted from the pins outside (audmux) and audmux
> should configured according to clock direction and data direction etc. I don't
> remember now is done now in the latest kernel, because I have in the
> head too much architecture,
> but it should be possible to dump it from sysfs how is configured. So
> you need to check if it match

OK, I will try to find out everything I can.

>>>> I am also trying to test fsl_ssi in master mode.
>>>>
>>>> I am running linux-next 20140912 with the following changes to get SSI
>>>> in master mode:
>>>>
>>>> --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>>> +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
>>>> @@ -532,6 +532,7 @@
>>>>  };
>>>>
>>>>  &ssi2 {
>>>> +       fsl,mode = "i2s-master";
>>>>         status = "okay";
>>>>  };
>>>>
>>>> diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
>>>> index 3a3d17c..09ea6a5 100644
>>>> --- a/sound/soc/fsl/imx-wm8962.c
>>>> +++ b/sound/soc/fsl/imx-wm8962.c
>>>> @@ -247,7 +247,7 @@ static int imx_wm8962_probe(struct platform_device *pdev)
>>>>         data->dai.platform_of_node = ssi_np;
>>>>         data->dai.ops = &imx_hifi_ops;
>>>>         data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
>>>> -                           SND_SOC_DAIFMT_CBM_CFM;
>>>> +                           SND_SOC_DAIFMT_CBS_CFS;
>>>>
>>>>         data->card.dev = &pdev->dev;
>>>>         ret = snd_soc_of_parse_card_name(&data->card, "model");
>>>>
>>>> ,but when I do aplay I do not get any sound.
>>>>
>>>>> I am wondering if I forgot something in my DT or if I need to do
>>>>> something else :
>>>>>
>>>>>     sound {
>>>>>         compatible = "fsl,imx6q-vbx3-sgtl5000",
>>>>>                  "fsl,imx-audio-sgtl5000";
>>>>>         model = "imx6q-vbx3-sgtl5000";
>>>>>         ssi-controller = <&ssi1>;
>>>>>         audio-codec = <&codec>;
>>>>>         audio-routing =
>>>>>             "LINE_IN", "Line In Jack";
>>>>>         mux-int-port = <1>;
>>>>>         mux-ext-port = <5>;
>>>>>     };
>>>>>
>>>>> &audmux {
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_audmux>;
>>>>>     status = "okay";
>>>>> };
>>>>>
>>>>> &i2c2 {
>>>>>     clock-frequency = <100000>;
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_i2c2>;
>>>>>     status = "okay";
>>>>>
>>>>>     codec: sgtl5000 at 0a {
>>>>>         compatible = "fsl,sgtl5000";
>>>>>         reg = <0x0a>;
>>>>>         clocks = <&clks 201>;
>>>>>         VDDA-supply = <&vgen6_reg>;
>>>>>         VDDIO-supply = <&vgen6_reg>;
>>>>>         sysclk = <24000000>;
>>>>>     };
>>>>> };
>>>>>
>>>>> &iomuxc {
>>>>>     pinctrl-names = "default";
>>>>>     pinctrl-0 = <&pinctrl_hog>;
>>>>>
>>>>>     imx6qdl-vbx3 {
>>>>>         pinctrl_audmux: audmuxgrp {
>>>>>             fsl,pins = <
>>>>>                 MX6QDLPAD_DISP0_DAT13__AUD5_RXFS        0x130b0
>>>>>                 MX6QDL_PAD_DISP0_DAT14__AUD5_RXC        0x130b0
>>>>>                 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD        0x130b0
>>>>>             >;
>>>>>         };
>>>>> };
>>>>>
>>>>> &ssi1 {
>>>>>     status = "okay";
>>>>>     codec-handle = <&codec>;
>>>>
>>>> I think this codec-handle is not needed here.
>>>>
>>>>>     fsl,mode = "i2s-master";
>>>>>     fsl,ssi-asynchronous; /* Not sure about it, but does not change anything */
>>>>> };
>>>>>
>>>>> Here is the dmesg part :
>>>>> [    6.026803] sgtl5000 1-000a: sgtl5000 revision 0x11
>>>>> [    6.129380] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
>>>>> [    6.248849] platform sound: Driver imx-sgtl5000 requests probe deferral
>>>>> [    6.311643] sgtl5000 1-000a: Using internal LDO instead of VDDD
>>>>> [    6.393196] imx-sgtl5000 sound: sgtl5000 <-> 2028000.ssi mapping ok
>>>>>
>>>>> And the user space commands :
>>>>> $> arecord -l
>>>>> **** List of CAPTURE Hardware Devices ****
>>>>> card 0: imx6qvbx3sgtl50 [imx6q-vbx3-sgtl5000], device 0: HiFi sgtl5000-0 []
>>>>>   Subdevices: 1/1
>>>>>   Subdevice #0: subdevice #0
>>>>>
>>>>> $> arecord -v -V stereo -fdat -D hw:0,0 somefile.wav
>>>>> Recording WAVE 'somefile.wav' : Signed 16 bit Little Endian, Rate
>>>>> 48000 Hz, Stereo
>>>>> Hardware PCM card 0 'imx6q-vbx3-sgtl5000' device 0 subdevice 0
>>>>> Its setup is:
>>>>>   stream       : CAPTURE
>>>>>   access       : RW_INTERLEAVED
>>>>>   format       : S16_LE
>>>>>   subformat    : STD
>>>>>   channels     : 2
>>>>>   rate         : 48000
>>>>>   exact rate   : 48000 (48000/1)
>>>>>   msbits       : 16
>>>>>   buffer_size  : 16384
>>>>>   period_size  : 4096
>>>>>   period_time  : 85333
>>>>>   tstamp_mode  : NONE
>>>>>   period_step  : 1
>>>>>   avail_min    : 4096
>>>>>   period_event : 0
>>>>>   start_threshold  : 1
>>>>>   stop_threshold   : 16384
>>>>>   silence_threshold: 0
>>>>>   silence_size : 0
>>>>>   boundary     : 1073741824
>>>>>   appl_ptr     : 0
>>>>>   hw_ptr       : 0
>>>>> arecord: pcm_read:2031: read error: Input/output error
>>>>>
>>>
>>> The clock is not get in
>>
>> And what can this mean from a driver/mux perspective ?
>
> ssi <--- audmxux ---> pins (configured by pinctrl)
>
> I forget that you see the clock out. BTW too late. What I'm trying to
> said is that even if pins are configured and routed they can be routed
> in the wrong direction. Right now you try to generate both clock from
> the cpu and you can see them but receive path can be configured in
> syncronous mode or it can work take the clock from another pin. What
> is your configuration?

The master clock is provided by the CPU but I just found out
something. I have a FPGA between sgtl5000 and i.MX6. It is here in
order to route signals. And when imx-audmux is probed, it does not
find the clock, because the FPGA is not configured yet.
And as this driver is not returning EPROBE_DEFER, it does not try a
little bit later (when the clock will really be here).
I don't know if this is the explanation of my issue, but at least this
is an interesting catch.
I will try and get you informed.

JM


More information about the Alsa-devel mailing list