Linux ALSA驱动框架(一)--ALSA架构简介--声卡的创建

匿名 (未验证) 提交于 2019-12-02 21:59:42
(1)ALSA简介
(1)



(2)
alsa驱动框架核心层给我们干的活:创建声卡设备的控制接口和PCM设备
snd_soc_init()--->
platform_driver_register(&soc_driver)--->
soc_probe()--->
snd_soc_register_card(card)--->注册自己的声卡设备
snd_soc_instantiate_card(card)--->

{
}

(3)
在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。



(4)
字符设备
C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。

(5)
sound/core/sound.c
alsa_sound_init(void)
{
register_chrdevsnd_fops
}
snd_open

(6)
谁调用snd_register_device_for_dev()(两路调用)
一路:声卡设备的控制接口
另一路:声卡设备的数据接口
声卡设备的控制接口
sound/core/control.c
创建一个snd_card结构体
snd_ctl_create--->
snd_register_device--->
snd_register_device_for_dev()
snd_ctl_create
{
snd_ctl_dev_register,
}
创建声卡设备的数据接口(声卡驱动)
总结:
(1)构造snd_card结构体,snd_card_create()构造snd_card结构体并自动创建控制接口。调用函数snd_ctrl_create
(2)初始化;如snd_pcm_new(),创建逻辑设备(播放设备或录音设备)

(2)声卡的创建

(1)
snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体。
}

snd_soc_init
{
}
soc_probe
{
snd_soc_register_card
{
}
{
snd_card_create
}
snd_card_create
card:返回所创建的snd_card实例的指针
设置Driver的ID和名字
snd_info_init()-->
snd_card_info_init()-->
snd_card_info_read()-->
{
}
创建声卡的功能部件(逻辑设备),例如PCM,Mixer,MIDI等
这时候可以创建声卡的各种功能部件了,还记得开头的snd_card结构体的devices字段吗?每一种部件的创建最终会调用snd_device_new()来生成一个snd_device实例,并把该实例链接到snd_card的devices链表中。
通常,alsa-driver的已经提供了一些常用的部件的创建函数,而不必直接调用snd_device_new(),比如:

注册声卡
{
snd_card_create

}
比如我们的例子:
{
}



(2)
{
//根据extra_size参数的大小分配内存,该内存区可以作为芯片的专有数据使用



//拷贝声卡的ID字符串

#endif
//初始化snd_card结构中必要的字段

//建立逻辑设备:Control

//建立proc文件中的info节点:通常就是/proc/asound/card0

//分配的内存指针放入private_data字段中

}

{
//创建sysfs下的设备

//通过snd_device_register_all()注册所有挂在该声卡下的逻辑设备,snd_device_register_all()实际上是通过snd_card的devices链表,遍历所有的snd_device,并且调用snd_device的ops->dev_register()来实现各自设备的注册的。

最后代码就是建立一些相应的proc和sysfs下的文件或属性节点

}

{


class_create


}

sound_devnode
{
}
//声卡的class将会出现在文件系统的/sys/class/sound/下面,并且,sound_devnode()也决定了相应的设备节点也将会出现在/dev/snd/下面。










易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!