在 imx93 平臺調試 nau88c10 聲卡
一、環境介紹
linux 版本:6.6.52
soc:imx9331
codec:nau88c10
使用的內核文件為 Image,dtb 文件為:imx93-11x11-evk.dtb
二、硬件檢查
-
i2s 信號線要接對
-
i2c 控制信號建議為 4.7k 上拉
-
codec 供電可以按參考設計來
三、驅動修改
先配置 sai 信號,我的板子使用的是 sai2,所以我配置如下
&sai2 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&pinctrl_sai2>;
pinctrl-1 = <&pinctrl_sai2_sleep>;
assigned-clocks = <&clk IMX93_CLK_SAI2>;
assigned-clock-parents = <&clk IMX93_CLK_AUDIO_PLL>;
assigned-clock-rates = <12288000>;
fsl,sai-mclk-direction-output;
status = "okay";
};
pinctrl_sai2: sai2grp {
fsl,pins = <
MX93_PAD_ENET2_TX_CTL__SAI2_TX_SYNC 0x31e
MX93_PAD_ENET2_TXC__SAI2_TX_BCLK 0x31e
MX93_PAD_ENET2_RD2__SAI2_MCLK 0x31e
MX93_PAD_ENET2_RX_CTL__SAI2_TX_DATA00 0x31e
MX93_PAD_ENET2_TD3__SAI2_RX_DATA00 0x31e
>;
};
pinctrl_sai2_sleep: sai2grpsleep {
fsl,pins = <
MX93_PAD_ENET2_TX_CTL__GPIO4_IO20 0x51e
MX93_PAD_ENET2_TXC__GPIO4_IO21 0x51e
MX93_PAD_ENET2_RD2__GPIO4_IO26 0x51e
MX93_PAD_ENET2_RX_CTL__GPIO4_IO22 0x51e
MX93_PAD_ENET2_TD3__GPIO4_IO16 0x51e
>;
};
再配置 codec,codec 的 7 位讀寫地址為 0x1a;因為要用到 imx9331 給的 mclk;所以添加了一個時鐘配置
&lpi2c1 {
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <400000>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&pinctrl_lpi2c1>;
pinctrl-1 = <&pinctrl_lpi2c1>;
status = "okay";
codec: nau8810@1a {
#sound-dai-cells = <0>;
compatible = "nuvoton,nau8810";
reg = <0x1a>;
clocks = <&clk IMX93_CLK_SAI2>;
clock-name = "mclk";
};
};
再配置 machine 驅動的硬件信息,參考原先的 codec,修改如下
audio-routing 是更具 machine 驅動,和 codec 驅動的 struct snd_soc_dapm_widget 來填寫的;
sound-nau8810 {
compatible = "fsl,imx-audio-nau8810";
model = "nau8810-audio";
audio-cpu = <&sai2>;
audio-codec = <&codec>;
audio-routing =
"Ext Spk", "MONOOUT",
"Ext Spk", "SPKOUTP",
"Ext Spk", "SPKOUTN",
"AMIC", "MICN",
"AMIC", "MICP";
};
修改 machine 驅動,更具參考板的 compatible 字符串,找到驅動 fsl-asoc-card.c
// 添加頭文件
#include "../codecs/nau8810.h"
// 注釋掉以下代碼
static int fsl_asoc_card_hw_free(struct snd_pcm_substream *substream)
{
......
#if 0
ret = snd_soc_dai_set_pll(asoc_rtd_to_codec(rtd, 0),
codec_priv->pll_id, 0, 0, 0);
if (ret && ret != -ENOTSUPP) {
dev_err(dev, "failed to stop FLL: %d\n", ret);
return ret;
}
#endif
......
}
// 添加聲卡 nau8810 的信息
static int fsl_asoc_card_probe(struct platform_device *pdev)
{
......
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8904")) {
codec_dai_name = "wm8904-hifi";
priv->codec_priv.mclk_id = WM8904_FLL_MCLK;
priv->codec_priv.fll_id = WM8904_CLK_FLL;
priv->codec_priv.pll_id = WM8904_FLL_MCLK;
priv->dai_fmt |= SND_SOC_DAIFMT_CBP_CFP;
priv->card_type = CARD_WM8904;
} else if (of_device_is_compatible(np, "fsl,imx-audio-nau8810")) {
codec_dai_name = "nau8810-hifi";
priv->codec_priv.mclk_id = NAU8810_SCLK_MCLK;
priv->codec_priv.fll_id = NAU8810_SCLK_PLL;
priv->codec_priv.pll_id = NAU8810_SCLK_PLL;
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
if (codec_dev) {
priv->codec_priv.mclk = devm_clk_get(codec_dev, NULL);
printk("trans mclk rate %ld\n", clk_get_rate(priv->codec_priv.mclk));
}
} else {
dev_err(&pdev->dev, "unknown Device Tree compatible\n");
ret = -EINVAL;
goto asrc_fail;
}
......
}
四、測試聲卡
可以通過 alsa 工具來測試聲卡
# 顯示所有可以配置的控件
amixer controls
# SPKOUT 非靜音
amixer cset numid=36 off
# SPKOUT 靜音
amixer cset numid=36 on
# MONOOUT 非靜音
amixer cset numid=39 off
# MONOOUT 靜音
amixer cset numid=39 on
# 調整 MONOOUT 音量(SPKOUT 也會被一起調節)
amixer cset numid=7 220
# 調整 MIC 音量
amixer cset numid=11 230
# 調整 SPKOUT 音量
amixer cset numid=37 63
# 邊錄邊放
arecord -f S16_LE -r 8000 -c 2 | aplay -

浙公網安備 33010602011771號