MTK Android5.1 单独调整主副麦的模拟增益PGA(MT6350_PMIC)
项目使用副麦消噪,但是副麦增益太小,需要单独修改副麦增益,使用工程模式APP和Audio Tuning Tool调整的MIC的Level4的值,都会同时调整主麦和副麦的增益,而且这个调整的增益应该是数字增益!其实,主麦和副麦模拟信号进入PMIC之后,还是分别有一个模拟增益的调整的,不过好像工程模式APP和Audio Tuning Tool的工具没办法调整,需要去源码找!
先看两张图:
从图上可以看到,主麦VIN0和耳机麦VIN1进来之后,有一个名字叫PGAL的放大器,然后才到ADCL的模数转换器,副麦VIN2进来之后,有一个名字叫PGAR的放大器,然后才到ADCR的模数转换器。可以看到PGA的增益调节范围是-6dB~24dB,每6个dB一级。
再看PMIC的寄存器控制:
可以看到,寄存器AUDTOP_CON0的bit4到bit6控制PGAL的增益,也就是主麦增益,寄存器AUDTOP_CON1的bit8到bit10控制PGAR的增益,也就是副麦增益,范围都是-6dB~24dB,总共6个挡,每6个dB一挡。
知道了寄存器名字,去源码里面找,找到目录:kernel/sound/soc/mediatek/mt_soc_audio_6580/mt_soc_codec_63xx.c
里面有两个函数如下:
static int Audio_PGA1_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{int index = 0;int index2 = 5;printk("%s()\n", __func__);if (ucontrol->value.enumerated.item[0] > ARRAY_SIZE(ADC_UL_PGA_GAIN)){printk("return -EINVAL\n");return -EINVAL;}index = ucontrol->value.integer.value[0];printk("%s(),index=%d\n", __func__,index);//index = index / 6;if (index > index2){index = index2;}//const int PreAmpGain[] = {-6, 0, 6, 12, 18, 24};//index2 -= index;printk("%s(),index=%d,index2=%d\n", __func__,index,index2);Ana_Set_Reg(AUDTOP_CON0, index << 4, 0x00000070);mCodec_data->mAudio_Ana_Volume[AUDIO_ANALOG_VOLUME_MICAMP1] = ucontrol->value.integer.value[0];return 0;
}static int Audio_PGA2_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{int index = 0;int index2 = 5;printk("%s()\n", __func__);if (ucontrol->value.enumerated.item[0] > ARRAY_SIZE(ADC_UL_PGA_GAIN)){printk("return -EINVAL\n");return -EINVAL;}index = ucontrol->value.integer.value[0];printk("%s(),index=%d\n", __func__,index);if (index > index2){index = index2;}//const int PreAmpGain[] = {-6, 0, 6, 12, 18, 24};printk("%s(),index=%d\n", __func__,index);Ana_Set_Reg(AUDTOP_CON1, index << 8, 0x00000700);mCodec_data->mAudio_Ana_Volume[AUDIO_ANALOG_VOLUME_MICAMP2] = ucontrol->value.integer.value[0];return 0;
}
第一个函数Audio_PGA1_Set设置PGAL主麦的增益Ana_Set_Reg(AUDTOP_CON0, index << 4, 0x00000070),index就是要写入寄存器bit4到bit6的值,范围是0~5,对应-6, 0, 6, 12, 18, 24这几个dB增益;
第二个函数Audio_PGA2_Set设置PGAR副麦的增益Ana_Set_Reg(AUDTOP_CON1, index << 8, 0x00000700),同样的,index范围是0~5,对应-6, 0, 6, 12, 18, 24这几个dB增益。
接下来修改一下index的值,看看有没有效果。通过串口log,知道了我的机器的index默认值是2,也就是6dB,现在做如下修改:
static int Audio_PGA2_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{......printk("%s(),index=%d\n", __func__,index);index = 5; //强制设置增益的级别Ana_Set_Reg(AUDTOP_CON1, index << 8, 0x00000700);mCodec_data->mAudio_Ana_Volume[AUDIO_ANALOG_VOLUME_MICAMP2] = ucontrol->value.integer.value[0];return 0;
}
将控制副麦PGA的index强制设置为5,也就是24dB,然后再次录音,看以下两图对比:
可以看到,修改之前,副麦的增益很小,修改之后,副麦增益变大,但是主麦修改前后都没有变!!
因为只改了Audio_PGA2_Set这个函数,这个控制副麦,修改Audio_PGA1_Set函数,就可以看到主麦增益的变化了!
注意,这里修改的都是模拟增益,是麦克风的模拟电信号进入PMIC之后,直接放大的,所以,对于系统的所有模式都有影响,无论是通话还是普通录音!
但是这是强制修改了系统,不推荐使用,项目最终也没有用这种修改,是在上层做的,感兴趣的可以追一下这两个函数的调用,到hal层以及上层audio服务,index的值就是上层写下来的!