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

ALSA声卡驱动详解(7)

来源:网络收集 时间:2026-07-01
导读: { .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \\ .num_kcontrols = 0, .reg = SND_SOC_NOPM } #define SND_SOC_DAPM_OUTPUT(wname) \\ { .id = snd_soc_dapm_output, .name = wname, .kcont

{ .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM } #define SND_SOC_DAPM_OUTPUT(wname) \\

{ .id = snd_soc_dapm_output, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM } #define SND_SOC_DAPM_MIC(wname, wevent) \\

{ .id = snd_soc_dapm_mic, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \\

.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}

#define SND_SOC_DAPM_HP(wname, wevent) \\

{ .id = snd_soc_dapm_hp, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \\

17

.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}

#define SND_SOC_DAPM_SPK(wname, wevent) \\

{ .id = snd_soc_dapm_spk, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \\

.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}

#define SND_SOC_DAPM_LINE(wname, wevent) \\

{ .id = snd_soc_dapm_line, .name = wname, .kcontrol_news = NULL, \\

.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \\

.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}

以上这些widget分别对应信号发生器,输入引脚,输出引脚,麦克风,耳机,扬声器,线路输入接口。其中的reg字段被设置为SND_SOC_NOPM(-1),表明这些widget是没有寄存器控制位来控制widget的电源状态的。麦克风,耳机,扬声器,线路输入接口这几种widget,还可以定义一个dapm事件回调函数wevent,从event_flags字段的设置可以看出,他们只会响应

SND_SOC_DAPM_POST_PMU(上电后)和SND_SOC_DAPM_PMD(下电前)事件,这几个widget通常会在machine驱动中定义,而

SND_SOC_DAPM_INPUT和SND_SOC_DAPM_OUTPUT则用来定义codec芯片的输出输入脚,通常在codec驱动中定义,最后,在machine驱动中增加相应的route,把麦克风和耳机等widget与相应的codec输入输出引脚的widget连接起来。

音频路径(path)域widget的定义

这种widget通常是对普通kcontrols控件的再封装,增加音频路径和电源管理功能,所以这种widget会包含一个或多个kcontrol,普通kcontrol的定义方法我们在ALSA声卡驱动中的DAPM详解之一:kcontrol中已经介绍过,不过这些被包含的kcontrol不能使用这种方法定义,它们需要使用dapm框架提供的定义宏来定义,详细的讨论我们后面有介绍。这里先列出这些widget的定义宏: [cpp] view plaincopy

#define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\\ wcontrols, wncontrols) \\

{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}

#define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\\ wcontrols, wncontrols) \\

18

{ .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}

#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \\ wcontrols, wncontrols)\\

{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}

#define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \\

wcontrols, wncontrols)\\

{ .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \\

.shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \\

.num_kcontrols = wncontrols}

#define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \\ { .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = NULL, .num_kcontrols = 0}

#define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \\

{ .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}

#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \\

{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}

#define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \\

{ .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \\

.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}

#define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \\

{ .id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \\

19

.shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \\

.num_kcontrols = 1}

可以看出,这些widget的reg和shift字段是需要赋值的,说明这些widget是有相应的电源控制寄存器的,DAPM框架在扫描和更新音频路径时,会利用这些寄存器来控制widget的电源状态,使得它们的供电状态是按需分配的,需要的时候(在有效的音频路径上)上电,不需要的时候(不再有效的音频路径上)下电。这些widget需要完成和之前介绍的mixer、mux等控件同样的功能,实际上,这是通过它们包含的kcontrol控件来完成的,这些kcontrol我们需要在定义widget前先定义好,然后通过wcontrols和num_kcontrols参数传递给这些辅助定义宏。 如果需要自定义这些widget的dapm事件处理回调函数,也可以使用下面这些带“_E”后缀的版本:

SND_SOC_DAPM_PGA_E

SND_SOC_DAPM_OUT_DRV_E SND_SOC_DAPM_MIXER_E

SND_SOC_DAPM_MIXER_NAMED_CTL_E SND_SOC_DAPM_SWITCH_E SND_SOC_DAPM_MUX_E

SND_SOC_DAPM_VIRT_MUX_E

音频数据流(stream)域widget的定义

这些widget主要包含音频输入/输出接口,ADC/DAC等等: [cpp] view plaincopy

#define SND_SOC_DAPM_AIF_IN(wname …… 此处隐藏:3340字,全部文档内容请下载后查看。喜欢就下载吧 ……

ALSA声卡驱动详解(7).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)