I2S注意事项

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

352001119870964952.jpg

<完>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内容来源:2018 年 8 月 7 日,VMware大中华区原厂高级技术讲师史峻在“VMware直播分享 第二期”...
    麦兜的刀阅读 8,795评论 0 4
  • 11 月 3 日,Spring 技术的拥有者 Pivotal 在北京举办 SpringOne Tour 技术峰会,...
    77e0844c43db阅读 2,118评论 0 0
  • 在 Visual Studio Code 中安装 CodeRunner 插件后,直接运行 Java 代码的时候,输...
    唐七画阅读 11,649评论 0 0
  • 手机和我开了个玩笑,今天就保养了它一下。任何经历过的事都让我有所准备,而进入新领域,往往摸着石头过河,要想结果好,...
    吕明超阅读 952评论 0 0
  • 漫长的秋雨季节已在北方正式拉开帷幕,大家眼中的秋天都是怎样的呢,在我的头脑里,它是光腿穿着靴子踏上淅淅沥沥秋雨形成...
    云时之间阅读 1,202评论 0 1