文章目录
audio驱动原理概述
ASoC
被分为 Machine
, Platform
和 Codec
三大部件,Platform
驱动的主要作用是完成音频数据的管理, 最终通过 CPU
的 数字音频接口(DAI) 把音频数据传送给 Codec
进行处理,最终由 Codec
输出音频信号给耳机或者是喇叭。 在具体实现上, ASoC
又把 platform
驱动分为两个部分: snd_soc_platform_driver
和 snd_soc_dai_driver
。其中, platform_driver
负责管理音频数据,把音频数据通过 dma
或 其他操作传送至 cpu dai
中, dai_driver
则主要完成 cpu
一侧的 dai
的参数配置, 同时也会通过一定的途径把必要的 dma
等参数与 snd_soc_platform_driver
进行交互。
audio驱动中的一些术语以及概念
- platform: 一般是指某一个
SoC
平台,比如MTK,QCOM
等平台,与音频相关的通常包含该SoC
中的Clock、I2S、DMA
等等,一般由CPU厂商负责提供此部分的代码。platform
又可以细分为两个部分:
- cpu_dai:在嵌入式系统里面通常指
soc
的I2S、PCM
总线控制器,负责把音频数据从I2S TX FIFO
搬运到CODEC
(这里是播放的情形,录制则相反)。cpu_dai
通过snd_soc_register_dai
来注册。嵌入式系统中一般是I2S
和PCM
接口。- pcm_dma:负责把
dma_buffer
中的音频数据搬运到I2S TX FIFO
。值得留意的是:某些情形下是不需要dma
操作的,比如modem
和codec
直连,因为modem·本身已经把数据送到
FIFO`了,这时只需启动
-
platform_dai(cpu_dai):连接
platform
和machine
; -
codec :字面上的意思就是编解码器,在播放音频的过程中,将传输过来的经过采样量化成数字信号的音频数据,通过
DAC
转换成模拟信号,然后输出到喇叭或者耳机,让我们可以听到声音。Codec
里面包含了I2S接口、DAC、ADC、Mixer、PA(功放)
,通常包含多种输入(Mic、Line-in、I2S、PCM)
和多个输出(耳机、喇叭、听筒,Line-out)
,Codec
和Platform
一样,是可重用的部件。这个模块由codec厂商负责提供此部分的代码。 -
codec_dai:连接
codec
和machine
; -
machine:指某款机器,比如智能手机,通过配置
dai_link
把cpu_dai、codec_dai、modem_dai
各个音频接口给链结成一条条音频链路,然后注册snd_soc_card
。和上面两个不一样,Platform
和CODEC
驱动一般是可以重用的,而machine
有它特定的硬件特性,几乎是不可重用的 。所谓的硬件特性指:soc platform
与codec
的差异;DAIs
之间的链结方式;通过某个GPIO
打开Amplifier
;通过某个GPIO
检测耳机插拔;使用某个时钟如MCLK/External-OSC
作为I2S、CODEC
的时钟源等。 -
dai_link :
machine
驱动中定义的音频数据链路,它指定链路用到的codec、codec_dai、cpu_dai、platform
。一个系统可能有多个音频数据链路,比如media
和voice
,因此可以定义多个dai_link
。 -
PCM :
PCM(Pulse-code modulation)
是脉冲编码调制,PCM
信号的两个重要指标是采样频率 和 量化精度 ,目前,CD音频的采样频率通常为44100Hz
,量化精度是16bit
。播放音乐时,应用程序从存储介质中读取音频数据(MP3、WMA、AAC…),经过解码后,最终送到音频驱动程序中的就是PCM
数据;在录音时,音频驱动不停地把采样所得的PCM
数据送回给应用程序,由应用程序完成压缩、存储等任务。所以,音频驱动的两大核心任务就是:
- playback:如何把用户空间的应用程序发过来的
PCM
数据,转化为人耳可以辨别的模拟音频信号- capture:把
mic
拾取到的模拟信号,经过采样、量化,转换为PCM
数据送回给用户空间
音频驱动主要实现一下3个部分的功能:
(1)播放声音(playback)
(2)录音(capture)
(3)声音控制(control)
运行adb shell ls -l /dev/snd
,我们可以看到当前平台注册的声卡驱动设备。
主要分为以下几类:
pcmCxDxp —— Playback
pcmCxDxc —— Capture
controlC0 —— Control,比如各种音频控件开关、音量增益等
查看声卡设备的一些常用命令
<1>查看声卡的设备文件
ls -l /dev/snd
crw-rw---- 1 system audio 116, 2 2020-04-22 22:05 controlC0
crw-rw---- 1 system audio 116, 3 2020-04-22 22:05 pcmC0D0p
crw-rw---- 1 system audio 116, 17 2020-04-22 22:05 pcmC0D10p
crw-rw---- 1 system audio 116, 18 2020-04-22 22:05 pcmC0D11p
crw-rw---- 1 system audio 116, 19 2020-04-22 22:05 pcmC0D12c
crw-rw---- 1 system audio 116, 20 2020-04-22 22:05 pcmC0D13c
crw-rw---- 1 system audio 116, 21 2020-04-22 22:05 pcmC0D14p
crw-rw---- 1 system audio 116, 22 2020-04-22 22:05 pcmC0D15c
crw-rw---- 1 system audio 116, 23 2020-04-22 22:05 pcmC0D16c
crw-rw---- 1 system audio 116, 25 2020-04-22 22:05 pcmC0D17c
crw-rw---- 1 system audio 116, 24 2020-04-22 22:05 pcmC0D17p
crw-rw---- 1 system audio 116, 27 2020-04-22 22:05 pcmC0D18c
crw-rw---- 1 system audio 116, 26 2020-04-22 22:05 pcmC0D18p
crw-rw---- 1 system audio 116, 28 2020-04-22 22:05 pcmC0D19p
crw-rw---- 1 system audio 116, 4 2020-04-22 22:05 pcmC0D1c
crw-rw---- 1 system audio 116, 29 2020-04-22 22:05 pcmC0D20p
crw-rw---- 1 system audio 116, 30 2020-04-22 22:05 pcmC0D21p
crw-rw---- 1 system audio 116, 31 2020-04-22 22:05 pcmC0D22c
crw-rw---- 1 system audio 116, 34 2020-04-22 22:05 pcmC0D23p
crw-rw---- 1 system audio 116, 35 2020-04-22 22:05 pcmC0D24p
crw-rw