Linux内核音频驱动

admin 2025-04-04 165人围观 ,发现270个评论

本文以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左对齐模式和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

猜你喜欢
    不容错过