首页 理论教育Linux音频驱动电源管理详解

Linux音频驱动电源管理详解

【摘要】:对于音频驱动的电源管理部分,ALSASoC框架层提供了基本的电源管理框架,之前在其与底层platform关联的platform driver中可见有电源管理的操作接口soc_pm_ops。DAPM是dynamic audio power management的缩写。DAPM的目的是降低音频设备的功耗。在实现过程中通过将与音频路径相关的kcontrol控制元素包含进DAPM管理实体,就可以监控系统设置以及应用设置导致的状态变化,从而进行正确的操作。这样就完整实现了整个音频的电源管理功能。

对于音频驱动的电源管理部分,ALSASoC框架层提供了基本的电源管理框架,之前在其与底层platform关联的platform driver中可见有电源管理的操作接口soc_pm_ops。详细内容如下:

主要的电源管理操作就是通过这些接口实现的。下面分析soc_suspend的细节:

从分析中可见,ALSA框架提供的电源管理能力主要由snd_pcm_suspend_all实现,另外在ALSA SoC框架中由各个模块实现相应操作,还有部分功能由DAPM实现。

DAPM是dynamic audio power management(动态音频电源管理)的缩写。DAPM的目的是降低音频设备的功耗。DAPM对应用程序来说是透明的,所有与电源相关的开关都在ALSA SoC架构中完成,DAPM根据当前激活的音频流(playback或capture)和card中的mixer等的配置来决定音频控件模块的打开或关闭。

由于音频设备中会有不同的功能节点,通过这些节点的设置会有完全不同的音频通道,DAPM本身则需要能够维护这些不同节点的功能,以及相应产生的音频通道,在相关的电源管理操作时则会根据音频通道中各个音频节点进行对应的操作,系统提供的相应接口是dapm_power_widgets,对应具体的音频节点则是由snd_soc_dapm_widget结构进行管理。

总体来说DAPM主要是对整个音频流(主要是audiocodec内部的)中的各个节点以及路径进行管理,这样保证在运行过程中可以根据整个音频流的不同状态进行合理地控制,以减少功耗和保证良好的音频效果。运行时管理的重点是在节点和路径上。

先来看看DAPM定义的节点管理实体snd_soc_dapm_widget,分析如下:(www.chuimin.cn)

DAPM提供了一批宏定义,用于相应的codec驱动对widget进行定义。驱动会根据特定widget的特点(如是否能进行DAPM事件处理,是否有控制能力)选择宏进行定义。

另外一个重要的执行管理实体是path,由snd_soc_dapm_path进行管理,细节如下:

可见path是连接两个widget节点的实体,其中的kcontrol是根据相关的widget进行创建的,而必要的情况如mixer和mux会将kcontrol添加到应用层。通过应用层对kcontrol操作可以使音频路径发生变化。snd_soc_dapm_path管理动态的path信息,而设备中静态的连接信息由snd_soc_dapm_route定义,并和widget一起在初始化时产生snd_soc_dapm_path信息以及对应用的kcontrol控制元素。

整个音频路径中有效的音频路径概括为从DAC至output pin、从input pin至ADC、从input pin至output pin、从DAC至ADC等这几类。而从系统的角度无论何时当任何音频路径中有状态发生变化时,都需要进行全局的路径有效性检查,将整个音频路径的相关节点及配置都进行正确的操作,这个工作在DAPM中最终是由dapm_power_widgets来实现的,下面对其进行分析。

从分析中可见,该过程会把握整个变化,进行正确的设置,从而保证系统根据状态进行正确的切换,在保证功能的情况下,达到功耗尽量低,从而完成整个动态调整的功能。在实现过程中通过将与音频路径相关的kcontrol控制元素包含进DAPM管理实体,就可以监控系统设置以及应用设置导致的状态变化,从而进行正确的操作。这样就完整实现了整个音频的电源管理功能。