tslib库编译与移植

1.tslib库简介

  tslib 是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。

2 相关工具安装

  安装必要工具libtool、automake、autoconf

$ sudo apt-get install libtool
$ sudo apt-get install automake
$ sudo apt-get install autoconf

3 tslib安装步骤

  •  系统环境

开发环境: Ubuntu18.04
目标开发板: Tiny4412
交叉编译器: arm-linux-gcc
Linux内核: Linux3.5

  1.下载tslib库源码包,将源码解压到用户目录下。
  tslib源码下载地址:https://github.com/libts/tslib/releases

[wbyq@wbyq soft_work]$ tar xvf /mnt/hgfs/ubuntu/soft_pack/tslib-master.tar.gz  #解压
[wbyq@wbyq soft_work]$cd tslib-master/tslib-master/    #进入到源码目录下
[wbyq@wbyq tslib-master]$ ls


  2.configure配置,生成Makefile文件。

[wbyq@wbyq tslib-master]$ ./autogen.sh
[wbyq@wbyq tslib-master]$ ./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache --prefix=$PWD/_install

- -host=arm-linux - - -指定编译器
- -prefix=$PWD/_install - - -指定安装目录

  3.编译安装。

[wbyq@wbyq tslib-master]$ make && make install  

  编译安装好后会生成 _install 文件夹。


  生成的文件信息:

[wbyq@wbyq tslib-master]$ cd _install/
[wbyq@wbyq _install]$ tree
.
├── bin
│   ├── ts_calibrate
│   ├── ts_harvest
│   ├── ts_print
│   ├── ts_print_raw
│   └── ts_test
├── etc
│   └── ts.conf
├── include
│   └── tslib.h
└── lib
    ├── libts-1.0.so.0 -> libts-1.0.so.0.0.0
    ├── libts-1.0.so.0.0.0
    ├── libts.la
    ├── libts.so -> libts-1.0.so.0.0.0
    ├── pkgconfig
    │   ├── tslib-1.0.pc
    │   └── tslib.pc
    └── ts
        ├── arctic2.la
        ├── arctic2.so
        ├── collie.la
        ├── collie.so
        ├── corgi.la
        ├── corgi.so
        ├── dejitter.la
        ├── dejitter.so
        ├── dmc.la
        ├── dmc.so
        ├── galax.la
        ├── galax.so
        ├── h3600.la
        ├── h3600.so
        ├── input.la
        ├── input.so
        ├── linear_h2200.la
        ├── linear_h2200.so
        ├── linear.la
        ├── linear.so
        ├── mk712.la
        ├── mk712.so
        ├── pthres.la
        ├── pthres.so
        ├── tatung.la
        ├── tatung.so
        ├── touchkit.la
        ├── touchkit.so
        ├── ucb1x00.la
        ├── ucb1x00.so
        ├── variance.la
        └── variance.so

6 directories, 45 files

  4.拷贝bin目录下的文件到开发板/bin目录下。

[wbyq@wbyq _install]$ cp bin/* /home/wbyq/soft_work/rootfs/bin/

  5.拷贝lib目录下的.so文件到开发板的/lib目录下。

[wbyq@wbyq _install]$ cp lib/*.so* /home/wbyq/soft_work/rootfs/lib/ -rfdv
[wbyq@wbyq _install]$ cp lib/ts/ /home/wbyq/soft_work/rootfs/lib/ -rfdv

  6.拷贝etc/ts.conf文件到开发板的/etc目录下。

[wbyq@wbyq _install]$ cp etc/ts.conf /home/wbyq/soft_work/rootfs/etc/ 

  7.修改配置文件。
  如果希望使用linux输入层事件接口,需要取消module_raw input 注释。

[wbyq@wbyq _install]$ vim /home/wbyq/soft_work/rootfs/etc/ts.conf


  8.配置开发板的的启动文件 profile。

[wbyq@wbyq _install]$ vim /home/wbyq/soft_work/rootfs/etc/profile 

export set TSLIB_TSDEVICE=/dev/input/event2 #设置触摸屏设备节点
export set TSLIB_CONFFILE=/etc/ts.conf #配置文件环境变量
export set TSLIB_PLUGINDIR=/lib/ts #指定tslib插件目录
export set TSLIB_CALIBFILE=/etc/pointercal  #指定校准之后,信息保存的位置(会自动生成)
export set TSLIB_CONSOLEDEVICE=none  #指定控制台设备文件名字,默认没有。填none
export set TSLIB_FBDEVICE=/dev/fb0 #屏幕设备节点

注意: 设置完环境变量之后,需要重启开发板生效,或者使用 source 命令立即生效。

4 开发板运行效果

  安装触摸屏驱动,检查触摸屏设备节点是否为上面设置的event2,运行ts_test

[root@wbyq code]# insmod ft5x06_dev.ko 
[  759.390000] IIC子系统:设备层注册成功
[root@wbyq code]# insmod ft5x06_drv.ko 
[  762.175000] IIC子系统:驱动层注册成功
[  762.175000] 资源匹配成功
[  762.175000] input: Unspecified device as /devices/virtual/input/input3
[root@wbyq code]# ts_test 
874.277420:    388    354      1
874.322712:    384    352      1
874.337917:    369    348      1
874.353162:    355    346      1
874.368397:    332    343      1
874.383524:    304    339      1
874.398664:    277    337      1
874.413889:    258    336      1
874.429156:    243    335      1
874.444247:    234    334      1
874.474649:    230    333      1
874.489914:    236    330      1
874.504974:    248    328      1


  tslib中提供的测试命令,是通过ts.config文件读取相应的触摸屏配置信息和LCD屏配置信息。

5 调用tslib库获取触摸屏坐标

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#include "tslib.h"
int main(int argc,char *argv[])
{
	struct tsdev *ts;
	char *tsdevice=NULL;
	/*打开触摸屏设备节点*/
	if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) {
		ts = ts_open(tsdevice,0);
	} 
	else {
		ts = ts_open("/dev/input/event2",0);
	}
	if(ts==NULL)
	{
		perror("ts_open");
		exit(1);
	}
	if (ts_config(ts)) {
		perror("ts_config");
		exit(1);
	}
	struct ts_sample samp;
	int ret;
	printf("   时间    \t X坐标   \t Y坐标\t压力值 \n");
	while (1) {
		ret = ts_read(ts, &samp, 1);
		if (ret < 0) {
			perror("ts_read");
			exit(1);
		}
		if (ret != 1)
			continue;
		printf("[%ld.%06ld] %6d %6d %6d\n", samp.tv.tv_sec, samp.tv.tv_usec,
											samp.x, samp.y, samp.pressure);
	}
	return 0;	
}

  •  程序编译:
cflags=-I/home/wbyq/soft_work/tslib-master/tslib-master/_install/include  #指定头文件
cflags+=-L/home/wbyq/soft_work/tslib-master/tslib-master/_install/lib  #指定库文件路径
cflags+=-lts  #指定库
app:
	arm-linux-gcc app.c -o app $(cflags)

  •  运行效果:
[root@wbyq code]# ./app 
   时间       X坐标   Y坐标   压力值 
[4591.061816]    337    369      1
[4591.124190]    337    369      0
[4592.426659]    512    399      1
[4592.502302]    507    400      1
[4592.517474]    503    401      1
[4592.532512]    500    403      1
[4592.547776]    494    405      1
[4592.562922]    489    408      1
[4592.578111]    483    410      1
[4592.593260]    479    412      1
[4592.624739]    475    415      1
[4592.655903]    472    417      0
[4592.972564]    442    402      1
[4593.063510]    445    402      1
[4593.078637]    449    402      1
[4593.093764]    452    403      1
[4593.109025]    459    404      1
[4593.124148]    465    404      1


  触摸屏驱动参考示例:https://blog.csdn.net/weixin_44453694/article/details/126906896