工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口

Apalis iMX8 計(jì)算機(jī)模塊的數(shù)字音頻接口 SAISynchronous Audio Interface)可以配置為 AC97I2S格式,用于連接外部音頻編****。文章接下來將介紹在 Linux BSP v6 上如何擴(kuò)展第二路 SGTL5000。

 

iMX8 處理器具有多路 SAI 通道,SAI1 已經(jīng)被模塊片上的 SGTL5000 使用,SAI0 通道引出到模塊金手指上,并且是兼容 Apalis 標(biāo)準(zhǔn)數(shù)字音頻接口,通道在基于其他 CPU 的 Apalis 模塊也可以直接使用。因此,我們選擇 SAI0 擴(kuò)展外部 SGTL5000

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口345.png 

 

SGTL5000 面向 iMX8 處理器的接口主要是 I2S 和時鐘信號。

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口386.png 

 

Apalis iMX8 的 SAI0 通道可以直接連接 SGTL5000 的 I2S 接口。但是 MXM3_194 引腳上沒有時鐘信號。對于外部音頻編****如果需要時鐘輸入,如 SGTL5000 的 SYS_MCLK,可以選擇 MXM3_215 引腳,或者采用外部時鐘源,如晶振。

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口530.png 

 

SGTL5000 在 master mode 時可以向 Apalis iMX8 輸出 I2S_LRCLK 和 I2S_SCLK 信號。 當(dāng)SYS_MCLK = SupportedRates * Fs,I2S_LRCLK 可以和 SYS_MCLK 同步。如果無法滿足,SGTL5000 則會使用內(nèi)部的 PLL  產(chǎn)生符合音源的  I2S_LRCLK 頻率。PLL 的使用會增加 額外的功耗。PLL 的時鐘輸入也來自 SYS_MCLK,可以支持 8.0 到 27MHz 頻率。

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口770.png 

 

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

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口815.png 

 

接下來修改 device tree 添加 SGTL5000 的相關(guān)配置。

imx8-apalis-v1.1.dtsi  的 I2C3 節(jié)點(diǎn)添加 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 = <?_ex_auido_3v>;         VDDIO-supply = <?_ex_auido_3v>;         VDDD-supply = <?_ex_auido_1v8>;         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 節(jié)點(diǎn)后再增加一個 外部 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 節(jié)點(diǎn)。

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

&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 通道上已經(jīng)發(fā)現(xiàn)地址為 0x0a 的設(shè)備。

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

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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

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

 

相應(yīng)的驅(qū)動也加載。

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

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

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

 

檢查聲卡設(shè)備,發(fā)現(xiàn) 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 默認(rèn)的音頻文件播放。

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

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

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

 

如果音量小的話,使用 alsamixer 調(diào)整。按F6 選擇外部 SGTL5000。

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口5684.png 

 

Gong.wav 是一個采樣率44.1KHz,16bit雙聲道文件,比特率=16*2*44.1K=1.4MHz。如下面示波器測量顯示,CH1 LRCLK,CH2 是 SCLK

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口5777.png 

 

SGTL5000 在播放時會根據(jù)音源文件調(diào)整工作參數(shù),例如時鐘,PLL 工作狀態(tài)。可以通過 cat /sys/kernel/debug/regmap/5-000a/registers 命令查看寄存器配置。由于 SGTL5000 的已經(jīng)被其驅(qū)動占用,所以無法使用 i2cget 讀取寄存器。

基于NXP iMX8處理器擴(kuò)展外部 SGTL5000 音頻接口5925.png 

 

例如寄存器 CHIP_CLK_CTRL 0x0004 的值為 0007。bit3:2=0x01,表示采樣頻率為 44.1KHz。Bit 1:0 = 0x3,表示使用 PLL 。這是由于  44.1KHz 信號無法通過 12.28MHz 的 256、384或 512 倍分頻得到,所以只能使用 PLL 產(chǎn)生。

基于NXP iMX8處理器擴(kuò)展外部 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 命令查看對應(yīng)聲卡的 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

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

 

 

總結(jié)

Apalis iMX8 的數(shù)字音頻接口可以非常方便地?cái)U(kuò)展音頻編****,具體的引腳分配、device tree 配置等需要結(jié)合所使用的音頻編****,有些可能會十分簡單,如 MAX98357A,其甚至不需要 I2C 和 SYS_MCLK 就可以直接工作。Apalis iMX8 所使用的 Linux kernel 源碼中有非常多的示例可供用戶參考。 

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊

Verdin iMX8MP 調(diào)試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測試