博客專欄

EEPW首頁 > 博客 > 基于NXP iMX8處理器擴展外部 SGTL5000 音頻接口

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

發(fā)布人:toradex 時間:2023-04-19 來源:工程師 發(fā)布文章

By Toradex胡珊逢

 

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

 

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

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

 

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

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

 

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

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

 

SGTL5000 master mode 時可以向 Apalis iMX8 輸出 I2S_LRCLK I2S_SCLK 信號。 當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處理器擴展外部 SGTL5000 音頻接口770.png 

 

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

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

 

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

imx8-apalis-v1.1.dtsi  I2C3 節(jié)點添加 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é)點后再增加一個 外部 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é)點。

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

&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 默認的音頻文件播放。

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

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

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

 

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

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

 

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

基于NXP iMX8處理器擴展外部 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處理器擴展外部 SGTL5000 音頻接口5925.png 

 

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

基于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 命令查看對應(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ù)字音頻接口可以非常方便地擴展音頻編****,具體的引腳分配、device tree 配置等需要結(jié)合所使用的音頻編****,有些可能會十分簡單,如 MAX98357A,其甚至不需要 I2C SYS_MCLK 就可以直接工作。Apalis iMX8 所使用的 Linux kernel 源碼中有非常多的示例可供用戶參考。 


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: ARM Linux iMX8 SAI NXP Audio Toradex Apalis

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉