tslib 的安装与使用

article/2025/1/16 5:08:41

5 tslib

需要安装好触摸屏驱动

tslib 是一个触摸屏的开源库,可以使用它来访问触摸屏设备,可以给输入设备添加各种“filter”(过滤器,就是各种处理),地址是:http://www.tslib.org/。

编译 tslib 后,可以得到libts库,还可以得到各种工具:较准工具、测试工具。

5.1 tslib 框架分析

tslib的主要代码如下:

在这里插入图片描述

核心在于 “plugins” 目录里的 “插件”,或称为 “module”。这个目录下的每个文件都是一个 module,每个 module 都提供 2 个函数:read、read_mt,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。

框架:

在这里插入图片描述

调用ts_open后,可以打开某个设备节点,构造出一个tsdev结构体。然后调用ts_config读取配置文件的处理,假设 /etc/ts.conf 内容如下:

 module_raw inputmodule pthres pmin=1module dejitter delta=100module linear

每行表示一个 “module” 或 “moduel_raw”。

对于所有的 “module”,都会插入 tsdev.list 链表头,也就是 tsdev.list 执行配置文件中最后一个 “module”,配置文件中第一个 “module” 位于链表的尾部。

对于所有的 “module_raw”,都会插入 tsdev.list_raw 链表头,一般只有一个 “module_raw”。

注意:tsdev.list 中最后一个 “module” 会指向 ts_dev.list_raw 的头部。

无论是调用 ts_read 还是 ts_read_mt,都是通过 tsdev.list 中的模块来处理数据的。这写模块是递归调用的,比如 linear 模块的 read 函数如下:

在这里插入图片描述

linear 模块的 read_raw 函数如下:

在这里插入图片描述

因为是递归调用,所有最先使用 input 模块读取设备节点得到原始数据,再依次经过 pthres 模块、dejitter 模块、linear 模块处理后,才返回最终数据。

5.2 编译

  1. 获得源码后解压

  2. 进入源码目录

  3. 配置:

    ./configure  --host=arm-linux-gnueabihf   --prefix=$PWD/tmp
    make
    make install
    cd  tmp
    #然后将 include 下的文件复制到交叉编译工具的 include 中
    cp  include/*  -rf  /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux- \gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/include
    #然后将 lib 下的文件复制到交叉编译工具的 lib 中
    cp  lib/*  -drf  /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux- \gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib
    
  4. 将编译好的 tmp 复制到开发板的文件系统

    sudo cp * -rf /home/luo/linux/nfs/buildrootfs

  5. 在开发板中配置 tslib

    1. 打开/etc/ts.conf文件,找到下面这一行:module_raw input,如果有注释,就去掉

    2. 打开/etc/profile 文件,在里面加入如下内容:

export TSLIB_TSDEVICE=/dev/input/event1 #表示触摸设备文件,这里设置为/dev/input/event1,这个要根据具体情况设置
export TSLIB_CALIBFILE=/etc/pointercal #表示校准文件,如果进行屏幕校准的话校准结果就保存在这个文件中,这里设置校准文件为/etc/pointercal,此文件可以不存在,校准的时候会自动生成。
export TSLIB_CONFFILE=/etc/ts.conf #触摸配置文件,文件为/etc/ts.conf,此文件在移植 tslib 的时候会生成。
export TSLIB_PLUGINDIR=/lib/ts #表示 tslib 插件目录位置,目录为/lib/ts。
export TSLIB_CONSOLEDEVICE=none #表示控制台设置,这里不设置,因此为 none
export TSLIB_FBDEVICE=/dev/fb0	#屏幕驱动文件

5.3 测试

电容屏可以不用校准,如果是电阻屏就要先进行校准!校准的话输入如下命令:ts_calibrate

校准完成以后如果不满意,或者不小心对电容屏做了校准,那么直接删除掉/etc/pointercal文件即可。 最后我们使用 ts_test_mt 这个软件来测试触摸屏工作是否正常,以及多点触摸是否有效,
执行如下所示命令:ts_test_mt
在这里插入图片描述

其中 :

  • Drag 为拖拽,按下后,用手指接触屏幕,会有十字光标跟随,多点就有多个光标
  • Draw 为绘制,按下后,用手指触摸屏幕,会画出线来,多个手指就同时画出多条线
  • Quit 为退出。

5.4 应用测试

5.4.1 头文件

#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>

5.4.2 distance 函数

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

5.4.3 main 函数

int main(int agrc, char **argv)
{struct tsdev *ts;int i, 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 == NULL)goto setup_fail;if(ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT),&slot) < 0)goto ioctl_fail;max_slots = slot.maximum + 1 - slot.minimum;samp_mt = malloc(sizeof(struct ts_sample_mt *));if(samp_mt == NULL){goto mem_fail;}samp_mt[0] = calloc(max_slots, sizeof(struct ts_sample_mt));if(samp_mt == NULL){free(samp_mt);goto mem_fail;}pre_samp_mt = malloc(sizeof(struct ts_sample_mt *));if(pre_samp_mt == NULL)goto mem_fail;pre_samp_mt[0] = calloc(max_slots, sizeof(struct ts_sample_mt));if(pre_samp_mt[0] == NULL){free(pre_samp_mt);goto mem_fail;}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 error!\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;
setup_fail:printf("ts_setup error!\n");return -1;
ioctl_fail:perror("ioctl EVIOGABS");ts_close(ts);return errno;
mem_fail:ts_close(ts);return -ENOMEM;}

5.4.4 makefile

KERNELDIR := /home/luo/linux/IMX6ULL/linux-imx-rel_imx_4.1.15_2.1.0_ga_alpha
CURRENT_PATH := $(shell pwd)CROSS_COMPILE ?= arm-linux-gnueabihf-build: kernel_moduleskernel_modules:$(CROSS_COMPILE)gcc -o mt_cal_distance mt_cal_distance.c -ltsclean:rm mt_cal_distance

5.4.5 测试结果

会打印出两点的距离


http://chatgpt.dhexx.cn/article/jf0uHBtx.shtml

相关文章

第三方库介绍——tslib库

文章目录 tslib 简介tslib 框架分析tslib 的框架 交叉编译、测试 tslibtslib应用程序 tslib 简介 tslib 是一个触摸屏的开源库&#xff0c;可以使用它来访问触摸屏设备&#xff0c;可以给输入设备添加各种“ filter ”( 过滤器&#xff0c;就是各种处理) 编译 tslib 后&#…

tslib框架分析

tslib时一个触摸屏的开源库&#xff0c;可以使用它来访问触摸屏设备&#xff0c;可以输入给设备添加各种"filter"&#xff0c;地址这里 编译tslib后&#xff0c;可以得到libts库&#xff0c;还可以得到各种工具&#xff1a;校准工具、测试工具 一、tslib框架分析 …

暑假实训成果及心得

暑假实训成果及心得 本次暑假实训主要从大数据的现况及前景出发&#xff0c;通过大数据发展的趋势及鲲鹏云大数据对大数据有了一个全新的认识。 自我介绍 本着对大数据热爱&#xff0c;我毅然决然的踏上了这条大数据的不归路。第一次接触大数据是在高三的语文试卷里&#xf…

大学生mysql实训心得_大学生实训心得体会范文(精选3篇)

大学生实训心得体会范文(精选3篇) 当在某些事情上我们有很深的体会时,往往会写一篇心得体会,这样可以帮助我们总结以往思想、工作和学习。一起来学习心得体会是如何写的吧,以下是小编为大家收集的大学生实训心得体会范文(精选3篇),仅供参考,欢迎大家阅读。 大学生实训心得…

谈谈我的实习感受~

写在前面 有粉丝私信说&#xff0c;让我出一篇关于工作感受的文章&#xff0c;今天他来了。 初来乍到 刚入职的时候&#xff0c;一个词形容——一脸懵逼&#xff0c;不过有人带着会好很多&#xff0c;他会告诉你需要做什么&#xff0c;当然了刚来的一两周一般都是熟悉公司业务&…

c语言实验报告总结通用版,大学生实训心得体会(通用11篇)

大学生实训心得体会(通用11篇) 我们心里有一些收获后,好好地写一份心得体会,这样能够培养人思考的习惯。很多人都十分头疼怎么写一篇精彩的心得体会,以下是小编精心整理的大学生实训心得体会(通用11篇),欢迎大家分享。 大学生实训心得体会1 在我们过去的读书生涯中,有一个…

云计算实训报告总结_实训报告心得体会(通用5篇)

实训报告心得体会(通用5篇) 我们在一些事情上受到启发后,马上将其记录下来,这样就可以总结出具体的经验和想法。那么如何写心得体会才能更有感染力呢?以下是小编帮大家整理的实训报告心得体会(通用5篇),欢迎阅读,希望大家能够喜欢。 实训报告心得体会1 我对于visualbasic的…

大学生html5实训报告,大学生实训心得体会范文(精选5篇)

大学生实训心得体会范文(精选5篇) 当我们积累了新的体会时,应该马上记录下来,写一篇心得体会,如此就可以提升我们写作能力了。你想好怎么写心得体会了吗?下面是小编整理的大学生实训心得体会范文(精选5篇),仅供参考,大家一起来看看吧。 大学生实训心得体会1 五月,在各种…

html5实训总结200字,实训心得体会范文200字(通用5篇)

实训心得体会范文200字(通用5篇) 当我们心中积累了不少感想和见解时,写心得体会是一个不错的选择,这样就可以通过不断总结,丰富我们的思想。那么心得体会怎么写才恰当呢?下面是小编收集整理的实训心得体会范文200字(通用5篇),仅供参考,大家一起来看看吧。 实训心得体会1 …

大学生html5实训心得体会,实训心得体会600字(精选5篇)

实训心得体会600字(精选5篇) 当我们心中积累了不少感想和见解时,写一篇心得体会,记录下来,这样我们就可以提高对思维的训练。但是心得体会有什么要求呢?下面是小编帮大家整理的实训心得体会600字(精选5篇),欢迎阅读,希望大家能够喜欢。 实训心得体会600字1 时间过的真快,…

上第一次实训课感想

上第一次Java实训课感想 第一天开始实训,有点担心自己不会做,但第一天分配的任务比我想象的要简单一点,是用navicat创建数据表,用到了mysql的知识。 比较麻烦的就是给表导入数据,因为数据比较多,所以比较麻烦,但总体来说还好。 然后用百度脑图创建了一张思维导图,如下…

html怎么制作表单,HTML如何制作表单

制作表单的方法&#xff1a;首先使用form标签创建表单&#xff0c;搭建表单框架&#xff1b;然后使用input标签创建文本输入框和提交按钮&#xff1b;接着使用select和option标签创建下拉列表&#xff1b;最后使用textarea标签创建文本区域即可。 本教程操作环境&#xff1a;wi…

HTML 什么是表单

什么是表单 HTML 表单的主要作用是接收用户的输入&#xff0c;当用户提交表单时&#xff0c;浏览器将用户在表单中输入的数据打包&#xff0c;并发送给服务器&#xff0c;从而实现用户与Web服务器的交互。 表单是控件的容器&#xff0c;一个表单由form元素、表单控件和表单按…

HTML表单和表格

一.表单 HTML 表单简介 定义和用法 HTML 常用表单元素 属性 1.1 HTML表单简介 HTML 表单是 HTML 文档中的 一个区域 HTML 表单这个区域中包含了一系列的 可交互元素 HTML 表单主要用于 收集用户输入信息 1.2 定义和用法 <form> 标签用于为用户输入创建 HTML 表单。 …

HTML登录表单的制作

表单的知识点总结 form必须有action属性&#xff0c;表示提交地址所有需要提交的数据&#xff0c;input必须有name属性input按钮的文字&#xff0c;使用value属性表示input必须放在form标签才能提交 input标签常见类型总结 文本输入框 密码输入框 单选框 复选框 type"…

HTML网页设计:十一、表单

表单 HTML系列文章目录 HTML网页设计&#xff1a;一、HTML的基本结构HTML网页设计&#xff1a;二、网页的基本标签HTML网页设计&#xff1a;三、图像标签之&#xff1c;img&#xff1e;标签HTML网页设计&#xff1a;四、超链接HTML网页设计&#xff1a;五、行内元素和块元素H…

HTML表单--如何使用HTML创建表单

HTML表单是什么&#xff1f; HTML 表单用于收集用户输入&#xff0c;与服务器进行交互&#xff0c;使用form元素来定义一个HTML表单。 下面简单介绍表单中常见元素的用法。 1.表单标签 form 属性&#xff1a; action —数据提交的服务器地址method— 数据提交的方法 数据提…

初学者:html中的表单详解(下面附有代码)

表单的理解与解释 表单&#xff1a;采集不同类型的用户输入数据&#xff0c;发送给服务器&#xff0c;实现用户和服务器之间的数据交互。 表单标签form 声明数据采集的范围&#xff0c;只要是在form中的&#xff0c;都是要采集的数据。 一个页面中可以有多个form标签&#xf…

HTML表单制作

为什么写表单&#xff1f;&#xff08;目的是为了收集用户信息&#xff09; 表单的组成&#xff1a;表单域、表单控件&#xff08;也称表单元素&#xff09;和提示信息3个部分构成。 在HTML中&#xff0c;<form>标签用于定义表单域&#xff0c;以实现用户信息的收集和传…

html的form表单详解

这里写目录标题 Form表单介绍表单元素单选按钮复选框文件隐藏域提交按钮重置按钮按钮图像图片按钮下拉列表多行文本框(文本域)HTML5新增type类型HTML5新增属性编码不易 如有帮助到您 请支持一下 多谢Form表单介绍 表单在 Web 网页中用来给访问者填写信息,从而能采集客户端信息…