tas5782m功率调试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010481276/article/details/88551808

功率调试,是1Khz 0db的源将soc dsp到pa的幅度降到一样(理想状态,调到dsp最大幅度),再调pa相对增益以达到特定功率(这里为5W),只需要调试这个功率的相对增益就行,设置到pa之后再调dsp的幅度,每个幅度都会做相应的增益补偿(与最大功率一样)

整个调试过程中比较纠结,到最后才发现i2s bit clock mclock波形质量不好

且模块需要在提供i2s clock的时候,读写才有效

在调试音频功率时发现,做line in时,pm8916有异常波形出来,需要削除掉这个异常15k正弦波形在这里插入图片描述
后面是发现是从mic1进来的,由硬件进行滤波来解决这个问题,后面在解决中还出现了23k正弦波,同样是硬件解决的

最后硬件只将tinymix “ADC1 Volume” 5就可以调pa的功率为5w
只需在mix_path将默认值修改为5,再将ftm_test_config配置文件中去掉ADC1 Volume:6的设置

Index: android/hardware/qcom/audio/configs/msm8909/mixer_paths_msm8909_pm8916.xml
===================================================================
--- android/hardware/qcom/audio/configs/msm8909/mixer_paths_msm8909_pm8916.xml  (revision 281)
+++ android/hardware/qcom/audio/configs/msm8909/mixer_paths_msm8909_pm8916.xml  (revision 282)
@@ -56,7 +56,7 @@
     <ctl name="IIR1 INP2 Volume" value="84" />
     <ctl name="IIR1 INP3 Volume" value="84" />
     <ctl name="IIR1 INP4 Volume" value="84" />
-    <ctl name="ADC1 Volume" value="4" />
+    <ctl name="ADC1 Volume" value="5" />
     <ctl name="ADC2 Volume" value="4" />
     <ctl name="ADC3 Volume" value="4" />
     <ctl name="DEC1 Volume" value="84" />
Index: android/vendor/qcom/proprietary/mm-audio/audio_ftm/family-b/config/8909/ftm_test_config
===================================================================
--- android/vendor/qcom/proprietary/mm-audio/audio_ftm/family-b/config/8909/ftm_test_config     (revision 281)
+++ android/vendor/qcom/proprietary/mm-audio/audio_ftm/family-b/config/8909/ftm_test_config     (revision 282)
@@ -802,8 +802,6 @@
 
 DEC1 MUX:ADC1
 
-ADC1 Volume:6
-
 QUAT_MI2S_RX Port Mixer TERT_MI2S_TX:1
 
 QUAT_MI2S_RX_DL_HL Switch:1

在调试过程中,还发现
针对tas5782m模块
ppc3仿真工具操作不方便,数据误发
写的i2c地址是0x92其实是0x90需要手动再发一现,非常麻烦,
导出来的寄存器数据有误
导出来的数据发现有问题,有一定的风险
如下导出来是
{ 0x22, 0x03 },实现操作的是96k

后来发现ppc3无法加载单声道,此时pa是采用声道设计的,且原来i2c地址采用的0x90

原来关于tas5782m,TI SW(ppc3)内部已经固定的立体声设备地址为0x90而Mono设备为0x92,这就是无法选择相应的单声道模式的原因

从上说0x90是立体声道,因此需要硬件将i2c 地址修改为0x92,软件也需要修改
在这里插入图片描述
因为默认为低,因此adr0必须拉高,且驱动将i2c地址修改为0x49
重新修改后可以识别了,重新用ppc3调试

在没有连接的状态下,在recent files选 一个ppc3文件
在这里插入图片描述
点end system integration,确保一下参数是否与调试相匹配在这里插入图片描述
点左下角的连接,
在这里插入图片描述
系统检测
在这里插入图片描述
在这里插入图片描述
硬件检测后喇叭就会发出声音,检测完成后就没有声音,说明硬件检测通了,可以开始调试了
回到home进入audio processing音频调试界面
在这里插入图片描述
重新调96K
在这里插入图片描述
在这里插入图片描述
导出寄存器表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里导出表的头文件内容类型为,如果ppc3软件有问题,还需要根据spec修改寄存器里面的信息,如clk源,i2s 格式,电压等
在这里插入图片描述

调节音量直接走调pa的相对音量增益
在高通的audio hal 中修改即文件 audio_hw.c的out_set_volume中

#if 1						  
#define ESP (0.000001)
static float volume_value[]=
{
	0.000000,
	0.002701,
	0.006464,
	0.013924,
	0.023646,
	0.040156,
	0.072862,
	0.123738,
	0.189453,
	0.294274,
	0.435262,
	0.643799,
	1.000000,
};//打印出来用于定位到声音处于哪一阶
#endif
static int out_set_volume(struct audio_stream_out *stream, float left,
                          float right)
{
    struct stream_out *out = (struct stream_out *)stream;
    int volume[2];
    int ret = 0;
	
	ALOGE("[Linda]11 %s: left:%f, right: %f, out->usecase:%d",__func__, left, right,out->usecase);

    if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) {
        /* only take left channel into account: the API is for stereo anyway */
        out->muted = (left == 0.0f);
        return 0;
    } else if (is_offload_usecase(out->usecase)) {
        if (audio_extn_passthru_is_passthrough_stream(out)) {
            /*
             * Set mute or umute on HDMI passthrough stream.
             * Only take left channel into account.
             * Mute is 0 and unmute 1
             */
            audio_extn_passthru_set_volume(out, (left == 0.0f));
        } else if (out->format == AUDIO_FORMAT_DSD){
            char mixer_ctl_name[128] =  "DSD Volume";
            struct audio_device *adev = out->dev;
            struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);

            if (!ctl) {
                ALOGE("%s: Could not get ctl for mixer cmd - %s",
                      __func__, mixer_ctl_name);
                return -EINVAL;
            }
            volume[0] = (int)(AmpToDb(left));
            volume[1] = (int)(AmpToDb(right));
            mixer_ctl_set_array(ctl, volume, sizeof(volume)/sizeof(volume[0]));
            return 0;
        } else {
			ALOGE("[Linda]77 %s:",__func__);
            pthread_mutex_lock(&out->compr_mute_lock);
            ALOGE("%s: compress mute %d", __func__, out->a2dp_compress_mute);
			#if 0
            if (!out->a2dp_compress_mute)
                ret = out_set_compr_volume(stream, left, right);//注释掉这里正常播放的音量全部都是在这里设到adsp
			#else
			{
				#if 0
				FILE * fd;
				unsigned int value =10;
				ALOGE("%s: start test", __func__);
				fd = fopen("/sys/devices/soc/78b8000.i2c/i2c-4/4-0048/pa_vol","rw");
				if (fd == NULL)
				{
					ALOGE("%s: start test  fd == null", __func__);
					//return -1;
				}

				ALOGE("%s: start wrtie", __func__);
				if(fd != NULL)
				{
					ALOGE("%s: start wrtie 0", __func__);
					fwrite(&value, sizeof(value), 1, fd);
					
					ALOGE("%s: start wrtie 1", __func__);
				}
				fclose(fd);
				#else
				
				ALOGE("%s: start test", __func__);
				int i =0;
				char devicepath[512] = {0};
				
				for(i = 0; i < 12; i++)
				{
					ALOGE("%s: volume_value[i]: %f,right:%f,left:%f", __func__,volume_value[i],right,left);
					if(((volume_value[i] - left) > (-1) * ESP) && ((volume_value[i] - left) < ESP) &&
					   ((volume_value[i] - right) > (-1) * ESP) && ((volume_value[i] - right) < ESP) )
					{
						sprintf(devicepath, "echo %d > /sys/devices/soc/78b8000.i2c/i2c-4/4-0048/pa_vol", i);
						ALOGE("%s: test  command: %s", __func__,devicepath);
						system(devicepath);//将音量除数写到pa中,驱动层直接控制音量的相对增益寄存器
						break;
					}
				}
				#endif
				ALOGE("%s: test end", __func__);
			}
			#endif
			
            out->volume_l = left;
            out->volume_r = right;
            pthread_mutex_unlock(&out->compr_mute_lock);
            return ret;
        }
    } else if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP) {
        char mixer_ctl_name[] = "App Type Gain";
        struct audio_device *adev = out->dev;
        struct mixer_ctl *ctl;
        uint32_t set_values[4];

        ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
        if (!ctl) {
            ALOGE("%s: Could not get ctl for mixer cmd - %s",
                   __func__, mixer_ctl_name);
            return -EINVAL;
        }

        set_values[0] = 0; //0: Rx Session 1:Tx Session
        set_values[1] = out->app_type_cfg.app_type;
        set_values[2] = (int)(left * VOIP_PLAYBACK_VOLUME_MAX);
        set_values[3] = (int)(right * VOIP_PLAYBACK_VOLUME_MAX);

        mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
        return 0;
    }

    return -ENOSYS;
}

但后来发现以上的修改只能对播放mp3之类的有效果,对wav类的pcm数据没有影响,后来发现是audioflinger针对不同的流在混音时做了不同的处理,需要在AudioFlinger::setStreamVolume中作处理
https://blog.csdn.net/yangchangwen/article/details/78348317
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010481276/article/details/88551808
今日推荐