微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MT6582耳机检测有问题

MT6582耳机检测有问题

时间:10-02 整理:3721RD 点击:
现在我们这MT6582的项目,插入耳机,PMIC的中断会执行好几次。
不知道是什么原因 。
这下面是插入的LOG。拔出时无LOG
[   71.317791] (0)[25:PMIC_thread_kth][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101
[   71.318821] (0)[25:pmic_thread_kth]accdet_workqueue_func
[   71.319525] (0)[43:kworker/u:1][Accdet]accdet interrupt happen:[Plug_out]current AB = 1
[   71.320533] (0)[43:kworker/u:1][Accdet]check_cable_type: ACCDET_IRQ_STS = 0x100
[   71.321466] (0)[43:kworker/u:1][Accdet]check_cable_type:Clear interrupt:Done[0x0]!
[   71.322414] (0)[43:kworker/u:1][Accdet]cable type:[HeADSet_mic], status switch:[Plug_out]->[Headset_plug_in]
[   71.327254] (0)[43:kworker/u:1] [accdet] set state in cable_type  status:1

[   71.467768] (0)[25:pmic_thread_kth][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101
[   71.468788] (0)[25:pmic_thread_kth]ACCDET enable switch in 1.9v mode
[   71.469591] (0)[25:pmic_thread_kth]accdet_workqueue_func
[   71.470277] (0)[43:kworker/u:1][Accdet]accdet interrupt happen:[Headset_plug_in]current AB = 3
[   71.471348] (0)[43:kworker/u:1][Accdet]check_cable_type: ACCDET_IRQ_STS = 0x100
[   71.472257] (0)[43:kworker/u:1][Accdet]do not send plug ou in micbiast
[   71.473083] (0)[43:kworker/u:1][Accdet]check_cable_type:Clear interrupt:Done[0x0]!
[   71.475200] (0)[1340:kworker/0:3][Gsensor] jhy::[FFFFFFA8 0000004D FFFFFF18] => [  -88    77  -232] after
[   71.477088] (0)[43:kworker/u:1][Accdet]cable type:[Headset_mic], status switch:[Headset_plug_in]->[Plug_out]
[   71.478378] (0)[43:kworker/u:1] [accdet] set state in cable_type  status:1

[   71.917865] (0)[25:pmic_thread_kth][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101
[   71.918895] (0)[25:pmic_thread_kth]accdet_workqueue_func
[   71.919597] (0)[43:kworker/u:1][Accdet]accdet interrupt happen:[Plug_out]current AB = 1
[   71.920604] (0)[43:kworker/u:1][Accdet]check_cable_type: ACCDET_IRQ_STS = 0x100
[   71.921537] (0)[43:kworker/u:1][Accdet]check_cable_type:Clear interrupt:Done[0x0]!
[   71.922486] (0)[43:kworker/u:1][Accdet]cable type:[Headset_mic], status switch:[Plug_out]->[Headset_plug_in]
[   71.924921] (0)[43:kworker/u:1] [accdet] set state in cable_type  status:1
[   72.597794] (0)[25:pmic_thread_kth][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101
[   72.598826] (0)[25:pmic_thread_kth]ACCDET enable switch in 1.9v mode
[   72.599635] (0)[25:pmic_thread_kth]accdet_workqueue_func
[   72.600338] (0)[43:kworker/u:1][Accdet]accdet interrupt happen:[Headset_plug_in]current AB = 0
[   72.601422] (0)[43:kworker/u:1][Accdet]check_cable_type: ACCDET_IRQ_STS = 0x100
[   72.608723] (0)[1340:kworker/0:3][Gsensor] jhy::[FFFFFFC9 00000054 FFFFFF08] => [  -55    84  -248] after
[   72.615289] (0)[43:kworker/u:1][Accdet]ADC before cali_voltage1
[   72.616343] (0)[43:kworker/u:1][Accdet]adc cali_voltage1 = 21 mv
[   72.617093] (0)[43:kworker/u:1]accdet: come in key_check!
[   72.617804] (0)[43:kworker/u:1]adc_data: 21 mv
[   72.618362] (0)[43:kworker/u:1][Accdet]accdet current_status = 0
[   72.619404] (0)[43:kworker/u:1][Accdet]adc in while loop [1]= 21 mv
[   72.620226] (0)[43:kworker/u:1]accdet: come in key_check!
[   72.620912] (0)[43:kworker/u:1]adc_data: 21 mv
[   72.657818] (0)[25:pmic_thread_kth][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101
[   72.658845] (0)[25:pmic_thread_kth]accdet_workqueue_func
[   72.668744] (0)[1340:kworker/0:3][Gsensor] jhy::[FFFFFFCE 00000050 FFFFFF10] => [  -50    80  -240] after
[   72.687780] (0)[43:kworker/u:1][Accdet]accdet current_status = 3
[   72.688537] (0)[43:kworker/u:1]ACCDET diable switch in 1.9v mode
[   72.689304] (0)[43:kworker/u:1][Accdet] Short press middle (0x2)
[   72.690093] (0)[64:keyEvent_send] accdet:going to send event 3
[   72.690823] (0)[64:keyEvent_send][Accdet] PLAY_PAUSE !
[   72.691497] (0)[64:keyEvent_send] accdet:sendKeyEvent wait
[   72.695998] (0)[43:kworker/u:1] accdet:notify_sendKeyEvent !
[   72.696725] (0)[43:kworker/u:1][Accdet]cable type:[Headset_mic], status switch:[Headset_plug_in]->[Hook_switch]
[   72.699285] (0)[43:kworker/u:1] [accdet] set state in cable_type  status:1
[   72.700182] (0)[43:kworker/u:1][Accdet]accdet interrupt happen:[Hook_switch]current AB = 3
[   72.701222] (0)[43:kworker/u:1][Accdet]check_cable_type: ACCDET_IRQ_STS = 0x100
[   72.702135] (0)[43:kworker/u:1][Accdet] do not send plug out event in hook switch
[   72.705178] (0)[43:kworker/u:1][Accdet]check_cable_type:Clear interrupt:Done[0x0]!
[   72.706160] (0)[43:kworker/u:1][Accdet]cable type:[Headset_mic], status switch:[Hook_switch]->[Plug_out]
[   72.707358] (0)[43:kworker/u:1] [accdet] set state in cable_type  status:1

中断怎么配的?消抖、电平触发、中断后电平反转。

中断配得没有问题
我在中断服务函数中添加了一些代码,现在可以识别到耳机了。

光辉,这个问题是在呢么修改的?我这边正好遇到同样的问题。谢谢

void inline headset_plug_in(void)
{
        accdet_status = MIC_BIAS;
        cable_type = HEADSET_MIC;
        //update the cable_type
        switch_set_state((struct switch_dev *)&accdet_data, cable_type);
        ACCDET_DEBUG( " [accdet] set state in cable_type = NO_DEVICE\n");
}

void accdet_eint_work_callback(struct work_struct *work)
{
   //KE under fastly plug in and plug out
    accdet_eint_mask();
    if (cur_eint_state == EINT_PIN_PLUG_IN) {
                ACCDET_DEBUG("[Accdet]EINT func :plug-in\n");
                mutex_lock(&accdet_eint_irq_sync_mutex);
                eint_accdet_sync_flag = 1;
                mutex_unlock(&accdet_eint_irq_sync_mutex);
                #ifdef ACCDET_LOW_POWER
                wake_lock_timeout(&accdet_timer_lock, 7*HZ);
                #endif
                #ifdef ACCDET_28V_MODE
                accdet_set_28_mode();
                ACCDET_DEBUG("ACCDET use in 2.8V mode! \n");
                  #endif
                #ifdef ACCDET_PIN_SWAP
                        accdet_enable_vrf28_power_on();
                        msleep(800);
                    accdet_FSA8049_enable();  //enable GPIO209 for PIN swap
                    ACCDET_DEBUG("[Accdet] FSA8049 enable!\n");
                        msleep(250); //PIN swap need ms
                #endif
               
                        accdet_init();// do set pwm_idle on in accdet_init
               
                #ifdef ACCDET_PIN_RECOGNIZATION
                  show_icon_delay = 1;
                  //micbias always on during detected PIN recognition
                  accdet_set_pwm_always_on();
                  //ACCDET_DEBUG("[Accdet]Pin recog ACCDET_PWM_WIDTH=0x%x!\n", pmic_pwrap_read(ACCDET_PWM_WIDTH));       
                  //ACCDET_DEBUG("[Accdet]Pin recog ACCDET_PWM_THRESH=0x%x!\n", pmic_pwrap_read(ACCDET_PWM_THRESH));
                  ACCDET_DEBUG("[Accdet]pin recog start!  micbias always on!\n");
                #endif
                //set PWM IDLE  on
                #ifdef ACCDET_MULTI_KEY_FEATURE
                        accdet_set_pwm_idle_on();
                        ACCDET_DEBUG("[Accdet]accdet_eint_work_callback plug in ACCDET PWM IDLE on ACCDET_STATE_SWCTRL = 0x%x!\n", accdet_get_swctrl());
                #endif  
                //enable ACCDET unit
                        enable_accdet(ACCDET_SWCTRL_EN);
                headset_plug_in(); //jianghuiyan
    } else {
//EINT_PIN_PLUG_OUT
                        //Disable ACCDET
                ACCDET_DEBUG("[Accdet]EINT func :plug-out\n");
                mutex_lock(&accdet_eint_irq_sync_mutex);
                eint_accdet_sync_flag = 0;
                mutex_unlock(&accdet_eint_irq_sync_mutex);
                #ifdef ACCDET_LOW_POWER
                        del_timer_sync(&micbias_timer);
                #endif
                #ifdef ACCDET_PIN_RECOGNIZATION
                  show_icon_delay = 0;
                  cable_pin_recognition = 0;
                #endif
                #ifdef ACCDET_PIN_SWAP
                        accdet_enable_vrf28_power_off();
                    accdet_FSA8049_disable();  //disable GPIO209 for PIN swap
                    ACCDET_DEBUG("[Accdet] FSA8049 disable!\n");
                #endif
                        accdet_auxadc_switch(0);
                        disable_accdet();                          
                        headset_plug_out();
                        #ifdef ACCDET_28V_MODE
                        accdet_set_19_mode();
                        ACCDET_DEBUG("ACCDET use in 1.9V mode! \n");
                          #endif
                  
    }
    //unmask EINT
    //msleep(500);
    accdet_eint_unmask();
    ACCDET_DEBUG("[Accdet]eint unmask  !\n");
}
我就是这样改了一下,就OK了。

谢谢!我试试

可以了,非常感谢光辉!

其实我现在都没有搞明白,为什么要这样才可以。
我上次也是没有办法试一下,就好了。
现在还有点奇怪。

我这边是刚装的机器有这个现象,耳机插拔次数多了,这个现象就逐渐消失了,可能是耳机座开始很紧,导致这个问题。

一般情况下不要改MTK的代码哦。
插入的时候出现的中断是ACCDET模块的中断,如果你使用4段式的耳机,MICBIAS的状态是会3种状态间切换的,最后稳定后就是带麦耳机插入的状态。
另外,你说的不识别耳机是不是从图标上看出来的?就是你插入耳机了,但是没有显示图标。
如果是这样的话,就是MTK 3,4段耳机显示的问题。驱动一般都是OK的。


我的耳机是带MIC的,
情况是插入时能显示,在拔出时,我看他的LOG根本就没有检测的动作了。

我认为应该是这样的。
完全插入后已经把ACCDET模块关了,因为已经不需要检测耳机的状态了。
对于拔出的事件,只需要检测耳机的外部中断就行了。  

应当不会将ACCDET关掉的。
因为他还要检测耳机上的按键的。
我上次如果将耳机中断配对,实际上耳机插入都无图标显示了。
但是EINT实际上产生中断的。

哦,确实诶,忘了还要检测按键了。
不过,怎么会拔出耳机的时候ACCDET没有中断呢?就相当于你插入耳机后,ACCDET不工作了。
另外,MTK 3,4段图标显示有bug,不能单纯的从耳机图标来看驱动的状态。
我之前改过一个4段耳机缓慢插入后没有显示图标,但是驱动的状态确实是对的。

我这个是MT6582的平台,我觉得MTK的这一块应当也没有问题,但是我搞了很久,也没有找到原因,因为他在拔出时都没有任何相关的LOG了。根本就没有执行了。

不过你修改的地方的代码能否贴出来,让大家也看看。
谢谢!

代码就不贴了。我们这公司很变态的,被抓住把柄了要打人的。
如果有网友碰到这样的问题了,我会告诉他改的。
话说我刚调完82,为什么没碰到你这个问题。

可能版本不同吧。
我看了你的信息,,不免强你了。
好好保护自己。

看来是懂行的人啊。

名气在外。
请有时间多支持本网站。
谢谢!

哈,是个需要心理很强大的人才能待的地方。

好嘞!

我的发现耳机是检测到了 但状态栏没有图标 其实上层也改了
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBarPolicy.java
//                updateHeadSet(intent);
就是不显示图标

不要去掉这个吧。

我也不知道

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top