I2S注意事项

时间:2024-04-09 21:37:48

关于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波形图镇楼

I2S注意事项

<完>