1.简介
ALSA是目前linux的主流音频体系架构;
是一个有社区维护的开源项目。
http://www.alsa-project.org/
包括:
1.内核驱动包 alsa-driver
2.用户空间库 alsa-lib
3.附加库插件包 alsa-libplugins
4.音频处理工具集 alsa-utils
5.其他音频处理小工具包 alsa-tools
6.特殊音频固件支持包 alsa-firmware
7.alsa-lib的Python绑定包 pyalsa
8.OSS接口兼容包 alsa-oss

2.架构图
硬件架构:
这里写图片描述
软件架构:
这里写图片描述

3.初识alsa设备
这里写图片描述
注:
controlC0:控制接口,用于控制声卡,如通道选择,混音,麦克风输入增益调节等。
midiC0D0:Raw迷笛接口,用于播放midi音频。
pcmC0D0c:pcm接口,用于录音的pcm设备。
pcmC0D0p:用于播放的pcm设备。
pcmC0D1p:
seq:音序器接口。
timer:定时器接口。
即该声卡下挂载了7个设备。根据声卡实际能力,驱动实际上可以挂载更多种类的设备
其中
C0D0表示声卡0中的设备0。
pcmC0D0c:最后的c表示capture。
pcmC0D0p:最后一个p表示playback。

设备种类 include/sound/core.h:

    #define SNDRV_DEV_TOPLEVEL  ((__force snd_device_type_t) 0)  
    #define SNDRV_DEV_CONTROL   ((__force snd_device_type_t) 1)  
    #define SNDRV_DEV_LOWLEVEL_PRE  ((__force snd_device_type_t) 2)  
    #define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)  
    #define SNDRV_DEV_PCM       ((__force snd_device_type_t) 0x1001)  
    #define SNDRV_DEV_RAWMIDI   ((__force snd_device_type_t) 0x1002)  
    #define SNDRV_DEV_TIMER     ((__force snd_device_type_t) 0x1003)  
    #define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)  
    #define SNDRV_DEV_HWDEP     ((__force snd_device_type_t) 0x1005)  
    #define SNDRV_DEV_INFO      ((__force snd_device_type_t) 0x1006)  
    #define SNDRV_DEV_BUS       ((__force snd_device_type_t) 0x1007)  
    #define SNDRV_DEV_CODEC     ((__force snd_device_type_t) 0x1008)  
    #define SNDRV_DEV_JACK          ((__force snd_device_type_t) 0x1009)  
    #define SNDRV_DEV_LOWLEVEL  ((__force snd_device_type_t) 0x2000)  

4.linux内核中音频驱动代码分布
这里写图片描述
其中:
core:包含 ALSA 驱动的核心层代码实现。
core/oss:包含模拟旧的OSS架构的PCM和Mixer模块。
core/seq:音序器相关的代码。
drivers:存放一些与CPU,bus架构无关的公用代码。
i2c:ALSA的i2c控制代码。
pci:PCI总线 声卡的顶层目录,其子目录包含各种PCI声卡代码。
isa:ISA总线 声卡的顶层目录,其子目录包含各种ISA声卡代码。
soc:ASoC(ALSA System on Chip)层实现代码,针对嵌入式音频设备。
soc/codecs:针对ASoC体系的各种音频编码器的驱动实现,与平台无关。

include/sound:ALSA驱动的公共头文件目录。

5.驱动分类
OSS音频设备驱动:
OSS 标准中有两个最基本的音频设备: mixer(混音器)和 dsp(数字信号处理器)。

ALSA音频设备驱动:
虽然 OSS 已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,而且目前
基本上在 Linux mainline 中失去了更新。而 ALSA (Advanced Linux Sound Architecture)恰
好弥补了这一空白,它符合 GPL,是在 Linux 下进行音频编程时另一种可供选择的声卡驱动
体系结构。 ALSA 除了像 OSS 那样提供了一组内核驱动程序模块之外,还专门为简化应用
程序的编写提供了相应的函数库,与 OSS 提供的基于 ioctl 的原始编程接口相比, ALSA 函
数库使用起来要更加方便一些。 ALSA 的主要特点如下。

  • 支持多种声卡设备。
  • 模块化的内核驱动程序。
  • 支持 SMP 和多线程。
  • 提供应用开发函数库(alsa-lib)以简化应用程序开发。
  • 支持 OSS API,兼容 OSS 应用程序。

ASoC音频设备驱动:
ASoC(ALSA System on Chip)是 ALSA 在 SoC 方面的发展和演变,它在本质上仍然属于
ALSA,但是在 ALSA 架构基础上对 CPU 相关的代码和 Codec 相关的代码进行了分离。其原因是,
采用传统 ALSA 架构的情况下,同一型号的 Codec 工作于不同的 CPU 时,需要不同的驱动,这
不符合代码重用的要求。
对于目前嵌入式系统上的声卡驱动开发,我们建议读者尽量采用 ASoC 框架, ASoC 主要
由 3 部分组成。

  1. Codec 驱动。这一部分只关心 Codec 本身,与 CPU 平台相关的特性不由此部分操作。
  2. 平台驱动。这一部分只关心 CPU 本身,不关心 Codec。它主要处理两个问题: DMA 引
    擎和 SoC 集成的 PCM、 I2S 或 AC ‘97 数字接口控制。
  3. 板驱动(也称为 machine 驱动)。这一部分将平台驱动和 Codec 驱动绑定在一起,描述了
    板一级的硬件特征。

在以上 3 部分中, 1 和 2 基本都可以仍然是通用的驱动了,也就是说, Codec 驱动认为自己
可以连接任意 CPU,而 CPU 的 I2S、 PCM 或 AC ‘97 接口对应的平台驱动则认为自己可以连接任
意符合其接口类型的 Codec,只有 3 是不通用的,由特定的电路板上具体的 CPU 和 Codec 确定,
因此它很像一个插座,上面插上了 Codec 和平台这两个插头。
在以上三部分之上的是 ASoC 核心层,由内核源代码中的 sound/soc/soc-core.c 实现,查看其
源代码发现它完全是一个传统的 ALSA 驱动。因此,对于基于 ASoC 架构的声卡驱动而言, alsa-lib
以及 ALSA 的一系列 utility 仍然是可用的,如 amixer、 aplay 均无需针对 ASoC 进行任何改动。而
ASoC 的用户编程方法也与 ALSA 完全一致。
内核源代码的 Documentation/sound/alsa/soc/目录包含了 ASoC 相关的文档。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐