20. input子系统与触摸#
触摸屏属于input输入子系统的设备, 更多基于input输入子系统的设备也可以通过本章节的方法来分析
20.1. input子系统#
input子系统是Linux对输入设备提供的统一驱动框架。 如按键、键盘、触摸屏和鼠标等输入设备的驱动方式是类似的, 使用input子系统驱动的输入设备可以通过统一的数据结构提交给内核, 该数据结构包括输入的时间、类型、代号以及具体的键值或坐标, 内核通过/dev/input目录下的文件接口传递给用户空间。
在Linux内核源码的“Documentation/input”目录包含了input子系统相关的说明。
本章以触摸进行讲解input子系统的使用。
20.1.1. input事件目录#
event文件包含的信息采用内核事件数据结构来记录内容, 当其它程序使用时需要把读取到的内容按数据的结构进行格式化转换, 该数据结构定义如下所示。
1 struct input_event {
2 struct timeval time;
3 __u16 type;
4 __u16 code;
5 __s32 value;
6 };
time: 该变量用于记录事件产生的时间戳。
type: 输入设备的事件类型。系统常用的默认类型有EV_KEY、 EV_REL和EV_ABS, 分别用 于表示按键状态改变事件、相对坐标改变事件及绝对坐标改变事件,特别地, EV_SYN用于分隔事件,无特别意义。 相关的枚举值可以参考内核文件include/uapi/linux/input-event-codes.h。
code: 事件代号,它以更精确的方式表示事件。 例如 在EV_KEY事件类型中,code的值常用于表示键盘上具体的按键, 其取值范围在0~127之间, 例如按键Q对应的是KEY_Q,该枚举变量的值为16。 如果选择鼠标,evtest输出内容的code分别有ABS_X/ABS_Y,表示上报的是X或Y坐标。
value: 事件的值。对于EV_KEY事件类型,当按键按下时,该值为1; 按键松开时,该值为0。 如果选择鼠标,中evtest输出的内容里, ABS_X事件类型中的value值表示X坐标,ABS_Y类型中的value值表示Y坐标。
20.2. evtest#
使用屏幕时,请确认屏幕的连接是正确的,没有接屏幕也会有input的设备产生,但是会没有数据的生成
先使用evtest命令获取屏幕的驱动设备,然后选择我们的设备,以 lubancat5IO 为例
1root@lubancat:~# evtest
2
3No device specified, trying to scan all of /dev/input/event*
4Available devices:
5/dev/input/event0: febd0030.pwm
6/dev/input/event1: rk805 pwrkey
7/dev/input/event2: Goodix Capacitive TouchScreen
8/dev/input/event3: headset-keys
9/dev/input/event4: rockchip-es8388 Headset
10/dev/input/event5: rockchip-hdmi1 rockchip-hdmi1
11/dev/input/event6: rockchip-hdmi1 rockchip-hdmi1
12Select the device event number [0-6]:
可以看到 "Goodix Capacitive TouchScreen" 就是我们的触摸屏
他的驱动设备位于/dev/input/event2
输入'2'
1 Select the device event number [0-6]: 2
2 Input driver version is 1.0.1
3 Input device ID: bus 0x18 vendor 0x416 product 0x38f version 0x1060
4 Input device name: "Goodix Capacitive TouchScreen"
5 Supported events:
6 Event type 0 (EV_SYN)
7 Event type 1 (EV_KEY)
8 Event code 125 (KEY_LEFTMETA)
9 Event code 330 (BTN_TOUCH)
10 Event type 3 (EV_ABS)
11 Event code 0 (ABS_X)
12 Value 0
13 Min 0
14 Max 719
15 Event code 1 (ABS_Y)
16 Value 0
17 Min 0
18 Max 1279
19 Event code 47 (ABS_MT_SLOT)
20 Value 0
21 Min 0
22 Max 4
23 Event code 48 (ABS_MT_TOUCH_MAJOR)
24 Value 0
25 Min 0
26 Max 255
27 Event code 50 (ABS_MT_WIDTH_MAJOR)
28 Value 0
29 Min 0
30 Max 255
31 Event code 53 (ABS_MT_POSITION_X)
32 Value 0
33 Min 0
34 Max 719
35 Event code 54 (ABS_MT_POSITION_Y)
36 Value 0
37 Min 0
38 Max 1279
39 Event code 57 (ABS_MT_TRACKING_ID)
40 Value 0
41 Min 0
42 Max 65535
43 Properties:
44 Property type 1 (INPUT_PROP_DIRECT)
45 Testing ... (interrupt to exit)
输入后会把基本的输入信息打印出来,我们可以根据这些信息,获取触摸屏的基本信息
1 #当我点击屏幕后,可以看到下列信息
2
3 Testing ... (interrupt to exit)
4 vent: time 1661236971.556728, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 2
5 vent: time 1661236971.556728, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 370
6 vent: time 1661236971.556728, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 684
7 vent: time 1661236971.556728, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 50
8 vent: time 1661236971.556728, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 50
9 vent: time 1661236971.556728, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
10 vent: time 1661236971.556728, type 3 (EV_ABS), code 0 (ABS_X), value 370
11 vent: time 1661236971.556728, type 3 (EV_ABS), code 1 (ABS_Y), value 684
12 vent: time 1661236971.556728, -------------- SYN_REPORT ------------
13 vent: time 1661236971.629280, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
14 vent: time 1661236971.629280, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
15 vent: time 1661236971.629280, -------------- SYN_REPORT ------------
第9行 :表示按下了按键
第10和11行 :表示我按下屏幕的位置是x_370 ,y_684
第12和15行:表示屏幕上报了2次完整的数据
第14行表示:按键松开了
其他行是关于多点触控相关,以及触摸范围的大小,力度等, 如果有想深入了解的可以去百度或者自行测试探索,这里不进行过多讲述