Linux ALSA声卡驱动之二:声卡的创建

来源:互联网 发布:淘宝类目销售比列 编辑:程序博客网 时间:2024/05/24 06:45

转载自http://blog.csdn.net/droidphone/article/details/6289712

1. struct snd_card

 

1.1. snd_card是什么

snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体。正因为如此,本节中,我们也从 struct cnd_card开始吧。

 

1.2. snd_card的定义

snd_card的定义位于改头文件中:include/sound/core.h

  • struct list_head devices     记录该声卡下所有逻辑设备的链表
  • struct list_head controls    记录该声卡下所有的控制单元的链表
  • void *private_data            声卡的私有数据,可以在创建声卡时通过参数指定数据的大小

2. 声卡的建立流程

 

2.1.1. 第一步,创建snd_card的一个实例

  • index           一个整数值,该声卡的编号
  • id                字符串,声卡的标识符
  • 第四个参数    该参数决定在创建snd_card实例时,需要同时额外分配的私有数据的大小,该数据的指针最终会赋值给snd_card的private_data数据成员
  • card             返回所创建的snd_card实例的指针

 

2.1.2. 第二步,创建声卡的芯片专用数据

声卡的专用数据主要用于存放该声卡的一些资源信息,例如中断资源、io资源、dma资源等。可以有两种创建方法:

  • 通过上一步中snd_card_create()中的第四个参数,让snd_card_create自己创建


  • 自己创建:

然后,把芯片的专有数据注册为声卡的一个低阶设备:

 注册为低阶设备主要是为了当声卡被注销时,芯片专用数据所占用的内存可以被自动地释放。

2.1.3. 第三步,设置Driver的ID和名字

snd_card的driver字段保存着芯片的ID字符串,user空间的alsa-lib会使用到该字符串,所以必须要保证该ID的唯一性。shortname字段更多地用于打印信息,longname字段则会出现在/proc/asound/cards中。

 

2.1.4. 第四步,创建声卡的功能部件(逻辑设备),例如PCM,Mixer,MIDI等

这时候可以创建声卡的各种功能部件了,还记得开头的snd_card结构体的devices字段吗?每一种部件的创建最终会调用snd_device_new()来生成一个snd_device实例,并把该实例链接到snd_card的devices链表中。

通常,alsa-driver的已经提供了一些常用的部件的创建函数,而不必直接调用snd_device_new(),比如:

    PCM  ----        snd_pcm_new()

    RAWMIDI --    snd_rawmidi_new()

    CONTROL --   snd_ctl_create()

    TIMER   --       snd_timer_new()

    INFO    --        snd_card_proc_new()

    JACK    --        snd_jack_new()

 

2.1.5. 第五步,注册声卡

 

 

2.2. 一个实际的例子

我把/sound/arm/pxa2xx-ac97.c的部分代码贴上来:

 

 

驱动程序通常由probe回调函数开始,对一下2.1中的步骤,是否有相似之处?

 

经过以上的创建步骤之后,声卡的逻辑结构如下图所示:

                                             图 2.2.1  声卡的软件逻辑结构

 

下面的章节里我们分别讨论一下snd_card_create()和snd_card_register()这两个函数。

 

3. snd_card_create()

 snd_card_create()在/sound/core/init.c中定义。

首先,根据extra_size参数的大小分配内存,该内存区可以作为芯片的专有数据使用(见前面的介绍):

拷贝声卡的ID字符串:

如果传入的声卡编号为-1,自动分配一个索引编号:

初始化snd_card结构中必要的字段:

建立逻辑设备:Control

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

把第一步分配的内存指针放入private_data字段中:

4. snd_card_register()

  snd_card_create()在/sound/core/init.c中定义。

首先,创建sysfs下的设备:

其中,sound_class是在/sound/sound_core.c中创建的:

 

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

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

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

至此,整个声卡完成了建立过程。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刑事拘留22天了怎么办 被派出所拘留 车怎么办 被公安怀疑贩毒怎么办 报案后证据不足怎么办 担心丈夫复嫖怎么办 交通事故当事人重伤笔录怎么办 交通事故做完笔录后怎么办 罚款单子丢了怎么办 刑事案件人跑了怎么办 打架当事人跑了怎么办 赌博被派出所抓怎么办 治安案件人跑了怎么办 去警察局做笔录怎么办 未成年打架留下案底怎么办 土地被别人侵占怎么办 在公安局有案底怎么办 做小姐有案底怎么办 党员被黑社会打怎么办 周期内被扣15分怎么办 驾证扣了50分怎么办? 酒驾拘留工作怎么办 开电动车被拘留怎么办 有一次吸毒案底怎么办 家里收到拘留书怎么办 吸毒有案底结婚怎么办 坐牢了房子按揭怎么办 被刑事拘留15天怎么办 看守所没人交生活费怎么办 判刑后看守所拒收怎么办 上海小孩怎么办图书证 渝北区回兴怎么办户口 赌博罪进看守所怎么办 无法盘腿坐疼怎么办 在看守所不会盘腿怎么办 广州入户信息卡怎么办 工商局被投诉了怎么办 公安到预审阶段怎么办 找的律师不行怎么办 犯了刑事案件该怎么办 在派出所被打怎么办 判刑了身上手机怎么办