1、下载tslib的源码
tslib的安装包:
https://pan.baidu.com/s/1WC90hbxE1Y8f4DhhEC9SMQ
2.解压 # tar -jxvf tslib_1.4.tar.bz
3.配置
//如果出错请看下面解决办法
//创建这个目录是把qt安装到这里
./autogen.sh出错是缺少安装包:./autogen.sh: 4: autoreconf: not found
#sudo apt-get install autoconf automake libtool
4.编译和安装
//就安装到/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/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) 报错:所匹配的设备不是触摸屏
看到这个错误的提示,我们应该想到tslib源码里面肯定有这个错误提示的条件,这样就让我们有了思路,我们可以去找到这个文件看看他错误判断的条件是啥?
$ pwd
/home/lzj/fl2440/3rdparty/tslib/plugins
$ vim input-raw.c
首先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库
一般第一种就可以解决问题,因此,出现上面情况时,先不要急于换版本,如果二者版本不等,那么改一个就可以, 前提是二者版本相同 。
最后测试结果:
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