This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/TLV320ADC3101:TLV320ADC3101:记录期间出现随机问题

Guru**** 2393585 points
Other Parts Discussed in Thread: TLV320ADC3101

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/666653/linux-tlv320adc3101-tlv320adc3101-random-issue-during-record

部件号:TLV320ADC3101

工具/软件:Linux

您好,

我们正在将TLV320ADC3101用于我们的项目,并移植到内核版本3.10。96。 所有寄存器配置都在驱动程序部分完成,系统启动后,我们将使用amixer配置路径。 在我们的测试过程中,我们发现了一个问题,即麦克风无法录制。在下一个电源循环中,它也可以正常工作。 所以,我们看到的频率是2/100。


下面是我们的寄存器配置,

工作设置


不工作的设置:



以下是在应用程序部件上完成的配置,

       amixer -c 0 sset "ADMAIF1 MUX" I2S3"
       amixer -c 0 sset "I2S3 Mux""ADMAIF1"


下面是ADC的流式小部件,

  Snd_SOC_DAPM_ADC_E ("左ADC ","左捕获",AIC3255_ADC_CHN_REG,
           7,0,adc_event,snd_so_dapm_post_PMU | snd_so_dapm_post_pmd),<-- adc_event是启用ADC和取消静音的回调处理程序。 (这不称为)


以下是我们用于录制的命令,

arecord -v -D hw:0,0 -d 1 -c 2 -f S16_le -r 8000 mic_testing.wav


正如我们所看到的,工作的设置寄存器和问题设置寄存器似乎是相同的,但只有下面的寄存器似乎是不同的。

未应用增益(第0页:寄存器36,第1页:寄存器63)-->值- 0。

已应用左AGC增益-寄存器93。 -->值-0
应用的右AGC增益-寄存器101-->值- 0


我们想知道,这一问题的原因可能是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Mohan,

     

    我们可以帮助检查设备配置并尝试确定设备无法正常工作的原因,但遗憾的是,我们目前不支持这些设备的Linux集成。

    根据提供的寄存器转储,获得的寄存器仅是标志,因此设备的配置一般是相同的。 您提到在设备配置中所做的唯一更改是使用amixer命令设置的,对吗? 是否 仅在使用amixer命令配置设备后才出现此问题? 我想了解驱动程序使用amixer命令配置设备的顺序是什么,您是否可以提供此顺序?

    此致,

     -Diego Mel é ndez López ñ a
      音频应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Diego,

    感谢您的回复。

    以下是我们的驱动程序级别配置,


    静态const结构adc3101_configs adc3101_reg_init[]={
      /*步骤1:定义启动点。 */
       //将寄存器设置为第0页
       {0x00,0x00},

       //启动软件重置
       {0x01,0x01},

       /*步骤2:设定时钟设置*/
       //编程PLL时钟分频器
       {0x04,0x00},// ADC_CLKIN = MCLK,P=1,R=1,J=4,D=0000
       {0x05,0x11},
       {0x06,0x04},
       {0x07,0x00},
       {0x08,0x00},

       //加电PLL (如果需要PLL)=在此示例中不使用
       {0x05,0x11},

       //对NADC进行编程并加电
       {0x12,0x81},

       //对mAdc进行编程并开机
       {0x13,0x82},

       //程序OSR值
       {0x14,0x80},

       //根据需要对I2S字长度进行编程(16,20,24,32位)
       {0x1b,0x00},//模式为I2S,文字长度为16,从属模式(默认)

       //对要使用的处理块进行编程
       {0x3D,0x02},// PRB_P1

       /*步骤3编程模拟块*/
       //选择注册页面到1
       {0x00,0x01},

       //如果适用,对MICBIAS进行编程
       {0x33,0x50},

       //为MicPGA编程
       {0x3b,0xc6},/*默认,左PGA静音,由dapm */控制
       {0x3c,0xc6},/*默认,右PGA静音,由dapm */控制

       //将输入/共模路由到ADC输入
       //取消模拟PGA的静音并设置模拟增益
       {0x34,0xfc},
       {0x37,0xfc},

       /*编程ADC */
       //将注册页设置为0
       {0x00,0x00},

       {0x53,0x00},

       {0x54,0x00},

       //左AGC控制1
       {0x56,0x00},/*默认,左AGC已禁用,由dapm */控制

       //左AGC控制2.
       {0x57,0x3e},

       //左AGC最大增益
       {0x58,0x50},

       //左AGC攻击时间
       {0x59,0x50},

       {0x5b,0x0c},

       {0x5c,0x03},

       //右AGC控制1
       {0x5e,0x00},/*默认,右AGC已禁用,由dapm */控制

       //右AGC控制2.
       {0x5f,0x3e},

       //右AGC最大增益
       {0x60,0x50},

       //正确的AGC攻击时间
       {0x61,0x50},

       {0x63,0x0c},

       {0x64,0x03},

       {0x30,0x12},// INT1中断控制(单脉冲中断)

       {0x33,0x15},

       // ADC通道(左和右)
       {0x51,0x00},/*默认关闭,由dapm */控制

       //将数字音量控制静音并设置增益= 0 dB
       {0x52,0x88},/*默认ADC为静音,由dapm */控制
    };


    系统启动后,以下是我们的amixer配置及其各自的输出。


    root@Tegra-Ubuntu:/home/ubuntu# amixer -c 0 sset "ADMAIF1 MUX""I2S3"
    简单混合器控制'ADMAIF1 MUX',0
     能力:枚举
     项目:'None''ADMAIF1''ADMAIF2''ADMAIF3''ADMAIF4''ADMAIF5''ADMAIF6''ADMAIF7''ADMAIF8''ADMAIF9''ADMAIF10''I2S1''I2S2S2''I2''IFS3''I2FC'''''FIC1
    2''FC3''''FC4''''IXER1-1 ''IXER1-2''IXER1-3''IXER1-4 ''IXER1-5''AMX1''AMX2''PDF1-1''PDIF1-2''AFC1''AFC2''AFC3''AFC4''AFC4'''AFC2'''''''''''''''OPPEAFC2'
     'PKPROT1''MC1''VC2''IQC1-1''IQC1-1''IQC2-2''MIC1''MIC3''ADX1-1''ADX1-2''ADX1-3''ADX1-4''ADX2-1''ADX2-4'
     项目0:'I2S3'
    root@Tegra-Ubuntu:/home/ubuntu# amixer -c 0 sset "I2S3 Mux""ADMAIF1"
    简单混合器控制'I2S3 Mux',0
     能力:枚举
     项目:'None''ADMAIF1''ADMAIF2''ADMAIF3''ADMAIF4''ADMAIF5''ADMAIF6''ADMAIF7''ADMAIF8''ADMAIF9''ADMAIF10''I2S1''I2S2S2''I2''IFS3''I2FC'''''FIC1
    2''FC3''''FC4''''IXER1-1 ''IXER1-2''IXER1-3''IXER1-4 ''IXER1-5''AMX1''AMX2''PDF1-1''PDIF1-2''AFC1''AFC2''AFC3''AFC4''AFC4'''AFC2'''''''''''''''OPPEAFC2'
     'PKPROT1''MC1''VC2''IQC1-1''IQC1-1''IQC2-2''MIC1''MIC3''ADX1-1''ADX1-2''ADX1-3''ADX1-4''ADX2-1''ADX2-4'
     项目0:'ADMAIF1'


    您提到在设备配置中所做的唯一更改是使用amixer命令设置的,对吗? 是否 仅在使用amixer命令配置设备后才出现此问题?

    ==>默认情况下,ADC已关闭,并且两者均已静音。 在arecord期间,根据DAAPM,将进行回调以启用此功能。


    /**
     * ADC_EVENT:
     *-->         ADC通电/断电。
     *         --> AGC启用/禁用。
     *         --> AGC取消静音/静音。
     *         --> ADC取消静音/静音。
     *@w:指向dapm_widget的指针变量
     *@kcontrol:指向声音控制的指针
     *@事件:事件元素信息
     *
     *成功返回0。
     */
    静态int ADC_EVENT (结构snd_so_dapm_widget *w,
           struct snd_kcontrol *kcontrol,int事件)

       struct snd_soc_codec *codec = w->codec;
       int left_AGC_mute,right_AGC_mute;
       int left_AGC_en,right_AGC_en;
       Int ADC_MUTE;
       Int ADC_POWER;

       printk (kern_info "(adc3101)%s++\n",__func__);

       adc3101_codec_read (codec,AIC3255_ADC_FGA,&ADC_MUTE);
       adc3101_codec_read (codec,AIC3255_ADC_CHN_REG,&ADC_POWER);
       adc3101_codec_read (codec,AIC3255_LEFT_AGC_REG1,&LEFT_AGC_EN);
       adc3101_codec_read (codec,AIC3255_RIGHT _AGC_REG1,&RIGHT _AGC_EN);
       adc3101_codec_read (编解码器,AIC3255_LMICPGA_VOL_CTRL,&LEFT_AGC_MUTE);
       adc3101_codec_read (编解码器,AIC3255_RMICPGA_VOL_CTRL,&RIGHT AGC_MUTE);

       开关(事件){
           案例Snd_SOC_DAPM_POST_PMU:
               adc3101_codec_write (codec,AIC3255_ADC_CHN_REG,(ADC_POWER | ADC_POWER_UP));
               adc3101_codec_write(codec, AIC3255_LEFT AGC_REG1,(LET_AGC_EN | LET_AGC_EN));
               adc3101_codec_write(codec, AIC3255_right_AGC_REG1,(Rright_AGC_EN | Right_AGC_EN));
               adc3101_codec_write(codec, AIC3255_LMICPGA_VOL_CTRL,(left_AGC_MUTE &~left_AGC_MUTE));
               adc3101_codec_write(codec, AIC3255_RMICPGA_VOL_CTRL,(Rright_AGC_MUTE &~right_AGC_MUTE));
               adc3101_codec_write (codec,AIC3255_ADC_FGA,(ADC_MUTE和~ADC_MUTE));
               中断;

           案例Snd_SOC_DAPM_POST_PMD:
               adc3101_codec_write (codec,AIC3255_ADC_CHN_REG,(ADC_POWER &~ADC_POWER_UP));
               adc3101_codec_write(codec, AIC3255_LEFT AGC_REG1,(LET_AGC_EN &~LET_AGC_EN));
               adc3101_codec_write(codec, AIC3255_right_AGC_REG1,(Rright_AGC_en &~right_AGC_EN));
               adc3101_codec_write(codec, AIC3255_LMICPGA_VOL_CTRL,(left_AGC_MUTE | left_AGC_MUTE));
               adc3101_codec_write(codec, AIC3255_RMICPGA_VOL_CTRL,(Rright_AGC_MUTE | right_AGC_MUTE ));
               adc3101_codec_write (codec,AIC3255_ADC_FGA,(ADC_MUTE | ADC_MUTE));
               中断;

           默认:
               返回-EINVAL;
       }

       printk (kern_info "(adc3101)%s--\n",__func__);
       返回0;
    }

    /* ADC3101构件结构*/
    静态结构snd_so_dapm_widget adc3101_dapm_widget[]={

       左ADC的/*流小部件*/
       Snd_SOC_DAPM_ADC_E ("左ADC ","左捕获",AIC3255_ADC_CHN_REG,
               7,0,ADC_EVENT,Snd_SOC_DAPM_POST_PMU | Snd_SOC_DAPM_POST_PMD),


    如上所述,当调用ADC_EVENT时,它将启用ADC和AGC,并将其取消静音。 因此,这种情况不会发生。 这就是我们看到AGC处于静音状态的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Diego,

    您是否可以更新此信息?