Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1372138
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: 嵌入式

2013-05-24 11:25:21

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) |
给主人留下些什么吧!~~