Apalis iMX8?計算機模塊的數字音頻接口?SAI(Synchronous Audio Interface)可以配置為?AC97、I2S格式,用于連接外部音頻編解碼器。文章接下來將介紹在?Linux BSP v6?上如何擴展第二路?SGTL5000。
iMX8?處理器具有多路?SAI?通道,SAI1?已經被模塊片上的?SGTL5000?使用,SAI0?通道引出到模塊金手指上,并且是兼容?Apalis?標準數字音頻接口,該通道在基于其他?CPU?的?Apalis?模塊也可以直接使用。因此,我們選擇?SAI0?擴展外部?SGTL5000。
SGTL5000?面向?iMX8?處理器的接口主要是?I2S?和時鐘信號。
Apalis iMX8?的?SAI0?通道可以直接連接?SGTL5000?的?I2S?接口。但是?MXM3_194?引腳上沒有時鐘信號。對于外部音頻編解碼器如果需要時鐘輸入,如?SGTL5000?的?SYS_MCLK,可以選擇?MXM3_215?引腳,或者采用外部時鐘源,如晶振。
SGTL5000?在?master mode?時可以向?Apalis iMX8?輸出?I2S_LRCLK?和?I2S_SCLK?信號。 當SYS_MCLK = SupportedRates * Fs,I2S_LRCLK?可以和?SYS_MCLK?同步。如果無法滿足,SGTL5000?則會使用內部的?PLL ?產生符合音源的 ?I2S_LRCLK?頻率。PLL?的使用會增加 額外的功耗。PLL?的時鐘輸入也來自?SYS_MCLK,可以支持?8.0?到?27MHz?頻率。
外部?SGTL5000?原理圖如下,其中使用一個12.28MHz?的外部有源晶振。
接下來修改?device tree?添加?SGTL5000?的相關配置。
imx8-apalis-v1.1.dtsi ?的?I2C3?節點添加?SGTL5000?的?I2C?配置。
---------------------------------------
/* 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 = ;
????????VDDIO-supply = ;
????????VDDD-supply = ;
????????clocks = <&ex_audio_clk>;
????};
};
---------------------------------------
SGTL5000?使用外部的電源供電,所以也需要添加?VDDA-supply,VDDIO-supply?和?VDDD-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?節點后再增加一個 外部?SGTL5000?的?sound_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。
Gong.wav?是一個采樣率44.1KHz,16bit雙聲道文件,比特率=16*2*44.1K=1.4MHz。如下面示波器測量顯示,CH1?是LRCLK,CH2?是?SCLK。
SGTL5000?在播放時會根據音源文件調整工作參數,例如時鐘,PLL?工作狀態??梢酝ㄟ^?cat /sys/kernel/debug/regmap/5-000a/registers?命令查看寄存器配置。由于?SGTL5000?的已經被其驅動占用,所以無法使用?i2cget?讀取寄存器。
例如寄存器?CHIP_CLK_CTRL 0x0004?的值為?0007。bit3:2=0x01,表示采樣頻率為?44.1KHz。Bit 1:0 = 0x3,表示使用?PLL?。這是由于 ?44.1KHz?信號無法通過?12.28MHz?的?256、384或?512?倍分頻得到,所以只能使用?PLL?產生。
外部?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,其甚至不需要?I2C?和?SYS_MCLK?就可以直接工作。Apalis iMX8?所使用的?Linux kernel?源碼中有非常多的示例可供用戶參考。?
評論
查看更多