1、键盘要注意防抖动
2、如果确认有键盘就input_report_key(&va->kb_dev,key_got,1);然后重复扫描,这一步很重要,重复扫描的时间要小于33ms。
为什么?看下input.c就知道了,input.c的input_repeat_key会隔rep[REP_PERIOD]调用一次,但是如果我们在驱动里释放了按键,则input_repeat_key不会再调用(此函数前面有判断)。
因此扫描的时间一定要少于rep[REP_PERIOD],不这样做的话,就会出现你本来想按一次按键,结果多了几个尾巴。
例如,你确认按键后200ms再开始扫描是否还按下,则input_repeat_key已经调用好几次了,所以多了几个尾巴,这样就不是只按下一次键盘了。
3、千万不要因手按键盘的重复时间的固定思路迷惑了程序的编写。只要驱动指定了EV_REP,则驱动上层会自动启动上述的timer,本驱动只要判断按键是否抬起然后input_report_key(x,x,0);即可!
drivers/input/keyboard/pxa27x_keypad.c
// 数组rep[[]有两个元素rep[REP_DELAY ] 和rep[REP_PERIOD] 。这些值跟重复按键有关。比如一个键被按下
// 3秒开始算重复按键,3秒之后每隔1秒检测一次如果还被按下就算重复按下。这个3秒就是rep[REP_DELAY ],
// 这个1秒就是rep[REP_PERIOD]。
drivers/input/input.c 中函数 int input_register_device(struct input_dev *dev)
/*
* If delay and period are pre-set by the driver, then autorepeating
* is handled by the driver itself and we don't do it in input.c.
*/
init_timer(&dev->timer);
if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
//dev->timer.data = (long) dev;
//dev->timer.function = input_repeat_key;
dev->rep[REP_DELAY] = 250;
dev->rep[REP_PERIOD] = 33;
}
/**++by zjp @2013++++*/
dev->timer.data = (long) dev;
dev->timer.function = input_repeat_key;
/*++end++*/
阅读(3411) | 评论(0) | 转发(0) |