tas5782m功率调试

41 篇文章 8 订阅
34 篇文章 5 订阅

功率调试,是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.csdn.net/yangchangwen/article/details/78348317
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TAS5805M是一种数字音频功率放大器芯片,它采用了I2C控制接口来实现对器件的各种配置和控制。 要编写TAS5805M的I2C程序,首先需要了解芯片的寄存器配置和寄存器位的功能。TAS5805M的寄存器可以分为设备配置寄存器和音频处理寄存器两类。设备配置寄存器包括芯片ID、时钟、使能等配置,而音频处理寄存器包括音量、EQ、声场等音频处理参数的配置。 编写I2C程序的过程大致如下:首先通过I2C总线向TAS5805M写入设备配置寄存器,将芯片ID、时钟、使能等参数设置好。接下来根据需要对音频处理寄存器进行配置,包括音量、EQ、声场等参数的设置。需要注意的是,在对音频处理寄存器进行配置时,要保证寄存器位的设置正确,否则可能会导致音质变差或者无声输出。 编写I2C程序需要注意的几个细节:首先要确保I2C总线的时钟和数据线的电平稳定,以免出现通信错误。其次,在进行I2C读写操作时,要根据TAS5805M的地址和寄存器地址来正确操作寄存器位。最后,在每一次配置完成后,最好进行一次音频输出测试,以确保输出效果符合预期。 总的来说,编写TAS5805M的I2C程序需要有一定的音频处理和I2C通信基础,同时还需要仔细研究芯片的寄存器配置和寄存器位功能,才能实现对芯片的各种稳定可靠的配置。 ### 回答2: TAS5805M是一种数字功放芯片,其IIC程序是编程该芯片的其中一种方法。为了使用TAS5805M实现数字放大器功能,需要通过IIC接口来设置芯片的不同寄存器中的参数。IIC程序的实现是通过控制IIC总线来读写寄存器来完成。 TAS5805M的IIC程序主要包括以下步骤: 1. 初始化IIC总线,设置好地址和速率等参数; 2. 将寄存器地址和设置好的参数通过IIC总线写入TAS5805M芯片的寄存器中; 3. 如果需要取回之前设置的某些参数,可以通过IIC总线进行读取。 在实际编写IIC程序时,需要对不同的寄存器及其参数进行详细的了解和分析,了解其相关的数据格式、数据位及控制位,在代码中进行相应的设置和配置。 总之,IIC程序是实现数字功放TAS5805M芯片功能的重要步骤之一,有着非常重要的作用。通过IIC程序的编写,可以对TAS5805M芯片进行自定义的设置和配置,以满足不同应用场景下所需的功率、信噪比等要求。 ### 回答3: TAS5805M是一款数字音频功放芯片,提供完整的I2C编程接口。针对TAS5805M的I2C编程接口程序,主要包括以下几点: 首先,需要通过I2C接口进行器件初始化,包括时钟控制、音频参数设置、保护机制等。使用I2C编程时需要注意时序和协议,以确保数据传输正确。 其次,TAS5805M支持多种音频输入格式,包括I2S、PCM、TDM等,需要根据具体应用进行音频输入格式的设置,同时设置音量、增益、等化器等参数。 此外,TAS5805M具备多通道并行桥接功放特性,支持2x20W、3x13W、4x10W的输出功率,需要根据实际需求设置输出通道。 最后,对于保护机制的设置,TAS5805M提供了过压、过温、短路等多种保护功能,需要根据具体应用进行设置。 总之,TAS5805M的I2C编程接口程序需要根据具体应用实现相关的程序设计和调试工作,以达到最佳的音频输出效果和保护机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值