本文以I2S接口为例介绍Linux内核音频相关知识。
一、名词介绍,下面是音频调试中常见的名词缩略语。
1、AEC(Acoustic Echo Cancellor):回声消除。
2、AGC(Automatic Gain Control):自动增益补偿,调整MIC收音量。
3、ALSA(Advanced Linux Sound Architecture):高级Linux声音架构。
4、ANS(Automatic Noise Suppression):背景噪音抑制,ANS可探测出背景固定频率的杂音并消除背景噪音。
5、BCK(Bit Clock Line):位时钟,对应数字音频的每一位数据。标准称为SCK(Serial Clock),串行时钟。SCK=2x采样频率x采样位数,6、DAI(Digital Audio Interface):数字音频接口。
7、DAPM(Dynamic Audio Power Management):动态电源管理,DAPM可使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态。
8、DRC(Dynamic Range Control):动态压缩,将音频输出控制在一定范围内。
9、EQ(Equaliser):均衡器,通过对声音某一个或多个频段进行增益或衰减,达到调整音色的目的。
10、I2S(Inter-IC Sound):IC间传输数字音频资料的一种接口标准,采用序列的方式传输2组(左右声道)资料。
11、LRCK(Left-Right Clock):帧时钟,用于切换左右声道数据,0:左声道;1:右声道。标准称为WS(World Select),声道选择;或称为FS(Frame Sync),帧同步;LRCK的频率=采样频率。
12、MCLK(Master Clock):主时钟,一般MCLK=256*LRCK。不是I2S标准中的一部分,主要用来同步模拟/数字转换器的内部操作。
13、Mono:单声道。
14、OSS(Open Sound System):开放声音系统。
15、PCM(Pulse Code Modulation):脉冲编码调制,I2S是PCM的子集。
16、ramp:逐步增加或减少音量等级,避免声音急速变化,用于暂停或恢复音乐。
17、Stereo:双声道,18、TDM(Time Division Multiplexing):时分复用。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左对齐模式和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位。
其他协议格式还有:PCM early mode、PCM late1 mode和PCM late2 mode等。
四、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中相关功能如下(以rockchip 4a单板为例)>
1、Codec:音频芯片共有的部分,包括codec初始化函数,控制接口,寄存器缓存,控件,dapm部件,音频路由,偏置电压设置函数等描述信息。
Rockchip 4A单板,Codec选用的是ES8316芯片,该芯片的dts配置如下>
2、Codec DAI:codec上的音频接口驱动描述,包括:时钟配置,格式配置,能力描述等。
Codec DAI相关实现如下>
3、CPU DAI:指 SoC 的 I2S、PCM 总线控制器,负责把音频数据从 I2S tx FIFO 搬运到 codec。
RK3399 CPU DAI的dts相关配置如下>
4、DAI Link:音频数据链路,它指定链路用到的codec、codec_dai、cpu_dai和platform。
Linux 4.4 内核支持两种方式创建声卡:一种是通用的simple-card framework;一种是传统的编写自定义的 machine driver 来创建。
Simple card是简单通用的machine driver,如果 simple-card框架足够满足需求,可优先选择simple card 框架。
DAI Link的dts相关配置如下>
DAI Link的相关实现如下>
5、DAPM:动态电源管理,是基于kcontrol改进过后的相应框架,增加了相应的电源管理机制, widget是DAPM的基本单位。
Codec(es8316)中kcontrol、dapm widget和dapm routes的相关实现如下>
6、DMA:负责把 dma buffer 中的音频数据搬运到 I2S tx FIFO。
五、调试命令,ALSA是Linux处理音频的基本接口,但ALSA只提供基层的接口,操作较为繁复,一般情况下可以直接使用其附带提供的 utils 工具集,utils 工具集是一些封装好了的功能模块,直接以命令的方式提供,用户只需要敲入相关命令和参数即可实现音频操作功能。
1、查看声卡信息,controlCx:控制接口,提供灵活的方式管理注册的声卡和对存在的声卡进行查询。
pcmCxDxc:PCM接口,对应录音设备。
pcmCxDxp:PCM接口,对应放音设备。
timer:支持声音的同步事件提供声卡上的定时器。
seq:音序器接口,一个比原始MIDI接口高级的MIDI编程和声音同步高层接口。
2、查看声卡采集、播放PCM信息,3、查看ALSA驱动版本
4、查看声卡0的信息
5、查看寄存器
6、查看时钟
7、amixer命令
7.1查看card0内容
7.2查看和配置某个numid命令
8、设备名
9、放音
10、录音
-D:播放设备,aplay -l 或arecord -l列出的设备名,-r:采样率,-c:音频文件通道,-f:采样格式,常用的有S16_LE ,S24_LE ,S32_LE, cd (可忽略),也可参考tinyalsa命令,如:tinymix、tinypcminfo、tinyplay和tinycap的用法。
11、mp3转wav