06 input子系统
input子系统
在应用层对于input子系统的开发,其实就是:通过读取
/dev/input/eventX
设备文件,获取某个input设备的输入信息的过程
1.怎么看某个硬件设备对应input子系统下哪个event呢?
1 | cat /proc/bus/input/devices |
看Handlers
字段
2.应用层如何获取从input子系统的设备获取数据?
对/dev/input/eventX
设备节点进行open()
和read()
系统调用
1 | int fd = open("/dev/input/eventX",O_RDONLY); |
注意:read()
时,如果没有数据,会阻塞线程
3.应用层read()
读取到的是什么数据?
读到的是下面这个结构体
1 | struct input_event { |
4.用户的一次input动作可能会触发多个事件,比如我触摸一下,会接连报好几次事件,上报X、Y坐标等信息. read()
每次只能读取一个事件,那么应用层如何知道此次Input动作读完了呢?
- 通过同步事件类型 EV_SYN来知道,当读到同步事件时(type = 0, code = 0),即可知道本次input动作的数据读取完了
6.应用层只负责从Input设备节点里读按键的值,具体值是什么,长按还是短按、消抖之类的工作,由驱动层做
7.单点触摸和多点触摸的区别:
- 一个同步事件,单点触摸上传的数据只能包含一个触摸点、而多点触摸上传的数据可能包含多个触摸点
- 单点触摸上报的事件是
ABS_XXX
,而多点触摸上报的事件是ABS_MT_XXX
(但是多点触摸设备的第一个触摸点,也会上报单点触摸的事件,其他的触摸点只会上报多点触摸事件)
8.触摸屏类设备一般支持的事件类型:
- 同步事件
- 绝对位移事件
- 按键事件(用于描述手放到屏幕/从屏幕拿开)
部分触摸屏支持的事件:
- 压力大小
- 触点面积
9.多点触摸设备通过多点触摸协议来上报多点触摸事件,多点触摸协议分为TypeA和TypeB,目前基本上只会用TypeB. 他有以下特点:
- 识别出的每个触摸点分配一个SLOT变量,并通过input子系统上报事件(硬件层的变量)
- 使用
ABS_MT_TRACTKING_ID
事件来跟踪触摸点(软件层的变量,描述一次触摸的生命周期) - 每次上传只上传变化的变量,比如一个手指只在X方向发生了移动,那它就不会上报Y方向的坐标
10.tsllib
是嵌入式触摸屏开发时常用的一个中间件第三方库,向下它读取Input子系统的设备节点,进一步封装并提供消抖、线性化等操作,再传给需要触摸信息的应用层
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.