Thor I2S audio issue

We are testing the CJC8988 audio chip on our self-developed carrier board. The current situation is that the driver can be registered normally, but there is no sound output from the audio.

About dts:

	clocks {
		cjc8988_mclk: cjc8988_mclk {
			compatible = "fixed-clock";
			#clock-cells = <0>;
			clock-frequency = <12000000>;
			clock-output-names = "cjc8988-mclk";
			status = "okay";
		};
	};

	sound {
		status = "okay";
		/delete-property/ widgets;
		/delete-property/ routing;
	};
	bus@0 {
		aconnect@9000000 {
			ahub@9630000 {
				status = "okay";
				i2s@92b0000 {
					status = "okay";
					ports {
						port@1 {
							endpoint {
								dai-format = "i2s";
								remote-endpoint = <&cjc8988_ep1>;
							};
						};
					};
				};
			};
		};

		i2c@c610000 {
			status = "okay";
			cjc8988: cjc8988@1a {
				status = "okay";
				compatible = "cjc8988";
				reg = <0x1a>;
				clocks = <&cjc8988_mclk>;
				clock-names = "mclk";
				sound-name-prefix = "CVB-RT";
				port {
					cjc8988_ep1: endpoint {
						link-name = "cjc8988-playback";
						remote-endpoint = <&i2s4_dap>;
						mclk-fs = <256>;
					};
				};
			};
		};

cat /proc/asound/cards

nvidia@tegra-ubuntu:~/cjc8988$ cat /proc/asound/cards
 0 [HDA            ]: tegra-hda - NVIDIA Jetson Thor AGX HDA
                      NVIDIA Jetson Thor AGX HDA at 0x88090b8000 irq 287
 1 [APE            ]: tegra-ape - NVIDIA Jetson Thor AGX APE
                      NVIDIA-NVIDIAJetsonAGXThorDeveloperKit-NotSpecified-Jetson

When the insmod driver ko file is being loaded, the log information of dmesg is as follows:

[  221.449270] ----plink----i2c-probe----
[  221.525787] cjc8988_probe ok
[  221.531166] ----plink----sysclk----freq: 12000000----
[  221.531173] cjc8988_set_dai_sysclk constraints_12
[  221.531174] cjc8988_set_dai_fmt SND_SOC_DAIFMT_CBS_CFS
[  221.531176] cjc8988_set_dai_fmt SND_SOC_DAIFMT_I2S
[  221.531178] cjc8988_set_dai_fmt SND_SOC_DAIFMT_NB_NF
[  221.531397] cjc8988_set_dai_fmt ok
[  221.557722] tegra-audio-graph-card sound: Registered APE graph sound card with DPCM links for AHUB
[  221.567678] tegra-mixer-controls sound:mixer-controls: Begin probe of override control device
[  221.569427] tegra-mixer-controls sound:mixer-controls: Registered override controls for APE sound card

The testing method is to use the voice test function in the settings interface.

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cset name="I2S1 Mux" "ADMAIF1"
numid=1886,iface=MIXER,name='I2S1 Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=91
  ; Item #0 'None'
  ; Item #1 'ADMAIF1'
  ; Item #2 'ADMAIF2'
  ; Item #3 'ADMAIF3'
  ; Item #4 'ADMAIF4'
  ; Item #5 'ADMAIF5'
  ; Item #6 'ADMAIF6'
  ; Item #7 'ADMAIF7'
  ; Item #8 'ADMAIF8'
  ; Item #9 'ADMAIF9'
  ; Item #10 'ADMAIF10'
  ; Item #11 'ADMAIF11'
  ; Item #12 'ADMAIF12'
  ; Item #13 'ADMAIF13'
  ; Item #14 'ADMAIF14'
  ; Item #15 'ADMAIF15'
  ; Item #16 'ADMAIF16'
  ; Item #17 'I2S1'
  ; Item #18 'I2S2'
  ; Item #19 'I2S3'
  ; Item #20 'I2S4'
  ; Item #21 'I2S5'
  ; Item #22 'I2S6'
  ; Item #23 'I2S7'
  ; Item #24 'I2S8'
  ; Item #25 'SFC1'
  ; Item #26 'SFC2'
  ; Item #27 'SFC3'
  ; Item #28 'SFC4'
  ; Item #29 'MIXER1 TX1'
  ; Item #30 'MIXER1 TX2'
  ; Item #31 'MIXER1 TX3'
  ; Item #32 'MIXER1 TX4'
  ; Item #33 'MIXER1 TX5'
  ; Item #34 'AMX1'
  ; Item #35 'AMX2'
  ; Item #36 'AMX3'
  ; Item #37 'AMX4'
  ; Item #38 'AMX5'
  ; Item #39 'AMX6'
  ; Item #40 'OPE1'
  ; Item #41 'MVC1'
  ; Item #42 'MVC2'
  ; Item #43 'DMIC1'
  ; Item #44 'DMIC2'
  ; Item #45 'ADX1 TX1'
  ; Item #46 'ADX1 TX2'
  ; Item #47 'ADX1 TX3'
  ; Item #48 'ADX1 TX4'
  ; Item #49 'ADX2 TX1'
  ; Item #50 'ADX2 TX2'
  ; Item #51 'ADX2 TX3'
  ; Item #52 'ADX2 TX4'
  ; Item #53 'ADX3 TX1'
  ; Item #54 'ADX3 TX2'
  ; Item #55 'ADX3 TX3'
  ; Item #56 'ADX3 TX4'
  ; Item #57 'ADX4 TX1'
  ; Item #58 'ADX4 TX2'
  ; Item #59 'ADX4 TX3'
  ; Item #60 'ADX4 TX4'
  ; Item #61 'ADX5 TX1'
  ; Item #62 'ADX5 TX2'
  ; Item #63 'ADX5 TX3'
  ; Item #64 'ADX5 TX4'
  ; Item #65 'ADX6 TX1'
  ; Item #66 'ADX6 TX2'
  ; Item #67 'ADX6 TX3'
  ; Item #68 'ADX6 TX4'
  ; Item #69 'ASRC1 TX1'
  ; Item #70 'ASRC1 TX2'
  ; Item #71 'ASRC1 TX3'
  ; Item #72 'ASRC1 TX4'
  ; Item #73 'ASRC1 TX5'
  ; Item #74 'ASRC1 TX6'
  ; Item #75 'ADMAIF17'
  ; Item #76 'ADMAIF18'
  ; Item #77 'ADMAIF19'
  ; Item #78 'ADMAIF20'
  ; Item #79 'ADMAIF21'
  ; Item #80 'ADMAIF22'
  ; Item #81 'ADMAIF23'
  ; Item #82 'ADMAIF24'
  ; Item #83 'ADMAIF25'
  ; Item #84 'ADMAIF26'
  ; Item #85 'ADMAIF27'
  ; Item #86 'ADMAIF28'
  ; Item #87 'ADMAIF29'
  ; Item #88 'ADMAIF30'
  ; Item #89 'ADMAIF31'
  ; Item #90 'ADMAIF32'
  : values=1

Moreover, it seems that the command did not execute successfully. Could you please provide any suggestions or advice?

kernel/kernel-noble/sound/soc/tegra/tegra_codecs.c

+static int tegra_machine_cjc8988_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct device *dev = rtd->card->dev;
+       printk("----plink----tegra_machine_cjc8988_init: %s----\n", rtd->dai_link->name);
+        return simple_util_dai_init(rtd);
+}

int tegra_codecs_init(struct snd_soc_card *card)
{
        struct snd_soc_dai_link *dai_links = card->dai_link;
        int i;

        if (!dai_links || !card->num_links)
                return -EINVAL;

        for (i = 0; i < card->num_links; i++) {
                if (strstr(dai_links[i].name, "rt565x-playback") ||
                    strstr(dai_links[i].name, "rt5640-playback") ||
                    strstr(dai_links[i].name, "rt565x-codec-sysclk-bclk1") ||
                    strstr(dai_links[i].name, "rt5640-codec-sysclk-bclk1"))
                        dai_links[i].init = tegra_machine_rt56xx_init;
                else if (strstr(dai_links[i].name, "fe-pi-audio-z-v2"))
                        dai_links[i].init = tegra_machine_fepi_init;
                else if (strstr(dai_links[i].name, "respeaker-4-mic-array"))
                        dai_links[i].init = tegra_machine_respeaker_init;
+                else if (strstr(dai_links[i].name, "cjc8988-playback")) /* Add by chenxi to support cjc8988 */
 +                       dai_links[i].init = tegra_machine_cjc8988_init;
        }

        return 0;
}

nvidia@tegra-ubuntu:~$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.raw
Recording WAVE 'test.raw' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~$ aplay -D hw:APE,0 test.raw
Playing WAVE 'test.raw' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~$

The command test can both collect and play, but in fact there is no sound output.

root@tegra-ubuntu:/home/nvidia# ls /sys/kernel/debug/asoc/NVIDIA\ Jetson\ Thor\ AGX\ APE/cjc8988.3-001a/dapm/
 bias_level                'CVB-RT Left Line Mux'  'CVB-RT LINPUT2'      'CVB-RT Right ADC'       'CVB-RT Right Out 2'    'CVB-RT VREF'
'CVB-RT Capture'           'CVB-RT Left Mixer'     'CVB-RT LOUT1'        'CVB-RT Right ADC Mux'   'CVB-RT Right PGA Mux'
'CVB-RT Differential Mux'  'CVB-RT Left Out 1'     'CVB-RT LOUT2'        'CVB-RT Right DAC'       'CVB-RT RINPUT1'
'CVB-RT Left ADC'          'CVB-RT Left Out 2'     'CVB-RT LRC control'  'CVB-RT Right Line Mux'  'CVB-RT RINPUT2'
'CVB-RT Left ADC Mux'      'CVB-RT Left PGA Mux'   'CVB-RT Mic Bias'     'CVB-RT Right Mixer'     'CVB-RT ROUT1'
'CVB-RT Left DAC'          'CVB-RT LINPUT1'        'CVB-RT Playback'     'CVB-RT Right Out 1'     'CVB-RT ROUT2'

nvidia@tegra-ubuntu:~$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~$

Using the sample audio files in here, there is no sound either.

Could you clarify below question

  1. on below change, does the codec expects fixed MCLK rate 12MHz or it would based on sampling rate factor as per your change i.e 256Fs?
clocks {
	cjc8988_mclk: cjc8988_mclk {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <12000000>;
		clock-output-names = "cjc8988-mclk";
		status = "okay";
	};
};
  1. When you perform aplay for a wavefile, does the file plays for whole duration or stops immediately
  2. Does the I2S signals reaches the codec pins? could you probe the signals

Please also check the codec related amixer controls required as I don’t see any codec controls in your comment.

yes

yes

Capable of detecting the signal reaching the pins of the codec chip.

Yesterday during the test, I was able to play audio. Since this was my first time testing the audio codec chip.

音频设置和开发 — NVIDIA Jetson Linux 开发人员指南
I’m not sure how to proceed with this part of the configuration.

This is my first time testing the codec chip, and I’m not sure how to troubleshoot it. I hope to receive your assistance.

Ok, What I understand from your reply is

→ I2S signals are reaching the Codec pins during the playback session active.

This confirms the Tegra I2S signals are working fine and could able to send data to the codec.

→ No audio output could be now related to not properly configuring the codec controls/setting.

Would you be able to attach the codec driver, this would help me to analyze the driver and suggest something.

–> Also list all the amixer controls you have used before aplay command to configure the path.

cjc8988.zip (6.7 KB)
The attachment is our driver.

About amixer

nvidia@tegra-ubuntu:~$ amixer -c APE controls |grep CVB-RT
numid=1823,iface=MIXER,name='CVB-RT 3D Lower Cut-off'
numid=1825,iface=MIXER,name='CVB-RT 3D Mode'
numid=1821,iface=MIXER,name='CVB-RT 3D Switch'
numid=1824,iface=MIXER,name='CVB-RT 3D Upper Cut-off'
numid=1822,iface=MIXER,name='CVB-RT 3D Volume'
numid=1832,iface=MIXER,name='CVB-RT ALC Capture Attack Time'
numid=1831,iface=MIXER,name='CVB-RT ALC Capture Decay Time'
numid=1828,iface=MIXER,name='CVB-RT ALC Capture Function'
numid=1830,iface=MIXER,name='CVB-RT ALC Capture Hold Time'
numid=1827,iface=MIXER,name='CVB-RT ALC Capture Max Volume'
numid=1835,iface=MIXER,name='CVB-RT ALC Capture NG Switch'
numid=1833,iface=MIXER,name='CVB-RT ALC Capture NG Threshold'
numid=1834,iface=MIXER,name='CVB-RT ALC Capture NG Type'
numid=1826,iface=MIXER,name='CVB-RT ALC Capture Target Volume'
numid=1829,iface=MIXER,name='CVB-RT ALC Capture ZC Switch'
numid=1816,iface=MIXER,name='CVB-RT Bass Boost'
numid=1817,iface=MIXER,name='CVB-RT Bass Filter'
numid=1818,iface=MIXER,name='CVB-RT Bass Volume'
numid=1844,iface=MIXER,name='CVB-RT Capture 6dB Attenuate'
numid=1837,iface=MIXER,name='CVB-RT Capture Digital Volume'
numid=1842,iface=MIXER,name='CVB-RT Capture Polarity'
numid=1840,iface=MIXER,name='CVB-RT Capture Switch'
numid=1838,iface=MIXER,name='CVB-RT Capture Volume'
numid=1839,iface=MIXER,name='CVB-RT Capture ZC Switch'
numid=1999,iface=MIXER,name='CVB-RT Differential Mux'
numid=2003,iface=MIXER,name='CVB-RT Left Line Mux'
numid=2006,iface=MIXER,name='CVB-RT Left Mixer Left Bypass Switch'
numid=1846,iface=MIXER,name='CVB-RT Left Mixer Left Bypass Volume'
numid=2005,iface=MIXER,name='CVB-RT Left Mixer Playback Switch'
numid=2008,iface=MIXER,name='CVB-RT Left Mixer Right Bypass Switch'
numid=1847,iface=MIXER,name='CVB-RT Left Mixer Right Bypass Volume'
numid=2007,iface=MIXER,name='CVB-RT Left Mixer Right Playback Switch'
numid=2001,iface=MIXER,name='CVB-RT Left PGA Mux'
numid=1851,iface=MIXER,name='CVB-RT Output 1 Playback Volume'
numid=1850,iface=MIXER,name='CVB-RT Output 1 Playback ZC Switch'
numid=1853,iface=MIXER,name='CVB-RT Output 2 Playback Volume'
numid=1852,iface=MIXER,name='CVB-RT Output 2 Playback ZC Switch'
numid=1845,iface=MIXER,name='CVB-RT PCM Volume'
numid=1843,iface=MIXER,name='CVB-RT Playback 6dB Attenuate'
numid=1841,iface=MIXER,name='CVB-RT Playback De-emphasis'
numid=2004,iface=MIXER,name='CVB-RT Right Line Mux'
numid=2010,iface=MIXER,name='CVB-RT Right Mixer Left Bypass Switch'
numid=1848,iface=MIXER,name='CVB-RT Right Mixer Left Bypass Volume'
numid=2009,iface=MIXER,name='CVB-RT Right Mixer Left Playback Switch'
numid=2011,iface=MIXER,name='CVB-RT Right Mixer Playback Switch'
numid=2012,iface=MIXER,name='CVB-RT Right Mixer Right Bypass Switch'
numid=1849,iface=MIXER,name='CVB-RT Right Mixer Right Bypass Volume'
numid=2002,iface=MIXER,name='CVB-RT Right PGA Mux'
numid=2000,iface=MIXER,name='CVB-RT Route'
numid=1820,iface=MIXER,name='CVB-RT Treble Cut-off'
numid=1819,iface=MIXER,name='CVB-RT Treble Volume'
numid=1836,iface=MIXER,name='CVB-RT ZC Timeout Switch'

At present, we also suspect that the routing configuration is incorrect. After the driver is successfully loaded, there are some incorrect values in the registers. After manually writing the values, the sound can be played normally. Could you please provide guidance on how to configure the routing properly?

The value of the CJC8988_PWR2 register has been set to 0, so there is no sound. The current problem identified is…

Please try with below commands before the playback

amixer -c APE cset name=“CVB-RT Right Mixer Playback Switch” “on”
amixer -c APE cset name=“CVB-RT Left Mixer Playback Switch” “on”

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cset name=“CVB-RT Right Mixer Playback Switch” “on”
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cset name=“CVB-RT Left Mixer Playback Switch” “on”
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$

The current problem seems to be similar to this one - the control items cannot be set.

Plesae check the double quote ““ format, sometime copying from here won’t work properly

How should I configure it in order to achieve audio capture? The command for collection did not report any errors, but the final file playback did not produce any sound. And when opening it with Audacity, the waves cannot be seen.

The amixer information related to CVB-RT is as follows:

numid=1823,iface=MIXER,name='CVB-RT 3D Lower Cut-off'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 '200Hz'
  ; Item #1 '500Hz'
  : values=0
numid=1825,iface=MIXER,name='CVB-RT 3D Mode'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Capture'
  ; Item #1 'Playback'
  : values=0
numid=1821,iface=MIXER,name='CVB-RT 3D Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1824,iface=MIXER,name='CVB-RT 3D Upper Cut-off'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 '2.2kHz'
  ; Item #1 '1.5kHz'
  : values=0
numid=1822,iface=MIXER,name='CVB-RT 3D Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=0
numid=1832,iface=MIXER,name='CVB-RT ALC Capture Attack Time'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=2
numid=1831,iface=MIXER,name='CVB-RT ALC Capture Decay Time'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=3
numid=1828,iface=MIXER,name='CVB-RT ALC Capture Function'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Off'
  ; Item #1 'Right'
  ; Item #2 'Left'
  ; Item #3 'Stereo'
  : values=1
numid=1830,iface=MIXER,name='CVB-RT ALC Capture Hold Time'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=0
numid=1827,iface=MIXER,name='CVB-RT ALC Capture Max Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0
  : values=7
numid=1835,iface=MIXER,name='CVB-RT ALC Capture NG Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1833,iface=MIXER,name='CVB-RT ALC Capture NG Threshold'
  ; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0
  : values=0
numid=1834,iface=MIXER,name='CVB-RT ALC Capture NG Type'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Constant PGA Gain'
  ; Item #1 'Mute ADC Output'
  : values=0
numid=1826,iface=MIXER,name='CVB-RT ALC Capture Target Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0
  : values=3
numid=1829,iface=MIXER,name='CVB-RT ALC Capture ZC Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1816,iface=MIXER,name='CVB-RT Bass Boost'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Linear Control'
  ; Item #1 'Adaptive Boost'
  : values=0
numid=1817,iface=MIXER,name='CVB-RT Bass Filter'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 '130Hz @ 48kHz'
  ; Item #1 '200Hz @ 48kHz'
  : values=0
numid=1818,iface=MIXER,name='CVB-RT Bass Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=15
numid=1844,iface=MIXER,name='CVB-RT Capture 6dB Attenuate'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1837,iface=MIXER,name='CVB-RT Capture Digital Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=255,step=0
  : values=195,195
  | dBscale-min=-97.50dB,step=0.50dB,mute=1
numid=1842,iface=MIXER,name='CVB-RT Capture Polarity'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Normal'
  ; Item #1 'L Invert'
  ; Item #2 'R Invert'
  ; Item #3 'L + R Invert'
  : values=0
numid=1840,iface=MIXER,name='CVB-RT Capture Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=on,on
numid=1838,iface=MIXER,name='CVB-RT Capture Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=63,step=0
  : values=23,23
  | dBscale-min=-17.25dB,step=0.75dB,mute=0
numid=1839,iface=MIXER,name='CVB-RT Capture ZC Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=off,off
numid=1999,iface=MIXER,name='CVB-RT Differential Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  : values=0
numid=2003,iface=MIXER,name='CVB-RT Left Line Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'PGA'
  ; Item #3 'Differential'
  : values=0
numid=2006,iface=MIXER,name='CVB-RT Left Mixer Left Bypass Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1846,iface=MIXER,name='CVB-RT Left Mixer Left Bypass Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=2
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=2005,iface=MIXER,name='CVB-RT Left Mixer Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=2008,iface=MIXER,name='CVB-RT Left Mixer Right Bypass Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1847,iface=MIXER,name='CVB-RT Left Mixer Right Bypass Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=2
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=2007,iface=MIXER,name='CVB-RT Left Mixer Right Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=2001,iface=MIXER,name='CVB-RT Left PGA Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=3
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'Differential'
  : values=1
numid=1851,iface=MIXER,name='CVB-RT Output 1 Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=127,step=0
  : values=127,127
  | dBscale-min=-121.00dB,step=1.00dB,mute=1
numid=1850,iface=MIXER,name='CVB-RT Output 1 Playback ZC Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=off,off
numid=1853,iface=MIXER,name='CVB-RT Output 2 Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=127,step=0
  : values=116,116
  | dBscale-min=-121.00dB,step=1.00dB,mute=1
numid=1852,iface=MIXER,name='CVB-RT Output 2 Playback ZC Switch'
  ; type=BOOLEAN,access=rw------,values=2
  : values=off,off
numid=1845,iface=MIXER,name='CVB-RT PCM Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=255,step=0
  : values=254,254
  | dBscale-min=-127.50dB,step=0.50dB,mute=1
numid=1843,iface=MIXER,name='CVB-RT Playback 6dB Attenuate'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1841,iface=MIXER,name='CVB-RT Playback De-emphasis'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'None'
  ; Item #1 '32Khz'
  ; Item #2 '44.1Khz'
  ; Item #3 '48Khz'
  : values=0
numid=2004,iface=MIXER,name='CVB-RT Right Line Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'PGA'
  ; Item #3 'Differential'
  : values=0
numid=2010,iface=MIXER,name='CVB-RT Right Mixer Left Bypass Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1848,iface=MIXER,name='CVB-RT Right Mixer Left Bypass Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=2
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=2009,iface=MIXER,name='CVB-RT Right Mixer Left Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=2011,iface=MIXER,name='CVB-RT Right Mixer Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=2012,iface=MIXER,name='CVB-RT Right Mixer Right Bypass Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=1849,iface=MIXER,name='CVB-RT Right Mixer Right Bypass Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
  : values=4
  | dBscale-min=-15.00dB,step=3.00dB,mute=0
numid=2002,iface=MIXER,name='CVB-RT Right PGA Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=3
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'Differential'
  : values=1
numid=2000,iface=MIXER,name='CVB-RT Route'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Stereo'
  ; Item #1 'Mono (Left)'
  ; Item #2 'Mono (Right)'
  ; Item #3 'Digital Mono'
  : values=0
numid=1820,iface=MIXER,name='CVB-RT Treble Cut-off'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 '8kHz'
  ; Item #1 '4kHz'
  : values=0
numid=1819,iface=MIXER,name='CVB-RT Treble Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
  : values=0
numid=1836,iface=MIXER,name='CVB-RT ZC Timeout Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off

Just a confirmation, does the playback working fine with the mixer control suggested?.

On capture does your mic connected to codec Line 1 pin?. As per controls the codec is set to capture from Line1

yes

I have communicated with the chip manufacturer. This chip can collect data simultaneously for Line 1 and Line 2. Currently, I have only connected to Line 2.

Try setting below controls for Line2, if doesn’t work you could check with codec vendor on right set of controls to enable capture

‘CVB-RT Right Line Mux’ → 1

‘CVB-RT Left Line Mux’ → 1

‘CVB-RT Differential Mux’ → 1

Hello mkumard,
Currently, data waveforms can be captured through the I2S_DIN pin.


However, the collected audio files still contain no data.

nvidia@tegra-ubuntu:~/capture$ amixer -c APE cget name="CVB-RT Left Line Mux"
numid=2003,iface=MIXER,name='CVB-RT Left Line Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'PGA'
  ; Item #3 'Differential'
  : values=1
nvidia@tegra-ubuntu:~/capture$ amixer -c APE cget name="CVB-RT Right Line Mux"
numid=2004,iface=MIXER,name='CVB-RT Right Line Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'PGA'
  ; Item #3 'Differential'
  : values=1
nvidia@tegra-ubuntu:~/capture$ amixer -c APE cget name="CVB-RT Differential Mux"
numid=1999,iface=MIXER,name='CVB-RT Differential Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  : values=1

Currently, the MCLK used in the chips is obtained through a crystal oscillator. Next, how should I proceed with the testing and adjustment?

As you mentioned the I2S DIN is showing valid data, the captured file also should have same data. Could you provide the full list of commands used and output file captured.

nvidia@tegra-ubuntu:~/cjc8988$ sudo insmod cjc8988.ko
nvidia@tegra-ubuntu:~/cjc8988$ sudo su
root@tegra-ubuntu:/home/nvidia/cjc8988# ls /sys/kernel/debug/asoc/NVIDIA\ Jetson\ Thor\ AGX\ APE/cjc8988.3-001a/dapm/
 bias_level                'CVB-RT LINPUT1'         'CVB-RT Right Mixer'
'CVB-RT Capture'           'CVB-RT LINPUT2'         'CVB-RT Right Out 1'
'CVB-RT Differential Mux'  'CVB-RT LOUT1'           'CVB-RT Right Out 2'
'CVB-RT Left ADC'          'CVB-RT LOUT2'           'CVB-RT Right PGA Mux'
'CVB-RT Left ADC Mux'      'CVB-RT LRC control'     'CVB-RT RINPUT1'
'CVB-RT Left DAC'          'CVB-RT Mic Bias'        'CVB-RT RINPUT2'
'CVB-RT Left Line Mux'     'CVB-RT Playback'        'CVB-RT ROUT1'
'CVB-RT Left Mixer'        'CVB-RT Right ADC'       'CVB-RT ROUT2'
'CVB-RT Left Out 1'        'CVB-RT Right ADC Mux'   'CVB-RT VREF'
'CVB-RT Left Out 2'        'CVB-RT Right DAC'
'CVB-RT Left PGA Mux'      'CVB-RT Right Line Mux'
root@tegra-ubuntu:/home/nvidia/cjc8988# exit
exit
nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Capture"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left ADC"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Right ADC"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left ADC Mux"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left Line Mux"
numid=2003,iface=MIXER,name='CVB-RT Left Line Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'PGA'
  ; Item #3 'Differential'
  : values=1
nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left Mixer"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left PGA Mux"
numid=2001,iface=MIXER,name='CVB-RT Left PGA Mux'
  ; type=ENUMERATED,access=rw------,values=1,items=3
  ; Item #0 'Line 1'
  ; Item #1 'Line 2'
  ; Item #2 'Differential'
  : values=1
nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Left LINPUT2"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ amixer -c APE cget name="CVB-RT Mic Bias"
amixer: Cannot find the given element from control sysdefault:1

nvidia@tegra-ubuntu:~/cjc8988$ ls
cjc8988.c   cjc8988.mod    cjc8988.o  modules.order   test
cjc8988.h   cjc8988.mod.c  dump.dts   Module.symvers
cjc8988.ko  cjc8988.mod.o  Makefile   reg_value.sh
nvidia@tegra-ubuntu:~/cjc8988$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~/cjc8988$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~/cjc8988$ sudo i2cdump -f -y 3 0x1a
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: 17 01 17 01 7f 01 7f 01 00 00 00 00 00 00 02 00    ????????......?.
10: 00 00 00 00 fe 00 fe 00 00 00 00 00 00 00 00 00    ....?.?.........
20: 00 00 fb 00 00 00 32 00 00 00 c3 00 c3 00 00 00    ..?...2...?.?...
30: 80 01 4c 01 f8 01 00 00 00 00 00 00 00 00 00 01    ??L???.........?
40: 40 00 40 00 51 01 50 00 52 00 30 01 50 00 50 00    @.@.Q?P.R.0?P.P.
50: 74 00 74 00 79 00 00 00 00 00 00 00 00 00 00 00    t.t.y...........
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 08 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    ................
nvidia@tegra-ubuntu:~/cjc8988$ sudo i2cset -f -y 3 0x1a 0x0e 0x4a
nvidia@tegra-ubuntu:~/cjc8988$ arecord -Dhw:APE,0 -c 2 -r 48000 -f S16_LE -d 15 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
nvidia@tegra-ubuntu:~/cjc8988$

The above steps constitute the complete operation.

Regarding this, the reason is that the codec chip uses the crystal oscillator’s clock instead of Thor’s MCLK. Therefore, it can only operate in the main mode.