• 7255阅读
  • 0回复

[共享]Qt3的tslib-path补丁和Tslib的编译支持触摸屏成功案例和估计会遇到的bug [复制链接]

上一主题 下一主题
离线lalale
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-27
Qt3的tslib-path补丁和Tslib的编译支持触摸屏和估计会遇到的bug
做了一个月的qt界面,一直遇到一些bug无法解决,到论坛发求助信号,感谢家的回复。下面是我一些qt触摸移植成功的总结分享,第一为了方便自己以后的查找,其次正在为移植qt触摸一直的同学一个参考。

内核:linux-2.6.18
编译器:arm-linux-3.4.1
3.安装tsilib
解压文件,生成tslib-1.3的目录
#cd tslib-1.3
#mkdir image //安装目录
#./autogen.sh //生成config文件
#echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
//Pwd是image的路径
#./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$PWD/image --enable-inputapi=no
红色的部分是触摸屏驱动不支持ioctl操作
#make
为了防止出现“libtool:link: only absolute run-paths are allowed“的错误,在/tslib/plugins/Makefile里面找rpath,找到将其注释并加上绝对路径。
#LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
#make install
在测试触摸屏前,要看看触摸屏的设备节点h3600_tsraw文件,如果没有,在rcS文件中加上
ln -s /dev/ts0  /dev/h3600_tsraw

编译完成后在image目录里就是需要移植到板内的文件。

我这边是采用nfs和主机连结的。
设置板内的环境变量
export LD_LIBRARY_PATH=/touch/lib:$LD_LIBRARY_PATH//直径stlib库文件的路径可以PATH结合理解
export QWS_MOUSE_PROTO=tslib:/dev/h3600_tsraw//指定触摸屏设备节点 在dev显示的节点为ts0具体设置在rS里面
export TSLIB_CALIBFILE=/touch/pointercal //指定触摸屏校准文件pintercal的存放位置
export TSLIB_CONFFILE=/touch/etc/ts.conf //指定TSLIB配置文件的位置

export TSLIB_CONSOLEDEVICE=none//tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty
/export TSLIB_FBDEVICE=/dev/fb0, //指定帧缓冲设备

export TSLIB_PLUGINDIR=/touch/plugins//指定触摸屏插件所在路径
export TSLIB_TSDEVICE=/dev/h3600_tsraw//指定触摸屏设备节点
export TSLIB_TSEVENTTYPE=H3600//节点和触摸屏中的修改的的节点是一样 具体的可以

置好环境变量就可以对触摸屏校准了,到目录=/mnt/nfs/tslib/bin下执行
#./ts_calibrate
屏摸上会出现5点校准,校准完成后看一下目录/mnt/nfs/tslib/下有没有生成pointercal文件
#ls /mnt/nfs/tslib/
需要生成pointercal文件才可以 如果没有生成,请确认你的这个目录下是否可写操作
然后运行test文件
#./ts_test
要求运行后触摸笔指哪,光标就跟到哪。就这算成功了。
{
(如果要开机自动启动触摸屏文件,则需要做以下工作)。
在rcS中加入/bin/qt &语句。然后再/bin文件中建立qt文件,在qt
中设计环境变量
   开机启动触摸屏环境变量/bin/qt
#!/bin/sh
export QPEDIR=/touch/tslib/
export LD_LIBRARY_PATH=/touch/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO=TPanel:/dev/h3600_tsraw
export TSLIB_CALIBFILE=/touch/pointercal
export TSLIB_CONFFILE=/touch/ts.conf
export TSLIB_CONSOLEDEVICE=none e
xport TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/touch/plugins
export TSLIB_TSDEVICE=/dev/h3600_tsraw
export TSLIB_TSEVENTTYPE=H3600
$QPEDIR/bin/ts_calibrate &
sleep 10
$QPEDIR/bin/ts_test &
开机就能实现上面的目的了。

}
二 :采用qte-3.3.4+tslib-1.3 的方式
内核环境:linux-2.6.18
编译器:arm-linux-3.4.1
1.     编译tslib-1.3
2.     可参考下面文章,很详细
将生成的库文件包括lib下的(libts.so)和插件plugins里的校准库全部考到qte3.3.4/lib里.include里的头文件ts.conf考到qte3.3.4/include里
同时将编译Qt-X11得到的uic考到qte-3.3.4/bin里。
2.给qte-3.3.4打补丁使其支持tslib
网上下的补丁文件有点问题用patch命令打补丁不完全,于是手工打补丁
按照patch的方法,增加两个文件到src/embedded/下,修改相应文件src/embedded/qmousedriverfactory_qws.cpp, src/embedded/qt_embedded.pri,
configure
3.     交叉编译
4.     export QTDIR./configure –embedded arm –thread –qvfb –qconfig-large –qt-mouse-tslib –I$QTDIR/include –L$QTDIR/lib –lts
  make
这里需要强制指定tslib库位置,否则,会报错找不到libts。
结果make仍然报错,说libts不兼容。
/usr/bin/ld: skipping incompatible /home/hjcai/qt-arm/qte-arm-tslib/lib/libts.so when searching for -lts
/usr/bin/ld: cannot find –lts
读错误信息发现是编译到src/moc出现上述问题,
于是先:
echo yes |./configure -embedded arm -thread  
cd src/moc
make
然后再:
echo yes |./configure -embedded arm –thread –qt-mouse-tslib –I$QTDIR/include –L$QTDIR/lib
make
设置环境变量

export LD_LIBRARY_PATH=/touch/lib:$LD_LIBRARY_PATH//直径stlib库文件的路径可以PATH结合理解
export QWS_MOUSE_PROTO=tslib:/dev/h3600_tsraw//指定触摸屏设备节点 在dev显示的节点为ts0具体设置在rS里面
export TSLIB_CALIBFILE=/touch/pointercal //指定触摸屏校准文件pintercal的存放位置
export TSLIB_CONFFILE=/touch/etc/ts.conf //指定TSLIB配置文件的位置

export TSLIB_CONSOLEDEVICE=none//tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty
/export TSLIB_FBDEVICE=/dev/fb0, //指定帧缓冲设备

export TSLIB_PLUGINDIR=/touch/plugins//指定触摸屏插件所在路径
export TSLIB_TSDEVICE=/dev/h3600_tsraw//指定触摸屏设备节点
export TSLIB_TSEVENTTYPE=H3600//节点和触摸屏中的修改的的节点是一样 具体的可以查看src下面的makefile
export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH//这个是qt程序运行的库文件的制定
./menu -qws
如果要开机就启动触摸屏程序,则将上述环境变量放置在你的根文件系统/etc/rcS中。
#!/bin/sh
export LD_LIBRARY_PATH=/touch/lib:$LD_LIBRARY_PATH
export QWS_MOUSE_PROTO=tslib:/dev/h3600_tsraw //设备文件根据你的更改
export TSLIB_CALIBFILE=/etc/pointercal      (将触摸屏校正的文件拷贝到/etc中)  
export TSLIB_CONFFILE=/touch/etc/ts.conf
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/touch/plugins
export TSLIB_TSDEVICE=/dev/h3600_tsraw //设备文件根据你的更改
export TSLIB_TSEVENTTYPE=H3600
export QTDIR=/qt
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
/opt/menu -qws &
可能会遇到的bug

:/touch/bin> ./ts_calibrate
SIGSEGV//  SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址
这个错误在哪里?
既然触摸编译的时候没有出错那么就有可能是环境变量的出错,查找了相关的环境变量设置发现:
export TSLIB_CALIBFILE=/touch/pointercal这里
在touch的文档里面建立了pointercal 而这个pointercal不是建立的 而是自动生成的 所以是名字冲突了
所以错误在这里
Bug解决

在测试的时候,运行./ts_calibrate又出现了令人十分之郁闷的错误:
ts_config: Success// 这里可以理解成为触摸已经执行成功,但是环境变量估计有问题的理解
这个问题的错误在哪里?
我这个错误是以下环境变量的设置问题
上面的环境变量中
export TSLIB_PLUGINDIR=/touch/plugins 但是在nfs的touch中米有这个文档
这个文档在share/ts/plugins中
固产生了此错误
Bug解决

当时在这里遇到一个状况就是光标不能随着触笔动而动,找了很多方法也无法解决,在一个blog碰到一个同学他是如此解决的
打开文档etc/ts.conf文件然后会有:
#module mousebuts
module variance xlimit=50 ylimit=50 pthreshold=3
module dejitter xdelta=1 ydelta=1 pthreshold=3
module linear
然后我将第二句话module variance xlimit=50 ylimit=50 pthreshold=3注释掉然后将被注销的第一句#module mousebuts取消注销然后整个画面就动起来了~也就是成功了^_^但是到现在为止我也不明白为什么。
module mousebuts
#module variance xlimit=50 ylimit=50 pthreshold=3
module dejitter xdelta=1 ydelta=1 pthreshold=3
module linear

希望有兴趣的可以一起交流。QQ:328947046

快速回复
限100 字节
 
上一个 下一个