Audio

时间:2024-03-25 16:59:52

转载 :

https://zhuanlan.zhihu.com/p/56792351

 

前言

Audio

编写目的

此文档描述了通用的Android和Linux音频驱动框架和修改方法,并描述了音频模块的驱动和上层的使用和调试方法。并且针对智慧社区自研平板上特定的外挂音频Codec硬件进行了描述。

阅读对象

嵌入式开发。

Audio

1. 术语与缩写解释

缩写、术语

Audio

Audio

2.模块设计

2.1 硬件体系结构设计

Audio

 

如上图所示,其中RT5670为编码器器件,通过I2S0的SDI与主芯片相连。TFA9890为数字功放,通过I2S0 SDO与主芯片相连。数字功放的回声消除的DATA OUT与RT5670的DAC部分相连用来做回声消除,主要用于进行喇叭播放声音的消除。MIC1和MIC2的输入数据和回声数据进行混合后,通过一定的算法处理,转换成单声道或双声道纯净的人声信号后通过I2S0 SDI进入主芯片。BT数据通过RT5670上的I2S接口和codec直接通讯。

2.2 软件体系结构设计

自研平板的软件体系结构设计如下:

 

Audio

软件体系结构设计如上图所示。其中音频驱动为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。

Audio

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/

Audio

4.音频配置方法

4.1内核配置

在kernel目录下,make ARCH=arm menuconfig,可以进入内核配置。详细配置如下图:

Audio

进入方法为Device Drivers-->Sound Card Support-->Advanced Linux Sound Architechture-->ALSA for SoC audio support-->CODEC drivers.

Audio

以上红色框标示的部分需要选择。其中CODEC drivers里面为codec部分,Rockchip I2S Device Driver为platform部分,ASoC Simple sound card support为machine部分。

4.2 dts配置

Audio

 

以上红色部分为需要配置的部分,此配置文件位于/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音频通路图模拟部分如下:

 

Audio

 

在/hardware/rockchip/audio/tinyalsa_hal/codec_config下需要配置在各种场景下的音频通路。配置的方法如下:

  1. 在rt5670_config.h中配置各种应用场景下硬件的音频通路
  2. 在config_list.h中把rt5670添加进去,如下图所示:

Audio

Audio

5.调试方法

ASoC节点的查看

cd /sys/kernel/debug/asoc/

cat codecs

cat dais

cat platforms

Audio

ASoC的machine在probe的时候,会把所有的codec,dais,platforms注册到系统的一个全局链表里。这里的值可以在这里查看。

DAPM供电节点的查看

Audio

通过进入asoc指定目录下的dapm目录,可以查看各个节点的供电情况,来找到可能的无法工作的原因。