• 正文
    • 硬件原理
    • IOMUX配置
    • 設(shè)備節(jié)點(diǎn)
    • 添加NAU88C22驅(qū)動
    • 編譯測試
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之SAI

02/21 09:00
717
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

SAI(synchronous audio interface)是音頻專用接口,i.MX6ULL有3路SAI(synchronous audio interface)接口,支持具有幀同步功能的全雙工串行接口,例如I2S、AC97、TDM、codec/DSP接口。i.MX6ULL的SAI音頻接口只是傳輸音頻數(shù)據(jù)的數(shù)字接口,而我們要聽到播放數(shù)字音頻文件的聲音,就需要將這些數(shù)字?jǐn)?shù)據(jù)信號轉(zhuǎn)換模擬的連續(xù)的聲音波形(數(shù)模轉(zhuǎn)換DAC),經(jīng)過放大器放大到揚(yáng)聲器或者到耳機(jī)。同樣錄音的時候,就需要將我們的聲音通過mic或者拾音器,將連續(xù)的模擬信號轉(zhuǎn)換成離散的數(shù)字信號(模數(shù)轉(zhuǎn)換ADC),一般需要完成采樣、量化和編碼三個步驟。我們將DAC和ADC的過程稱為音頻編解碼。

SAI音頻接口只是傳輸音頻數(shù)據(jù)的數(shù)字接口,所以這些音頻編解碼的工作需要一個專有的編解碼芯片來完成,ELF?1使用的是NAU88C22芯片,NAU88C22可連接mic和揚(yáng)聲器或耳機(jī)用于錄音和播放聲音。i.MX6ULL使用I2S總線與NAU88C22進(jìn)行音頻數(shù)據(jù)的傳輸,I2S(Inter—IC Sound)總線,又稱集成電路內(nèi)置音頻總線,是Philips公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn),該總線專門用于音頻設(shè)備之間的數(shù)據(jù)傳輸,廣泛應(yīng)用于各種多媒體系統(tǒng)。

上圖中的SAI2_MCLK、SAI2_BCLK、SAI2_SYNC、SAI2_TXD、SAI2_RXD是本音頻方案中I2S總線包括的信號,其中SAI2_MCLK是系統(tǒng)時鐘,SAI2_BCLK是數(shù)據(jù)位時鐘,SAI2_SYNC是幀時鐘,SAI2_TXD是數(shù)據(jù)發(fā)送,SAI2_RXD是數(shù)據(jù)接收。I2S使用的信號線可根據(jù)具體方案而定,不過一般都會包含BCLK、SYNC、TXD或RXD,三根或四根信號線。具體的I2S總線協(xié)議原理不再展開來講,如果有興趣的或者遇到問題時需要測量其時序的,可自行研究。

i.MX6ULL與NAU88C22相連接的還有一路I2C總線,主要是用于對NAU88C22寄存器進(jìn)行配置,如初始化配置,或者動態(tài)音量調(diào)節(jié)等等。

硬件原理

i.MX6ULL有3路SAI接口,本方案使用SAI2。I2C總線使用I2C2。i.MX6ULL與NAU88C22連接的引腳有:SAI2_MCLK(JTAG_TMS)、SAI2_BCLK(JTAG_TDI)、SAI2_SYNC(JTAG_TDO)、SAI2_TXD(JTAG_TRST_B)、SAI2_RXD(JTAG_TCK)、I2C2_SDA(UART5_RX_DATA)、I2C2_SCL(UART5_TX_DATA)。

IOMUX配置

確定完引腳,可以在設(shè)備樹中arch/arm/boot/dts/imx6ull-elf1-emmc.dts添加IOMUX配置節(jié)點(diǎn),在iomuxc節(jié)點(diǎn)下已添加好sai2子節(jié)點(diǎn)和i2c2子節(jié)點(diǎn):

pinctrl_sai2: sai2grp {

fsl,pins = <

MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK ?????????0x17088

MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC?????????0x17088

MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA ?????0x11088

MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA ?????????0x11088

MX6UL_PAD_JTAG_TMS__SAI2_MCLK ????????????0x17088

>;

};

效果如下:

pinctrl_i2c2: i2c2grp {

fsl,pins = <

MX6UL_PAD_UART5_TX_DATA__I2C2_SCL ?0x4001b8b0

MX6UL_PAD_UART5_RX_DATA__I2C2_SDA ?0x4001b8b0

>;

};

效果如下:

設(shè)備節(jié)點(diǎn)

已添加好的sai2節(jié)點(diǎn):

其中pinctrl-0屬性中引用了&pinctrl_sai2_hp_det_b節(jié)點(diǎn),此節(jié)點(diǎn)是關(guān)于耳機(jī)和mic插拔檢測引腳配置,我們的方案沒有使用插拔檢測,所以注釋掉此配置。iomuxc_snvs節(jié)點(diǎn)中的IOMUX配置也注釋掉:

sai2節(jié)點(diǎn)下的屬性主要是進(jìn)行了時鐘設(shè)置。

在i2c2節(jié)點(diǎn)下添加的NAU88C22子節(jié)點(diǎn):

&i2c2 {

clock_frequency = <100000>;

pinctrl-names = “default”;

pinctrl-0 = <&pinctrl_i2c2>;

status = “okay”;

nau8822: nau8822@1a {

compatible = "nuvoton,nau8822";

reg = <0x1a>;

clocks = <&clks IMX6UL_CLK_SAI2>;

clock-names = "mclk";

#sound-dai-cells = <0>;

status = "okay";

};

};

效果如下:

其子節(jié)點(diǎn)codec設(shè)備就是NAU88C22芯片,reg屬性是此芯片i2c地址0x1a。clocks和clock-name配置了Mclk時鐘及時鐘名;

另外,由于音頻部分采用了和NXP官方不同的方案,我們需要對sound節(jié)點(diǎn)進(jìn)行修改:

????????sound {

compatible = "fsl,imx6ul-evk-nau8822",

"fsl,imx-audio-nau8822";

model = "nau8822-audio";

cpu-dai = <&sai2>;

audio-codec = <&nau8822>;

asrc-controller = <&asrc>;

gpr = <&gpr 4 0x100000 0x100000>;

audio-routing =

"Headphone Jack", "AUXOUT1",

"Headphone Jack", "AUXOUT2",

"Headphone Jack", "LHP",

"Headphone Jack", "RHP",

"Ext Spk", "LSPK",

"Ext Spk", "RSPK",

"LMICP", "Main MIC",

"LMICN", "Main MIC",

"RMICP", "Main MIC",

"RMICN", "Main MIC",

"Main MIC", "Mic Bias",

"CPU-Playback", "ASRC-Playback",

"Playback", "CPU-Playback",

"ASRC-Capture", "CPU-Capture",

"CPU-Capture", "Capture";

status = "okay";

};

修改后效果如下:

其中cpu-dai指向使用的具體的sai接口;

audio-codec屬性指向使用的音頻編解碼芯片NAU88C22;

asrc-controller屬性指使用的異步采樣率轉(zhuǎn)換器

gpr屬性用于配置sai相關(guān)的gpr通用寄存器。

audio-routing是音頻組件連接源和連接點(diǎn)對應(yīng)關(guān)系的列表。

至此,設(shè)備樹已配置完成。

添加NAU88C22驅(qū)動

一、將ELF 1開發(fā)板資料包