嵌入式Linux驱动程序开发(IV)-音频驱动程序开发
浏览:505 次

姓名:薛少红学号:19020100016学院:电子工程学院
转移自:
【嵌入式牛指南】本文介绍了嵌入式Linux音频驱动程序的开发
【嵌入式牛鼻子】嵌入式Linux驱动程序开发
【嵌入式牛问题】如何开发嵌入式Linux音频驱动程序?
【嵌入奶牛的身体】
1.嵌入式音频系统的硬件连接
下面显示的嵌入式设备使用IIS将音频数据发送到编解码器。编解码器的I/O寄存器通过IIC总线编程。
2.音频架构-ALSA
ALSA是Advanced Linux Sound Architecture的缩写,它已成为Linux的主流音频架构
在内核设备驱动层,ALSA提供了ALSA驱动程序,而在应用层,ALSA为我们提供了ALSA-lib。app可以通过调用alsa lib提供的API来控制底层音频硬件。
3.ALSA设备文件
ALSA驱动核心将创建和管理一些设备节点,例如:
/Dev/snd/controlC0:一个控制节点(用于app控制声卡,如频道选择、音量控制等)
/Dev/snd/pcmC0D0p:用于播放的pcm设备
/Dev/snd/pcmC0D0c:pcm记录设备
C0D0表示声卡0中的设备0。最后一个c表示捕获,最后一个p表示播放。
4.声卡建立过程

步骤1:创建snd_卡的实例
snd_该卡可以说是整个ALSA音频驱动器的顶部结构。整个声卡的软件逻辑结构从这个结构开始。几乎所有与声音相关的逻辑设备都在snd_卡的管理下
步骤2:创建声卡的功能部件(逻辑设备),如PCM、混音器等,并将逻辑设备与步骤1中创建的声卡绑定
通常,alsa驱动程序提供了一些常见的组件创建功能,PCM---snd_ PCM_new()、CONTROL--snd_ctl_create()
步骤3:将声卡注册到ALSA框架中
经过以上创建步骤,声卡的逻辑结构如下图所示:
5.PCM设备的创建
对于pcm设备,可以生成两个设备文件,一个用于回放,另一个用于捕获。它们的命名规则也在代码中确定:
播放--pcmCxDxp。通常,系统中只有一个声卡和一个pcm,即pcmC0D0p
捕获--pcmCxDxc。通常,系统中只有一个声卡和一个pcm,即pcmC0D0c
创建新pcm设备的过程:
snd_card_Create,pcm是声卡下的一个设备(组件),因此第一步是创建声卡
snd_pcm_New,调用api创建一个pcm,将在api中完成以下操作:
同时创建播放流和相应的子流
同时创建捕获流和相应的子流
调用snd_ device_ New()将pcm挂在声卡上,ops参数中的dev_ register字段指向函数snd_ pcm_dev_ register。此回调函数将在声卡的注册阶段调用
snd_ pcm_set_ops,设置控制/操作接口函数以操作pcm,参数中的snd _ pcm_ ops结构中的函数通常是我们驱动实现的函数
snd_ card_寄存器注册声卡。在这个阶段,它将遍历声卡下的所有逻辑设备,并调用每个设备的注册回调函数。对于pcm,它是第二步中提到的snd _ pcm_dev_ Register函数,它建立用于与用户空间app(alsa lib)通信的设备文件节点:/dev/snd/pcmCxxDxxp和/dev/snd/pcmCxxxDxxc

6.控制设备的创建
控制设备,如PCM设备,属于声卡下的逻辑设备。用户空间app通过alsa-lib访问控制设备,读取或设置控制状态,以便控制音频编解码器进行各种混音器和其他控制操作。
要自定义控件,我们首先需要定义三个回调函数:info、get和put。然后,定义一个snd_ kcontrol_新结构:
静态结构snd_ kcontrol_ new my_ control_ devinitdata={
iface=SNDRV_ CTL_ ELEM_,
.name=“PCM播放开关”,
index=0,
.access=SNDRV_ CTL_ ELEM_,
.private_值=0xffff,
.info=my_ control_ info,
.get=my_ control_ get,
.put=my_控制_放置
};
iface字段指示控件的类型
名称字段是控件的名称
索引字段用于保存卡中控件的编号。
访问字段包含控件的访问类型。
private_value字段包含长整数类型的任意值。

info回调函数用于获取控件的详细信息
get回调函数用于读取控件的当前值并返回