一、常用调试方法:
1. adb
DCC模式:查看中断计数
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 6 mt-eint 206 pmic-eint
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 7 mt-eint 206 pmic-eint // 耳机拔出触发1次pmic中断
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 9 mt-eint 206 pmic-eint // 耳机插入触发2次pmic中断
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 10 mt-eint 206 pmic-eint
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 12 mt-eint 206 pmic-eint // 耳机按下音量+触发2次pmic中断
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 14 mt-eint 206 pmic-eint // 耳机按下音量-触发2次pmic中断
magc6737t_65_n:/ $ cat /proc/interrupts | grep "pmic"
494: 16 mt-eint 206 pmic-eint // 耳机按下暂停键触发2次pmic中断
2. 查看log
3.
4.
二、根据mtk-online介绍,耳机检测有三种模式:
Feature Phone主要有三种耳机检测方式:
1. EINT+AuxADC
【检测原理】
(1)耳机检测方式为EINT+AuxADC。
(2)EINT HISR为AUX_EINT_HISR,在aux_task_main中注册中断。插入耳机,若是高电平触发中断,需要保证AUX_EINT_STATE为1,否则为0。
(3)hook key的检测采用ADC。当耳机plug in,trigger AUX_EINT_HISR,此时turn on micbias, double check plug in state后,再发送msg AUX_ID_EARPHONE给UEM。
然后turn off micbias。当aux收到来电消息,也会turn on micbias,检测SENDKEY ADC,直到挂断电话,才turn off micbias。
【软件配置】ACCDET_SUPPORT=FALSE
【典型平台】MT6236,MT6252
2. ACCDET【即DCC模式】
【检测原理】
(1)耳机检测方式为ACCDET only。
(2)HISR为ACCDET_HISR,在ACCDET_INIT注册。
(3)hook key的检测采用ACCDET。
(4)耳机状态与accdet处的电压对应关系如下表:
表(一)
Earphone state Accdet voltage Comparator AB state
Plug out 1.9V A=1,B=1
Plug in 0.4V~1.7V A=0,B=1
Hook key pressed 0V A=0,B=0 //【可用万用表量mic脚电压,按键按住不松开即可】
【软件配置】ACCDET_SUPPORT=TRUE
【典型平台】MT6276,MT6250D/MT6250
3. EINT_ACCDET【即ACC模式】
【检测原理】
(1)耳机检测方式为EINT+ACCDET。
(2)EINT HISR为AUX_EINT2_HISR,在ACCDET_INIT注册。插入耳机,若是高电平触发中断,需要将AUX_EINT_STATE置为1,否则置为0。
(3)hook key的检测采用accdet。
(4)耳机状态与accdet处的电压对应关系同表(一)。
(5)耳机插入,触发eint之后,enable ACCDET,耳机拔出之后会disable ACCDET。
【软件配置】ACCDET_SUPPORT=EINT_ACCDET
【典型平台】MT6255,MT6250/MT6250D
三、如何分辨是【ACC】还是【DCC】
根据查看硬件原理图,对照BOM
ACC: R11+R12
DCC: R13
VIO18_PMU
|
ACCDET -------R13(47K)---| R11(470K)
| |
EINT_EAR -----R12(47K)-----------------HP_EINT
四、
ACC : 还需要而配置dws,dts中断脚accdet
magc6737m_65_n_debug_defconfig:
CONFIG_ACCDET_EINT=y
# CONFIG_ACCDET_EINT_IRQ is not set
DCC : 无需而配置中断脚
magc6737m_65_n_debug_defconfig:
# CONFIG_ACCDET_EINT is not set
CONFIG_ACCDET_EINT_IRQ=y
二、全插入: 耳机+mic
插入log:
// 第一次中断
[ 1294.690140] -(2)[0:swapper/2][name:irq_mt_eic&]EINT Module - expires:4295066764, jiffies:4295066763, deb_in_jiffies:1,
[ 1294.690180] -(2)[0:swapper/2][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1294.697499] (1)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x2000
[ 1294.697542] (1)[54:pmic_thread][name:accdet&][accdet_eint_int_handler]....
[ 1294.697581] (1)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x4
[ 1294.697663] (1)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8404
[ 1294.697726] (1)[54:pmic_thread][name:accdet&][Accdet]Enter accdet_eint_func !!!!!!
[ 1294.697875] (1)[54:pmic_thread][name:accdet&][Accdet]accdet_eint_func after cur_eint_state=1
[ 1294.698038] (1)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1294.699397] (2)[113:kworker/u8:2][name:accdet&][Accdet]DCC EINT func :plug-in, cur_eint_state = 1
[ 1294.699453] (2)[113:kworker/u8:2][name:accdet&][Accdet]accdet hardware init
[ 1294.699738] (2)[113:kworker/u8:2][name:accdet&][Accdet]pin recog start! micbias always on!
[ 1294.699778] (2)[113:kworker/u8:2][name:accdet&]accdet: enable_accdet
// ???
[ 1294.727521] (1)[6:kworker/u8:0][name:accdet&][Accdet]check_cable_type:Clear interrupt:Done[0x8000]! // 奇怪
[ 1294.727566] (1)[6:kworker/u8:0][name:accdet&][Accdet]cable type:[No_device], status switch:[Plug_out]->[Plug_out]
[ 1294.727597] (1)[6:kworker/u8:0][name:accdet&] [accdet] set state in cable_type status
[ 1294.727972] (0)[57:cfinteractive][name:mt_cpufreq&][Power/cpufreq] @_mt_cpufreq_set_locked(): Vproc = 1025mv, freq = 793000 KHz
// 第二次中断
[ 1294.798382] -(2)[1200:system_server][name:irq_mt_eic&]EINT Module - expires:4295066775, jiffies:4295066774, deb_in_jiffies:1,
[ 1294.798415] -(2)[1200:system_server][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1294.807368] (1)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x2000
[ 1294.807407] (1)[54:pmic_thread][name:accdet&][accdet_eint_int_handler]....
[ 1294.807441] (1)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8004
[ 1294.807510] (1)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x404
[ 1294.807586] (1)[54:pmic_thread][name:accdet&][Accdet]Enter accdet_eint_func !!!!!!
[ 1294.807637] (1)[54:pmic_thread][name:accdet&][Accdet]accdet_eint_func after cur_eint_state=0
[ 1294.807757] (1)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1294.807794] (0)[6:kworker/u8:0][name:accdet&][Accdet]DCC EINT func :plug-out, cur_eint_state = 0
[ 1294.807881] (0)[6:kworker/u8:0][name:accdet&][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x100
[ 1294.808125] (0)[6:kworker/u8:0][name:accdet&]accdet: disable_accdet
[ 1294.808171] (0)[6:kworker/u8:0][name:accdet&] [accdet] set state in cable_type = NO_DEVICE
// 第三次中断
[ 1295.058332] -(1)[216:logd.writer][name:irq_mt_eic&]EINT Module - expires:4295066801, jiffies:4295066800, deb_in_jiffies:1,
[ 1295.058379] -(1)[216:logd.writer][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1295.067560] (1)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x2000
[ 1295.067609] (1)[54:pmic_thread][name:accdet&][accdet_eint_int_handler]....
[ 1295.067655] (1)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x4
[ 1295.067744] (1)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8404
[ 1295.067814] (1)[54:pmic_thread][name:accdet&][Accdet]Enter accdet_eint_func !!!!!!
[ 1295.067883] (1)[54:pmic_thread][name:accdet&][Accdet]accdet_eint_func after cur_eint_state=1
[ 1295.068084] (1)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1295.069433] (2)[6:kworker/u8:0][name:accdet&][Accdet]DCC EINT func :plug-in, cur_eint_state = 1
[ 1295.069495] (2)[6:kworker/u8:0][name:accdet&][Accdet]accdet hardware init
[ 1295.069771] (2)[6:kworker/u8:0][name:accdet&][Accdet]pin recog start! micbias always on!
[ 1295.069818] (2)[6:kworker/u8:0][name:accdet&]accdet: enable_accdet
// 第四次中断
[ 1297.077836] (0)[57:cfinteractive][name:mt_cpufreq&][Power/cpufreq] @_mt_cpufreq_set_locked(): Vproc = 1025mv, freq = 793000 KHz
[ 1297.085367] -(1)[4960:mobile_log_d.rd][name:irq_mt_eic&]EINT Module - expires:4295067003, jiffies:4295067002, deb_in_jiffies:1,
[ 1297.085403] -(1)[4960:mobile_log_d.rd][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1297.085835] (0)[1774:PhotonicModulat][name:leds&][LED]Set Backlight directly 203 at time 4295067002, mapping level is 203
[ 1297.085871] (0)[1774:PhotonicModulat][name:ddp_aal&]disp_aal_notify_backlight_changed 810/1023 096.098, 818/1023 096.114, 814/1023 003.109
[ 1297.085898] (0)[1774:PhotonicModulat][name:ddp_aal&][AAL] led_mode=5 , aal_need_lock=0
[ 1297.087737] (0)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x1000
[ 1297.087776] (0)[54:pmic_thread][name:accdet&][accdet_int_handler]....
[ 1297.087809] (0)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8001
[ 1297.087864] (0)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x8101
[ 1297.087965] (0)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1297.089208] (0)[6:kworker/u8:0][name:accdet&][Accdet]accdet interrupt happen:[Plug_out]current AB = 1
[ 1297.089291] (0)[6:kworker/u8:0][name:accdet&][Accdet]check_cable_type:Clear interrupt:Done[0x8000]!
[ 1297.089317] (0)[6:kworker/u8:0][name:accdet&][Accdet]cable type:[Headset_mic], status switch:[Plug_out]->[Headset_plug_in]
[ 1297.089802] (0)[6:kworker/u8:0][name:accdet&] [accdet] set state in cable_type status
[ 1297.097813] (1)[57:cfinteractive][name:mt_cpufreq&][Power/cpufreq] @_mt_cpufreq_set_locked(): Vproc = 1218mv, freq = 1248000 KHz
拔出log
[ 1086.569977] -(0)[4960:mobile_log_d.rd][name:irq_mt_eic&]EINT Module - expires:4295045952, jiffies:4295045951, deb_in_jiffies:1,
[ 1086.570017] -(0)[4960:mobile_log_d.rd][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1086.577606] (0)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x3000
[ 1086.577651] (0)[54:pmic_thread][name:accdet&][accdet_int_handler].... // 1
[ 1086.577689] (0)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8005 //1
[ 1086.577774] (0)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x405 //1
[ 1086.577833] (0)[54:pmic_thread][name:accdet&][Accdet]Enter accdet_eint_func !!!!!! // 1
[ 1086.577890] (0)[54:pmic_thread][name:accdet&][Accdet]accdet_eint_func after cur_eint_state=0 //1
[ 1086.578034] (0)[54:pmic_thread][name:accdet&][accdet_eint_int_handler].... // 2
[ 1086.578074] (0)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x401 // 2
[ 1086.578138] (0)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x101 //2
[ 1086.578249] (0)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1086.579448] (1)[143:kworker/u8:4][name:accdet&][Accdet]DCC EINT func :plug-out, cur_eint_state = 0 // 1
[ 1086.579515] (1)[143:kworker/u8:4][name:accdet&][Accdet]clear_accdet_interrupt: ACCDET_IRQ_STS = 0x100 // 2
[ 1086.579766] (1)[143:kworker/u8:4][name:accdet&]accdet: disable_accdet // 1
[ 1086.580369] (0)[113:kworker/u8:2][name:accdet&][Accdet]accdet interrupt happen:[Plug_out]current AB = 3 // 2
[ 1086.580406] (0)[113:kworker/u8:2][name:accdet&][Accdet]PLUG_OUT state not change! // 2
[ 1086.580436] (0)[113:kworker/u8:2][name:accdet&][Accdet] Headset has plugged out
[ 1086.580487] (0)[113:kworker/u8:2][name:accdet&][Accdet]check_cable_type:Clear interrupt:Done[0x0]! // 2
[ 1086.580516] (0)[113:kworker/u8:2][name:accdet&][Accdet]cable type:[No_device], status switch:[Plug_out]->[Plug_out] // 2
[ 1086.580545] (0)[113:kworker/u8:2][name:accdet&][Accdet] Headset has plugged out don't set accdet state // 2
[ 1086.580572] (0)[113:kworker/u8:2][name:accdet&] [accdet] set state in cable_type status // 2
[ 1086.582908] (1)[143:kworker/u8:4][name:accdet&] [accdet] set state in cable_type = NO_DEVICE //1
[ 1086.830118] -(1)[0:swapper/1][name:irq_mt_eic&]EINT Module - expires:4295045978, jiffies:4295045977, deb_in_jiffies:1,
[ 1086.830147] -(1)[0:swapper/1][name:irq_mt_eic&]deb:1000, in mt_eint_set_timer_event
[ 1086.837324] (1)[54:pmic_thread][name:pmic&][PMIC] [PMIC_INT] addr[0x2c4]=0x2000
[ 1086.837358] (1)[54:pmic_thread][name:accdet&][accdet_eint_int_handler]....
[ 1086.837385] (1)[54:pmic_thread][name:accdet&][Accdet accdet_irq_handler]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x4
[ 1086.837441] (1)[54:pmic_thread][name:accdet&][Accdet]clear_accdet_eint_interrupt: ACCDET_IRQ_STS = 0x8404
[ 1086.837508] (1)[54:pmic_thread][name:accdet&][Accdet]Enter accdet_eint_func !!!!!!
[ 1086.837554] (1)[54:pmic_thread][name:accdet&][Accdet]accdet_eint_func after cur_eint_state=1
[ 1086.837652] (1)[54:pmic_thread][PWRAP] clear EINT flag mt_pmic_wrap_eint_status=0x0
[ 1086.837709] (2)[143:kworker/u8:4][name:accdet&][Accdet]DCC EINT func :plug-in, cur_eint_state = 1
[ 1086.837742] (2)[143:kworker/u8:4][name:accdet&][Accdet]accdet hardware init
[ 1086.837928] (2)[143:kworker/u8:4][name:accdet&][Accdet]pin recog start! micbias always on!
[ 1086.837955] (2)[143:kworker/u8:4][name:accdet&]accdet: enable_accdet
三、半插入: 仅耳机
案例一 : 耳机按键误报 - 提交eService给mtk - 未回复
现象 : 快速按压耳机【播放暂停键】,小概率出现误报为volume up 或volume down的情况(约100次误报1次)
平台 : androidN,MTK6737
排查过程: 1. 打开驱动中的log:
alps\kernel-3.18\drivers\misc\mediatek\accdet\mt6735\accdet.c
static void multi_key_detection(int current_status)
if (0 == current_status) {
cali_voltage = Accdet_PMIC_IMM_GetOneChannelValue(1);
+ printk("[Accdet]adc cali_voltage1 = %d mv\n", cali_voltage);
m_key = cur_key = key_check(cali_voltage); // 根据电压判断 为3个按键中的哪个
}
send_key_event(cur_key, !current_status); // input 上报耳机按键
static void send_key_event(int keycode, int flag)
{
switch (keycode) {
case DW_KEY:
+ printk("[accdet]KEY_VOLUMEDOWN %d\n", flag);
case UP_KEY:
+ printk("[accdet]KEY_VOLUMEUP %d\n", flag);
case MD_KEY:
+ printk("[accdet]KEY_PLAYPAUSE %d\n", flag);
}
}
2. 快速按下耳机【播放暂停键】,约100次出现误报一次,导出log【adb shell dmesg > e:accdet.log】
Line 16911: [ 313.494871] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16912: [ 313.527480] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 16916: [ 313.605934] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 16926: [ 313.885214] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16931: [ 313.918753] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 16936: [ 314.068243] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 16947: [ 314.315231] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16949: [ 314.349070] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 16952: [ 314.455528] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 16958: [ 314.534878] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16959: [ 314.567700] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 16967: [ 314.718421] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 16970: [ 314.794847] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 857 mv // 通过pmic检测电压,错误值,由于在范围外被过滤
Line 16978: [ 314.984865] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16981: [ 315.018054] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 16987: [ 315.095550] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 16994: [ 315.174844] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 16995: [ 315.207510] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 17003: [ 315.358508] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 17010: [ 315.605387] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 17012: [ 315.639057] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 17020: [ 315.784780] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 17023: [ 315.864832] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 14 mv
Line 17027: [ 315.897459] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 1
Line 17032: [ 316.047719] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
Line 17039: [ 316.124811] (0)[143:kworker/u8:3][Accdet]adc cali_voltage1 = 335 mv // 通过pmic检测电压,错误值,可能为电压不稳定导致
Line 17040: [ 316.164035] (0)[143:kworker/u8:3][accdet]KEY_VOLUMEDOWN 1 // 误报为volume down
Line 17043: [ 316.235133] (0)[143:kworker/u8:3][accdet]KEY_VOLUMEDOWN 0
Line 17062: [ 316.514019] (1)[114:kworker/u8:2][Accdet]adc cali_voltage1 = 14 mv
Line 17063: [ 316.550660] (1)[114:kworker/u8:2][accdet]KEY_PLAYPAUSE 1
Line 17070: [ 316.691048] (0)[143:kworker/u8:3][accdet]KEY_PLAYPAUSE 0
注: dts中写有耳机按键的电压区间
&accdet {
headset-three-key-threshold = <0 80 220 500>; // 不在此范围内将会被过滤掉
0~80mV为暂停播放键
80~220 mV为音量加
220~500 mV为音量减
3. 更换品牌耳机(华为荣耀) - 一样会有小概率误报
4. 减慢按压频率至约1秒按2次(之前约1秒按5次),按压数百次未出现误报现象,怀疑是pmic 电压采用反应时间没那么快
注: 减慢之后pmic 测量出来的电压较稳定,较少出现800多、900多的错误值
5. 提交eService给mtk
? Issue ID: ALPS03841867
? Project: MAGC6737T_65_N
? HW Project: V615
? Title: 快速按压耳机播放暂停键 小概率误报为音量加或音量减
? Description:
Dear MTK,
MT6737 Android7.0快速(约1秒按5次)按压耳机播放暂停键,会有小概率(约100次出现一次)误报为音量加或音量减,
更换华为荣耀耳机,也有此现象。放慢按下频率至约1秒按2次则无此现象。这边快慢分别抓了一份mtklog,请帮忙分析,
看能否改善快速按压出现误报的情况
处理方案: mtk还未有回复
总结 :
案例二 :
现象 :
平台 : androidM,MTK6580
排查过程: 1.
2.
3.
处理方案:
总结 :
案例三 :
现象 :
平台 : androidM,MTK6580
排查过程: 1.
2.
3.
处理方案:
总结 :