1、下载tslib的源码

tslib的安装包:

​https://pan.baidu.com/s/1WC90hbxE1Y8f4DhhEC9SMQ​

2.解压 # tar -jxvf tslib_1.4.tar.bz

3.配置

# cd tslib
# ./autogen.sh //如果出错请看下面解决办法
# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
# mkdir /opt/tslib //创建这个目录是把qt安装到这里
# ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache

./autogen.sh出错是缺少安装包:./autogen.sh: 4: autoreconf: not found
#sudo apt-get install autoconf automake libtool

4.编译和安装

# make
# make install //就安装到/opt/tslib中了

5.部署

在/opt/tslib   (以主机为根)

(1)动态库文件so
(2)配置文件
(3)bin文件
我们把以上三个都配置,部署上去 #cp    /opt/tslib/    /home/liu/ARM/rootfs/rootfs2     -rf

/home/liu/ARM/rootfs/rootfs2# cd tslib
/home/liu/ARM/rootfs/rootfs2/tslib# rm include/ -r
/home/liu/ARM/rootfs/rootfs2/tslib# ls
bin etc lib
/home/liu/ARM/rootfs/rootfs2/tslib# cd lib/
/home/liu/ARM/rootfs/rootfs2/tslib/lib# ls
libts-0.0.so.0 libts-0.0.so.0.1.1 libts.la libts.so pkgconfig ts
/home/liu/ARM/rootfs/rootfs2/tslib/lib# rm libts.la

然后再改名字为

#mv tslib tslib1.4

6.导出环境变量

开发板linux中执行# vi /etc/profile 添加

export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/tslib1.4/etc/pointercal
// pointercal是校准之后生成的文件
export TSLIB_CONFFILE=/tslib1.4/etc/ts.conf
export TSLIB_PLUGINDIR=/tslib1.4/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tslib1.4/lib //添加共享库
#export TS_INFO_FILE=/sys/class/input/input2/uevent
export TS_INFO_FILE=/sys/class/input/input1/uevent

7.运行和测试

在tslib1.4/bin文件中提供了测试用的文件,可以供我们测试

ts_calibrate  ts_harvest    ts_print      ts_print_raw  ts_test
【出错】 
(1) ts_config: No such file or directory 
解决:

在etc/ts.conf中去掉  module raw input  这行的注释就行了。 

(2) 报错:所匹配的设备不是触摸屏

QT环境搭建(1):tslib移植_触摸屏

看到这个错误的提示,我们应该想到tslib源码里面肯定有这个错误提示的条件,这样就让我们有了思路,我们可以去找到这个文件看看他错误判断的条件是啥?

 

$ pwd
/home/lzj/fl2440/3rdparty/tslib/plugins
$ vim input-raw.c

 

QT环境搭建(1):tslib移植_linux_02

 

首先tslib通过EVIOCGVERSION来获取驱动的版本号,然后再通过EVIOCGBIT来判断设备是否为触摸屏,最后获取触摸屏的X轴(ABS_X),Y轴(ABS_Y),以及压力(ABS_PRESSURE)。其中只要有一项内容不正确,tslib都会认为该设备不是触摸屏,而打印出“selecteddevice is not a touchscreen I understand”错误。

其中关键的是version == EV_VERSION这个判断语句,如果这俩不等,那么就会打印出selected device is not a touchscreen I understand。

 

tslib中的input版本号是在交叉编译的时候指定的,赋值给version,而EV_VERSION是在内核中定义,笔者做tslib时,用的2.6.39内核,这个EV_VERSION定义在linux源码的include/linux/input.h中,值是0x010001,而tslib中的version是和交叉编译器相同,查看编译器,在/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h中,值是0x010000,这俩明显不相等,当然不会满足version ==EV_VERSION,所以导致错误。

 

所以,以下提供两种解决方法

 

1.将内核源代码里的include/linux/input.h中的

#define EV_VERSION0x010001

改为:

#define EV_VERSION0x010000

 

2.将arm交叉编译工具中的头文件库中的

linux/input.h中的

#define EV_VERSION0x010000

改为

#define EV_VERSION0x010001

然后再编译tslib库

 

一般第一种就可以解决问题,因此,出现上面情况时,先不要急于换版本,如果二者版本不等,那么改一个就可以, 前提是二者版本相同

最后测试结果:

# ./ts_calibrate 
xres = 1024, yres = 600
Took 1 samples...
Top left : X = 42 Y = 46
Took 1 samples...
Top right : X = 996 Y = 62
Took 1 samples...
Bot right : X = 1022 Y = 559
Took 1 samples...
Bot left : X = 24 Y = 585
Took 1 samples...
Center : X = 507 Y = 290
23.785522 0.946048 -0.006575
0.619385 0.005139 0.962120
Calibration constants: 1558808 62000 -430 40592 336 63053 65536