本文以I2S接口为例介绍Linux内核音频相关知识。
一、名词介绍下面是音频调试中常见的名词缩略语。
1、AEC(AcousticEchoCancellor):回声消除。
2、AGC(AutomaticGainControl):自动增益补偿,调整MIC收音量。
3、ALSA(AdvancedLinuxSoundArchitecture):高级Linux声音架构。
4、ANS(AutomaticNoiseSuppression):背景噪音抑制,ANS可探测出背景固定频率的杂音并消除背景噪音。
5、BCK(BitClockLine):位时钟,对应数字音频的每一位数据。标准称为SCK(SerialClock),串行时钟。SCK=2x采样频率x采样位数
6、DAI(DigitalAudioInterface):数字音频接口。
7、DAPM(DynamicAudioPowerManagement):动态电源管理,DAPM可使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态。
8、DRC(DynamicRangeControl):动态压缩,将音频输出控制在一定范围内。
9、EQ(Equaliser):均衡器,通过对声音某一个或多个频段进行增益或衰减,达到调整音色的目的。
10、I2S(Inter-ICSound):IC间传输数字音频资料的一种接口标准,采用序列的方式传输2组(左右声道)资料。
11、LRCK(Left-RightClock):帧时钟,用于切换左右声道数据,0:左声道;1:右声道。标准称为WS(WorldSelect),声道选择;或称为FS(FrameSync),帧同步;LRCK的频率=采样频率。
12、MCLK(MasterClock):主时钟,一般MCLK=256*LRCK。不是I2S标准中的一部分,主要用来同步模拟/数字转换器的内部操作。
13、Mono:单声道。
14、OSS(OpenSoundSystem):开放声音系统。
15、PCM(PulseCodeModulation):脉冲编码调制,I2S是PCM的子集。
16、ramp:逐步增加或减少音量等级,避免声音急速变化,用于暂停或恢复音乐。
17、Stereo:双声道
18、TDM(TimeDivisionMultiplexing):时分复用。I2S最多只能传2声道数据,TDM最多支持16通道。
二、I2S接口I2S是飞利浦定义的数字音频传输标准,用于数字音频数据在系统内部器件之间传输。
I2S是PCM的一个分支,接口定义相同。I2S的采样率一般为44.1/48KHZ,PCM采样频率一般为8/16KHZ等。
I2S接口有4组信号:SCK(位时钟)、LRCK(帧时钟)、SDI/SDO(数据)。
在I2S总线上,只能同时存在一个主设备和发送设备,主设备可以是发送设备或接收设备。常见的I2S框图如下:

I2S接口常见的协议模式包括:I2S正常模式、I2S左对齐模式和I2S右对齐模式等。
1、I2S正常模式
I2S正常模式属于I2S左对齐中的一种特例,也叫Philips模式。下图是I2S正常模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变低表示左声道,变高表示右声道。
SD(i2s_sdo,i2s_sdi)信号首先传输MSB或LSB,并在LRCK改变后的一个SCLK时钟周期发送第一个bit。
SD信号宽度的范围是从16到32位。
2、I2S左对齐模式
下图是I2S左对齐模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变高表示左声道,变低表示右声道。
SD(i2s_sdo,i2s_sdi)信号首先传输MSB或LSB,并在LRCK改变的同时发送第一个bit。
SD信号宽度的范围是从16到32位。
3、I2S右对齐模式
下图是I2S右对齐模式的波形。
LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变高表示左通道,变低表示右通道。
SD(i2s_sdo、i2s_sdi)信号首先传输MSB或LSB,与I2S正常或左对齐模式不同,其数据与LRCK信号的边缘处的最后一位对齐。
SD信号宽度范围从16到32位。
其他协议格式还有:PCMearlymode、PCMlate1mode和PCMlate2mode等。
四、ALSA框架Linux内核2.6之后,ALSA取代了OSS成为了Linux内核音频子系统是一部分。
ALSA系统包括:
1、alsa-driver:alsa系统驱动。
2、alsa-lib:alsa库,用户空间调用,和内核空间交互。
3、alsa-utils:命令行工具。
4、alsa-plugin:alsa插件。
5、alsa-tools:alsa工具。
ALSA框架组成如下:
alsa-driver中相关功能如下(以rockchip4a单板为例):
1、Codec:音频芯片共有的部分,包括codec初始化函数,控制接口,寄存器缓存,控件,dapm部件,音频路由,偏置电压设置函数等描述信息。
Rockchip4A单板,Codec选用的是ES8316芯片,该芯片的dts配置如下:
2、CodecDAI:codec上的音频接口驱动描述,包括:时钟配置,格式配置,能力描述等。
CodecDAI相关实现如下:
3、CPUDAI:指SoC的I2S、PCM总线控制器,负责把音频数据从I2StxFIFO搬运到codec。
RK3399CPUDAI的dts相关配置如下:
4、DAILink:音频数据链路,它指定链路用到的codec、codec_dai、cpu_dai和platform。
内核支持两种方式创建声卡:一种是通用的simple-cardframework;一种是传统的编写自定义的machinedriver来创建。
Simplecard是简单通用的machinedriver,如果simple-card框架足够满足需求,可优先选择simplecard框架。
DAILink的dts相关配置如下:
DAILink的相关实现如下:
5、DAPM:动态电源管理,是基于kcontrol改进过后的相应框架,增加了相应的电源管理机制,widget是DAPM的基本单位。
Codec(es8316)中kcontrol、dapmwidget和dapmroutes的相关实现如下:
6、DMA:负责把dmabuffer中的音频数据搬运到I2StxFIFO。
五、调试命令ALSA是Linux处理音频的基本接口,但ALSA只提供基层的接口,操作较为繁复,一般情况下可以直接使用其附带提供的utils工具集,utils工具集是一些封装好了的功能模块,直接以命令的方式提供,用户只需要敲入相关命令和参数即可实现音频操作功能。
1、查看声卡信息
root@xiaotianbsp:~ls-l/dev/snd/total0drwxr-xr-x2rootroot80Aug1614:43by-pathcrw-rw----+1rootaudio116,2Aug1614:43controlC0crw-rw----+1rootaudio116,5Aug1614:43controlC1crw-rw----+1rootaudio116,4Aug1614:43pcmC0D0ccrw-rw----+1rootaudio116,3Aug1614:43pcmC0D0pcrw-rw----+1rootaudio116,6Aug1614:43pcmC1D0pcrw-rw----+1rootaudio116,1Aug1614:43seqcrw-rw----+1rootaudio116,33Aug1614:43timer
controlCx:控制接口,提供灵活的方式管理注册的声卡和对存在的声卡进行查询。
pcmCxDxc:PCM接口,对应录音设备。
pcmCxDxp:PCM接口,对应放音设备。
timer:支持声音的同步事件提供声卡上的定时器。
seq:音序器接口,一个比原始MIDI接口高级的MIDI编程和声音同步高层接口。
2、查看声卡采集、播放PCM信息
root@xiaotianbsp:~cat/proc/asound/
4、查看声卡0的信息
root@xiaotianbsp:~cat/sys/kernel/debug/regmap/1-0011/namees8316root@xiaotianbsp:~cat/sys/kernel/debug/regmap//registers00:0000000f04:0000000f08:00033f3f0c:0000000010:000f001014:01f0000018:XXXXXXXX1c:0000000020:XXXXXXXX28:00000000es8316寄存器root@xiaotianbsp:~cat/sys/kernel/debug/clk/clk_summary|grepi2s0clk_i2s0_div10clk_i2s0_frac111128960000clk_i2s0_mux111128960000clk_i2s0121128960000hclk_i2s01210000000000
7、amixer命令
root@xiaotianbsp:~amixer-c0contentsnumid=16,iface=MIXER,name='ADCDoubleFSMode';type=BOOLEAN,access=rw------,values=1:values=offnumid=14,iface=MIXER,name='ADCSoftRamp';type=BOOLEAN,access=rw------,values=1:values=onnumid=13,iface=MIXER,name='ADCCaptureVolume';type=INTEGER,access=rw---R--,values=1,min=0,max=192,step=0:values=192|dBscale-min=-96.00dB,step=0.50dB,mute=1numid=15,iface=MIXER,name='CapturePolarity';type=ENUMERATED,access=rw------,values=1,items=2;Item1'Invert':values=0
7.2查看和配置某个numid命令
查看root@xiaotianbsp:~amixer-c0csetnumid=16onnumid=16,iface=MIXER,name='ADCDoubleFSMode';type=BOOLEAN,access=rw------,values=1:values=on
8、设备名
root@xiaotianbsp:~0:subdevice0:subdevicearecord-l****ListofCAPTUREHardwareDevices****card0:rockchipes8316c[rockchip,es8316-codec],device0:[]Subdevices:1/1Subdevice0
9、放音
aplay-Dhw:0,0-r44100-c2-fs16_
10、录音
arecord-Dhw:0,0-r16000-c1-fs16_
-D:播放设备,aplay-l或arecord-l列出的设备名
-r:采样率
-c:音频文件通道
-f:采样格式,常用的有S16_LE,S24_LE,S32_LE,cd(可忽略)
也可参考tinyalsa命令,如:tinymix、tinypcminfo、tinyplay和tinycap的用法。
11、mp3转wav