Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

摘要:
为了更好地支持移动设备中的嵌入式处理器和音频编解码器,一套软件架构。内核已经部分支持SoC中的音频。嵌入式设备的音频系统可以分为三部分:板载硬件(机器)、SoC(平台)和编解码器。机器为CPU、编解码器和I/O设备提供载体。音频相关通常包括SoC中的时钟、DMA、I2S、PCM等。


1.  ASoC的由来

ASoC--ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器 和 移动设备中的 音频Codec的一套 软件体系。在ASoc出现之前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性:

  •    Codec驱动与SoC CPU的底层耦合过于紧密,这种不理想会导致代码的重复,例如,仅是wm8731的驱动,当时Linux中有分别针对4个平台的驱动代码。
  •    音频事件没有标准的方法来通知用户,例如耳机、麦克风的插拔和检测,这些事件在移动设备中是非常普通的,而且通常都需要特定于机器的代码进行重新对音频路劲进行配置。
  •   当进行播放或录音时,驱动会让整个codec处于上电状态,这对于PC没问题,但对于移动设备来说,这意味着浪费大量的电量。同时也不支持通过改变 取样频率 和 偏置电流 来达到省电的目的。

ASoC正是为了解决上述种种问题而提出的,目前已经被整合至内核的代码树中:sound/soc。ASoC不能单独存在,他只是建立在标准ALSA驱动上的软件体系,它必须和标准的ALSA驱动框架相结合才能工作。



2.  硬件架构

通常,就像软件领域里的抽象和重用一样,嵌入式设备的音频系统 可以被划分为 板载硬件(Machine)、Soc(Platform)、Codec三大部分,如下图所示:

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)第1张

                                        图2.1  音频系统结构

  • Machine  是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体
  • Platform  一般是指某一个SoC平台,比如pxaxxx,s3cxxxx,omapxxx等等,与音频相关的通常包含该SoC中的时钟、DMA、I2S、PCM等等,只要指定了SoC,那么我们可以认为它会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。实际上,把Platform认为是某个SoC更好理解。
  • Codec  字面上的意思就是编解码器,Codec里面包含了 I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和 多个输出(耳机、喇叭、听筒,Line-out),Codec和Platform一样,是可重用的部件,同一个Codec可以被不同的Machine使用。嵌入式Codec通常 通过I2C 对内部的寄存器 进行控制。 

3.  软件架构

在软件层面,ASoC也把嵌入式设备的音频系统同样分为3大部分,Machine,Platform和Codec。

  • Codec驱动  ASoC中的一个重要设计原则就是 要求Codec驱动是平台无关的,它包含了一些音频的控件(Controls),音频接口,DAMP(动态音频电源管理)的定义和某些Codec IO功能。为了保证硬件无关性,任何特定于平台 和 机器的代码 都要移到Platform 和 Machine 驱动中。所有的Codec驱动都要提供以下特性:
    • Codec DAI 和 PCM的配置信息;
    • Codec的IO控制方式(I2C,SPI等);
    • Mixer和其他的音频控件;
    • Codec的ALSA音频操作接口;

必要时,也可以提供以下功能:

    • DAPM描述信息;
    • DAPM事件处理程序;
    • DAC数字静音控制
  • Platform驱动  它包含了该SoC平台的音频DMA 和 音频接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何与板子 或 机器相关的代码
  • Machine驱动  Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的Platform 和 Codec驱动是不能工作的,它必须由Machine驱动 把它们结合在一起 才能完成整个设备的音频处理工作

4.  数据结构

整个ASoC是由一系列 数据结构组成要搞清楚ASoC的工作机理,必须要理解这一系列数据结构之间的关系和作用,下面的关系图展示了ASoC中重要的数据结构之间的关联方式:

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)第2张

                                                                                                      图4.1  Kernel-2.6.35-ASoC中各个结构的静态关系

 ASoC把声卡 实现为一个Platform Device然后利用Platform_device结构中的dev字段:dev.drvdata,它实际上指向一个snd_soc_device 结构。可以认为snd_soc_device是整个ASoC数据结构的 根本,由他开始,引出一系列的数据结构用于表述音频的各种特性和功能。snd_soc_device结构 引出了snd_soc_card 和 soc_codec_device两个结构,然后snd_soc_card又引出了snd_soc_platform、snd_soc_dai_link和snd_soc_codec结构。如上所述,ASoC被划分为Machine、Platform和Codec三大部分,如果从这些数据结构看来,snd_codec_device和snd_soc_card代表着Machine驱动,snd_soc_platform则代表着Platform驱动,snd_soc_codec和soc_codec_device则代表了Codec驱动,而snd_soc_dai_link则负责连接Platform和Codec。

5.  3.0版内核对ASoC的改进

本来写这篇文章的时候参考的内核版本是2.6.35,不过有CSDN的朋友提出在内核版本3.0版本中,ASoC做了较大的变化。故特意下载了3.0的代码,发现确实有所变化,下面先贴出数据结构的静态关系图:

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)第3张

                                                                                             图5.1   Kernel 3.0中的ASoC数据结构

由上图我们可以看出,3.0中的数据结构更为合理和清晰,取消了snd_soc_device结构,直接用snd_soc_card取代了它,并且强化了snd_soc_pcm_runtime的作用,同时还增加了另外两个数据结构snd_soc_codec_driver 和 snd_soc_platform_driver,用于明确代表Codec驱动和Platform驱动。

后续的章节中将会逐一介绍 Machine 和 Platform 以及Codec 驱动 的工作细节和关联。



免责声明:文章转载自《Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇获取Android设备的方向 -- gsensorOracle向MySQL迁移的注意点整理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Wireshark使用技巧:提取VOIP通话中的音频流

“Wireshark的RTP流分析功能实战。” 在VOIP协议的分析过程中,常常会遇到一些标准协议承载的语音传输,如以SIP、H.323为控制协商协议,RTP为语音数据协议的VOIP传输情况。 在语音协议的分析过程中,需要提取的一个重要项是语音内容,但是,语音内容不像文本那样,在流量中可以肉眼观察到,而是需要使用耳朵的听来进行语音内容的判断,有没有便...

音视频与直播

音视频与直播 万人直播架构 直播产品种类 泛娱乐化直播 实时互动直播 泛娱乐化直播架构 实时互动直播架构 CDN网络 CDN网络为了解决用户访问网络资源慢而出现的。为什么访问慢: 访问链路长,比如从中国北部到南部 人为因素,运营商切割,电信用电信,联通用联通 CDN构成 边缘节点:用户从边缘节点上获取数据,让用户访问链路变短二级节点:主干网节...

Android 音频系统 1 -- codec

0. 专用术语 1. 物理结构 2. 系统架构 本文基于Freescale IMX平台Codec ALC5625为例。 0. 专用术语  ASLA - Advanced Sound Linux Architecture  OSS - 以前的Linux音频体系结构,被ASLA取代并兼容  Codec - Coder/Decoder  I2S/PCM/...

华为海思系列芯片开发学习中常见缩写详解

1. 系统控制Hi —— HiSilicon 海思半导体公司 MPP —— Media Process Platform 媒体处理平台 MPI —— MPP Programe Interface MPP程序接口 DDR —— Double Data-Rate 双倍速率,DDR SDRAM=双倍速率同步动态随机存储器,人们习惯称为DDR,其中,SDRAM 是...

<转>主流蓝牙BLE控制芯片详解(3):创杰 IS1685S

[导读] IS1685S是一款高度集成的超低功耗芯片,应用于射频和基带芯片的蓝牙V3.0 + EDR单声道耳机。 智能型无线音频数据传输产品——S1685S单声道蓝牙芯片,是低成本的高效率单声道无线传输方案。采用免驱动方式,客户只需要把模块接入应用产品,通电,连接按键就可以快捷地实现音乐的无线传输,享受无线音乐的乐趣。   同系列芯片资料推荐:     主...

从wav到Ogg Opus 以及使用java解码OPUS

PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 采样率 采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。通俗的...