L版本accdet驱动已经不再检测耳机按键是短按还是长按,是由上层来做的。
L版本accdet驱动不管耳机按键长按或短按,上报的key都是统一的。
alps\kernel-3.10\drivers\misc\mediatek\accdet\mt6580\accdet.c
static void multi_key_detection(int current_status)
{
int m_key = 0;
int cali_voltage=0;
if(0 == current_status){
cali_voltage = PMIC_IMM_GetOneChannelValue(MULTIKEY_ADC_CHANNEL,1,1);
ACCDET_DEBUG("[Accdet]adc cali_voltage1 = %d mv\n", cali_voltage);
m_key = cur_key = key_check(cali_voltage);
}
mdelay(30);
#ifdef ACCDET_EINT_IRQ
if((pmic_pwrap_read(ACCDET_IRQ_STS) & EINT_IRQ_STATUS_BIT)!=EINT_IRQ_STATUS_BIT){
#else ifdef ACCDET_EINT
if((pmic_pwrap_read(ACCDET_IRQ_STS) & IRQ_STATUS_BIT)!=IRQ_STATUS_BIT){
#endif
send_key_event(cur_key, !current_status);
}else{
send_key_event(cur_key, !current_status);
ACCDET_DEBUG("[Accdet]plug out side effect key press, do not report key = %d\n", cur_key);
cur_key = NO_KEY;
}
if(current_status){
cur_key = NO_KEY;
}
}
static void send_key_event(int keycode,int flag)
{
switch (keycode)
{
case DW_KEY:
input_report_key(kpd_accdet_dev, KEY_VOLUMEDOWN, flag);
input_sync(kpd_accdet_dev);
ACCDET_DEBUG("[accdet]KEY_NEXTSONG/KEY_VOLUMEDOWN %d\n",flag);
break;
case UP_KEY:
input_report_key(kpd_accdet_dev, KEY_VOLUMEUP, flag);
input_sync(kpd_accdet_dev);
ACCDET_DEBUG("[accdet]KEY_PREVIOUSSONG/KEY_VOLUMEUP %d\n",flag);
break;
case MD_KEY:
input_report_key(kpd_accdet_dev, KEY_PLAYPAUSE, flag);
input_sync(kpd_accdet_dev);
ACCDET_DEBUG("[accdet]KEY_PLAYPAUSE %d\n",flag);
break;
#ifdef FOUR_KEY_HEADSET
case AS_KEY:
input_report_key(kpd_accdet_dev, KEY_VOICECOMMAND, flag);
input_sync(kpd_accdet_dev);
ACCDET_DEBUG("[accdet]KEY_VOICECOMMAND %d\n",flag);
break;
#endif
}
}
在L版本accdet驱动里面,不管耳机按键长按or短按
down key上报 KEY_VOLUMEDOWN
up key上报 KEY_VOLUMEUP
MD key上报 KEY_PLAYPAUSE
至于切换歌曲、调大调小声音等操作,上层APK都可以根据这些固定的sanCode来做调整。
上层耳机按键长按or短按检测方法:
底层会报keycode down和keycode up,上层会计算up和down之间的时间,
如果大于500ms(此事件客户可以指定)就是长按,小于就是短按。上层有个onLongClick函数。
Demo code随便在andorid 的source code中搜onLongClick就可以搜到。