android2.3/4.0(M4000E)声音驱动调试

常用工具:QPST, QACT, QDV

步骤:

0,手机拨打电话*cctpad#,调试模式,打开调试口;另外在设置中确认usb debug打开(默认是打开的)。

1,打开QPST configuration,连接service;

2,打开QDV,setup->hardware, map rptfile, 选择当前项目的vajra.rpt;

       菜单,new text window,右键,edit subscription,选择name,选择一个需要监视的属性(电话说话的音量、录音机录入的音量是TX,电话听筒音量、录音机播放的音量是RX——这里的R和T均是从使用者的角度出发,而非机器)

3,使机器 【通过你想调试的方式】 播放/录入 声音。观察监视值的变化。

4,到voccal_M4000E.c中搜索该值,定位到某(几)个值。

重复上述步骤,在第4部中逐渐锁定某个值,然后可以对其修改了。

 

使用工具QACT2.0(qualcomm audio calibration tool), 打开multimedia M4000\audio\audiocal\data\audio_cal.xml进行调试,音量大小在选项Gains中。

注意,数据修改之后立刻被写入手机(左下角出现data set to target successfully),但此时声音并不会立刻改变,需要在手机上切换一下发声模式,再换回来,才能看到效果,比如:手机正在外放音乐,此时修改了SND_DEVICE_HFK,这时声音不会立刻变化;此时可以先切换到电话,使用听筒,然后再外放音乐,这时就可以听到变化。

 

再例如,

1、使用3502WG样机进行耳机通话时听到背景音,修改:AGC FILTER -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET -> rx_agc_exp_thres(对应voccal_M3502WGICS.c中的3512行,voc_pcm_on_chip_1_cal_umts下的【#nodefined TFFA】编译开关下的agc_param数组第三项),从0x780增加为0x1100

注意第二级第一项应选择VOC_SERVICE_UMTS,若选了VOC_SERVICE_CDMA则修改后无反应。

2、使用3502WG样机进行耳机通话,听对方的声音太大声,修改:Gains -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET  ->  codec_rx_gain(对应voccal_M3502WGICS.c中的3417行,voc_pcm_on_chip_1_cal_umts下的【#nodefined TFFA】编译开关下的codec_rx_gain) 从0x7f62 减为0x3000.

3、使用3502WG样机进行耳机通话,对方能听到他自己的回音,修改Enhanced Echo Canceller -> VOC_SERVICE_UMTS & SND_DEVICE_HEADSET & SND_METHOD_VOICE & VOC_EC_HEADSET -> ec_params[1] -> instance1 -> DENS_NL_atten(对应.C中的367行,voc_cal_adv_ec_params_headset数组下的DENS_NL_atten), 200增加为600。

4、使用3502WG样机进行免提通话,听对方声音,断断续续。修改AGC_FILTER -> VOC_SERVICE_UMTS & SND_DEVICE_SPEAKER_PHONE & SND_METHOD_VOICE -> agc_param -> rx_agc_compr_thres(对应.C中第5254行,voc_pcm_on_chip_speaker_cal_umts数组下的【#nodefined T_FFA】编译开关下的agc_param,数组第五项)。0x1b0c 改为 0x0780.这个改动是不对的,因为rx_agc_compr_thres的减小会大大减小免提时听到对方的声音。应该将rx_agc_exp_thres降低。

5、分别使用3502WG样机进行免提和听筒通话,对方听到己方的声音较小声。

  听筒:修改Gains -> VOC_SERVICE_UMTS & SND_DEVICE_HANDSET & SND_METHOD_VOICE -> codec_tx_gain(对应代码在1363行,数组voc_pcm_on_chip_0_cal_umts_qrd下的codec_tx_gain)。0x4000  改为 0x5000。

  免提:修改Gains -> VOC_SERVICE_UMTS & SND_DEVICE_SPEAKER_PHONE & SND_METHOD_VOICE -> codec_tx_gain(对应代码在5158行,voc_pcm_on_chip_speaker_cal_umts下,编译开关no T_FFA下的codec_tx_gain) 。0x3ff0改为0x5000。

 -------------------------------------------------------------

5月14日,针对上述修改后出现的问题再次修改

1、耳机仍有背景音,且己方和对方都听得到,3511行3512行,rx 1100 -> 1500, tx 780 -> 1500

2、免提通话听对方声音断断续续,上次改错了地方,导致免提听对方声音变小,5252行,compr_thres 0x780 改回 0x1b0c ,exp_thres 4000 -> 1500

3、免提,对方和己方听到的声音仍稍小声,5158行,dtmf_tx_gain 1000 ->4000; rx 3000 -> 4000

4、听筒通话,明显回音,326行,(EC type:ESEC) NL 200 -> 600

5、免提回音,449行,NL 200 -> 600

6、after all,三种模式的:

  底噪音消除:(3511行-headset,5253行-speaker,1459行-handset)除了hand rx 1600,其它都是1500;注意第一行第三项才是rx,第二行第三项是tx的,即消除对方听到的底噪音

  回音消除:(speaker 449行, handset 326行, headset 367行)DENS_NL_atten:600.

  音量:handset-1363行:  

  0x4000,       /* tx_gain */
    0x1000,       /* dtmf_tx_gain */
    0x5000,       /* codec_tx_gain */
    0x4000,       /* codec_rx_gain */
    0x0515,       /* codec_st_gain */

       headset-3417行:

(voc_pcm_on_chip_1_cal_umts)

  0x8f47,       /* tx_gain */
    0x1000,       /* dtmf_tx_gain */
    0x656e,       /* codec_tx_gain */
    0x3000,       /* codec_rx_gain */
    0x0,       /* codec_st_gain */

      speaker-5158行:

  0xbc51,       /* tx_gain */
    0x4000,       /* dtmf_tx_gain */
    0x5000,       /* codec_tx_gain */
    0x4000,       /* codec_rx_gain */
    0x0000,       /* codec_st_gain */

即 voc_pcm_on_chip_speaker_cal_umts{  ...   else ...

 

 

 

    蓝牙耳机-7215行:

    VOC_EC_VER_ECNS,      /* ec_version */
    VOC_EC_BT,            /* ec_mode */
    VOC_NS_ON,            /* ns_enable */
    0x4000,       /* tx_gain */
    0x1000,       /* dtmf_tx_gain */
    0x4000,       /* codec_tx_gain */
    0x4000,       /* codec_rx_gain */
    0x0000,       /* codec_st_gain */

修改之后保存,这将修改被打开的.XML文件,比较前后的文件,发现voc_pcm_on_chip_0_cal_cdma标签下的几个子标签被修改,于是定位到voccal_M4000E.c中的voc_pcm_on_chip_0_cal_cdma标签,在该源文件用全字搜索即可。然后修改该标签下的配置值。

 

 

 --------------------------------------------------------

 

 

android2.3升级为android4.0,音频参数调试(以M3502WG为例)

参考代码:android2.3(chocolate)上的multimedia/audio/audiocal/sku3/voccal_sku3_H3501.c

目标代码:android4.0(milk)上的multimedia/audio/vocoder/src/voccal_M3502WGICS.c

下面是需要修改的结构:

voc_cal_adv_ec_params_handset

voc_cal_adv_ec_params_headset

voc_cal_adv_ec_params_speaker

voc_pcm_on_chip_0_cal_umts_qrd

voc_pcm_on_chip_1_cal_umts_qrd

voc_pcm_on_chip_speaker_cal_umts_qrd

另外,移植的时候注意/* agc_param */在2.3版本中有17个数组元素,在4.0中只有14个,省略掉了前三个,所以拷贝过来的时候要删掉前三个。

 

-------------------------------------------------

有时,在步骤4中,搜索到的值多达上百个,这样很难定位。我的解决办法是写一个perl脚本,用1~n个自然数逐个替换这些数值相等的变量,然后烧进手机,再查看我需要调试的那个值变为多少,现在这个值在代码中是唯一的,于是可以准确定位到代码中的某个变量。用这种方法,1次烧写就可以准确定位在代码中有无数相同值的变量。

使用递增正整数逐个替换某关键字的perl脚本如下:

#!/usr/bin/env perl
# program: find specific text in a file, and replace the key number with incremental number from 1.
#            Specially, if one line contains more than one key number, they will be replaced with a same number.
# Made by:  Daiyyr
# date:  2013/05/13
use 5.10.1;
use strict;
use warnings;
use POSIX qw(strftime);


my $key;
my $fname;

sub replace{
    my $count = 1;
    my $changed = 0;
    open(FILE, "+<$fname") || die("open file failed: $fname\n");
    while(my $line=<FILE>){
        while($line =~ s/$key/$count/ && $key != $count){    #这里不能用if,因为一行中若存在多个key,语句s//只会替换第一个key
            $changed = 1;
        }
        if($key == $count){
            $changed = 1;
        }
        if($changed){
            print DEST $line;
            $count++;
        }
        else{
            print DEST $line;
        }
        $changed = 0;
    }
    close(FILE) || die("close file failed: $fname\n");
}

print "input your file name:\n";
$fname = <STDIN>;
chomp($fname);
print "input your key word number:\n";
$key = <STDIN>;
chomp($key);
open(DEST, ">${fname}_changed") || die("open file failed: ${fname}_changed\n");
&replace();
close(DEST) || die("close file failed: ${fname}_changed\n");

你可能感兴趣的:(android)