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的值就是上層寫下來的!