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的值就是上层写下来的!

发布了11 篇原创文章 · 获赞 4 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_21059825/article/details/81263725
MTK