zoukankan      html  css  js  c++  java
  • 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");

  • 相关阅读:
    安卓基础值之Intent
    输入值/表单提交参数过滤有效防止sql注入的方法
    一致性hash
    linux授权某个用户对某个目录有读写的权限
    mysql分区功能详细介绍,以及实例
    SVN分支与主干
    solr查询
    mysql-proxy做客户端连接转发【外网访问内网mysql】
    liunx 下安装 php_screw 扩展 以及报错处理
    邮件发送
  • 原文地址:https://www.cnblogs.com/yiru/p/3021448.html
Copyright © 2011-2022 走看看