先说一下芯片控制音频外设的基本操作方法:
CPU通过内部总线控制片内外设(I2S、PCM等等),然后片内外设再去控制音频外设,其中片内外设会根据音频外设厂商给出的方法按照一定的顺序去读取或者发送相关音频数据。
理解一下这三大块:
根据上图的ASOC宽假,我们便可以解决了第一个问题(问题1:编解码器驱动程序通常与底层 SoC CPU 紧密耦合)。在这种逻辑下:
CPU/SOC厂商就只关注platform的代码
外设音频编解码器厂商只关注codec代码
生产厂商就只关注Machine层,将某个CPU/SOC 与 音频外设连接便可。
但是通常情况下,这三部分人员都需要互相懂对方,以方便大家沟通。
ASOC提供了如下的测量解决第二个问题(用户与硬件交互麻烦):
机器特定控制:允许机器向声卡添加控制(例如扬声器放大器的音量控制)。
描述一下,ASOC主要提供了一种方法供使用者选择,这种方法是ASOC Common的,如果使用这种方法,那么就会让用户更加便捷控制,并且由于是ALSA提供的,其安全性和可靠性更加优秀。
此处,ASoC提供了一套标准化的控制接口指的是kcontrols,这些控制接口允许用户空间的应用程序通过标准的ALSA控制接口与音频硬件进行交互。这些控制接口可以用来调节音量、切换音频路径、控制音效等。
ASOC提供了下面的方法来解决第三个问题(耗电量高):
3.动态音频电源管理 (DAPM)。DAPM 始终自动将编解码器设置为最低功耗状态。这包括根据内部编解码器音频路由和任何活动流来打开/关闭内部电源模块。
Linux官方说的是一个总结性的内容,具体来讲它省电的方法在于:
当打开节点的时候,音频的设备不一定会上电,并且当你设置kcontrols给音频硬件上电的时候,硬件也不一定上电了。设备要有数据传输(有数据传输便意味着硬件已经打开,由先open后write/read的软件流程决定)且kcontrols设置上电才会真正的去给硬件上电。
如此便可以解决上电但没有使用造成的电量空损耗的问题了。
其基本的原理是:
在ASOC框架下,
主控IC厂商将其IC特有的操作封装成一系列的标准ASOC接口函数提供给ASOC;
而编解码厂商则会在codec侧将其音频IC的特定操作封装成一系列的标准ASOC接口函数提供给ASOC。
产品厂商在machine层会整合主控IC和编解码IC的内容。
最后在实际录音或者播放的时候,ASOC会按照一定的顺序去调用这两组ops,例如执行open的时候,就会先去调用Platform层的ops去初始化CPU侧的环境,为codec的使用提供环境,再去调用codec端的ops完成特定的外设的初始化。
下图展现其基本的原理:
指的注意的是codec的ops是不一定与platform的ops对应,其是两种ops,这两种ops会由ASOC统一去管理与调用,以完成指定的动作。