教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

ALSA声卡驱动详解(12)

来源:网络收集 时间:2026-07-01
导读: } 上面这种注册方法有个缺点,有时候我们为了代码的清晰,可能会根据功能把不同的widget定义成多个数组,但是snd_soc_codec_driver中只有一个 dapm_widgets字段,无法设定多个widget数组,这时候,我们需要主动在co

}

上面这种注册方法有个缺点,有时候我们为了代码的清晰,可能会根据功能把不同的widget定义成多个数组,但是snd_soc_codec_driver中只有一个

dapm_widgets字段,无法设定多个widget数组,这时候,我们需要主动在codec的probe回调中调用dapm框架提供的api来创建这些widget: [cpp] view plaincopy

static int wm8993_probe(struct snd_soc_codec *codec) {

......

snd_soc_dapm_new_controls(dapm, wm8993_dapm_widgets, ARRAY_SIZE(wm8993_dapm_widgets));

...... }

实际上,对于第一种方法,snd_soc_register_codec内部其实也是调用

snd_soc_dapm_new_controls来完成的。后面会有关于这个函数的详细分析。

platform驱动中注册 和codec驱动一样,我们会通过ASoc提供的api函数snd_soc_register_platform来注册一个platform驱动,该函数的第二个参数是一个snd_soc_platform_driver结构指针,snd_soc_platform_driver结构中同样也包含了与dapm相关的字段: [cpp] view plaincopy

struct snd_soc_platform_driver { ......

/* Default control and setup, added after probe() is run */

const struct snd_kcontrol_new *controls; int num_controls;

const struct snd_soc_dapm_widget *dapm_widgets; int num_dapm_widgets;

const struct snd_soc_dapm_route *dapm_routes; int num_dapm_routes; ...... }

要注册platform级别的widget,和codec驱动一样,只要把定义好的widget数组赋值给dapm_widgets和num_dapm_widgets字段即可,

snd_soc_register_platform函数注册paltform后,当machine驱动匹配上该

platform时,系统会自动完成创建和注册的工作。同理,我们也可以在platform驱动的probe回调函数中主动使用snd_soc_dapm_new_controls来完成widget的创建工作。具体的代码和codec驱动是类似的,这里就不贴了。

machine驱动中注册 有些widget可能不是位于codec中,例如一个独立的耳机放大器,或者是喇叭功放等,这种widget通常需要在machine驱动中注册,通常

31

他们的dapm context也从属于声卡(snd_soc_card)域。做法依然和codec驱动类似,通过代表声卡的snd_soc_card结构中的几个dapm字段完成: [cpp] view plaincopy struct snd_soc_card { ...... /*

* Card-specific routes and widgets. */

const struct snd_soc_dapm_widget *dapm_widgets; int num_dapm_widgets;

const struct snd_soc_dapm_route *dapm_routes; int num_dapm_routes; bool fully_routed; ...... }

只要把定义好的widget数组和数量赋值给dapm_widgets指针和

num_dapm_widgets即可,注册声卡使用的api:snd_soc_register_card(),也会通过snd_soc_dapm_new_controls来完成widget的创建工作。

注册音频路径

系统中注册的各种widget需要互相连接在一起才能协调工作,连接关系通过

snd_soc_dapm_route结构来定义,关于如何用snd_soc_dapm_route结构来定义路径信息,请参考:ALSA声卡驱动中的DAPM详解之三:如何定义各种widget中的\建立widget和route\一节的内容。通常,所有的路径信息会用一个

snd_soc_dapm_route结构数组来定义。和widget一样,路径信息也分别存在与codec驱动,machine驱动和platform驱动中,我们一样有两种方式来注册音频路径信息:

通过snd_soc_codec_driver/snd_soc_platform_driver/snd_soc_card结构中的dapm_routes和num_dapm_routes字段;

在codec、platform的的probe回调中主动注册音频路径,machine驱动中则通过snd_soc_dai_link结构的init回调函数来注册音频路径;

两种方法最终都是通过调用snd_soc_dapm_add_routes函数来完成音频路径的注册工作的。以下的代码片段是omap的pandora板子的machine驱动,使用第二种方法注册路径信息: [cpp] view plaincopy

static const struct snd_soc_dapm_widget omap3pandora_in_dapm_widgets[] = {

SND_SOC_DAPM_MIC(\, NULL), SND_SOC_DAPM_MIC(\, NULL), SND_SOC_DAPM_LINE(\, NULL),

32

};

static const struct snd_soc_dapm_route omap3pandora_out_map[] = {

{\, NULL, \},

{\, NULL, \}, {\, NULL, \},

{\, NULL, \}, };

static const struct snd_soc_dapm_route omap3pandora_in_map[] = {

{\, NULL, \}, {\, NULL, \},

{\, NULL, \}, {\, NULL, \},

{\, NULL, \},

{\, NULL, \}, };

static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd) {

struct snd_soc_codec *codec = rtd->codec;

struct snd_soc_dapm_context *dapm = &codec->dapm; int ret;

/* All TWL4030 output pins are floating */ snd_soc_dapm_nc_pin(dapm, \); ......

//注册kcontrol控件

ret = snd_soc_dapm_new_controls(dapm, omap3pandora_out_dapm_widgets,

ARRAY_SIZE(omap3pandora_out_dapm_widgets));

if (ret < 0)

return ret;

//注册machine的音频路径

return snd_soc_dapm_add_routes(dapm, omap3pandora_out_map,

ARRAY_SIZE(omap3pandora_out_map)); }

33

static int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd) {

struct snd_soc_codec *codec = rtd->codec;

struct snd_soc_dapm_context *dapm = &codec->dapm; int ret;

/* Not comnnected */

snd_soc_dapm_nc_pin(dapm, \); ......

//注册kcontrol控件

ret = snd_soc_dapm_new_controls(dapm, omap3pandora_in_dapm_widgets,

ARRAY_SIZE(omap3pandora_in_dapm_widgets));

if (ret < 0)

return ret; //注册machine音频路径

return snd_soc_dapm_add_routes(dapm, omap3pandora_in_map, …… 此处隐藏:1802字,全部文档内容请下载后查看。喜欢就下载吧 ……

ALSA声卡驱动详解(12).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/520655.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)