MT6582耳机检测有问题
不知道是什么原因 。
这下面是插入的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);
就是不显示图标
不要去掉这个吧。
我也不知道