關(guān)于I2S立倍,wikipedia上介紹的比較全面镰绎。這里記錄一些容易出錯(cuò)的點(diǎn)朝卒。
啟用I2S
以Linux/Android主板而言,I2S是ASoC中的CPU Platform驅(qū)動(dòng)香椎。一般情況下需要同時(shí)搭上Codec和Machine驅(qū)動(dòng)才能夠啟用漱竖。啟用后會(huì)在/proc/asound/cards中查看到多出一個(gè)聲卡。(如果硬件上I2S確實(shí)沒(méi)有連接Codec畜伐,那么一般CPU廠家內(nèi)核中會(huì)有Plublic Machine
的Machine驅(qū)動(dòng)來(lái)保證單獨(dú)的I2S也可以被使用起來(lái))
以Allwinner H3的I2S0為例馍惹,由于板子I2S0沒(méi)有連接Codec,需要按照以下配置啟用該I2S:
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
....
<*> SoC daudio0 tdm interface for SUNXI chips
<*> Daudio0 Public Machine for SUNXI chips
....
其中SoC daudio0 tdm interface for SUNXI chips
為ASoC中的CPU Platform驅(qū)動(dòng)玛界,Daudio0 Public Machine for SUNXI chips
為ASoC中的Machine
+ 虛擬Codec驅(qū)動(dòng)万矾。
對(duì)于Allwinner的平臺(tái)而言還要確定sys_config.fex中的相應(yīng)配置有沒(méi)有選中,相應(yīng)的GPIO有無(wú)占用慎框。
這樣編譯燒寫(xiě)系統(tǒng)后良狈,cat /proc/asound/cards
可以查看到多了一個(gè)聲卡。
使用I2S
使用I2S就是按照普通聲卡的方式進(jìn)行使用鲤脏,比如Android下的tinyalsa都可以做簡(jiǎn)單的播放錄制等等们颜。
更多使用方法見(jiàn):Android音頻底層調(diào)試-基于tinyalsa吕朵。
注意事項(xiàng)
I2S中的一般常用的bit有16 24 32猎醇,這些I2S輸出的CLK都是32個(gè)。播放16bit時(shí)努溃,放到了前32bit的前16bit硫嘶;播放32bit一般是剛好是32bit;而播放24bit時(shí)梧税,需要把數(shù)據(jù)按照32bit傳遞給設(shè)備節(jié)點(diǎn)沦疾,也是前24bit。如果使用tinyalsa播放一個(gè)真24bit數(shù)據(jù)時(shí)第队,沒(méi)有轉(zhuǎn)換成32bit下傳時(shí)播放會(huì)出現(xiàn)噪聲哮塞。
|<- 16bit ->|
|<- 32bit ->|
|<- 24bit ->| |
I2S硬件輸出的波形如下:
|<- 32bit ->|
|<- 24bit ->| |
|<- 16bit ->| |
當(dāng)然還有一點(diǎn),一些宣稱(chēng)支持到32bit的凳谦,實(shí)際輸出的是時(shí)候可能會(huì)按照24bit輸出(當(dāng)?shù)?bit丟棄了)忆畅,比如Allwinner H3∈矗或許只是kernel驅(qū)動(dòng)的問(wèn)題家凯。
I2S波形圖鎮(zhèn)樓
<完>