AGX Thor use ES8316 codec

Hi, nvidia

I am currently adapting the ES8316 codec to AGX Thor. However, I have encountered some issues.

The clock frequency of AUD_MCLK is 49.15 MHz. However, when I play music, there is no sound output.

cat /proc/asound/cards

0 [HDA ]: tegra-hda - NVIDIA Jetson Thor AGX HDA
NVIDIA Jetson Thor AGX HDA at 0x88090b8000 irq 270
1 [APE ]: tegra-ape - NVIDIA Jetson Thor AGX APE
NVIDIA-CESAGXThorJAT_001-NotSpecified-Jetson

The dts nodes I added are as follows:

i2s@92b0000 {
					status = "okay";
					ports {
						port@1 {
							endpoint {
								dai-format = "i2s";
								remote-endpoint = <&es8316_ep>;
								//bitclock-master;
								//frame-master;
							};
						};
					};


es8316_codec: es8316@10 {
				status = "okay";
				#sound-dai-cells = <0>;
				compatible = "everest,es8316";
				reg = <0x10>;
				clocks = <&bpmp TEGRA264_CLK_AUD_MCLK>;
				clock-names = "mclk";
				sound-name-prefix = "ES";
				
				port {
					es8316_ep: endpoint {
						link-name = "es8316-playback";
						remote-endpoint = <&i2s4_dap>;
						mclk-fs = <256>;
					};
				};
			};


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";
				
		clocks = <&bpmp TEGRA264_CLK_PLLA>,
			 <&bpmp TEGRA264_CLK_PLLA_OUT0>,
			 <&bpmp TEGRA264_CLK_AUD_MCLK>;
		clock-names = "pll_a", "plla_out0", "extern1";
		assigned-clocks = <&bpmp TEGRA264_CLK_PLLA_OUT0>, <&bpmp TEGRA264_CLK_AUD_MCLK>;
		assigned-clock-parents = <&bpmp TEGRA264_CLK_PLLA>, <&bpmp TEGRA264_CLK_PLLA_OUT0>;
		assigned-clock-rates = <98304000>, <49152000>, <12288000>;

		widgets = "Headphone",    "ES Headphone Jack",
			  "Microphone",   "ES Mic Jack",
			  "Speaker",      "ES Int Spk",
			  "Microphone",   "ES Int Mic";

		routing = /* Enable I2S4 <-> ES8316 */
			  "ES Playback",	"I2S4 DAP-Playback",
			  "I2S4 DAP-Capture",		"ES Capture",
			  /* ES8316 codec controls */
			  "ES Headphone Jack",      "ES HPOL",
			  "ES Headphone Jack",      "ES HPOR",
			  "ES MIC1",                "ES Mic Jack",
			  "ES MIC2",                "ES Mic Jack",
			  "ES DMIC",                "ES Int Mic";

		mclk-fs = <256>;
	};

And I didn’t find the virtual sound card I was looking for in the “sound → Output” section.

Thanks.

Best Wishes.

Hi, nvidia

Can someone help me?

I have added the initialization of my codec in the “tegra_codecs.c” file,And the initialization of the codec has also taken effect. but it still hasn’t worked. What should I do?

------zhangsh----tegra_codecs_init:tegra_codecs_init------
.........
---zhangsh---tegra_machine_es8316_init:tegra_machine_es8316_init-----

Thanks

Hi,

  • Are you setting the ES8316 codec specific mixer controls?
  • Please provide amixer, kernel, dt and pinmux logs, for commands refer debug_log_commands.
  • Please probe the I2S lines using oscilloscope while playback is running and share the info.
  • Also, try with aplay command. `aplay -Dhw:APE,0 <input_wav_file>.

Yes.

nvidia@nvidia:~$ amixer -c APE sset "I2S4 Mux" "ADMAIF1"
Simple mixer control 'I2S4 Mux',0
  Capabilities: enum
  Items: 'None' 'ADMAIF1' 'ADMAIF2' 'ADMAIF3' 'ADMAIF4' 'ADMAIF5' 'ADMAIF6' 'ADMAIF7' 'ADMAIF8' 'ADMAIF9' 'ADMAIF10' 'ADMAIF11' 'ADMAIF12' 'ADMAIF13' 'ADMAIF14' 'ADMAIF15' 'ADMAIF16' 'I2S1' 'I2S2' 'I2S3' 'I2S4' 'I2S5' 'I2S6' 'I2S7' 'I2S8' 'SFC1' 'SFC2' 'SFC3' 'SFC4' 'MIXER1 TX1' 'MIXER1 TX2' 'MIXER1 TX3' 'MIXER1 TX4' 'MIXER1 TX5' 'AMX1' 'AMX2' 'AMX3' 'AMX4' 'AMX5' 'AMX6' 'OPE1' 'MVC1' 'MVC2' 'DMIC1' 'DMIC2' 'ADX1 TX1' 'ADX1 TX2' 'ADX1 TX3' 'ADX1 TX4' 'ADX2 TX1' 'ADX2 TX2' 'ADX2 TX3' 'ADX2 TX4' 'ADX3 TX1' 'ADX3 TX2' 'ADX3 TX3' 'ADX3 TX4' 'ADX4 TX1' 'ADX4 TX2' 'ADX4 TX3' 'ADX4 TX4' 'ADX5 TX1' 'ADX5 TX2' 'ADX5 TX3' 'ADX5 TX4' 'ADX6 TX1' 'ADX6 TX2' 'ADX6 TX3' 'ADX6 TX4' 'ASRC1 TX1' 'ASRC1 TX2' 'ASRC1 TX3' 'ASRC1 TX4' 'ASRC1 TX5' 'ASRC1 TX6' 'ADMAIF17' 'ADMAIF18' 'ADMAIF19' 'ADMAIF20' 'ADMAIF21' 'ADMAIF22' 'ADMAIF23' 'ADMAIF24' 'ADMAIF25' 'ADMAIF26' 'ADMAIF27' 'ADMAIF28' 'ADMAIF29' 'ADMAIF30' 'ADMAIF31' 'ADMAIF32'
  Item0: 'ADMAIF1'
nvidia@nvidia:~$ amixer -c APE sset "ADMAIF1 Mux" "I2S4"
Simple mixer control 'ADMAIF1 Mux',0
  Capabilities: enum
  Items: 'None' 'ADMAIF1' 'ADMAIF2' 'ADMAIF3' 'ADMAIF4' 'ADMAIF5' 'ADMAIF6' 'ADMAIF7' 'ADMAIF8' 'ADMAIF9' 'ADMAIF10' 'ADMAIF11' 'ADMAIF12' 'ADMAIF13' 'ADMAIF14' 'ADMAIF15' 'ADMAIF16' 'I2S1' 'I2S2' 'I2S3' 'I2S4' 'I2S5' 'I2S6' 'I2S7' 'I2S8' 'SFC1' 'SFC2' 'SFC3' 'SFC4' 'MIXER1 TX1' 'MIXER1 TX2' 'MIXER1 TX3' 'MIXER1 TX4' 'MIXER1 TX5' 'AMX1' 'AMX2' 'AMX3' 'AMX4' 'AMX5' 'AMX6' 'OPE1' 'MVC1' 'MVC2' 'DMIC1' 'DMIC2' 'ADX1 TX1' 'ADX1 TX2' 'ADX1 TX3' 'ADX1 TX4' 'ADX2 TX1' 'ADX2 TX2' 'ADX2 TX3' 'ADX2 TX4' 'ADX3 TX1' 'ADX3 TX2' 'ADX3 TX3' 'ADX3 TX4' 'ADX4 TX1' 'ADX4 TX2' 'ADX4 TX3' 'ADX4 TX4' 'ADX5 TX1' 'ADX5 TX2' 'ADX5 TX3' 'ADX5 TX4' 'ADX6 TX1' 'ADX6 TX2' 'ADX6 TX3' 'ADX6 TX4' 'ASRC1 TX1' 'ASRC1 TX2' 'ASRC1 TX3' 'ASRC1 TX4' 'ASRC1 TX5' 'ASRC1 TX6' 'ADMAIF17' 'ADMAIF18' 'ADMAIF19' 'ADMAIF20' 'ADMAIF21' 'ADMAIF22' 'ADMAIF23' 'ADMAIF24' 'ADMAIF25' 'ADMAIF26' 'ADMAIF27' 'ADMAIF28' 'ADMAIF29' 'ADMAIF30' 'ADMAIF31' 'ADMAIF32'
  Item0: 'I2S4'
nvidia@nvidia:~$

nvidia@nvidia:~$ amixer -c APE cset name="ES Right Headphone Mixer Right DAC Switch" 1
numid=1995,iface=MIXER,name='ES Right Headphone Mixer Right DAC Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
nvidia@nvidia:~$ amixer -c APE cset name="ES Left Headphone Mixer Left DAC Switch" 1
numid=1993,iface=MIXER,name='ES Left Headphone Mixer Left DAC Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
nvidia@nvidia:~$ 

And logs:

amixer_setting.txt (465.7 KB)

dt.txt (327.5 KB)

dmesg_log.txt (129.5 KB)

clock.txt (142.0 KB)

From the logs, it appears that the codec is configured as the master and Tegra I2S as the slave, meaning the clock source should be the codec. Please confirm whether the codec is generating the clocks correctly. Also, try configuring Tegra I2S as the master and check the behavior.

Additionally, please share the pinmux logs as requested in the previous comment.

I revised the “master and slave” settings for the codec and Tegra I2S according to your instructions. But it’s not ok.

And below is the revised dts and pinmux logs I have made.

dt.txt (327.5 KB)

i2s_reg_dump.txt (1.1 KB)

pinmux_c7a2000.txt (5.9 KB)

pinmux_a8082e0000.txt (5.8 KB)

pinmux_810c281000.txt (26.4 KB)

Hi, Sheetal.G

My codec has been functioning properly for playback and recording. Thank you very much for your support.

Glad to know that it worked. I would like to know what’s the issue earlier.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.