tslib最主要的用途就是可以校准触摸屏,通常可以把它作为触摸屏的一个适配层,为上层的应用程序提供统一的接口。在这里,我们移植tslib,为以后移植和使用QT打下基础。
首先要构建交叉开发环境:
1、工具链和安装
工具链压缩包: arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,安装工具链只需将压缩包进行解压,并设置环境变量即可。解压后生成 arm-2011.03 目录。设置工具链路径,将 arm-2011.03/bin 目录添加到系统 PATH 环境变量中即可,假如工具链 安 装 在 /home/ctools/arm-2011.03 目 录 , 则 需 要 指 定 交 叉 编 译 目 录 到/home/ctools/arm-2011.03/bin。
具体设置方法:修改~/.bashrc (或者/etc/profile)文件,在 PATH 变量中增加交叉编译工具链的安装路径,然后运行~/.bashrc 文件,使设置生效。操作:
vim ~/.bashrc
添加PATH=$PATH:/myTools/crosstools/arm-2011.03/bin//增加交叉编译器安装路径
在终端输入 arm-none-并按 TAB 键, 如果能够看到很多 arm-none-linux-gnueabi-前缀的命令, 则基本可以确定交叉编译器安装正确。
接下来我们下载tslib-1.4.tar.gz,并完成解压、配置、编译和安装操作,命令如下:
tar -zxvf tslib-1.4.tar.gz
cd tslib
先执行./autogen-clean.sh
接下来执行./autogen.sh,会生成许多文件,其中就会有configure
./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --host=arm-none-linux-gnueabi --prefix=/opt/tslib ac_cv_func_malloc_0_nonnull=yes
-prefix这里是生成的目录,是你之后生成文件的路径
arm-none-linux-gnueabi-这个是你交叉编译的前缀,可能会有人不一样,你自己去你交叉编译的安装目录看下
如果不一样就将上面的arm-none-linux-gnueabi-替换成你的
成功之后再执行make && make install
成功之后你就可以在你-prefix指定的目录下看到etc lib include bin目录的生成
../libtool: line 970: arm-linux-gcc: command not found
make[2]: *** [ts_attach.lo] 错误 1
make[2]:正在离开目录 `/opt/tslib'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/opt/tslib'
make: *** [all] 错误 2
说明你交叉编译不对,像我就是arm-none-linux-gnueabi-而我写成了arm-linux-gcc:所以报错
然后再把生成tslib移植到开发板上,也就是复制相应的文件到开发板的根文件系统内,我放的位置是/opt目录下:
/opt/tslib/etc下的ts.conf文件复制到根文件系统的/etc下,并修改其中的内容,下面是ts.conf文件的前两行;
# Uncomment if you wish to use the linuxinput layer event interface
# module_raw input
去掉# module_raw input前面的注释以及空格,也就是module要顶格。该文件内的其他部分无需改动。
最后添加环境变量,把有关tslib的环境变量添加到开发板根文件系统的/etc/profile文件内,添加的内容如下:
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_TSEVEVTTYPE=input
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
这里每个人都不一样,网上一百度可以看到很多
下面对这些环境变量做一简单的说明:
TSLIB_TSDEVICE——触摸屏设备节点,这个要根据自己开发板的情况填写;
TSLIB_CONFFILE——配置文件名,就是前面复制并修改的ts.conf文件;
TSLIB_PLUGINDIR——插件目录
TSLIB_CALIBFILE——校准的数据文件pointercal。当执行ts_calibrate命令对触摸屏进行校正的时候,会生成一个校准文件,这样在以后使用触摸屏的时候,系统会根据该文件正确判断触点的位置。在这里我把pointercal文件放到temp目录下,因为对于我的系统来说,temp目录是可读写的。如果你选择的pointercal文件所在目录是不可写的,那么是不会生成pointercal文件的,即使执行了ts_calibrate命令,触点的位置也是错误的;
TSLIB_CONSOLEDEVICE——控制台设备文件名;
TSLIB_FBDEVICE——LCD设备节点,也要根据自己开发板的情况填写。
这样开发板的根文件系统就添加了tslib,重新编译根文件系统,并把它烧写进开发板内,启动开发板后,到/opt/bin/下执行ts_calibrate命令,用来进行校验触摸屏;执行ts_test命令可以对触摸屏进行测试。
如果你运行ts_calibrate碰到了while loading shared libraries:/opt/lib/libts-0.0.so.0:file too short,可以
重建 libts.so 和 libts.so.0 连接
ln -s lib-0.0.so.0.1.1 libts.so.0
ln -s lib-0.0.so.0.1.1 libts.so
再次启动脚本
这样就行了!!
其他问题:
1、如果是新板子10分钟会黑屏,可以先设置setblank=0,不进入待机模式
2、如果以后你运行qt程序的时候,提示了你一句No such plugin for spec "tslib",那是因为你qt的插件环境变量指定了tslib,去/etc/profile里面将这句话屏蔽或删除就好啦/
3、如果出现了ts_config() failed (No such file or directory),就在/etc/profile下添加
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so
4、 Segmentation fault
ts.conf没修改,或者修改后前边的空格没有删除掉 vi /opt/ts.conf 最后内容如下:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
5、ts_open: No such file or directory
导出触摸屏的环境变量:
export TSLIB_TSDEVICE=/dev/input/event0/
6、open tty:No such file or directory
KDSETMODE:Bad file descriptor
导出控制台环境变量:
export TSLIB_CONSOLEDEVICE=none
7、Couldnt load module pthres
No raw modules loaded.
ts_config: Success
解决办法:
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts/
8、Couldnt open tslib config file: No such file or directory
ts_config: Illegalseek
解决办法:
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
9、 不要在pointercal对应的目录下,建立一个空的pointercal文件,否则在运行ts_calibrate时,也可能会出现Segmentation fault