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.

[参考译文] TLV320AIC3107:MIC 以噪声进行录制、扬声器为16KHz 文件提供低音量

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/928549/tlv320aic3107-mic-is-recording-with-a-noise-and-speaker-is-giving-low-volume-for-16khz-file

器件型号:TLV320AIC3107

尊敬的 TI 团队:

我们在项目中使用 TLV320AIC3107编解码器。 在尝试播放某些音频文件和播放编解码器中录制的音频文件时、我们会观察到以下问题。

尽管在录制音频时我们在 DTS 文件中将 MIC 偏置电压设置为2V、但 MICBIAS 控制寄存器(0x19)会自动更改为0x02。 我已经看到了驱动程序代码、但我无法找到该寄存器的更改位置。 由于此更改、MIC 无法正常工作、并且未录制音频。 作为一种临时解决方案、我们将在开始录制之前使用终端上的 i2c 命令强制将寄存器设置为0x40、但每次我需要设置该寄存器时、由于录制完成后、寄存器值再次转换为0x02。 即使我在读取该寄存器时将该寄存器设置为0x40、它也会显示为0x42。 我们需要知道它在记录完成后自动更改为0x02的原因以及为什么该0x02位不被清除。

2.在我们更改 MICBIAS 寄存器后,我们也能够录制音频,但在尝试收听录制的音频时,我们注意到音频音量非常微弱。 我们看到、默认情况下、模拟路径中的 AGC 处于禁用状态、启用 AGC 后、我们能够以更好的音量听到录制的音频、但我们听到了一些额外的噪声。 如果需要更改寄存器配置以消除额外的噪声、请告知我们。

这与扬声器路径有关。 当我们尝试播放8kHz 音频文件时、音量非常清晰、但当我们尝试播放16KHz 时、输出音量会下降。 我们尝试更改左右 DAC 音量控制寄存器、但问题仍然存在。 请告诉我们如何提高16KHz 文件的输出音量。

我们已将 MIC 线路连接到 MIC3R 和 MIC3L 引脚、扬声器已连接到 HPLOUT 和 HPROUT 引脚。

提前感谢。

此致、

Ranjith Kumar

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

    您好 Ranjith、

    您能否共享原理图和寄存器转储? 问题2和问题3可能未正确配置器件。 如果您还可以共享 MCLK、WCLK 和 BCLK 频率以及音频串行接口的一些示波器截图、那将会很好。  

    至于问题1、这不是器件的典型行为。 MICBIAS 寄存器不应自动配置自身。

    此致、

    Aaron

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

    您好、Aaron、

    我在使用8kHz 和16KHz 采样频率录制和播放音频文件时、已附加原理图的音频部分和寄存器转储。

    我还附加了我们在8kHz 和16KHz 启用 AGC 时记录的示例记录文件。 在16KHz 时、与在扬声器中具有相同音量的8kHz 相比、录制的音频非常清晰、但会出现一些额外的噪声、您可以注意到。

    关于8kHz 采样频率下的 BCLK 频率为256KHz、16KHz 采样频率下的 BCLK 频率为512KHz、WCLK 为16KHz、MCLK 为0Hz、CLKDIV_IN 和 PLLCLK_IN 使用 BCLK 作为源。

    注意:在寄存器转储中、您可以在寄存器0x19中看到位2不清零、在空闲阶段也会设置位2。 在开始记录之前、我们已强制设置该寄存器、并且在记录完成后、寄存器值再次转换为0x02。 我们将使用 tlv320aic3x.c 驱动程序文件作为我们的用途、内核版本为5.4.10。 我已经在驱动程序文件中写入寄存器的任何位置放置了调试打印、并且寄存器值不是0x02、因此我们无法找到该寄存器被覆盖的位置。

    此致、

    Ranjith Kumare2e.ti.com/.../MIC_5F00_dump.txte2e.ti.com/.../SPKR_5F00_dump.txte2e.ti.com/.../test_5F00_AGC_5F00_8K.wave2e.ti.com/.../test_5F00_AGC_5F00_16K.wav

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

    您好 Ranjith、

    我看了16kHz 寄存器转储、似乎 PLL 配置不正确。 我建议 PLL 采用以下设置:

    P = 1

    R = 4

    J = 48

    这应提供一个 Fsref = 48kHz。  

    我看到的另一个违反是针对8kHz 文件。 最小 PLL 输入时钟频率为512kHz、因此256kHz 超出了此限制。 WCLK 还应等于采样频率、对于8kHz 文件、WCLK 为16kHz。 这可能是为什么16kHz 文件的音频更加清晰的原因。 请尝试16kHz 的建议设置、并告诉我是否有任何进展。

    此致、

    Aaron

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

    您好、Aaron、

    无论我与您共享的寄存器转储是什么、寄存器设置都是由驱动程序自动完成的、我们没有触及 SDK 中的编解码器驱动程序。 我们使用的是 Linux 内核版本5.4.10。

    关于 BCLK 和 WCLK、我们再次测量了这些频率并获得了以下结果。

    对于立体声和单声道8kHz 文件、BCLK=256KHz 和 WCLK=8kHz
    对于立体声和单声道16KHz 文件、BCLK=512KHz 和 WCLK=16KHz。

    SoC 本身会根据输入音频文件采样率来处理 BCLK 和 WCLK 生成、我们无法控制这些频率的更改。

    此致、

    Ranjith Kumar。

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

    您好 Ranjith、

    如果 MCLK 未被提供、采样率需要由 BCLK 确定。 如果 BCLK 为256kHz、则在 D = 0000时它违反 PLL 约束。 最小 BCLK 频率应为512kHz。  

    如果 D 不= 0000、则 PLLCLK_IN/P 需要介于10MHz 和20MHz 之间。  

    此致、

    Aaron

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

    您好、Aaron、

    我们更改了一些设置、例如增加左/右 DAC 数字音量、 除了增加相应的模拟增益值和使用 alsamixer 将 Line1L 和 Line1R 配置为全差分模式外、分别将 DAC_L1和 DAC_R1路由到 HPLOUT 和 HPROUT、我们在扬声器和麦克风侧获得了预期结果。 现在、我们需要在驱动程序中进行这些配置、以便在每次启动时应用这些配置。


    我们有一个疑问、在使用 alsamixer / amixer 命令更改设置并重新启动电路板时、寄存器值在这些设置中不会改变、而是使用我们在重新启动之前保留的值。 这是预期行为还是寄存器值将重置为默认值?

    此致、

    Ranjith Kumar

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

    您好 Ranjith、

    器件将以默认值启动。 发出软件/硬件复位或重启将使编解码器默认值恢复为默认值。  

    此致、

    Aaron

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

    您好、Aaron、

    是的、器件必须以默认值启动、但在我们的情况下不会发生这种情况。

    下面是我观察到的情况。

    当我转储了寄存器43和44的值时、它显示为0x80。 当我播放音频并检查寄存器时、该值会发生更改、即使我们重新启动电路板、该值也会保留。 所以我的疑问是,是否重新启动 alsamixer 中的值也会被保留?

    谢谢、

    Ranjith

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

    您好 Ranjith、

    让我在内部讨论这一点、因为我以前没有看到过这种情况。 驱动程序必须像我之前提到的那样重新写入寄存器、在重新启动后、器件应配置为默认值。  

    此致、

    Aaron

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

    您好、Aaron、

    感谢您的回答。 请尽快关闭此问题、因为我们在一个多月前创建了此主题、我们需要尽快解决此问题。 请建议我们如何在驱动程序级别设置一些默认值、因为无论我们在何处尝试设置一些默认值、只要我们打开器件电源、就不会反映这些默认值。

    此致、

    Ranjith

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

    您好 Ranjith、

    要配置启动的某些默认值、您需要在驱动程序的 DTS 级别执行此操作。 驱动程序的 DTS 级别将在启动时配置器件、以满足 I2C 地址等硬性要求。 alsamixer 是我需要根据应用程序更改的其他设置的位置。 这些 alsamixer 值通常会被保留。

    此致、

    Aaron

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

    您好、Aaron、

    感谢您澄清了 alsamixer 的问题。 但是、即使我们在驱动器的 DTS 级别配置 MICBIAS 电压、在电路板启动后、它也不会反映在编解码器中、以及我们将如何配置 HP DAC 和 PCM 的默认值、以便在每次启动时都能反映这些寄存器值 将与用户选择的相同。

    因此、现在只需清除2项即可。

    1.为什么在编解码器启动后没有在寄存器中设置 MICBIAS 电压?
    2.如何默认配置 HP DAC 和 PCM 寄存器值?

    请尝试清除这两个问题。

    此致、

    Ranjith

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

    您好 Ranjith、

    对于1、您能否查看消息日志以查看是否有任何消息? 我相信有一个像"dmesg"这样的命令。 可能有多种原因导致无法使用 DTS 配置来配置设备:

    1.未加载驱动程序。

    2.驱动程序已加载、但 I2C 未执行。 执行此命令时、器件可能已被保持在复位状态。

    3.司机不理解 DTS。  

    对于2、我不确定您的意思是什么。 您能详细说明吗? 如果需要在启动时配置 HP DAC 配置和 PCM、同样需要在 DTS 级别完成这些操作。  

    此致、

    Aaron

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

    您好、Aaron、

    对于1、dmesg 中没有特定的日志、我们发现在启动编解码器的初始阶段、编解码器仅退出复位状态、但有时编解码器将进入复位状态、我们不知道为什么会发生这种情况。 但驱动程序会被加载、因为在提供 i2cdetect 命令时、它会显示对应于编解码器从地址的"U"、这意味着驱动程序正在控制该 IC。

    下面是我们所做的实验。
    1.我们手动将编解码器从复位中取出,并通过 i2cset 命令设置 MIC 偏置电压。
    2.我们记录了一些音频文件,在记录时我们检查了 MICBIAS 控制寄存器,其中的值就是我们使用 i2cset 命令设置的值。
    在我们检查寄存器时录制音频后、该值为0x02、即使我们再次录制音频并检查该寄存器中的值仅为0x02。 我们在 DTS 文件中只给出了"ai3x-micbias vg =<1>;"、但它不会反映在寄存器中。

    对于2、我们希望为 LDAC_VOL、RDAC_VOL、DACL1_2_HPLOT_VOL 和 DACR1_2_HPROUT_VOL 寄存器设置一些默认值。 您能建议我们如何为这些寄存器设置 DTS 级别的默认值吗? 由于在 DTS 文档中没有指定任何用于控制这些寄存器的内容。

    此致、

    Ranjith

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

    Ranjith、

    让我尝试步入并帮助您。 首先、DTS 指令位于  Documentation/devicetree/bindings/sound 中的 kernel.org repo 下

    有一个 DTS 条目:
    ai31xx-mibas-vg -微偏置电压设置
    1或 MICBIAS_2_0V - MICBIAS 输出被供电至2.0V
    2或 MICBIAS_2_5V - MICBIAS 输出被供电至2.5V
    3或 MICBIAS_AVDD - MICBIAS 输出连接到 AVDD
    如果未提及此节点或该值未知、则
    将 MICBIAS设置为2.0V。 

    在 DTS 中、应该有一个条目:

    tlv320aic31xx:tlv320aic31xx@18{
    兼容="ti,tlv320aic311x";
    reg =<0x18>;
    a31xx-micbias vg = ;
    RESET-GPIO =<&GPIO1 17 GPIO_ACTIVE_LOW>;
    HPVDD 电源=<&regulator >;
    SPRVDD 电源=<&regulator >;
    SPLVDD 电源=<&regulator >;
    AVDD 电源=<&regulator >;
    IOVdd-supply =<&regulator >;
    DVDD-supply =<&regulator >;
    }; 

    查看驱动程序:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/tlv320aic31xx.c?h=v5.9-rc4

    DTS 条目在例程 aic31xx_i2c_prob()中读取。 对于微偏置 vg、它位于第1614行、并读取变量 michbias 值:

    fwnode_property_read_u32 (aic31xx->dev->fwnode、"ai31xx-micBIAS-vg"、
    &micBIAS_value);
    switch (micBIAS_value){
    case MICBIAS_2_0V:
    case MICBIAS_2_5V:
    case MICBIAS_AVDDV:aic31xx->micBIAS_DEV_vxx
    
    
    
    
    ;deg_default_bias
    
    =%BIAS_v31xx;d_bad_bad_bad_value_v31xx-d_dV;"micBIAS_bad_bad_value_d_d_file_v31xx-d_file_d_dV;"micBIAS_bad_d_bad_d_file_dV;d_ 

    if (DEV_GET_platdata (aic31xx->dev)){memcpy (&aic31xx->pdata、DEV_GET_platdata (aic31xx->dev)、sizeof (aic31xx->pdata));aic31xx->codec_type = aic31xx->pdata_bias = aic31xx->pdata_bias;}v31xx->p31xx->pic31xx

    我希望此时它会写入寄存器、但会被放置在该数据结构中。 然后由第540行中的 alsamixer common31xx_dapm_widget 的 widget 处理:

    /*麦克风偏置*/ 
    SND_SOC_DAPM_SUPPLY ("MICBIAS"、SND_SOC_NOPM、0、0、MIC_BIAS_EVENT、 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD)、

    这会创建一个 mit_bias 事件、该事件实际上使用例程 nd_soc_component_update_bits 写入寄存器

    static int mim_bias 事件(struct snd_soc_dapm_widget *w、
    struct snd_kcontrol *kcontrol、int event)
    {
    struct snd_soc_component * component = snd_soc_dapm_TO_component (w->dapm);
    struct aic31xx_APM *aic31xx_component * snd_component = snd_soc_dapm_component
    
    
    
    (w->d_soc_component);struct a soc volt_soc voltage d_soc voltage * voltage d_soc_event_event_delt d_sc (w_drive)
    
    AIC31XX_MICBIAS_MASK、
    aic31xx->micbias vg <<
    AIC31XX_MICBIAS_SHIFT);
    DEV_dbg (component->dev、"%s":打开\n"、__func__);
    break;
    case Snd_SOC_DAPM_PRE_PMD:
    //关闭麦克风偏置*/
    snd_soc_component_update_bits (component、AIC31XX_MICBIAS、
    AIC31XX_MICBIAS_MASK,0);
    DEV_dbg (component->dev,"%s":turned off、__func__);
    break;
    }
    返回0;
    } 

    因此、看起来 DTS 条目被读取以初始填充此小部件、并且必须发送 alsamixer 命令以将其写入寄存器。

    如果要在 DTS 中添加更多值、可以向 aic31xx_i2c_probe 例程添加更多代码以读取 DTS 条目、如下所示:

    1) 1)读取属性:

    fwnode_property_read_u32 (aic31xx->dev->fwnode、"ai31xx-new-property"、&value);

    2) 2)向寄存器写入一些位

    regmap_update_bits (aic31xx->regmap、AIC31XX_REGXX、AIC31XX_REG_MASK、value);

    或写入整个寄存器

    regmap_write (aic31xx->regmap、AIC31XX_REGXX、value);

    3) 3)添加 DTS 属性:

    tlv320aic31xx:tlv320aic31xx@18{
    兼容="ti,tlv320aic311x";
    reg =<0x18>;
    a31xx-micbias vg = ;
    RESET-GPIO =<&GPIO1 17 GPIO_ACTIVE_LOW>;
    HPVDD 电源=<&regulator >;
    SPRVDD 电源=<&regulator >;
    SPLVDD 电源=<&regulator >;
    AVDD 电源=<&regulator >;
    IOVdd-supply =<&regulator >;
    DVDD-supply =<&regulator >;
    ai31xx-new-property = ;
    }; 

    此致、
    佩德罗





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

    您好、Pedro、

    感谢您的详细建议。 如果我们希望在 DTS 中添加更多条目、您提供的添加其他 DTS 条目的建议将对我们非常有帮助。

    正如您在回复中提到的,我们已将 DTS 条目设置为“aic3x-micbias-vg=<1>;”,这意味MICBIAS output is powered to 2.0V着。

    那么、您意味着我们必须在内核启动后提供 alsamixer 命令来写入该寄存器吗?

    此致、

    Ranjith

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

    Ranjith、

    是的、这个驱动程序看起来需要一个 alsamixer 命令来将结构值写入寄存器。

    此致、
    佩德罗

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

    您好、Pedro、

    感谢您的回复。 验证后、我们将返回给您。

    此致、

    Ranjith