目录
1、输入系统
驱动程序上报数据含义三项重要内容:type(哪类)、code(哪个)、value(值)
当读取到以上三个值都为0时,说明你读取完了一个完整的事件数据
2、APP访问硬件的种方式
例子,妈妈怎么知道房间里的孩子醒了
1.查询方式
2.休眠-唤醒
3.poll方式
4.异步通知
3.编写应用程序获得设备输入信息
步骤:
1.打开设备节点(open)
2.调用ioctl获取硬件信息
ioctl(句柄,EVICOME,input_id结构体地址)返回值为零说明没有错误
input_id结构体中的的参数:bustype、vendor、product、version
将这四项打印出来
3.获取EVbit
EVIOCGBIT()通过修改这个宏来获得我们要读取的数据
根据获取到的evbit判断
4.使用查询方式和休眠唤醒方式读取
4.1查询方式
打开文件open时传入O_NONBLOCK参数,以非阻塞方式打开文件
4.2休眠唤醒方式
打开文件open时不传入O_NONBLOCK参数,默认就是休眠唤醒方式
4.3代码实现
使用上面两种方式成功打开文件后
读取数据read(句柄,&event,长度)这里的event是结构体struct input_event event;的地址
3.打印event里的数据
5.poll方式
调用poll函数需要用到的头文件和结构体:
1.使用非阻塞方式打开文件
原因:一次poll可以多次读,
2.调用poll函数
定义数组,数量,设置结构体
3.读取文件
6.异步通知方式
1.异步通知的功能介绍
异步通知,就是APP可以忙自己的事,当驱动程序用数据时它会主动给 APP发信号,这会导致APP执行信号处理函数。
2.使用异步通知需要做的事情:
3.遇到的问题
主函数的while循环里有个计数的打印,运行程序后当屏幕没操作时,他会打印计数值,但是但屏幕有操作后,该while循环不在打印计数值。
解决办法:打开文件的方式要加上)O_NONBLOCK参数,以非阻塞的方式运行。
7.电阻屏和电容屏
电阻屏的数据
电容屏的数据
松开时
8.tslib
1.交叉编译tslib
在交叉编译的过程中,最重要的是将交叉编译得到的Iinclude和lib目录中的文件,全部复制到编译时去寻找的目录下。这个步骤和前面交叉编译freetype基本相同。
2.测试tslib
对于执行ts_test_mt没有数据返回,是因为需要关闭qt或者lvgl。
3.自己写一个测试程序
不断打印两个触点之间的距离
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <getopt.h>
#include <linux/input.h>
#include <sys/ioctl.h>
#include <tslib.h>
int distance(struct ts_sample_mt *point1, struct ts_sample_mt *point2) { int x = point1->x - point2->x; int y = point1->y - point2->y;
return x*x + y*y;
}
int main(int argc, char argv) { struct tsdev *ts; int i; int ret; struct ts_sample_mt samp_mt; struct ts_sample_mt **pre_samp_mt; int max_slots; int point_pressed[20]; struct input_absinfo slot; int touch_cnt = 0;
ts = ts_setup(NULL, 0);
if (!ts)
{
printf("ts_setup err\n");
return -1;
}
if (ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), &slot) < 0) {
perror("ioctl EVIOGABS");
ts_close(ts);
return errno;
}
max_slots = slot.maximum + 1 - slot.minimum;
samp_mt = malloc(sizeof(struct ts_sample_mt *));
if (!samp_mt) {
ts_close(ts);
return -ENOMEM;
}
samp_mt[0] = calloc(max_slots, sizeof(struct ts_sample_mt));
if (!samp_mt[0]) {
free(samp_mt);
ts_close(ts);
return -ENOMEM;
}
pre_samp_mt = malloc(sizeof(struct ts_sample_mt *));
if (!pre_samp_mt) {
ts_close(ts);
return -ENOMEM;
}
pre_samp_mt[0] = calloc(max_slots, sizeof(struct ts_sample_mt));
if (!pre_samp_mt[0]) {
free(pre_samp_mt);
ts_close(ts);
return -ENOMEM;
}
for ( i = 0; i < max_slots; i++)
pre_samp_mt[0][i].valid = 0;
while (1)
{
ret = ts_read_mt(ts, samp_mt, max_slots, 1);
if (ret < 0) {
printf("ts_read_mt err\n");
ts_close(ts);
return -1;
}
for (i = 0; i < max_slots; i++)
{
if (samp_mt[0][i].valid)
{
memcpy(&pre_samp_mt[0][i], &samp_mt[0][i], sizeof(struct ts_sample_mt));
}
}
touch_cnt = 0;
for (i = 0; i < max_slots; i++)
{
if (pre_samp_mt[0][i].valid && pre_samp_mt[0][i].tracking_id != -1)
point_pressed[touch_cnt++] = i;
}
if (touch_cnt == 2)
{
printf("distance: %08d\n", distance(&pre_samp_mt[0][point_pressed[0]], &pre_samp_mt[0][point_pressed[1]]));
}
}
return 0;
}
课程来源: