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.

[参考译文] TLV320DAC3100EVM-U:ASOC:tlv320aic31xx-codec 上的 snd_soc_component_update_bits 处错误。

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1423920/tlv320dac3100evm-u-asoc-error-at-snd_soc_component_update_bits-on-tlv320aic31xx-codec

器件型号:TLV320DAC3100EVM-U
主题中讨论的其他器件:TLV320DAC3100

工具与软件:

我将 tlv320dac3100集成到 Linux IMX93QS93电路板中。 它正在工作、我可以测试扬声器并播放一些 wav 文件。 但是、当我第一次打开主板和编解码器电源时、在测试时遇到错误、并且在测试扬声器时仅听到噪音。 我把它们关闭然后重新打开,并且神奇的是编解码器工作正常,没有任何错误,我听到正确的声音从扬声器出来。  

我得到的错误:

 ~# aplay -D plughw:0,0 /usr/share/sounds/alsa/Rear_Right.wav
Playing WAVE '/usr/share/sounds/alsa/Rear_Right.w[   38.619370] tlv320aic31xx-codec 1-0018: ASoC: error at snd_soc_component_update_bits on tlv320aic31xx-codec.1-0018 for register: [0x00000040] -5
av' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

当我测试扬声器时、我收到一个错误、但我只能听到噪音:

~# speaker-test -D plughw:0,0 -c 2 -r 48000 -F S16_LE -t sine -f 500

speaker-test 1.2.8

Playback device is plughw:0,0
Stream parameters are 48000[  156.926645] tlv320aic31xx-codec 1-0018: ASoC: error at snd_soc_component_update_bits on tlv320aic31xx-codec.1-0018 for register: [0x00000040] -5
Hz, S16_LE, 2 channels
Sine wave rate is 500.0000Hz
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 32 to 131072
Period size range from 16 to 8184
Using max buffer size 131072
Periods = 4
was set period_size = 4096
was set buffer_size = 131072
 0 - Front Left
 1 - Front Right
Time per period = 3.264035
 

这是我的 DT 配置:  

`μ A

audio_clk: audio-clk {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <12000000>; 
	};
	
	codec_audio: sound {
		compatible = "simple-audio-card";
		simple-audio-card,name = "tlv320dac3100-codec";
		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&cpu_dai>;
		simple-audio-card,frame-master = <&cpu_dai>;
		simple-audio-card,widgets =
			"Line", "Line Out",
			"Headphone", "Headphone Jack",
			"Speaker", "Speaker Out";
		simple-audio-card,routing =
			"Line Out", "HPL",
			"Line Out", "HPR",
			"Headphone Jack", "HPL",
			"Headphone Jack", "HPR";
		status = "okay";
		cpu_dai: simple-audio-card,cpu {
			sound-dai = <&sai1>;
		};
		codec_dai: simple-audio-card,codec {
			sound-dai = <&audio_codec>;
			clocks = <&audio_clk>;
		};
	};
};

&sai1 {
	#sound-dai-cells = <0>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_sai1>;
	assigned-clocks = <&clk IMX93_CLK_SAI1>;
	assigned-clock-parents = <&clk IMX93_CLK_AUDIO_PLL>;
	assigned-clock-rates = <12288000>;
	fsl,sai-mclk-direction-output;
	status = "okay";	
};

&lpi2c2 {
	clock-frequency = <400000>;
	pinctrl-names = "default", "gpio";
	pinctrl-0 = <&pinctrl_lpi2c2>;
	status = "okay";

	// Add TLV320AIC3100 audio codec node
	audio_codec: codec@18 {
		compatible = "ti,tlv320dac3100";
		pinctrl-names = "default";
		reg = <0x18>;
		#sound-dai-cells = <0>;
		reset-gpios = <&gpio4 9 GPIO_ACTIVE_LOW>;
		HPVDD-supply = <&reg_audio_pwr_3v3>; // 1.8V in the schematic BUT 3.3V in the TLV320AIC3100 datasheet !
		AVDD-supply = <&reg_audio_pwr_3v3>;
		DVDD-supply = <&reg_audio_pwr_1v8>;
		IOVDD-supply = <&reg_audio_pwr_3v3>;
		SPRVDD-supply = <&reg_audio_pwr_3v3>;
		SPLVDD-supply = <&reg_audio_pwr_3v3>;
		SPKVDD-supply = <&reg_audio_pwr_5v>;
	};
};


	pinctrl_lpi2c2: lpi2c2grp {
		fsl,pins = <
			MX93_PAD_I2C2_SCL__LPI2C2_SCL				0x40001a1e
			MX93_PAD_I2C2_SDA__LPI2C2_SDA				0x40001a1e
		>;
	};

什么 ID 这里的问题,有什么我遗漏的东西吗? 可能缺少了与器件初始化相关的内容!!

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

    您好!

    是的、似乎编解码器未在驱动程序或您的设置中正确初始化。 我将在下周用 EVM 进行测试、也可以询问我们的驱动专家有关重置的信息。 在发出音频以重新初始化它之前、您可能需要向编解码器发送一个复位脉冲、也许您的电路板在重新启动它之前不会发送该复位脉冲。 您可以在电路板开启而放大器输出不工作时触发复位脉冲吗?看看这样是否使其再次工作?

    此外、您能否附加系统原理图?

    此致!
    MIR

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

    您好、感谢您的答复。 我已尝试手动触发复位脉冲、但似乎没有发生任何情况。  

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

    您好!

    感谢您提供原理图和信息。 我想可能是电源定序不正确。 数据表中有一个"电源建议"部分、规定应启用扬声器电源(SPKVDD)、数字电源和模拟电源、等待每个电源在下一个电源变为稳定状态。 因此、我建议您看看是否可以在示波器上监控电源时序、看看您首次上电和遇到输出问题时以及重新上电后电源时序之间是否存在差异。 您可能还需要将 IOVDD 连接到 DVDD、而不是 AVDD、因为它也是数字电源;如果在模拟电源之前数字电源不稳定、可能会对时序产生影响。 请告诉我您在此找到的信息、如果您需要更多帮助、可在此处发布定序。

    另一项建议是电源上的去耦电容器应在物理上靠近引脚放置。 我不认为这是您的问题、但最好进行检查以防万一。

    此致!
    MIR

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

    您好、感谢您提供的信息。 使用 TLV320DAC3100EVM-U 进行测试。 然后我通过 USB 电缆将它连接到我的电脑来为它供电一次。 我认为在这种情况下、电源定序是自动完成的!

    目前、即使我关闭/打开设备电源、也不会再发出声音、它始终会发出噪声(相同配置)。  

    注:当我使用编解码器控制软件对计算机进行测试时、该模块工作正常。  

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

    有一件事我忘了提到,当我手动重置编解码器时,下次我想播放一些声音或尝试更改音量时,我得到了这个错误:

    ~# speaker-test -D plughw:0,0 -c 2 -r 480000 -F S16_LE -t sine -f 500[  284.644945] tlv320aic31xx-codec 1-0018: aic31xx_wait_bits: Failed! 0x25 was 0x88 expected 0x0 (0, 0x80, 500000 us)
    [  284.655305] tlv320aic31xx-codec 1-0018: ASoC: POST_PMD: DAC Left event failed: -1
    [  285.685677] tlv320aic31xx-codec 1-0018: aic31xx_wait_bits: Failed! 0x25 was 0x88 expected 0x0 (0, 0x8, 500000 us)
    [  285.695958] tlv320aic31xx-codec 1-0018: ASoC: POST_PMD: DAC Right event failed: -1
    

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

    您好!

    很抱歉耽误您的时间。 有趣的是、即使在电源循环后、您也无法再听到声音、但您以前是这样。 您可以对编解码器执行寄存器转储吗? 另外、您使用的是哪个版本的 Linux 内核、或者您使用的是哪个版本的设备驱动程序? 如果寄存器转储不能帮助我弄清楚它、我可以联系我们的 Linux 驱动程序专家。 听起来您的系统配置不正确。 您能解释为什么 在设备树中选择12000000时钟而不是12288000吗? 另外、400000时钟是什么? 我不是设备树文件方面的专家、因此如果这样做没有帮助、我们深表歉意。  

    请告诉我有关寄存器转储的信息、并检查您的器件树文件中的时钟、以确保其设置符合您的预期。 我期待您的回复!  

    此致!
    MIR

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

    我使用的是 Linux- 内核6.1、设备驱动程序是内核维护人员的官方驱动程序、因此它是 Linux 内核的相同版本。

    12000000 是编解码器 MCLK ,它适合与驱动器48kHz 速率。
    - 12288000 = 12.288 MHz 是时钟速率,因为它是48kHz 的倍数,它应该是可以的。  
    - 400000 是 或 I2C 通信不干扰或影响音频时钟我猜.  

    由于某些原因、我无法访问寄存器(即使编解码器正常工作、我也可以使用转储)、您可以在此处看到:  

    # i2cdump -y 2 0x18
    No size specified (using byte-data access)
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
    

    已知,我可以通过`alsamixer`更改音量和静音/取消静音

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

    大家好、我从 master 下载了驱动程序源代码、它应该是最新版本、并作为内核模块添加到了我的版本中。  
    驱动程序现在抱怨系数文件`tlv320dac3100-coeffs.bin`从那里我可以得到这个文件! TI 是否提供示例?

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

    您好!

    我认为 coeffs.bin 文件不是问题、在驱动程序代码中、这是一条"警告"、表明器件不会加载任何滤波器系数。 如果您不是要尝试为系统添加滤波器、我认为这并不是您需要担心的。  

    至于时钟、感谢您的澄清。 我不确定 I2C 时钟、我想这不是问题。 但是、在您的时钟树中使用两个不同的 MCLK 并不理想。 在驱动器中、MCLK 有一个12000000的默认 PLL 配置、所以您可以将12.288MHz 时钟改为12MHz 吗? 这可能有所帮助。

    I2C 转储中的所有 XX 似乎无法读取寄存器、因为它可能正忙于其他进程。 如果您没有打开任何其他程序、是否仍会出现这种情况? 我将发送我们的 Linux 专家此线程、看看我们是否能找出您的问题、获取寄存器转储将在调试过程中提供巨大帮助。 如果更改一个时钟会有什么帮助、请告诉我!

    此致!
    MIR

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

    嗨,好消息,编解码器再次使用其内核模块源代码的最新版本,我下载了 tlv320aic31xx 源代码并将其构建为 LKM,我忽略了抱怨系数通过注释责任行。 我必须稍微调整代码以适应我的版本、最终它可以在没有噪声的情况下正常工作。

    关于`Assigned-clock rate`值它不能用于 12MHz、因为我从调查中了解到如果使用48kHz 采样率、这个值应该是48kHz 的倍数、所以我将它设置为12.288MHz。  

    12000000的 MCLK 在内核模块中支持48kHz、您可以从源代码中看到:  

        /* mclk/p    rate  pll: r  j     d     dosr ndac mdac  aors nadc madc */
    	/* 48k rate */
    	{ 1536000,  48000,	2, 32,   0,	128,   8,  2,	128,   8,  2},
    	{ 3072000,  48000,	1, 32,   0,	128,   8,  2,	128,   8,  2},
    	{12000000,  48000,	1, 8, 1920,	128,   8,  2,	128,   8,  2},
    	{12000000,  48000,	1, 7, 6800,	 96,   5,  4,	 96,   5,  4},
    	{12500000,  48000,	1, 7, 8643,	128,   8,  2,	128,   8,  2},


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

    您好!

    很棒、很高兴它能与最新的司机一起工作! 我们现在可以关闭这个主题、除非你需要更多帮助吗? 请告诉我。

    此致!
    MIR