■总结
在初始化过程中执行麦克风偏置控制(※)的设置、
麦克风偏置无效、因为在初始化处理后会通知 SND_SOC_DAPM_PRE_PMD 事件
※tlv320aic3104.pdf -表31。 第0页/寄存器25:MICBIAS 控制寄存器
■详细信息
函数调用顺序(linux-imx\sound/soc/codecs\tlv320aic3x.c)
aic3x_i2c_probe ()
→器件树中设置了 aI3x-micbias vg =<1>(MICBIAS 输出被供电至2.0V)、
AIC3X_MICBIAS_2_0V 在 aic3x->micBIAS_vg 中设置
static int aic3x_i2c_probe (struct i2c_client *i2c,
const struct i2c_device_id *id)
{
・・・
if (!OF_property_read_u32 (np,"ai3x-micbis-vg",&value){
case 1:aic3x->micicx_read_u32 (np,"aicx_bias v3v_beg",&beg")= v3v_beg_beg_beg_v3v_beg_beg_aic v=v3v_beg_aicbeg_beg_beg_aic
v3v=v_aic
v_beg_dias_beg_aic v3v=v_beg_beg_beg_beg_aic
v_aic v_aic v3v
DEV_ERR(&i2c->DEV,“不合适的微偏置电压”
“可在 DT\n"找到);
}
否则{aic3x->micbias
_vg = AIC3X_MICBIAS_OFF;
}
・・・
}
aic3x_probe ()
→MICBIAS 控制寄存器的值根据 aic3x->micBIAS_vg (0x40)的值进行更新
静态 int aic3x_probe (struct snd_soc_codec *编解码器) { ・・・ switch (aic3x->model){ case AIC3X_model_3X: case AIC3X_model_33: snd_soc_add_codec_controls (codec、aic3x_extra snd_controls、 array_size (aic3x_model_model_33)、snic3x_codec_controls ;snic3_doccotr_controls (codec_controls) array_size (aic3x_mono_controls)); break; case AIC3X_model_3007: snd_soc_add_codec_controls (codec、aic3x_extra snd_controls、 array_size (aic3x_extra snd_controls)); SND_SoC_add_codec_controls (编解码器、 &aic3x_classd_amp_gain_ctrl、1); break; case AIC3X_model_3104: break; } /*设置麦克风偏置电压*/ switch (aic3x->micbias vg){ case AIC3X_MICBIAS_2_0V: case AIC3X_MICBIAS_2_5V: case AIC3X_MICBIAS_AVDDV: SND_SoC_UPDATE_Bits (CODEC、MICBIAS_CTRL、 MICBIAS_LEVEL_MASK、 (aic3x->micbias _vg)<< MICBIAS_LEVEL_SHIFT); break; case AIC3X_MICBIAS_OFF: // *注意到要执行的操作。 目标不会在此处输入。 这只是为了避免 *编译时间警告"警告:枚举值 *'AIC3X_MICBIAS_OFF'未在开关中处理" * /中断; } aic3x_add_widget (codec); 返回0; }
3. aic3x_init ()
4. MIC_BIAS_EVENT ()
→通知了 SND_SOC_DAPM_PRE_PMD 事件并更新了 MICBIAS 控制寄存器的值(0x40→0x00)
※之后,不会出现“snd_SOC_DAPM_POST_PMU”事件通知,
在初始化过程中设置的 MICBIAS 控制寄存器值仍然被覆盖。