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.

[参考译文] PCMD3180-Q1:如何在 Thor Linux 6.8 中为 PCMD3180 配置设备树?

Guru**** 2925550 points

Other Parts Discussed in Thread: PCMD3180

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1634609/pcmd3180-q1-how-to-configure-the-device-tree-for-pcmd3180-in-thor-linux-6-8

器件型号: PCMD3180-Q1
主题: PCMD3180 中讨论的其他器件

我将使用 Thor SoC 和 6.8 的 Linux 内核。 以下是我对器件树的修改。 当前的问题是我无法注册声卡。 我不确定是否是声卡路由问题(i2cdump -f -y 7 0x4c 正确读取它)。

i2c@810c680000 {
			status = "okay";

			pcmd3180: audio-codec@4c {
				compatible = "ti,tlv320adc3140";
				reg = <0x4c>;
				#sound-dai-cells = <0>;
				reset-gpios = <&gpio_main TEGRA264_MAIN_GPIO(Q, 4) GPIO_ACTIVE_LOW>;
				areg-supply = <&vcc5v_pcmd3180>;

				clocks = <&bpmp TEGRA264_CLK_AUD_MCLK>;
				clock-names = "mclk";

				ti,mic-bias-source = <0>;
				ti,vref-source = <0>;
				ti,pdm-edge-select = <0 0 0 0>;
				ti,gpi-config = <4 4 0 0>;
				ti,asi-tx-drive;
				
				sound-name-prefix = "CVB-RT";
				status = "okay";
				port {
					pcmd3180_ep: endpoint {
						dai-format = "dsp_a";

						bitclock-slave;
						frame-slave;

						dai-tdm-slot-num = <8>;
						dai-tdm-slot-width = <32>;

						remote-endpoint = <&i2s4_dap>;
					};
				};
			};
		};
	sound {
		status = "okay";

		dais = /* ADMAIF (FE) Ports */
		       <&admaif0_port>, <&admaif1_port>, <&admaif2_port>, <&admaif3_port>,
		       <&admaif4_port>, <&admaif5_port>, <&admaif6_port>, <&admaif7_port>,
		       <&admaif8_port>, <&admaif9_port>, <&admaif10_port>, <&admaif11_port>,
		       <&admaif12_port>, <&admaif13_port>, <&admaif14_port>, <&admaif15_port>,
		       <&admaif16_port>, <&admaif17_port>, <&admaif18_port>, <&admaif19_port>,
		       <&admaif20_port>, <&admaif21_port>, <&admaif22_port>, <&admaif23_port>,
		       <&admaif24_port>, <&admaif25_port>, <&admaif26_port>, <&admaif27_port>,
		       <&admaif28_port>, <&admaif29_port>, <&admaif30_port>, <&admaif31_port>,
		       /* XBAR Ports */
		       <&xbar_i2s1_port>, <&xbar_i2s4_port>,
		       <&xbar_sfc1_in_port>, <&xbar_sfc2_in_port>,
		       <&xbar_sfc3_in_port>, <&xbar_sfc4_in_port>,
		       <&xbar_mvc1_in_port>, <&xbar_mvc2_in_port>,
		       <&xbar_amx1_in1_port>, <&xbar_amx1_in2_port>,
		       <&xbar_amx1_in3_port>, <&xbar_amx1_in4_port>,
		       <&xbar_amx2_in1_port>, <&xbar_amx2_in2_port>,
		       <&xbar_amx2_in3_port>, <&xbar_amx2_in4_port>,
		       <&xbar_amx3_in1_port>, <&xbar_amx3_in2_port>,
		       <&xbar_amx3_in3_port>, <&xbar_amx3_in4_port>,
		       <&xbar_amx4_in1_port>, <&xbar_amx4_in2_port>,
		       <&xbar_amx4_in3_port>, <&xbar_amx4_in4_port>,
		       <&xbar_amx5_in1_port>, <&xbar_amx5_in2_port>,
		       <&xbar_amx5_in3_port>, <&xbar_amx5_in4_port>,
		       <&xbar_amx6_in1_port>, <&xbar_amx6_in2_port>,
		       <&xbar_amx6_in3_port>, <&xbar_amx6_in4_port>,
		       <&xbar_adx1_in_port>, <&xbar_adx2_in_port>,
		       <&xbar_adx3_in_port>, <&xbar_adx4_in_port>,
		       <&xbar_adx5_in_port>, <&xbar_adx6_in_port>,
		       <&xbar_mix_in1_port>, <&xbar_mix_in2_port>,
		       <&xbar_mix_in3_port>, <&xbar_mix_in4_port>,
		       <&xbar_mix_in5_port>, <&xbar_mix_in6_port>,
		       <&xbar_mix_in7_port>, <&xbar_mix_in8_port>,
		       <&xbar_mix_in9_port>, <&xbar_mix_in10_port>,
		       <&xbar_asrc_in1_port>, <&xbar_asrc_in2_port>,
		       <&xbar_asrc_in3_port>, <&xbar_asrc_in4_port>,
		       <&xbar_asrc_in5_port>, <&xbar_asrc_in6_port>,
		       <&xbar_asrc_in7_port>,
		       <&xbar_ope1_in_port>,
		       /* HW accelerators */
		       <&sfc1_out_port>, <&sfc2_out_port>,
		       <&sfc3_out_port>, <&sfc4_out_port>,
		       <&mvc1_out_port>, <&mvc2_out_port>,
		       <&amx1_out_port>, <&amx2_out_port>,
		       <&amx3_out_port>, <&amx4_out_port>,
		       <&amx5_out_port>, <&amx6_out_port>,
		       <&adx1_out1_port>, <&adx1_out2_port>,
		       <&adx1_out3_port>, <&adx1_out4_port>,
		       <&adx2_out1_port>, <&adx2_out2_port>,
		       <&adx2_out3_port>, <&adx2_out4_port>,
		       <&adx3_out1_port>, <&adx3_out2_port>,
		       <&adx3_out3_port>, <&adx3_out4_port>,
		       <&adx4_out1_port>, <&adx4_out2_port>,
		       <&adx4_out3_port>, <&adx4_out4_port>,
		       <&adx5_out1_port>, <&adx5_out2_port>,
		       <&adx5_out3_port>, <&adx5_out4_port>,
		       <&adx6_out1_port>, <&adx6_out2_port>,
		       <&adx6_out3_port>, <&adx6_out4_port>,
		       <&mix_out1_port>, <&mix_out2_port>, <&mix_out3_port>,
		       <&mix_out4_port>, <&mix_out5_port>,
		       <&asrc_out1_port>, <&asrc_out2_port>, <&asrc_out3_port>,
		       <&asrc_out4_port>, <&asrc_out5_port>, <&asrc_out6_port>,
		       <&ope1_out_port>,
		       /* BE I/O Ports */
		       <&i2s1_port>, <&i2s4_port>;

		label = "NVIDIA Jetson Thor AGX APE";

		widgets = "Microphone",	"CVB-RT MIC";

		routing = /* Enable I2S4 <-> PCMD3180 */
			  "I2S4 DAP-Capture",		"CVB-RT Capture",
			  /* PCMD3180 codec controls */
			  "CVB-RT MIC1P",		"CVB-RT MIC",
			  "CVB-RT MIC1M",		"CVB-RT MIC",
			  "CVB-RT MIC2P",		"CVB-RT MIC",
			  "CVB-RT MIC2M",		"CVB-RT MIC",
			  "CVB-RT MIC3P",		"CVB-RT MIC",
			  "CVB-RT MIC3M",		"CVB-RT MIC",
			  "CVB-RT MIC4P",		"CVB-RT MIC",
			  "CVB-RT MIC4M",		"CVB-RT MIC";
	};
&i2s4_cif {
	format = "s32_le";
};
&i2s4_port {
	i2s4_dap: endpoint {
		dai-format = "dsp_a";        // TDM

		bitclock-master;           
		frame-master;               
		bitclock-inversion = <0>;
		frame-inversion = <0>;

		
		dai-tdm-slot-num = <8>;    
		dai-tdm-slot-width = <32>; 

		remote-endpoint = <&pcmd3180_ep>;
	};
};

dmesg.txt 

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

    在进行以下修改后、声卡已成功识别:

    / {
        i2s@92b0000 {
    		status = "okay";
    		bclk-ratio = <4>;
    	};
    				
    	i2c@810c680000 {
    		status = "okay";
    
    		tlvcodec: tlvcodec@4c {
    			compatible = "ti,tlv320adc3140";
    			reg = <0x4c>;
    
    			clocks = <&bpmp TEGRA264_CLK_AUD_MCLK>;
    			clock-names = "mclk";
    
    			ti,mic-bias-source = <6>;
    			ti,pdm-edge-select = <0 0 0 0>;
    			ti,gpi-config = <4 5 6 7>;
    			ti,gpio-config = <0 0>;
    			ti,asi-tx-drive;
    			ti,gpo-config-1 = <4 1>;
    			ti,gpo-config-2 = <4 1>;
    			ti,gpo-config-3 = <4 1>;
    			ti,gpo-config-4 = <4 1>;
    
    			reset-gpios = <&gpio_main TEGRA264_MAIN_GPIO(Q, 4) GPIO_ACTIVE_HIGH>;
    			areg-supply = <&vcc5v_pcmd3180>;
    			
    			sound-name-prefix = "H40-TLV";
    
    			status = "okay";
    
    			#sound-dai-cells = <1>;
    			port {
    				tlv_ep: endpoint {
    					link-name = "tlv-8-mic-array";
    					remote-endpoint = <&i2s4_dap>;
    					mclk-fs = <256>;
    				};
    			};
    		};
    	};
    		
    	sound {
    		...
    		widgets = 
    			"Microphone",	"H40-TLV Int Mic";
    
    		routing = 
    			"H40-TLV MIC1P",             "H40-TLV Int Mic",
    			"H40-TLV MIC1M",             "H40-TLV Int Mic",
    			"H40-TLV MIC2P",             "H40-TLV Int Mic",
    			"H40-TLV MIC2M",             "H40-TLV Int Mic",
    			"H40-TLV MIC3P",             "H40-TLV Int Mic",
    			"H40-TLV MIC3M",             "H40-TLV Int Mic",
    			"H40-TLV MIC4P",             "H40-TLV Int Mic",
    			"H40-TLV MIC4M",             "H40-TLV Int Mic";
    		nvidia-audio-card,mclk-fs = <256>;
    		...
    	};
    };
    &i2s4_dap {
    	// link-name = "tlv-8-mic-array";
    	dai-format = "dsp_a";
    	bitclock-master;
    	frame-master;
    	dai-tdm-slot-num = <8>;
    	dai-tdm-slot-width = <32>;
    
    	remote-endpoint = <&tlv_ep>;
    	codec {
    		sound-dai = <&tlvcodec 0>;
    		prefix = "H40-TLV";
    	};
    };
    

    特别是、`reSET-GPIO =<&GPIO_MAIN TEGRA264_MAIN_GPIO (Q、4) GPIO_ACTIVE_HIGH>;`需要高电平有效信号。

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

    感谢您提供该解决方案。

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

    根据 NVIDIA 的文档、我运行了以下命令进行记录。

    amixer -c APE cset name="ADMAIF1 Mux" "I2S4"
    amixer -c APE cset name="I2S4 FSYNC Width" 0
    arecord -D hw:APE,0 -r 48000 -c 2 -f S32_LE /dev/null

    遗憾的是、录制文件不包含有效数据。

    故障排除后、我进行了以下修改、以便在主要模式下配置 τ-I2S。

    &i2s4_dap {
    	// link-name = "tlv-8-mic-array";
    	dai-format = "dsp_a";
    	// bitclock-master;
    	// frame-master;
    	dai-tdm-slot-num = <8>;
    	dai-tdm-slot-width = <32>;
    
    	remote-endpoint = <&tlv_ep>;
    	codec {
    		sound-dai = <&tlvcodec 0>;
    		prefix = "H40-TLV";
    	};
    };

    FSYNC 和 SCLK 信号可以正常测量、但 PCMD3180 的 SDOUT 没有波形。

    同时、我测量了 GPO1、发现没有 CLK 输出;MIC 的 VREF 为 AVDD1V8。 芯片似乎没有正确驱动 GPO 来输出 PDMCLK 信号。

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

    这是​​记录期间所有寄存器值的转储。

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

    尊敬的杭湘:

    首先必须启用 输入和输出时隙:

    寄存器 0x73 = 0xff

    寄存器 0x74 = 0xff

    此致、

    Garret

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

    修改两个寄存器后、该测试仍然显示没有波形。

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

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

    问题最终被发现:
    根据设计、AREG_SELECT 寄存器应为 1;

    因此、应删除“AREG-SUPPLY =<&vcc3V3_sdz>;“。

    此外、还需要以下配置:

    寄存器 0x73 = 0xff
    寄存器 0x74 = 0xff