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.

[参考译文] TLV320AIC34:TDM 配置和播放声音

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1231777/tlv320aic34-tdm-configuration-and-play-sound

器件型号:TLV320AIC34
主题中讨论的其他器件: TLV320AIC3104TAS2781

您好!  

我们正在开发一个基于 imx8mp 的定制电路板、该电路板将 TLV320AIC34编解码器连接到 SAI3。 已使用 Yocto Hardnert 和 NXP BSP 生成操作系统。 我们使用的是内核版本5.10.72。

我们无法在设备树中为编解码器配置声卡。 由于该编解码器内部由两个 tlv320aic3104组成、因此我们首先尝试采用一种方法、即创建一个具有两个 di-link 的单个"简单音频卡"节点卡、每个编解码器块对应一个 di-link、并使用 TDM。 按照这种方法、我们希望拥有一个具有四个独立通道的单张卡。

我们构建的器件树为:

	sound-codec {
		compatible = "simple-audio-card";
		simple-audio-card,name = "ep200-audio";
		status = "okay";
		simple-audio-card,widgets =
			"Microphone", "Mic Jack",
			"Line", "Line Out",
			"Line", "Line In",
			"Headphone", "Headphone Jack";

		simple-audio-card,routing =
			"MIC2L a",	"Mic Jack",
			"MIC2L b",	"Mic Jack",
			"MIC2L a",	"Mic Jack",
			"MIC2L b",	"Mic Jack",
			"Mic Jack",	"Mic Bias a",
			"Mic Jack",	"Mic Bias b",
			"Line Out",	"LLOUT a",
			"Line Out",	"LLOUT b",
			"Line Out",	"RLOUT a",
			"Line Out",	"RLOUT b",
			"RLOUT a", "Playback a",
			"RLOUT b", "Playback b",
			"LLOUT a", "Playback a",
			"LLOUT b", "Playback b",
			"Headphone Jack", "HPLOUT a",
			"Headphone Jack", "HPLOUT b",
			"Headphone Jack", "HPROUT a",	
			"Headphone Jack", "HPROUT b",	
			"LINE1L a",	"Line In",
			"LINE1L b",	"Line In",
			"LINE1R a",	"Line In",
			"LINE1R b",	"Line In";

		simple-audio-card,dai-link@0 {
			format = "i2s";
			bitclock-master = <&dailink_master>;
			frame-master = <&dailink_master>;

			dailink_master: cpu {
				sound-dai = <&sai3>;
				dai-tdm-slot-num = <8>;
				dai-tdm-slot-width = <32>;
				dai-tdm-slot-tx-mask = <1 1 1 1 0 0 0 0>;
				dai-tdm-slot-rx-mask = <1 1 1 1 0 0 0 0>;
			};
			codec {
				sound-dai = <&tlv320aic3104a>;
				clocks = <&clk IMX8MP_CLK_SAI3>;  

			};
		};
		simple-audio-card,dai-link@1 {
			format = "i2s";
			bitclock-master = <&dailink_master2>;
			frame-master = <&dailink_master2>;

			dailink_master2: cpu {
				sound-dai = <&sai3>;
				dai-tdm-slot-num = <8>;
				dai-tdm-slot-width = <32>;
				dai-tdm-slot-tx-mask = <0 0 0 0 1 1 1 1>;
				dai-tdm-slot-rx-mask = <0 0 0 0 1 1 1 1>;
			};
			codec {
				sound-dai = <&tlv320aic3104b>;
				clocks = <&clk IMX8MP_CLK_SAI3>; 		
			};
		};				
	};

在 i2c 节点中:

&i2c3 {
	clock-frequency = <400000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c3>;
	status = "okay";
	
	tlv320aic3104a: tlv320aic3104a@18 {
		#sound-dai-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_tlv320>;
		compatible = "ti,tlv320aic3104_a";
		reg = <0x18>;
		status = "okay";
		reset-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
	};
	
	
	tlv320aic3104b: tlv320aic3104b@19 {
		#sound-dai-cells = <0>;
		//pinctrl-names = "default";
		//pinctrl-0 = <&pinctrl_tlv320>;
		compatible = "ti,tlv320aic3104_b";
		reg = <0x19>;
		status = "okay";
		//reset-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
	};
	
};

我们必须创建一个新的 tlv320aic3104驱动程序,并在其中添加了 sufix "_a"和"_b",以避免使用相同名称的控件。

启动系统后、我们可以看到一张带有两个器件的卡(ep200audio):

卡1:ep200audio [ep200-音频]、设备0:30c30000.SAI-tlv320aic3x-hifi v3 20aic3x-hif-0 [30c30000.SAI-tlv320aic3x-hifi tlv320aic3x-hif-0]
子器件:1/1
子设备#0:子设备#0
卡1:ep200audio [ep200-音频]、设备1:30c30000.si-tlv320aic3x-b-hifi tl v320aic3x-b-hif-1 [30c30000.si-tlv320aic3x-b-hifi tlv320aic3x-b-hifi-1]
子器件:1/1
子设备#0:子设备#0

该卡具有重复的控件、允许我们独立控制每个编解码器块、例如"PCM Playback Volume a"和"PCM Playback Volume b"。 我们的问题是,当我们尝试使用两个卡设备同时播放两个声音时,如果我们在两个单独的控制台运行以下命令,没有播放声音,命令没有完成:
aplay /usr/share/sounds/alsa/Front_Center.wav -Dplughw:ep200audio、0
aplay /usr/share/sounds/alsa/Front_Center.wav -Dplughw:ep200audio、1

我们的方法是否正确? 我们怎样解决这个问题呢? 在我们的应用中、我们需要同时在两个器件中播放声音。

此致、

Gustavo Plaza。

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

    您好!  

    我不认为 devicetree 中存在问题。 我想知道这两个器件是否共享相同的驱动程序代码。 如果是、您要将所有全局变量转换为局部变量。

    您的应用需要修改驱动程序代码以支持两个硬件实例。 您可以在驱动程序中添加一些日志、以检查代码的工作流程。

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

    您好、 丁

    当您说"修改驱动程序代码以支持两个硬件实例"时、 您指的是哪个驱动程序? "simple-audio-card" o "Sai"驱动程序? 我们必须实施哪些修改?

    我们可以在哪个文件或驱动程序中添加日志?  

    此致、  

    Gustavo。

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

    仅 tlv320aic3104驱动程序

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

    我们已向 TLV 驱动程序添加了"#define debug"、但没有显示日志。  

    我们还向   Linux-IMX/sound/soc/soc-core.c 和 Linux-IMX/sound/soc/generic/simple-card.c 添加了"#define debug"  、我们得到的日志包括:

    [ 46.150822] tlv320aic31-A-CODEC 2-0018:SUPPLY IOVDD A NOT FOUND、Using virtual regulator (未找到电源 IOVDD A)
    [ 46.159062] tlv320aic31-A-CODEC 2-0018:未找到电源 DVDD A,使用虚拟调节器
    [46.167146] tlv320aic31-A-CODEC 2-0018:未找到电源 AVDD A,使用虚拟调节器
    [ 46.175180] tlv320aic31-a-codec 2-0018:未找到电源 DRVDD A、使用虚拟调节器
    [ 46.183334] tlv320aic31-a-codec 2-0018:无效电源电压 AVDD:-22、DVDD:-22
    [ 46.191300] tlv320aic31-A-CODEC 2-0018:ASOC:动态寄存器 DAI 2-0018
    [46.198461] tlv320aic31-a-codec 2-0018:ASOC:注册 DAI 'tlv320aic31-a-hifi'
    [46.207066] asoc-simple-card sound-codec: link 2, dais 4, ccnf 0
    [46.213246] ASOC-simple-card sound-codec: link_of (/sound-codec/simple-audio-card da-link@0)
    [46.223159] ASOC-simple-card sound-codec: link_of (/sound-codec/simple-audio-card da-link@1)
    [48.932942] tlv320aic31-b-codec 2-0019:未找到电源 IOVDD b,正在使用虚拟调节器
    [ 48.941343] tlv320aic31-b-codec 2-0019:未找到电源 DVDD b,使用虚拟调节器
    [48.949842] tlv320aic31-b-codec 2-0019:未找到电源 AVDD b,使用虚拟调节器
    [48.957926] tlv320aic31-b-codec 2-0019:未找到电源 DRVDD b,使用虚拟调节器
    [48.966130] tlv320aic31-b-codec 2-0019:无效电源电压 AVDD:-22,DVDD:-22
    [48.974222] tlv320aic31-b-codec 2-0019:ASOC:动态寄存器 DAI 2-0019
    [48.981428] tlv320aic31-b-codec 2-0019:ASOC:已注册 DAI 'tlv320aic31-b-hifi'
    [48.989792] ASOC-simple-card sound-codec:链接2、dais 4、ccnf 0
    [48.997776] ASOC-simple-card sound-codec: link_of (/sound-codec/simple-audio-card da-link@0)
    [ 49.007228] ASOC-simple-card sound-codec:link_of (/sound-codec/simple-audio-card、da-link@1)
    [49.016705] ASOC-simple-card sound-codec: Card Name: ep200-audio
    [49.023510] ASOC-simple-card sound-codec:DAI0
    [ 49.028730] ASOC-simple-card 声音编解码器:CPU SYSCLK = 400000000
    [49.0355553] ASOC-simple-card 音频编解码器:CPU 方向= IN
    [ 49.042043] ASOC-simple-card sound-codec:CPU 插槽=4
    [ 49.048023] ASOC-simple-card 声音编解码器:CPU 插槽宽度= 32
    [ 49.053844] ASOC-simple-card 音频编解码器:CPU TX 插槽掩码= 15
    [49.059792] ASOC-simple-card sound-codec:CPU Rx 插槽掩码=15
    [ 49.065729] ASOC-simple-card 声音编解码器:编解码器 SYSCLK = 24576000
    [49.071848] ASOC-simple-card sound-codec:编解码器方向= IN
    [49.077700] ASOC-simple-card sound-codec:编解码器 TX 时隙掩码=3
    [49.083736] ASOC-simple-card sound-codec:CODEC Rx 插槽掩码=3
    [49.09804] ASOC-simple-card 声音编解码器:编解码器时钟24576000Hz
    [49.095701] ASOC-simple-card sound-codec: dai name = 30c3000.si-tlv320aic31-a-hifi
    [49.103575] ASOC-simple-card sound-codec:Dai 格式= 4001
    [49.109196] ASOC-simple-card sound-codec:MCLK-FS = 256
    [49.114480] ASOC-simple-card 声音编解码器:DAI1
    [ 49.119098] ASOC-simple-card 声音编解码器:CPU SYSCLK = 400000000
    [49.125233] ASOC-simple-card 音频编解码器:CPU 方向= IN
    [49.131038] ASOC-simple-card sound-codec:CPU 插槽=4
    [49.136386] ASOC-简单卡音频编解码器:CPU 插槽宽度= 32
    [49.142248] ASOC-simple-card sound-codec:CPU TX 插槽掩码=15
    [49.148306] ASOC-simple-card sound-codec:CPU Rx 插槽掩码=15
    [ 49.154366] ASOC-simple-card 声音编解码器:编解码器 SYSCLK = 24576000
    [49.160589] ASOC-simple-card 声音编解码器:编解码器方向=输入
    [49.166545] ASOC-simple-card sound-codec:编解码器 TX 插槽掩码= 12
    [49.172753] ASOC-simple-card sound-codec:CODEC Rx 插槽掩码=12
    [49.178975] ASOC-simple-card 声音编解码器:编解码器 clk 24576000Hz
    [49.185869] ASOC-simple-card sound-codec: dai name = 30c3000.si-tlv320aic31-b-hifi
    [49.193792] ASOC-simple-card sound-codec: DAI format = 4001
    [49.199493] ASOC-simple-card 声音编解码器:MCLK-FS = 256
    [49.204873] ASOC-simple-card sound-codec: ASOC : binding 30c3000.si-tlv320aic31-a-hifi
    [49.212999] ASOC-simple-card sound-codec: ASOC: binding 30c3000.si-tlv320aic31-b-hifi
    [49.222093] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 0 latest -2
    [49.230000] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 1 late -2
    [49.237896] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 0 late -1
    [49.245766] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 1 late -1
    [49.253617] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 0 late 0
    [49.261327] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 1 late 0
    [49.269023] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 0 late 1
    [49.276700] ASOC-simple-card sound-codec:ASOC:probe ep200-音频 Dai link 1 late 1
    [49.284384] ASOC-simple-card sound-codec: ASOC: probe ep200-音频 Dai link 0 late 2
    [49.292061] ASOC-simple-card sound-codec: ASOC: probe ep200-音频 Dai link 1 late 2

    我们仅在加载驱动程序时看到日志、但在使用 aplay 播放声音时无法看到任何新日志。

    有什么想法吗? 您是否具有 TLV320AIC34的器件树配置?

    此致、  

    Gustavo。

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

    根据日志、  如果 sound-dai 已被两个 TLV320AIC34驱动 程序中的一个占用、我认为另一个 TLV320AIC34驱动程序可以使用 sound-dai。 可以编写一个驱动程序来支持两个 tlv320aic3104。 添加 kcontrol 控制三种状态、都是工作、编解码器 a 工作、编解码器 b 工作。 如以下

    +  i2c{

    >+    /*支持四核的示例,如平板电脑或平板电脑设备*/

    >+    #地址单元=<1>;

    >+    #size-cells =<0>;

    >+    quad:编解码器@38 {

    >+      compatible ="ti,tas2781";

    >+      reg =< 0x38 /*音频时隙0 */

    >+              0x3a/*音频插槽1 */

    >+>              ;

    >+      #sound-da-cells =<1>;

    >+      RESET-GPIO =<&GPIO1 10 GPIO_ACTIVE_HIGH >;

     

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

    尊敬的丁先生:

    我不是音频驱动器专家、我不知道您说" 我认为 另一个  TLV320AIC34 驱动器可以使用 sound-Dai、当 sound-Dai 曾经被两个 TLV320AIC34驱动 器中的一个占用时"时、您可以给我们更详细的解释吗?

    当您说"添加 kcontrol 控制三种状态、都是工作的、编解码器 A 工作的、编解码器 B 工作的。 就像以下内容一样"、您的意思是只使用一个驱动程序来控制编解码器 A 和编解码器 B 吗?

    此致、  

    Gustavo。

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

    有一个驱动器同时控制 A 和 B。

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

    您好、Gustavo、我正在从事与您相同的任务、使用相同的编解码器、但在 iMX7D 平台上。 您最终是否找到了使它们协同工作的解决方案?

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

    大家好、Mathieu、 我不知道这些天您是否已经完成了整合。

    我们最终使其得以运行、我们所做的是使用 tlv320aic3x 驱动程序的两个实例、添加后缀_a 和_b。 然后我们从"FSL,IMX-AUDIO-CARD"驱动程序开始创建我们自己的音频卡,允许使用两个编解码器驱动程序和一个处理器 SAI。

    我不知道我的答案是否足够清楚。  

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

    您好、Gustavo、

    第一步、我已经为两个编解码器创建了驱动程序_a 和_b。

    您能否 提供有关此 "FSL,IMX-AUDIO-CARD"驱动程序的更多详细信息? 或者仅显示您所做的更改。

    非常感谢。