input子系统

在应用层对于input子系统的开发,其实就是:通过读取/dev/input/eventX设备文件,获取某个input设备的输入信息的过程

1.怎么看某个硬件设备对应input子系统下哪个event呢?

1
cat /proc/bus/input/devices

Handlers字段

2.应用层如何获取从input子系统的设备获取数据?

/dev/input/eventX设备节点进行open()read()系统调用

1
2
3
4
5
6
7
8
9
10
int fd = open("/dev/input/eventX",O_RDONLY);
struct input_event ev;
while(1)
{
if(read(fd,&ev,sizeof(struct input_event)) != sizeof(struct input_event))
{
perror("error!");
exit(-1);
}
}

注意:read()时,如果没有数据,会阻塞线程

3.应用层read()读取到的是什么数据?

读到的是下面这个结构体

1
2
3
4
5
6
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};

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子系统的设备节点,进一步封装并提供消抖、线性化等操作,再传给需要触摸信息的应用层