硬件平台:ARMEasy6410开发板
操作系统:Linux
版 本:TSLIB1.4
第一步:在网上下载TSLIB1.4的版本源代码,推荐下载地址:
http://armembed.5d6d.com/
【嵌入式交流网/ARM开发工具DIY/TSLIB1.3 & TSLIB1.4】
第二步:安装tslib-1.4.tar.gz
1. 解压tslib-1.4.tar.gz:
tar zxvf tslib-1.4.tar.gz
2. 在TSLIB1.4下:
./autogen.sh
这时会生成configure配置文件
3. 配置TSLIB1.4的编译环境:
./configure --prefix=/usr/local/lib/ --host=arm-none-linux-gnueabi ac_cv_func_malloc_0_nonnull=yes
4. make
5. make install
这时,在/usr/local目录下将会生成lib目录,目录下生成有etc,include,bin,lib四个文件夹。
6. 打包生成的TSLIB文件:
cd /usr/local/lib
tar zcvf tslib.tgz etc include bin lib
7. 将打包好的tslib.tgz拷到开发板文件系统的/usr/local目录,解压该文件
8. 编辑/usr/local/etc下的ts.conf文件,编译内容如下:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=10000
module linear
注意,确保module_raw前面没有空格,否则会弹出Segmentation fault的错误。
9. 编辑/etc/profile文件,在后面添加如下环境变量:
export TSLIB_ROOT=/usr/local
export LD_LIBRARY_PATH=/usr/local/lib #指定tslib
export TSLIB_TSDEVICE=/dev/input/event0 #指定触摸屏设备节点为event0.在进入文件系统后可以在/dev下查到有input文件夹,里面有event0这个文件。
export TSLIB_CONFFILE=/usr/local/etc/ts.conf #指定配置文件为ts.conf
export TSLIB_PLUGINDIR=/usr/local/lib/ts #指定模块文件
export TSLIB_CONSOLEDEVICE=none #控制台设为none
export TSLIB_CALIBFILE=/etc/pointercal #指定触摸屏校准文件pointercal的存放位置
export TSLIB_FBDEVICE=/dev/fb0 #指定帧缓存设备节点为fb0
注意:TSLIB_TSDEVICE根据不同板子这里设置可能会有差异,具体在开发板进入文件系统后查询dev下的文件,通常在input下会有触摸屏的驱动程序文件。我这里是event0,因此对应设备节点填/dev/input/event0.
10. 测试TSLIB
cd /usr/local/bin
./ts_calibrate
./ts_test
在调试过程中遇到了很多问题,如出现没有这个目录的错误提示,通常为TSLIB_TSDEVICE路径没有设置正确。出现Segmentation fault的错误,通常为ts.conf中格式不对,如前面多加了空格等。值得注意的是,如果在/etc目录下存在pointercal这个校准文件,如果执行./ts_calibrate或是./ts_test,也会出现这个错误。解决办法:将/etc下的校准文件pointercal删掉即可。
另外,还遇到一个特别奇怪的问题,执行./ts_calibrate和./ts_test都正常,但是就是进入QT后无法正常工作,发现/etc下的pointercal文件为0字节,手动执行./ts_calibrate校准后,pointercal文件确实正常了,但是没有立即生效。重启开发板,发现/etc下的pointercal文件又变为0字节了。原来在文件系统的脚本中也要做修改。在ARMEasy6410开发平台上需要修改rootfs_qtopia_qt4/bin下的qt4和qtopia两个文件,qt4修改后脚本指令如下:
#!/bin/sh
if [ -e /etc/ARMEasy6410-ts-input.conf ] ; then
. /etc/ARMEasy6410-ts-input.conf
fi
true ${TSLIB_TSDEVICE:=/dev/input/event0}
TSLIB_CONFFILE=/usr/local/etc/ts.conf
export TSLIB_TSDEVICE
export TSLIB_CONFFILE
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_DISPLAY=:1
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin
if [ -c /dev/input/event0 ]; then
export QWS_MOUSE_PROTO="Tslib"
if [ ! -s /etc/pointercal ] ; then
rm /etc/pointercal
/usr/local/bin/ts_calibrate
fi
else
export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice"
fi
export QWS_KEYBOARD=TTY:/dev/tty1
export HOME=/root
#cd /usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher
#lqm changed for QT4.7.
cd /usr/local/Trolltech/QtEmbedded-4.7.0-arm/demos/embedded/fluidlauncher
./fluidlauncher -qws
hotplug
qtopia文件修改后的脚本文件如下:
#!/bin/sh
if [ -e /etc/ARMEasy6410-ts-input.conf ] ; then
. /etc/ARMEasy6410-ts-input.conf
fi
true ${TSLIB_TSDEVICE:=/dev/input/event0}
TSLIB_CONFFILE=/usr/local/etc/ts.conf
export TSLIB_TSDEVICE
export TSLIB_CONFFILE
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export CAMERA_DEVICE=/dev/video2
if [ -c /dev/input/event0 ]; then
export QWS_MOUSE_PROTO="TPanel"
if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then
rm /etc/pointercal
fi
else
export QWS_MOUSE_PROTO="USB:/dev/input/mice"
>/etc/pointercal
fi
export QWS_KEYBOARD=TTY:/dev/tty1
export KDEDIR=/opt/kde
export HOME=/root
exec $QPEDIR/bin/qpe 1>/dev/null 2>/dev/null
在rootfs_qtopia_qt4/etc下的ARMEasy6410-ts-input.conf文件内容修改如下:
TSLIB_TSDEVICE=/dev/input/event0
整个TSLIB的移植,花了差不多两个星期的时间。在这里留下记录供后来者分享,少走些弯路。另外,TSLIB默认的校屏顺序是左上,右上,右下,左下,中间。这一顺序和WINCE下是截然相反的。这里可以通过修改TSLIB源代码将顺序反过来。校屏的十字架,上面的提示文字等都可以自定义。ARMEasy6410 出货默认和WINCE的校屏顺序一致。