Question about audio record with ssi as i2s slave

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Question about audio record with ssi as i2s slave

Jump to solution
2,175 Views
levisli
Contributor II

Hello guys,

We are try to perform audio record function on imx6q platform.

The hardware design is as follows:

1. The analog voice signal comes into TEF6638 from AIN0 and digital I2S signal output from HOST_O_SD0,TEF6638 provides bit clock and word select signal through HOST_BCK and HOST_WS

2. In the i.MX6  side,ssi1 and AUD3 is used to receive I2S clock and data from TEF6638

3.The I2C reg configurations of TEF6638 are all done in MCU side, and i.MX6 is only responsible for codec.

My configurations of i.MX6 side are:

1.device tree:

tef6638_codec: tef6638-codec {                                      
                compatible = "tef6638-codec";                               
                //clocks = <&clks IMX6QDL_CLK_CKO>;                              
        };

sound-tef6638 {                                                     
                compatible = "fsl,imx-audio-tef6638";                       
                model = "imx-tef6638";                                      
                ssi-controller = <&ssi1>;                                   
                audio-codec = <&tef6638_codec>;                             
                mux-int-port = <1>;                                         
                mux-ext-port = <3>;                                         
        };

&ssi1 {                                                                     
        fsl,mode = "i2s-slave";                                             
        status = "okay";                                                    
};

2.AUDMUX

static int imx_audmux_config(int slave, int master)                         
{                                                                           
    unsigned int ptcr, pdcr;                                                
    /*                                                                      
     * The port numbering in the hardware manual starts at 1, while         
     * the audmux API expects it starts at 0.                               
     */                                                                     
     slave = slave - 1;                                                     
     master = master - 1;                                                   
                                                                            
     ptcr = IMX_AUDMUX_V2_PTCR_SYN |                                        
            IMX_AUDMUX_V2_PTCR_TFSDIR |                                     
            IMX_AUDMUX_V2_PTCR_TFSEL(master) |                              
            IMX_AUDMUX_V2_PTCR_TCLKDIR |                                    
            IMX_AUDMUX_V2_PTCR_TCSEL(master);                               
     pdcr = IMX_AUDMUX_V2_PDCR_RXDSEL(master);                              
     imx_audmux_v2_configure_port(slave, ptcr, pdcr);                       
                                                                            
     ptcr = IMX_AUDMUX_V2_PTCR_SYN;                                         
     pdcr = IMX_AUDMUX_V2_PDCR_RXDSEL(slave);                               
     imx_audmux_v2_configure_port(master, ptcr, pdcr);                      
                                                                            
     return 0;                                                              
}

3.hw params:

static int imx_tef6638_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params)          {                                                                           
    struct snd_soc_pcm_runtime *rtd = substream->private_data;              
    struct snd_soc_dai *cpu_dai = rtd->cpu_dai;                             
    struct snd_soc_dai *codec_dai = rtd->codec_dai;                         
    unsigned int channels = params_channels(params);                        
    int ret = 0;                                                            
    u32 dai_format;                                                         

                                                                                  
    dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LSB | SND_SOC_DAIFMT_NB_NF |
                 SND_SOC_DAIFMT_CBM_CFM;                                    
                                                                            
    /* set cpu DAI configuration */                                         
    ret = snd_soc_dai_set_fmt(cpu_dai, dai_format);                         
    if (ret < 0) {                                                          
        printk("imx_tef6638_hw_params: snd_soc_dai_set_fmt error!\n");
        return ret;                                                         
    }                                                                       
                                                                            
    /* set i.MX active slot mask */                                         
    snd_soc_dai_set_tdm_slot(cpu_dai, 3, 3, 2, 32);                                     
                                                                                                
    /* set the SSI system clock as input */                                 
    snd_soc_dai_set_sysclk(cpu_dai, 0, 0, SND_SOC_CLOCK_IN);          
           
    snd_soc_dai_set_sysclk(codec_dai, 0, clk_frequency, SND_SOC_CLOCK_OUT);
                                                                            
    return 0;                                                               
}

4.static struct snd_soc_dai_driver tef6638_codec_dai = {                      
        .name = "tef6638",                                                  
        .playback = {                                                       
        .stream_name = "playback",                                          
        .channels_min = 1,                                                  
        .channels_max = 2,                                                  
        .rates = SNDRV_PCM_RATE_44100,                                             
        .formats = SNDRV_PCM_FMTBIT_S16_LE,                                         
    },                                                                      
        .capture = {                                                        
        .stream_name = "capture",                                           
        .channels_min = 1,                                                  
        .channels_max = 2,                                                  
        .rates = SNDRV_PCM_RATE_44100,                                             
        .formats = SNDRV_PCM_FMTBIT_S16_LE,                                         
    },                                                                      
};

Now,the sound card is precented:

##arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: imxtef6638ssi [imx-tef6638-ssi], device 0: imx-tef6638 tef6638-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

but when I start record with command:

##arecord -Dplughw:0,0 -c 2 -r 44100 -f S16_LE -d 5 /tmp/record.wav,

I get a error :

arecord: pcm_read:1828: read error: Input/output error

Could anyone tell me how to config the clocks of the codec dai?

Best regards.

LevisLi

Tags (2)
1 Solution
1,502 Views
igorpadykov
NXP Employee
NXP Employee

Hi LevisLi

as example of such configuration one can look at boundary devices sgtl500 dts settings:
linux-imx6/arch/arm/boot/dts/imx6qdl-s.dtsi
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.1.15_1.0.0_ga/arch/arm/boot/dts/im...
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.1.15_1.0.0_ga/arch/arm/boot/dts/im...

BD sabrelite board:
https://boundarydevices.com/product/sabre-lite-imx6-sbc/

Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

View solution in original post

6 Replies
1,503 Views
levisli
Contributor II

Hi igorpadykov,

Thanks for your reply.

I have resovled my problem and you can close this topic.

Best regards.

Levi

0 Kudos
1,503 Views
billkang
Contributor I

I have the same problem. How to solve it ?

0 Kudos
1,503 Views
xiaojun_huang
Contributor I

Hi,li weihua,

我们的板子上也用了tef638,但是我没有找到任何的驱动代码,

请问你能分享一下你的驱动代码吗?

0 Kudos
1,503 Views
igorpadykov
NXP Employee
NXP Employee

Hi LevisLi

as example of such configuration one can look at boundary devices sgtl500 dts settings:
linux-imx6/arch/arm/boot/dts/imx6qdl-s.dtsi
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.1.15_1.0.0_ga/arch/arm/boot/dts/im...
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.1.15_1.0.0_ga/arch/arm/boot/dts/im...

BD sabrelite board:
https://boundarydevices.com/product/sabre-lite-imx6-sbc/

Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

1,503 Views
xiaojun_huang
Contributor I

Hello,

Where can I find the driver for tef6638?

Thanks.

0 Kudos
1,503 Views
levisli
Contributor II

AUD3 pinmux:

pinctrl_audmux: audmuxgrp {                                 
                        fsl,pins = <                                        
                                MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x130b0
                                MX6QDL_PAD_CSI0_DAT10__AUD3_RXC                0x130b0
                                MX6QDL_PAD_CSI0_DAT11__AUD3_RXFS               0x130b0
                        >;                                                  
                };                                

0 Kudos