Linux音频调试示例
硬件设计
cpu | codec | peripheral interface |
---|---|---|
nvidia-jetson | max9867 | line-in×1, hp×1 |
codec与cpu之间通过i2c读写寄存器,i2s传输音频信号(i2s总线简介)。
cpu作为主设备,codec作为从设备,cpu提供主时钟(aud_mclk)。
codec连接1路line-in,1路headphone。
设备树
因为cpu是nvidia jetson系列,所以基于Nvidia官方释放的“L4T Sources”(Jetson下载中心)修改。
在i2c节点添加设备
/ {
i2c@c250000 {
// 硬件连通的i2c通道
status = "okay";
max9867: codec@18 {
compatible = "maxim,max9867"; // 与官方驱动匹配
reg = <0x18>; // i2c地址
};
};
};
使能i2s总线
// 在tegraxx_soc_audio.dtsi中查找
/ {
aconnect@2a41000 {
ahub {
i2s@2901300 {
// 硬件连通的i2s通道
status = "okay";
};
};
};
};
添加dai_link
/ {
sound {
status = "okay";
compatible = "nvidia,tegra-audio-t186ref-mobile"; // 修改,与rt565x解绑
nvidia,model = "tegra-snd-t19x-mobile"; // 修改,与rt565x解绑
nvidia,audio-routing = // 需要与codec驱动匹配,从右到左,代表数据流向
// x是前缀,与dai-link的name-prefix匹配
"x LINE_IN", "x Linein",
"x Headphone", "x HPOUT"
nvidia,dai-link-1 {
// dai-link,与codec和i2s匹配
// codec-dai-name与codec驱动匹配
link-name = "max9867";
cpu-dai = <&tegra_i2s1>;
codec-dai = <&max9867>;
cpu-dai-name = "I2S1";
codec-dai-name = "max9867-aif1";
name-prefix = "x";
};
// 只用到一路,其余nvidia,dai-link设置“disabled”
};
};
// max9867.c
static struct snd_soc_dai_driver max9867_dai[] = {
{
.name = "max9867-aif1", // 匹配nvidia,dai-link中的codec-dai-name
... ...
}
};
修改pinmux
/ {
pinmux@2430000 {
pinmux_default: common {
// audio mclk pin
aud_mclk_ps4 {
nvidia,pins = "aud_mclk_ps4";
nvidia,function = "aud";
nvidia,pull = <TEGRA_PIN_PULL_NONE>;
nvidia,tristate = <TEGRA_PIN_DISABLE>;
nvidia,enable-input = <TEGRA_PIN_DISABLE>;
nvidia,lpdr = <TEGRA_PIN_DISABLE>;
};
// i2s pins
dap5_sclk_pt5 {
nvidia,pins = "dap5_sclk_pt5";
nvidia,function = "rsvd2";
nvidia,pull = <TEGRA_PIN_PULL