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.

[参考译文] TLV320AIC3110:编解码器永远不会进入断电模式

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1295796/tlv320aic3110-codec-never-goes-into-power-down-mode

器件型号:TLV320AIC3110

您好!

我们正在使用 TLV320AIC3110编解码器、并且我们已经看到它永远不会进入断电模式、即它永远不会将值0x80写入页1寄存器46 (0x2E)。 我们只会看到其值为0x00或0x01。

这是我们用于编解码器的器件树:

/ {
    sound0: sound@0 {
		compatible = "simple-audio-card";
		simple-audio-card,name = "MySound";
		simple-audio-card,widgets =
			"Microphone", "Microphone Jack",
			"Headphone", "Headphone Jack",
			"Speaker", "Speaker";
		simple-audio-card,routing =
			"MIC1LP", "Microphone Jack",
			"MIC1RP", "Microphone Jack",
			"MIC1LP", "MICBIAS",
			"MIC1RP", "MICBIAS",
			"Headphone Jack", "HPL",
			"Headphone Jack", "HPR",
			"Speaker", "SPL",
			"Speaker", "SPR";
		simple-audio-card,format = "i2s";
		simple-audio-card,bitclock-master = <&sound0_master>;
		simple-audio-card,frame-master = <&sound0_master>;
		simple-audio-card,bitclock-inversion;
		simple-audio-card,convert-rate = <48000>;

		sound0_master: simple-audio-card,cpu {
			sound-dai = <&i2s1>;
			system-clock-frequency = <12000000>;
		};

		simple-audio-card,codec {
			sound-dai = <&codec>;
			system-clock-frequency = <12000000>;
		};
	};
};

&pinctrl {
	codec_pins_a: codec_pins_a {
		pins1 {
			pinmux = <STM32_PINMUX('H', 2, GPIO)>; /* AUDIO_PWR_EN1 */
		};

		pins2 {
			pinmux = <STM32_PINMUX('C', 0, AF6)>,	/* CODEC_I2S1_SDO */
					 <STM32_PINMUX('A', 6, AF5)>,	/* CODEC_I2S1_SDI */
					 <STM32_PINMUX('B', 1, AF5)>,	/* CODEC_I2S1_BITCLK / I2S1_CK */
					 <STM32_PINMUX('B', 0, AF5)>,	/* I2S1_MCK */
					 <STM32_PINMUX('A', 4, AF5)>;	/* CODEC_I2S1_WORDCLK / I2S1_WS */
		};
	};

	codec_sleep_pins_a: codec_sleep_pins_a {
		pins {
			pinmux = <STM32_PINMUX('H', 2, ANALOG)>,	/* AUDIO_PWR_EN1 */
					 <STM32_PINMUX('C', 0, ANALOG)>,	/* CODEC_I2S1_SDO */
					 <STM32_PINMUX('A', 6, ANALOG)>,	/* CODEC_I2S1_SDI */
					 <STM32_PINMUX('B', 1, ANALOG)>,	/* CODEC_I2S1_BITCLK / I2S1_CK */
					 <STM32_PINMUX('B', 0, ANALOG)>,	/* I2S1_MCK */
					 <STM32_PINMUX('A', 4, ANALOG)>;	/* CODEC_I2S1_WORDCLK / I2S1_WS */
		};
	};
};

&i2s1 {
	status = "okay";
	pinctrl-names =  "default", "sleep";
	pinctrl-0 = <&codec_pins_a>;
	pinctrl-1 = <&codec_sleep_pins_a>;	/* Sleep pins */

	clock-names = "pclk", "i2sclk", "x8k", "x11k";
	clocks = <&rcc SPI1>,
			 <&rcc SPI1_K>,
			 <&scmi_clk CK_SCMI_PLL3_Q>,
			 <&scmi_clk CK_SCMI_PLL3_R>;
};

&i2c1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_pins_a>;
	pinctrl-1 = <&i2c1_sleep_pins_a>;
	i2c-scl-rising-time-ns = <96>;
	i2c-scl-falling-time-ns = <3>;
	clock-frequency = <100000>;
	status = "okay";
	/* spare dmas for other usage */
	/delete-property/dmas;
	/delete-property/dma-names;

	codec: codec@18 {
		compatible = "ti,tlv320aic3110";
		reg = <0x18>;
		#sound-dai-cells = <0>;
		status = "okay";

		reset-gpios = <&gpiof 6 GPIO_ACTIVE_LOW>;

		ai31xx-micbias-vg = <MICBIAS_2_0V>;
		// ai31xx-ocmv = <3>;

		/* Regulators */
		HPVDD-supply = <&scmi_v3v3_sw>;	/* 3V3_CODEC */
		SPRVDD-supply = <&v5v0_ao>;	/* 5V0_CODEC */
		SPLVDD-supply = <&v5v0_ao>;	/* 5V0_CODEC */
		AVDD-supply = <&scmi_v3v3_sw>;	/* 3V3_CODEC */
		IOVDD-supply = <&scmi_v3v3_sw>;	/* 3V3_CODEC */
		DVDD-supply = <&scmi_v1v8_periph>;	/* 1V8_CODEC */
	};
};

您知道这里的问题是什么、我该怎么做才能解决这个问题吗?

大概、在有播放一些音频的请求之前、编解码器应该处于断电模式、对吧?

谢谢你。

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

    您好!

    您要发送哪些 I2C 命令来关闭器件软件?

    此外、当有音频请求时、编解码器不会自动唤醒。 在请求出现时、需要由 I2C 主机将其唤醒。

    此致、
    J·麦克弗森

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

    您好!

    我不对此使用任何 I2C 命令。 我只将它们用于测试(i2cset 用于尝试将寄存器设置为0x80)、但代码中没有任何内容。

    我正在使用 sound/soci soc codecs/tlv320aic31xx.c 驱动程序,没有任何修改。 这不是由驱动程序处理吗?

    我尝试测试的命令是这样一个:

    i2cset -f -y 0 0x18 0x2E 0x80

    但它不会有任何效果。

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

    你好,耶稣!

    我懂了。 我将和我们的驾驶员专家一起讨论这个问题。 我确实使用直接 I2C 控制进行了快速测试、并能够让寄存器写入和读回正确的值、这就是我对正在发送的 I2C 命令很好奇的原因。

    谢谢。
    J·麦克弗森

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

    请用 i2cdump 转储所有寄存器、谢谢。

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

    您好!

    这是终端上电后编解码器的 i2cdump 输出:

    root@verifone-vegas:~# i2cdump -f -y 0 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: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ?...............
    10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 94    ...............?
    20: 86 3e 00 76 80 00 05 05 4a 4a 05 04 20 86 01 80    ?>.v?.??JJ?? ???
    30: 94 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ??..............
    40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    

    如果您有任何其他需要、请告诉我。

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

    您好  

    转储的寄存器位于第1页。  

    请使用以下命令。

    #先切换第0页

     i2cset -f -y 0 18 0 0

     i2cdump -f -y 0 18

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

    您好!

    输出如下:

    root@verifone-vegas:~# i2cdump -f -y 0 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: 00 00 01 56 00 91 04 00 00 00 00 81 81 00 80 80    ..?V.??....??.??
    10: 08 00 81 81 80 80 04 00 00 00 01 00 00 08 81 00    ?.?????...?..??.
    20: 00 00 00 00 80 30 00 00 00 00 00 00 00 00 00 00    ....?0..........
    30: 00 00 00 02 32 12 03 02 02 11 10 00 01 04 00 14    ...?2??????.??.?
    40: 0c 1a 1a 00 6f 38 00 00 00 00 00 ee 10 d8 7e e3    ???.o8.....???~?
    50: 00 00 80 00 00 00 00 00 7f 00 00 00 00 00 00 00    ..?.....?.......
    60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    70: 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00    .....?..........
    80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    

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

    您可以在 aic31xx_DAC_MUTE 中添加断电禁用和启用功能。

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

    问题修复了。 我在该函数中向寄存器添加了一个写入、现在它将进入断电状态我还在其他地方添加了一个"禁用断电"写入)。

    非常感谢。

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

    享受 Linux 编程带来的乐趣。