widget定义
struct snd_soc_dapm_widget {
enum snd_soc_dapm_type id;
const char *name; /* widget name */
const char *sname; /* stream name */
struct snd_soc_codec *codec;
struct snd_soc_platform *platform;
struct list_head list;
struct snd_soc_dapm_context *dapm;
void *priv; /* widget specific data */
struct regulator *regulator; /* attached regulator */
const struct snd_soc_pcm_stream *params; /* params for dai links */
/* dapm control */
int reg; /* negative reg = no direct dapm */
unsigned char shift; /* bits to shift */
unsigned int value; /* widget current value */
unsigned int mask; /* non-shifted mask */
unsigned int on_val; /* on state value */
unsigned int off_val; /* off state value */
unsigned char power:1; /* block power status */
unsigned char invert:1; /* invert the power bit */
unsigned char active:1; /* active stream on DAC, ADC's */
unsigned char connected:1; /* connected codec pin */
unsigned char new:1; /* cnew complete */
unsigned char ext:1; /* has external widgets */
unsigned char force:1; /* force state */
unsigned char ignore_suspend:1; /* kept enabled over suspend */
unsigned char new_power:1; /* power from this run */
unsigned char power_checked:1; /* power checked this run */
int subseq; /* sort within widget type */
int (*power_check)(struct snd_soc_dapm_widget *w);
/* external events */
unsigned short event_flags; /* flags to specify event types */
int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
/* kcontrols that relate to this widget */
int num_kcontrols;
const struct snd_kcontrol_new *kcontrol_news;
struct snd_kcontrol **kcontrols;
/* widget input and outputs */
struct list_head sources;
struct list_head sinks;
/* used during DAPM updates */
struct list_head power_list;
struct list_head dirty;
int inputs;
int outputs;
struct clk *clk;
};
各字段含义:
id:该widget的类型值,比如snd_soc_dapm_output,snd_soc_dapm_mixer等等
name/sname:该widget的name、sname
codec/platform:该widget所属的codec/platform
list:用于把widget添加到声卡的widgets链表中
dapm:snd_soc_dapm_context结构指针,ASoc把系统划分为多个dapm域,每个widget属于某个dapm域,同一个域代表着同样的偏置电压供电策略;比如,同一个codec中的widget通常位于同一个dapm域,而平台上的widget可能又会位于另外一个platform域中
regulator:对于snd_soc_dapm_regulator_supply类型的widget,该字段指向与之相关的regulator结构指针
params:目前对于snd_soc_dapm_dai_link类型的widget,指向该dai的配置信息的snd_soc_pcm_stream结构,参考代码:snd_soc_dapm_new_pcm()
reg/shift/mask:这3个字段用来控制该widget的电源状态,分别对应控制信息所在的寄存器地址/位移值/屏蔽值
value/on_val/off_val:电源状态的当前值、开启时、关闭时所对应的值
poewr/invert:指示该widget当前是否处于上电状态,invert则用于表明power字段是否需要逻辑反转
new:我们定义好的widget(snd_soc_dapm_widget结构),在注册到声卡中时需要进行实例化,该字段用来表示该widget是否已经被实例化。
ext:如果一个widget是某条path的目的widget,而该path的源widget是mic、micbias、line、output,则该widget具备外部连接特性;
如果一个widget是某条path的源widget,而该path的目的widget是spk、hp、line、input,则该widget具备外部连接特性。
force:该位被设置后,将会不管widget当前的状态,强制更新至新的电源状态。
ignore_suspend/new_power/power_checked:电源管理相关的字段
subseq:该widget目前在上电或下电队列中的排序编号,为了防止在上下电的过程中出现pop-pop声,DAPM会给每个widget分配合理的上下电顺序
power_check:用于检查该widget是否应该上电或下电的回调函数指针
event_flags:该字段是一个位或字段,每个位代表该widget会关注某个DAPM事件通知。只有被关注的通知事件会被发送到widget的事件处理回调函数中。
event:DAPM事件处理回调函数指针
num_kcontrols/kcontrol_news/kcontrols:这3个字段用来描述该widget所包含的kcontrol控件,例如一个mixer控件或者是一个mux控件
sources:该widget的输入端连接了哪些path
sinks:该widget的输出端连接了哪些path
power_list:每次更新整个dapm的电源状态时,会根据一定的算法扫描所有的widget,然后把需要变更电源状态的widget利用该字段链接到一个上电或下电的链表中,扫描完毕后,dapm系统会遍历这两个链表执行相应的上电或下电操作。
dirty:用于把power状态发生改变的widget添加的声卡的dapm_dirty链表中,稍后在遍历dapm_list链表时判断把该widget添加到down_list或者up_list,参考函数dapm_mark_dirty()
outputs:该widget的输出端连接的完整path的个数
inputs:该widget的输入端连接的完整path的个数
connected:代表引脚的连接状态,目前,只有以下这些widget使用connected字段
snd_soc_dapm_output
snd_soc_dapm_input
snd_soc_dapm_hp
snd_soc_dapm_spk
snd_soc_dapm_line
snd_soc_dapm_vmid
snd_soc_dapm_mic
snd_soc_dapm_siggen
clk:对于snd_soc_dapm_clock_supply类型的widget,指向相关联的clk结构指针
浙公网安备 33010602011771号