tas5782m功率调试

音频接口:TDM,PDM,I2S,PCM 简介 转载

数字音频接口之TDM

功率调试,是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,确保一下参数是否与调试相匹配在这里插入图片描述

后面在调tas5805m时,导出没有声音,发现要用以下配置
在这里插入图片描述
原因
在这里插入图片描述

点左下角的连接,
在这里插入图片描述
系统检测
在这里插入图片描述
在这里插入图片描述
硬件检测后喇叭就会发出声音,检测完成后就没有声音,说明硬件检测通了,可以开始调试了
回到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.youkuaiyun.com/yangchangwen/article/details/78348317
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值