上一章学习了开发板外接键盘并获取键盘的的输入
Linux输入设备应用编程(键盘,按键)-CSDN博客
本章编写触摸屏应用程序,获取触摸屏的坐标信息并将其打印出来
一 触摸屏数据分析(触摸,点击,松开)
1.1 硬件须知
首先在测试触摸屏之前,需要保证开发板上已经连接了LCD屏
使用命令"cat /proc/bus/input/devices",确定触摸屏对应的设备节点(本人将指令封装成了cat_dev),如下所示:
1.2 触摸屏信息分析
执行input文件后,一个手指点击触摸屏后松开,终端将会打印如下信息:
首先第一行上报了绝对位移事件EV_ABS(type=3)中的ABS_MT_TRACKING_ID(code=57)事件,并且value值等于246,也就是ID,这个ID是一个非负数,所以表示这是一个新的触摸点被创建,也就意味着触摸屏上产生了一个新的触摸点(手指按下)。
第二行上报了绝对位移事件EV_ABS(type=3)中的ABS_MT_POSITION_X(code=53)事件,其value对应的便是触摸点的X坐标;
第三行上报了ABS_MT_POSITION_Y(code=54)事件,其value值对应的便是触摸点Y坐标,所以由此可知该触摸点的坐标为(890, 445)。
第四行上报了按键类事件EV_KEY(type=1)中的BTN_TOUCH(code=330),value值等于1,表示这是触摸屏上最先产生的触摸点(slot=0、也就是触摸点0)。
第五行和第六行分别上报了绝对位移事件EV_ABS(type=3)中的ABS_X(code=0)和ABS_Y(code=1),其value分别对应的是触摸点的X坐标和Y坐标。多点触摸设备也会通过ABS_X、ABS_Y事件上报触摸点的X、Y坐标,但通常只有触摸点0支持,所以可以把多点触摸设备当成单点触摸设备来使用。
第七行上报了同步类事件EV_SYN(type=0)中的SYN_REPORT(code=0)事件,表示此次触摸点的信息全部上报完毕。
第八行当手指松开时,触摸点就会被销毁,上报ABS_MT_TRACKING_ID事件,并将value设置为-1(ID)
第四行上报了按键类事件EV_KEY(type=1)中的BTN_TOUCH(code=330),value值等于0,表示触摸屏上的触摸点销毁
最后一行上报同步事件(type=0、code=0),告知应用层数据完整。
二 触摸屏应用编程
2.1 获取触摸屏的最大同时触点
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
int main(int argc, char *argv[])
{
struct input_absinfo info; //调用 ioctl()会将获取到的信息写入到struct input_absinfo对象
int fd = -1;
int max_slots; //最大触摸点数
/* 校验传参 */
if (2 != argc) {
fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);
exit(-1);
}
/* 打开文件 */
if (0 > (fd = open(argv[1], O_RDONLY))) {
perror("open error");
exit(-1);
}
/* 获取slot信息 */
if (0 > ioctl(fd, EVIOCGABS(ABS_MT_SLOT), &info)) {
perror("ioctl error");
close(fd);
exit(-1);
}
max_slots = info.maximum + 1 - info.minimum;
printf("max_slots: %d\n", max_slots);
/* 关闭、退出 */
close(fd);
exit(0);
}
代码写完后,进行交叉编译,通过scp指令将文件发送到开发板上,然后执行input_slot文件
所以从打印结果可知,我们这个屏是一个5点触摸屏。