hi,
Jetson Xavier NX JP5.02 failed to adapt to audio, here are my modifications:
一.tegra194-audio-p3668.dtsi:
- i2c@3160000 {
status = “okay”;
rt5640: rt5640.8-001c@1c {
compatible = “realtek,rt5640”;
reg = <0x1c>;
clock-frequency = <200000>;
/* Codec IRQ output */
interrupt-parent = <&tegra_main_gpio>;
interrupts = <&tegra_main_gpio TEGRA194_MAIN_GPIO(Q, 5) GPIO_ACTIVE_HIGH>;
sound-name-prefix = "CVB-RT";
#sound-dai-cells = <1>;
status = "okay";
};
};
- sound {
…
nvidia-audio-card,widgets =
“Headphone”, “CVB-RT Headphone Jack”,
“Microphone”, “CVB-RT Mic Jack”,
“Speaker”, “CVB-RT Int Spk”,
“Microphone”, “CVB-RT Int Mic”;
nvidia-audio-card,routing =
"CVB-RT Headphone Jack", "CVB-RT HPOL",
"CVB-RT Headphone Jack", "CVB-RT HPOR",
"CVB-RT IN1P", "CVB-RT Mic Jack",
"CVB-RT IN2P", "CVB-RT Mic Jack",
"CVB-RT Int Spk", "CVB-RT SPOLP",
"CVB-RT Int Spk", "CVB-RT SPORP",
"CVB-RT DMIC1", "CVB-RT Int Mic",
"CVB-RT DMIC2", "CVB-RT Int Mic";
nvidia-audio-card,mclk-fs = <256>;
};
3. hdr40_snd_link_i2s: &i2s5_to_codec {
link-name = “rt5640_playback”;
ignore_suspend;
bitclock-master;
frame-master;
format = “i2s”;
codec-dai-name = “rt5640-aif1”;
bit-format = “s16_le”;
srate = <48000>;
num-channel = <2>;
ignore_suspend;
codec {
sound-dai = <&rt5640 0>;
prefix = “CVB-RT”;
};
};
二.tegra_machine_driver.c
- Add: #include “rt5640.h”
2.tegra_machine_dai_init Add:
rtd = snd_soc_get_pcm_runtime(card, “rt5640-playback”);
if (rtd) {
err = snd_soc_dai_set_sysclk(rtd->codec_dai, RT5640_SCLK_S_MCLK,
aud_mclk, SND_SOC_CLOCK_IN);
if (err < 0) {
dev_err(card->dev, “codec_dai clock not set\n”);
return err;
}
} - Add function tegra_machine_rt5640_init:
static int tegra_machine_rt5640_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_card *card = rtd->card;
struct snd_soc_jack *jack;
int err;
jack = devm_kzalloc(card->dev, sizeof(struct snd_soc_jack), GFP_KERNEL);
if (!jack)
return -ENOMEM;
err = snd_soc_card_jack_new(card, “Headset Jack”, SND_JACK_HEADSET,
jack, NULL, 0);
if (err) {
dev_err(card->dev, “Headset Jack creation failed %d\n”, err);
return err;
}
err = tegra_machine_add_codec_jack_control(card, rtd, jack);
if (err) {
dev_err(card->dev, “Failed to add jack control: %d\n”, err);
return err;
}
err = rt5640_set_jack_detect(rtd->codec, jack);
if (err) {
dev_err(card->dev, “Failed to set jack for RT5640: %d\n”, err);
return err;
}
/* single button supporting play/pause */
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_MEDIA);
/* multiple buttons supporting play/pause and volume up/down */
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_MEDIA);
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
snd_soc_dapm_sync(&card->dapm);
return 0;
}
4. codec_init function:
for (i = 0; i < num_links; i++) {
if (!dai_links[i].name)
continue;
if (strstr(dai_links[i].name, “rt5640-playback”) )
dai_links[i].init = tegra_machine_rt5640_init;
else if (strstr(dai_links[i].name, “rt565x-playback”) ||
strstr(dai_links[i].name, “rt565x-codec-sysclk-bclk1”))
dai_links[i].init = tegra_machine_rt565x_init;
三.Result:
1.Mixer control settings:
setting.txt (794.1 KB)
2.Kernel log:
kernel_log (89.9 KB)
3.Device tree log:
dt.log (364.4 KB)
4.Register dump of I2S5 being used:
reg_dump (585 Bytes)
Thanks