MTK Android5.1 單獨調整主副麥的模擬增益PGA(MT6350_PMIC)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章