嵌入式Linux应用开发——输入系统(所学课程来源百问网)

目录

1、输入系统

2、APP访问硬件的种方式

3.编写应用程序获得设备输入信息

4.使用查询方式和休眠唤醒方式读取

4.1查询方式

4.2休眠唤醒方式

4.3代码实现

5.poll方式

6.异步通知方式

1.异步通知的功能介绍

2.使用异步通知需要做的事情:

3.遇到的问题

7.电阻屏和电容屏

电阻屏的数据

电容屏的数据

8.tslib

1.交叉编译tslib

2.测试tslib​编辑

3.自己写一个测试程序


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;
}

课程来源:

4_7-1.输入系统框架及调试_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1w4411B7a4?p=63&vd_source=3a9afee9fda50350a1c881b4325e007d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值