新闻| 论坛| 博客| 在线研讨会
基于NXP iMX8处理器扩展外部 SGTL5000 音频接口
toradex| 2023-04-19 17:48:20 阅读:400 发布文章

By Toradex胡珊逢

Apalis iMX8计算机模块的数字音频接口SAISynchronous Audio Interface)可以配置为AC97I2S格式,用于连接外部音频编****。文章接下来将介绍在Linux BSP v6上如何扩展第二路SGTL5000

iMX8处理器具有多路SAI通道,SAI1已经被模块片上的SGTL5000使用,SAI0通道引出到模块金手指上,并且是兼容Apalis标准数字音频接口,通道在基于其他CPUApalis模块也可以直接使用。因此,我们选择SAI0扩展外部SGTL5000

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口345.png

SGTL5000面向iMX8处理器的接口主要是I2S和时钟信号。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口386.png

Apalis iMX8SAI0通道可以直接连接SGTL5000I2S接口。但是MXM3_194引脚上没有时钟信号。对于外部音频编****如果需要时钟输入,如SGTL5000SYS_MCLK,可以选择MXM3_215引脚,或者采用外部时钟源,如晶振。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口530.png

SGTL5000master mode时可以向Apalis iMX8输出I2S_LRCLKI2S_SCLK信号。 当SYS_MCLK = SupportedRates * FsI2S_LRCLK可以和SYS_MCLK同步。如果无法满足,SGTL5000则会使用内部的PLL产生符合音源的I2S_LRCLK频率。PLL的使用会增加 额外的功耗。PLL的时钟输入也来自SYS_MCLK,可以支持8.027MHz频率。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口770.png

外部SGTL5000原理图如下,其中使用一个12.28MHz的外部有源晶振。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口815.png

接下来修改device tree添加SGTL5000的相关配置。

imx8-apalis-v1.1.dtsiI2C3节点添加SGTL5000I2C配置。

---------------------------------------

/* Apalis I2C3 (CAM) */
&i2c3 {
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lpi2c3>;
status = "okay";

external_sgtl5000: audio-codec@a {
#sound-dai-cells = <0>;
compatible = "fsl,sgtl5000";
reg = <0xa>;
//micbias-resistor-k-ohms = <2>;
micbias-voltage-m-volts = <2250>;
VDDA-supply = <®_ex_auido_3v>;
VDDIO-supply = <®_ex_auido_3v>;
VDDD-supply = <®_ex_auido_1v8>;
clocks = <&ex_audio_clk>;
};

};

---------------------------------------

SGTL5000使用外部的电源供电,所以也需要添加VDDA-supplyVDDIO-supplyVDDD-supply

---------------------------------------

reg_ex_auido_3v: regulator-ex-audio-3v {
compatible = "regulator-fixed";
regulator-name = "ex-audio-3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};

reg_ex_auido_1v8: regulatorex-audio-1v8 {
compatible = "regulator-fixed";
regulator-name = "+V1.8";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};

---------------------------------------

以及外部时钟定义。

---------------------------------------

ex_audio_clk: sgtl5000_12M {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <12288000>;
};

---------------------------------------

在原有的sound节点后再增加一个 外部SGTL5000sound_external

---------------------------------------

sound_external {
compatible = "simple-audio-card";
simple-audio-card,bitclock-master = <&dailink_master_external>;
simple-audio-card,format = "i2s";
simple-audio-card,frame-master = <&dailink_master_external>;
simple-audio-card,name = "external-sgtl5000";

simple-audio-card,cpu {
sound-dai = <&sai0>;
};

dailink_master_external: simple-audio-card,codec {
sound-dai = <&external_sgtl5000>;
system-clock-frequency = <12288000>;
};
};

---------------------------------------

配置sai0节点。

---------------------------------------

&sai0 {
assigned-clocks = <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_PLL>,
<&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_SLV_BUS>,
<&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_MST_BUS>,
<&sai0_lpcg 0>;
assigned-clock-rates = <786432000>, <49152000>, <12288000>, <49152000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sai0>;
#sound-dai-cells = <0>;
//fsl,txm-rxs;
};

---------------------------------------

最后在imx8-apalis-ixora-v1.2.dtsi里启用SAI0

---------------------------------------

&sai0 {
status = "okay";
};

---------------------------------------

参考这里重新编译和部署device tree。上面提到的patch文件下载。重新启动后检查外部SGTL5000挂载情况。在I2C-5通道上已经发现地址为0x0a的设备。

---------------------------------------

root@apalis-imx8-06852111:/tmp# i2cdetect -y -r 5
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- UU -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

---------------------------------------

相应的驱动也加载。

---------------------------------------

root@apalis-imx8-06852111:/tmp# dmesg|grep sgtl
[ 2.128045] sgtl5000 3-000a: sgtl5000 revision 0x11
[ 2.264861] sgtl5000 5-000a: sgtl5000 revision 0x11

---------------------------------------

检查声卡设备,发现sysdefault:CARD=externalsgtl500

---------------------------------------

root@apalis-imx8-06852111:/tmp# aplay -L

null

Discard all samples (playback) or generate zero samples (capture)

sysdefault:CARD=externalsgtl500

external-sgtl5000, 59040000.sai-sgtl5000 sgtl5000-0

Default Audio Device

sysdefault:CARD=apalisimx8qmsgt

apalis-imx8qm-sgtl5000, 59050000.sai-sgtl5000 sgtl5000-0

Default Audio Device

sysdefault:CARD=imxspdif

imx-spdif, S/PDIF PCM snd-soc-dummy-dai-0

Default Audio Device

---------------------------------------

使用BSP默认的音频文件播放。

---------------------------------------

root@apalis-imx8-06852111:/tmp# aplay -D sysdefault:CARD=externalsgtl500 ~/sound/Gong.wav

---------------------------------------

如果音量小的话,使用alsamixer调整。按F6选择外部SGTL5000

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口5684.png

Gong.wav是一个采样率44.1KHz16bit双声道文件,比特率=16*2*44.1K=1.4MHz。如下面示波器测量显示,CH1LRCLKCH2SCLK

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口5777.png

SGTL5000在播放时会根据音源文件调整工作参数,例如时钟,PLL工作状态。可以通过cat /sys/kernel/debug/regmap/5-000a/registers命令查看寄存器配置。由于SGTL5000的已经被其驱动占用,所以无法使用i2cget读取寄存器。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口5925.png

例如寄存器CHIP_CLK_CTRL 0x0004的值为0007bit3:2=0x01,表示采样频率为44.1KHzBit 1:0 = 0x3,表示使用PLL。这是由于44.1KHz信号无法通过12.28MHz256384512倍分频得到,所以只能使用PLL产生。

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口6082.png

外部SGTL5000的录音功能可以使用下面命令。

---------------------------------------

root@apalis-imx8-06852111:/tmp# arecord -D hw:0,0 -V mono -c 2 -f S16_LE -r 44100 -t wav mic.wav

---------------------------------------

其中hw:0,0可以aplay -l命令查看对应声卡的card, subdevice序号。

---------------------------------------

root@apalis-imx8-06852111:/tmp# aplay -l

**** List of PLAYBACK Hardware Devices ****

card 0: externalsgtl500 [external-sgtl5000], device 0: 59040000.sai-sgtl5000 sgtl5000-0 [59040000.sai-sgtl5000 sgtl5000-0]

Subdevices: 1/1

Subdevice #0: subdevice #0

---------------------------------------

总结

Apalis iMX8的数字音频接口可以非常方便地扩展音频编****,具体的引脚分配、device tree配置等需要结合所使用的音频编****,有些可能会十分简单,如MAX98357A,其甚至不需要I2CSYS_MCLK就可以直接工作。Apalis iMX8所使用的Linux kernel源码中有非常多的示例可供用户参考。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客