再谈谈linux input 子系统事件类型

/* 向上层上报一个scancode */

input_event(dev, EV_MSC, MSC_SCAN, code);

将事件上报给事件处理句柄意味这事件将真正到达事件处理层,对于PC keyboard的event handle就是sysrq,kbd,eventX,这些handle对应的handler分别是sysrq_handler,kbd_handler,evdev_handler。每次上报一个事件,都会由input_pass_event函数去遍历这些event handle再有这些event handle 找到对应的handler,最后调用handler->event()函数对事件进行最终的处理。 回看atkbd_interrupt的三次input_event调用: 第一次type为EV_MSC,code为MSC_RAW,但有/sys/class/input/input0/capabilities/msc 为0x10可知(第4位为0),一般PC keyboard都不支持上报RAW类型事件。也就是说对于那些对event设备感兴趣的应用程序而言是无法从这里获得RAW scancode的。 第二次type为EV_MSC,code为MSC_SCAN 正好是PC keyboard唯一支持的EV_MSC事件类型,所以可以在此上报scancode 事件。其实从代码里可以看到RAW scancode和scancode 区别在于前者可以多几种scancode。 第三次type为EV_KEY,code为scancode,这才算是上报一次普通的按键事件。 最后一路跟踪到了kbd_handler,里面将调用kbd_event进行最终的处理。另外两个,sysrq_event和evdev_event不再讲了,前者处理sysrq特殊按键组合的事件,后者涉及evdev client和用户层挂接的问题

 

对于一个常规按键,kbd_event会在整个流程中被调用两次,第一次是event_type=EV_MSC ,event_code=MSC_SCAN ,这次其实是会被忽略。另外HW_RAW(handle->dev) 这个宏对于PC keyboard恒为0,所以再次重复一遍,PC keyboard永远也不会将raw scancode上报处理。 第二次是event_type=EV_KEY,event_code=keycode,这才是需要关心的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值