• 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()回调函数才会被调用

  • 相关阅读:
    (转)Linux 信号说明列表
    linux下socket函数之listen的参数backlog
    (转)auto_ptr与shared_ptr
    (转)关于两次fork
    收集外链
    (转+整理)Linux下Makefile的automake生成全攻略
    LINUX socket编程(转载)errno.h
    (转) socket编程——sockaddr_in结构体操作
    k Nearest Neighbor Search by CUDA
    CUDA Anisotropic Diffusion on a 2D Image
  • 原文地址:https://www.cnblogs.com/bobfly1984/p/13966732.html
Copyright © 2020-2023  润新知