DAPM event机制

概要

通过dapm事件机制,widget可以定义自己的event回调函数来监听dapm事件。

有些dapm widget和其它组件 在上下电顺序上有要求,而且这些组件电源不是通过寄存器控制或者说这些组件无法定义成widget注册到dapm框架,通过dapm机制控制其电源。可以通过dapm事件机制或amix进行控制。

例如:对于那些位于codec之外的组件,例如喇叭功放、外部的前置放大器等等,这些组件和有些widget有上下电顺序要求。由于组件不是使用codec内部的寄存器进行电源控制,无法定义成widget,我们就必须利用dapm的事件机制,获得相应的上下电事件,从而可以控制组件和widget之间的上下电顺序。

dapm widget event种类

widget event回调函数

下面的widget默认需要提供event回调函数:

这些widget都是位于codec外部的器件,它们无法使用通用的寄存器操作来控制widget的电源状态,所以需要我们提供event回调函数。

在定义snd_soc_dapm_clock_supply、snd_soc_dapm_regulator_supply、snd_soc_dapm_pinctrl类型widgets时,会默认定义相应的event回调函数。代码如下所示:

#define SND_SOC_DAPM_CLOCK_SUPPLY(wname) \
{	.id = snd_soc_dapm_clock_supply, .name = wname, \
	.reg = SND_SOC_NOPM, .event = dapm_clock_event, \
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
#define SND_SOC_DAPM_REGULATOR_SUPPLY(wname, wdelay, wflags)	    \
{	.id = snd_soc_dapm_regulator_supply, .name = wname, \
	.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD, \
	.on_val = wflags}
#define SND_SOC_DAPM_PINCTRL(wname, active, sleep) \
{	.id = snd_soc_dapm_pinctrl, .name = wname, \
	.priv = (&(struct snd_soc_dapm_pinctrl_priv) \
		{ .active_state = active, .sleep_state = sleep,}), \
	.reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, \
	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }

在定义snd_soc_dapm_supply类型的widget时,可以定义event回调函数。代码如下:

#define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \
{	.id = snd_soc_dapm_supply, .name = wname, \
	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
	.event = wevent, .event_flags = wflags}

注意这些硬件资源类型的widgets,是通过widget name来获取资源句柄的
supply类型widget必须添加到audio route路由表里,其event()回调函数才会被调用

posted @ 2020-11-12 22:40  bobfly1984  阅读(344)  评论(0编辑  收藏  举报