關于I2S,wikipedia上介紹的比較全面。這裡記錄一些容易出錯的點。
啟用I2S
以Linux/Android主機闆而言,I2S是ASoC中的CPU Platform驅動。一般情況下需要同時搭上Codec和Machine驅動才能夠啟用。啟用後會在/proc/asound/cards中檢視到多出一個聲霸卡。(如果硬體上I2S确實沒有連接配接Codec,那麼一般CPU廠家核心中會有
Plublic Machine
的Machine驅動來保證單獨的I2S也可以被使用起來)
以Allwinner H3的I2S0為例,由于闆子I2S0沒有連接配接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驅動,
Daudio0 Public Machine for SUNXI chips
為ASoC中的
Machine
+ 虛拟Codec驅動。
對于Allwinner的平台而言還要确定sys_config.fex中的相應配置有沒有選中,相應的GPIO有無占用。
這樣編譯燒寫系統後,
cat /proc/asound/cards
可以檢視到多了一個聲霸卡。
使用I2S
使用I2S就是按照普通聲霸卡的方式進行使用,比如Android下的tinyalsa都可以做簡單的播放錄制等等。
更多使用方法見:Android音頻底層調試-基于tinyalsa。
注意事項
I2S中的一般常用的bit有16 24 32,這些I2S輸出的CLK都是32個。播放16bit時,放到了前32bit的前16bit;播放32bit一般是剛好是32bit;而播放24bit時,需要把資料按照32bit傳遞給裝置節點,也是前24bit。如果使用tinyalsa播放一個真24bit資料時,沒有轉換成32bit下傳時播放會出現噪聲。
|<- 16bit ->|
|<- 32bit ->|
|<- 24bit ->| |
I2S硬體輸出的波形如下:
|<- 32bit ->|
|<- 24bit ->| |
|<- 16bit ->| |
當然還有一點,一些宣稱支援到32bit的,實際輸出的是時候可能會按照24bit輸出(當低8bit丢棄了),比如Allwinner H3。或許隻是kernel驅動的問題。
I2S波形圖鎮樓

<完>