转载 :
https://zhuanlan.zhihu.com/p/56792351
前言
编写目的
此文档描述了通用的Android和Linux音频驱动框架和修改方法,并描述了音频模块的驱动和上层的使用和调试方法。并且针对智慧社区自研平板上特定的外挂音频Codec硬件进行了描述。
阅读对象
嵌入式开发。
1. 术语与缩写解释
缩写、术语
2.模块设计
2.1 硬件体系结构设计
如上图所示,其中RT5670为编码器器件,通过I2S0的SDI与主芯片相连。TFA9890为数字功放,通过I2S0 SDO与主芯片相连。数字功放的回声消除的DATA OUT与RT5670的DAC部分相连用来做回声消除,主要用于进行喇叭播放声音的消除。MIC1和MIC2的输入数据和回声数据进行混合后,通过一定的算法处理,转换成单声道或双声道纯净的人声信号后通过I2S0 SDI进入主芯片。BT数据通过RT5670上的I2S接口和codec直接通讯。
2.2 软件体系结构设计
自研平板的软件体系结构设计如下:
软件体系结构设计如上图所示。其中音频驱动为ASoC架构,分为Platform,Codec,Machine三部分。其中Codec部分为外挂器件部分相关驱动代码,Platform为主芯片端控制器相关部分代码,Machine为开发板配置部分相关代码。此架构保证了音频驱动部分各个硬件模块部分的独立。
Tinyalsa为Android上在用户空间提供给上层的API,tinyalsa是google的标准实现方案。在我们的开发板上,AudioHAL层以下由主芯片厂商实现(Rockchip),主芯片厂商实现的方法也是选用的tinyalsa。
AudioFlinger等为Android提供的服务。此服务主要用来完成以下功能:
输入流控制
延迟控制
逻辑设备管理
内存管理
音频通路管理
同时向上提供API给Audio Native Framework使用。
AudioNativeFramework主要提供C++级别的API,Java层的API通过Android Binder和音频服务进程通讯,达到调用这些API的目的。
ApplicationFramework通过Binder和音频服务进程通讯,对上提供AudioTrack的API。
3.代码结构
Audio Driver部分代码如下
Codec部分:
Tfa9890驱动代码:/kernel/sound/soc/codecs/tfa
Realtek5670驱动代码:
/kernel/sound/soc/codec/rt5670.c
/kernel/sound/soc/codec/rt5670-dsp.c
/kernel/sound/soc/codec/rt5670.h
Machine部分:
/kernel/sound/soc/generic/simple-card.c
Platform部分:
/kernel/sound/soc/rockchip/rockchip_i2s.c
/kernel/sound/soc/rockchip/rockchip_i2s.h
Tinyalsa部分代码:
/external/tinyalsa/
Audio HAL部分代码:
/hardware/rockchip/audio/tinyalsa_hal/
AudioFlinger部分代码:
/frameworks/av/services/audioflinger/
AudioFramework Native代码:
/frameworks/av/media/libmedia/
4.音频配置方法
4.1内核配置
在kernel目录下,make ARCH=arm menuconfig,可以进入内核配置。详细配置如下图:
进入方法为Device Drivers-->Sound Card Support-->Advanced Linux Sound Architechture-->ALSA for SoC audio support-->CODEC drivers.
以上红色框标示的部分需要选择。其中CODEC drivers里面为codec部分,Rockchip I2S Device Driver为platform部分,ASoC Simple sound card support为machine部分。
4.2 dts配置
以上红色部分为需要配置的部分,此配置文件位于/kernel/arch/arm/boot/dts/rk3288-pad.dtsi。其中配置项解释如下:
simple-audio-card,format = “i2s” /*表示和外挂codec芯片连接的数据总线为i2s*/
simple-audio-card,name = “rockchip,rt5670-codec” /*表示此声卡注册的名字为rt5670-codec*/
simple-audio-card,dai-link 表示注册在同一个声卡上的几个硬件连接通路。在自研平板上,由于录制和播放使用的硬件为不同的器件,但又需要注册为一个声卡,所以在此dai_link上同时注册了tfa9890和rt5670的dts节点。而rk3288配置了两颗tfa9890用来分别进行左右声道的录音,所以同时配置了两个dai-link.
4.3 HAL层音频通路配置
RT5670音频通路图模拟部分如下:
在/hardware/rockchip/audio/tinyalsa_hal/codec_config下需要配置在各种场景下的音频通路。配置的方法如下:
- 在rt5670_config.h中配置各种应用场景下硬件的音频通路
- 在config_list.h中把rt5670添加进去,如下图所示:
5.调试方法
ASoC节点的查看
cd /sys/kernel/debug/asoc/
cat codecs
cat dais
cat platforms
ASoC的machine在probe的时候,会把所有的codec,dais,platforms注册到系统的一个全局链表里。这里的值可以在这里查看。
DAPM供电节点的查看
通过进入asoc指定目录下的dapm目录,可以查看各个节点的供电情况,来找到可能的无法工作的原因。