![](https://csdnimg.cn/release/download_crawler_static/4082621/bg5.jpg)
"SWITCH_NAME=%s", prop_buf);
envp[env_offset++] = name_buf;
}
length = state_show(sdev->dev, NULL, prop_buf); //给 HeadsetObserver.java 读取
读取状态,这个函数我们在前面分析过了,这个函数比较重要,关系到区分有无 mic。
if (length > 0) {
if (prop_buf[length - 1] == '\n')
prop_buf[length - 1] = 0;
snprintf(state_buf, sizeof(state_buf),
"SWITCH_STATE=%s", prop_buf);
envp[env_offset++] = state_buf;
}
envp[env_offset] = NULL;
kobject_uevent_env(&sdev->dev->kobj, KOBJ_CHANGE, envp);
free_page((unsigned long)prop_buf);
} else {
printk(KERN_ERR "out of memory in switch_set_state\n");
kobject_uevent(&sdev->dev->kobj, KOBJ_CHANGE);
}
}
}
EXPORT_SYMBOL_GPL(switch_set_state); //供外部所使用。
由于 hook 键和检测 mic 的有关联,故如果有 mic 则要申请 hook 的中断。
具体 mic 的检测可以参考我的 blog 中转载别人的的一篇文章,链接地址如下
http://blog.chinaunix.net/u3/106866/showart_2273977.html
接下来是 HOOK 键功能的处理了,在 google 论坛里有些说实现 hook 键接听和挂断电
话的问题。Hook 键只有一个,要实现两个功能就得要用时间来区分了,
短按:代表接听。
长按:代表拒接。
这样两种功能就实现了,呵呵。对于长短的检测最好用纳秒,用秒的准确性比较低。存在误
判性比较高,可以利用把时间转换成纳秒来计算,我用如下实现检测时间的长短:
do_gettimeofday(&time);
timens=timeval_to_ns(&time);
while(gpio_get_value(123)==0){};
do_gettimeofday(&time);
(timeval_to_ns(&time)-timens)由这个式子可以得到比较准确的时间。
在利用这个时间,你确定一个判断长短的依据,就可以了如:
if( (timeval_to_ns(&time)-timens)<1000000000l)
{//短按
if( (timeval_to_ns(&time)-timens) > 50000000)//为了取出噪音,而设置一定的最低值
{