1. Overview
Kernel - 3.4.5
SoC - Samsung exynos
CODEC - WM8994
Machine - goni_wm8994
Userspace - tinyalsa
ALSA/ASoC 驱动有如下三部分构成:
Platform:通常指某款 SoC 平台,如 exynos、omap、qcom 等等。Platform 又可细分两部分:
1). cpu dai:在嵌入式系统里面通常指 CPU 的 I2S、PCM 总线控制器,负责将音频数据从 I2S tx FIFO 搬运到 CODEC(回
放的情形,录制则方向相反)。cpu_dai 通过 snd_soc_register_dai()来注册。注:DAI 是 Digital Audio Interface 的
缩写,分为 cpu_dai 和 codec_dai,这两者通过 I2S/PCM 总线连接;AIF 是 Audio Interface 的缩写,一般分为 I2S 和 PCM
接口。
2). pcm dma:负责将 dma buffer 中的音频数据搬运到 I2S tx FIFO,这部分的逻辑比较复杂,以下几篇会对它详细阐述。
音频 dma 驱动通过 snd_soc_register_platform()来注册。值得留意的是:某些情形下是不需要 dma 操作的,比如 Modem
和 CODEC 直连,因为 Modem 本身已经把数据送到 PCM FIFO 了,这时只需启动 codec_dai 接收数据即可;该情形下,Machine
驱动 dai_link 中需要指定.platform_name = "snd-soc-dummy", 这是虚拟出来的 platform 驱动,实现见
sound/soc/soc-utils.c。
Codec:对于 Playback 来说,userspace 送过来的 PCM 数据是经过抽样量化出来的数字信号,在 codec 经过 DAC 转换成模
拟信号送到外放耳机输出,这样我们就可以听到声音了。Codec 字面意思是编解码器,但芯片里面的部件很多,常见的有
AIF、DAC、ADC、Mixer、PGA、Line-in、Line-out,有些高端的 codec 芯片还有 EQ、DSP、SRC、DRC、AGC、Echo canceller、
Noise suppression 等功能部件。
Machine:指某一款机器,它把 cpu_dai、codec_dai、modem_dai 各个音频接口通过定义 dai_link 链结起来,然后注册
snd_soc_card。和上面两个不一样,Platform 和 CODEC 驱动一般是可以重用的,而 Machine 有它特定的硬件特性,几乎是
不可重用的。所谓的硬件特性指:DAIs 之间的链结;通过某个 GPIO 打开 Amplifier;通过某个 GPIO 检测耳机插拔;使用
某个时钟如 MCLK/External OSC 作为 I2S、CODEC 模块的基准时钟源等等。
从上面的描述来看,对于回放的情形,PCM 数据流向大致是:
| copy_from_user | | DMA | | I2S | | AIF->DAC->PGA/Mixer |
userspace-------------->dma buffer----->I2S tx FIFO-------->CODEC-------------->SPK/HS/Earp
这系列初步定为如下几个部分:
分析 ALSA/ASoC 的 pcm_dma 注册过程,soc-core 如何找出 dai_link 上链接的 cpu_dai、codec_dai、platform 并逐一完成
各自的 probe。
当 pcm_open 时,如何建立 hw constraints;如何检查 hw params 是否在 hw constraints 约束范围之内;如何回调
platform/codec/machine 的 hw_params()。
当 pcm_write 时,1)如何把 pcm 数据从 userspace 拷贝到 dma_alloc_writecombine()分配出来的 dma buffer 中;2)如
何触发 pcm_dma 的 trigger()回调去启动 DMA,把数据从 dma buffer 搬运到 I2S tx FIFO;3)如何启动 I2S 把数据从 I2S
评论9
最新资源