介绍:该库是专门为触摸屏设备所开发的应用层函数库,是触摸屏驱动和应用层之间的适配层。
tslib移植
确定需要的版本,在板子里面输入ts_finddev,查看板子里面的版本信息,我们这里是1.16版本
进入到 tslib 的 git 仓库下载源码 https://github.com/libts/tslib/releases下载对应版本。,推荐下载tar.bz2 或 tar.gz 格式压缩包。
然后将下载的压缩包放在Ubuntu目录下tar -xzf tslib-1.16.tar.gz
解压之后会生成 tslib-1.16 目录,在家目录下创建一个 tools 目录,然后在 tools 目录下创建 tslib 目录, 等会编译 tslib 库的时候将安装目录指定到这里
进入tslib-1.16 目录,准备进行编译 tslib 源码:
接下来进行编译,整个源码的编译分为 3 个步骤: ⚫ 首先第一步是配置工程; ⚫ 第二步是编译工程; ⚫ 第三步是安装,将编译得到的库文件、可执行文件等安装到一个指定的目录下。 首先在配置工程之前,先对交叉编译工具的环境进行设置,使用 source 执行交叉编译工具安装目录下 的 environment-setup-cortexa7hf-neon-poky-linux-gnueabi 脚本文件:
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
执行下面这条命令对 tslib 源码工程进行配置: ./configure --host=arm-poky-linux-gnueabi --prefix=/home/dt/tools/tslib/
接着编译工程,直接执行 make:
最后执行 make install 安装: make install
移植的最后一步就是把 tslib 安装目录下的库文件、etc 下的配置文件以及编译得到的测试工具拷贝到开 发板 Linux 系统目录下,由于开发板出厂系统中已经移植了 tslib 库,所以我们这里就不用拷贝了。但如果 大家是自己做的根文件系统,并没有移植 tslib,那么就需要把这些库、可执行文件以及配置文件拷贝到根文 件系统中,那怎么去拷贝?这里简单地提一下:
⚫ 将安装目录 bin/目录下的所有可执行文件拷贝到开发板/usr/bin 目录下;
⚫ 将安装目录 etc/目录下的配置文件 ts.conf 拷贝到开发板/etc 目录下;
⚫ 将安装目录 lib/目录下的所有库文件拷贝到开发板/usr/lib 目录下。
将安装目录下的测试工具、库文件以及配置文件拷贝到开发板之后,接着需要配置一些环境变量,因为 tslib 工作的时候它需要依赖于一些环境变量,譬如它会通过读取环境变量来得知 ts.conf 配置文件、库文件 的路径以及我们要测试的触摸屏对应的设备节点等。
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
TSLIB_CONSOLEDEVICE:用于配置控制台设备文件名,直接配置为 none 即可! TSLIB_FBDEVICE:用于配置显示设备的名称,tslib 提供了手指触摸画线的测试工具,需要在 LCD 上 显示,所以这里需要指定一个显示设备的设备节点。
TSLIB_TSDEVICE:用于配置触摸屏对应的设备节点,根据实际情况配置。
TSLIB_CONFFILE:用于配置 ts.conf 文件的所在路径。
TSLIB_PLUGINDIR:用于配置插件所在路径。
如果想每次启动系统都能生效,可以把这些命令放置在/etc/profile 脚本中执行;出厂系统中已经配置好 了,无需用户进行配置。
接着我们使用 tslib 提供的测试工具测试触摸屏,它提供了单点触摸测试工具(ts_print、ts_test)和多点 触摸测试工具(ts_print_mt、ts_test_mt),ts_print 和 ts_print_mt 可以在终端打印触摸点信息,而 ts_test 和 ts_test_mt 则支持在 LCD 上画线。
tslib库函数介绍
打开触摸屏设备:ts_open,函数原型如下:
#include<tslib.h>
struct tsdev *ts_open(const char *dev_name,int nonblock);
参数dev_name指定了触摸屏的设备节点,参数nonblock表示是否已非阻塞的方式打开触摸屏设备,如果等于0表示阻塞方式,非0则表示以非阻塞方式打开。
调用成功过返回一个struct tsdev*指针,如果打开失败返回NULL;
除了使用ts_open以外海可以使用ts_setup()函数:
#include<tslib.h>
struct tsdev *ts_setup(const char *dev_name, int nonblock);
参数 dev_name 指定触摸屏的设备节点,与 ts_open()函数中的 dev_name 参数意义相同;但对于 ts_setup() 来说,参数 dev_name 可以设置为 NULL,当 dev_name 设置为 NULL 时,ts_setup()函数内部会读取 TSLIB_TSDEVICE 环境变量,获取该环境变量的内容以得知触摸屏的设备节点。
ts_setup()相比 ts_open(),除了打开触摸屏设备外,还对触摸屏设备进行了配置,也就是接下来说到的第 二步操作。
关闭触摸屏设备使用 ts_close()函数:
int ts_close(struct tsdev *);
配置触摸屏设备:
调用ts_config()函数进行配置,函数原型如下:
#include<tslib.h>
int ts_config(struct tsdev *ts);
参数ts指向触摸屏句柄;
成功返回0,失败返回-1;
读取触摸屏数据:
使用ts_read()或者ts_read_mt(),区别是前一个是单点触摸数据,后一个是用于读取多点触摸数据函数原型如下
#include<tslib.h>
int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr)
int ts_read_mt(struct tsdev *ts, struct ts_sample_mt **samp, int max_slots, int nr)
参数ts指向一个触摸屏设备,参数nr表示对于一个触摸点的采样数,设置为1即可。
ts_read_mt()函数有一个 max_slots 参数,表示触摸屏支持的最大触摸点数,应用程序可以通过调用 ioctl() 函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息,
ts_read()函数的 samp 参数是一个 struct ts_sample *类型的指针,指向一个 struct ts_sample 对象,struct ts_sample 数据结构描述了触摸点的信息;调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存 中。struct ts_sample 结构体内容如下所示:
struct ts_sample{
int x;
int y;
unsigned int pressure;//按压力大小
struct timeval;//时间
}
ts_read_mt()函数的 samp 参数是一个 struct ts_sample_mt **类型的指针,多点触摸应用程序,每一个触 摸点的信息使用 struct ts_sample_mt 数据结构来描述;一个触摸点的数据使用一个 struct ts_sample_mt 对象 来装载,将它们组织成一个 struct ts_sample_mt 数组,调用 ts_read_mt()时,将数组地址赋值给 samp 参数。 struct ts_sample 结构体内容如下所示:
struct ts_sample_mt {
/* ABS_MT_* event codes. linux/include/uapi/linux/input-event-codes.h * has the definitions. */
int x; //X 坐标
int y; //Y 坐标
unsigned int pressure; //按压力大小
int slot; //触摸点
slot int tracking_id; //ID int tool_type;
int tool_x; int tool_y; unsigned int touch_major;
unsigned int width_major;
unsigned int touch_minor;
unsigned int width_minor;
int orientation; int distance;
int blob_id; struct timeval tv; //时间 /* BTN_TOUCH state */
short pen_down; //BTN_TOUCH 的状态
/* valid is set != 0 if this sample * contains new data; see below for the * bits that get set. * valid is set to 0 otherwise */
short valid; //此次样本是否有效标志 触摸点数据是否发生更新
};