目录
3)、dai widget与stream widget的链接:
【目的】
结合SDM845处理器的Android内核代码来静态分析deep_buffer spker的playback路径,涉及dts的解析,pcm fe->dai be->dai_link->codec->pa->spker的整个流程。
【分析】
1、PA wsa991x:
static const struct snd_soc_dapm_route wsa881x_audio_map[] = {
{"SWR DAC_Port", "Switch", "IN"},
{"RDAC", NULL, "SWR DAC_Port"},
{"SPKR PGA", NULL, "RDAC"},
{"SPKR", NULL, "SPKR PGA"},
};
PA的widget音频路径 IN ->(switch开关)SWR DAC_PORT->RDAC->SPKR PGA->SPKR
Dts可以看到该PA的描述
Sdm845-qrd-audio-overlay.dtsi中:
qcom,wsa-max-devs = <2>;
qcom,wsa-devs = <&wsa881x_0211>, <&wsa881x_0213>;
qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight";
prefix的处理在machine的drv中:
Match id_table后->msm_wsa881x_init()
解析“qcom,wsa-aux-dev-prefix”,
msm_codec_conf[n].name_prefix保存pfefix name。
msm_aux_dev[n].init = msm_wsa881x_init;
card->codec_conf = msm_codec_conf;
在aux_dev初始化函数msm_wsa881x_init()中,填充了该codec的privdate的port属性pord_id,mask,rate,nun_ch,设置SpkrLeft IN/SpkrLeft SPKR、SpkrRight IN/SpkrRight SPKR这些端点widget->ignore_suspend = 1,及整条widget路径被suspend后,端点widget不会suspend。
Kcontrol添加prefix:
snd_soc_instantiate_card();
->soc_probe_link_components();
->soc_probe_component();
->soc_set_name_prefix(card, component);设置componnet->name_prefix为codec->codec_conf->name_prefix;
创建WIDGET:
snd_soc_dapm_new_widgets(card)
->Dapm_new_mixer()
/dapm_new_mux()
/dapm_new_pga()
->dapm_create_or_share_kcontrol();
->soc_dapm_prefix(dapm);
->snd_soc_cnew(..., name, prefix);
->if (prefix)
template.name = kasprintf(GFP_KERNEL, "%s %s", prefix, name);
->snd_ctl_new1(&template, data);
可以看到,Widget创建会对prefix解析,从component->prefix获取然后添加到widget的name前缀。
所以,PA的route中的widget都要添加prefix:SpkrLeft和SpkrRight
SpkrLeft IN -(switch)-> SpkrLeft SWR DAC_Port --> SpkrLeft SWR DAC_Port RDAC --> SpkrLeft SPKR PGA -->SpkrLeft SPKR
SpkrRight IN -(switch)-> SpkrRight SWR DAC_Port --> SpkrRight SWR DAC_Port RDAC --> SpkrRight SPKR PGA -->SpkrRight SPKR

本文详细解析了SDM845处理器的Android内核代码中,从用户层到扬声器的音频播放路径,涉及dts解析、pcmfe到codec的流程,以及PA、CPU-FE、ADSP、codec等组件的静态分析。
最低0.47元/天 解锁文章
1078

被折叠的 条评论
为什么被折叠?



