我在 Linux 系统下配置 imx 和编解码器之间的 sai 连接时遇到了困难。
编解码器为 AK4619,采用 4 通道 TDM 模式。48KHz / 32 位 TDM 模式下播放正常,MSB 优先且 MSB 对齐。
对于捕获,AK4619 仅支持 24 位。数据采用最高有效位对齐,这意味着非有效位位于相关位之后(有效位为 8-31)。另一方面,sai 将 FBT 设置为 23,这意味着有效位为 0-23。
我尝试查找相关设置,但没有找到。我知道 FBT 指示相关数据的起始位置,但我找不到哪个寄存器设置数据大小(在我的情况下是 24,而不是字长 32)。
需要设置哪个寄存器,或者需要在设备树中设置哪些配置?以下是我实际使用的相关配置:
&sai3 {
#sound-dai-cells = <0>;
clocks = <&clk IMX93_CLK_SAI3_IPG>, <&clk IMX93_CLK_DUMMY>,
<&clk IMX93_CLK_SAI3_GATE>, <&clk IMX93_CLK_DUMMY>,
<&clk IMX93_CLK_DUMMY>, <&clk IMX93_CLK_AUDIO_PLL>;
clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3", "pll8k";
assigned-clocks = <&clk IMX93_CLK_SAI3>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai3>;
assigned-clock-parents = <&clk IMX93_CLK_AUDIO_PLL>;
assigned-clock-rates = <24576000>;
fsl,sai-mclk-direction-output;
fsl,sai-asynchronous;
status = "okay";
};
simple-audio-card,dai-link {
link-name = "AK-4CHANNELS";
format = "i2s";
dai-tdm-slot-num = <4>;
dai-tdm-slot-width = <32>;
fsl,mclk-equal-bclk;
cpu {
sound-dai = <&sai3>;
dai-tdm-slot-num = <4>;
dai-tdm-slot-width = <32>;
assigned-clocks = <&clk IMX93_CLK_SAI3>;
};
codec {
sound-dai = <&ak4619>;
system-clock-frequency = <24576000>;
assigned-clocks = <&clk IMX93_CLK_SAI3>;
dai-tdm-slot-num = <4>;
dai-tdm-slot-width = <32>;
};
};我用示波器检查过了,sai 线上的数据看起来是正确的。
任何提示都将不胜感激。
谢谢。
问题是我不知道该在这个登记簿里写些什么。我能找到的唯一一份文件是
julienblanc_0-1789720432684.pngjulienblanc_0-1789720432684.png
我已将我案例中的相关行高亮显示。所以,是的,我应该在 FBT 中写入 0b11111,但我如何知道只有 24 位是相关的呢?我的理解是,我不能使用 W0W 和 WNW,因为它们表示字长,而我的字长是 32 位。我在两个 RCRx 寄存器中都找不到任何相关信息。
此致,
朱利安
你好,
您在录制/播放时是否尝试过使用 ALSA 的 -f S32_LE 参数?
此配置并非在设备树中完成,如果要通过驱动程序进行配置,则需要在此处修改寄存器 TCR5/RCR5:
顺祝商祺!
实际上,这些额外的部分似乎并没有造成任何问题。修改驱动程序,将正确的值写入 FBT 后,音频就能正常工作了。
顺祝商祺!