2010年(21)
分类: 嵌入式
2010-01-15 17:00:15
我的系统环境以及软件准备如下:
主机操作系统:Ubuntu 9.10
主机编译器:gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
交叉编译器:arm-linux-gcc 3.4.1(开发板的文档里自带的)
软件安装包:(软件包事先下载到了主目录下的/utuLinux2.6.24目录)
qt-embedded-linux-opensource-src-4.5.3.tar.gz
qt-x11-opensource-src-4.5.3.tar.gz
tslib-1.4.tar.gz
Qt的软件安装包可以到下载,tslib。
前面已经构建了pc上的qte开发环境,这一篇主要记录移植的过程。
1.编译安装qt-embedded(进入到/utuLinux2.6.24目录)
A、解压qt-embedded-linux-opensource-src-4.5.3.tar.gz
把源文件qt-embedded-linux-opensource-src-4.5.3.tar.gz解压到当前目录下。执行:
tar xvzf qt-embedded-linux-opensource-src-4.5.3.tar.gz
将其解压得到qt-embedded-linux-opensource-src-4.5.3目录,重命名为qt-embedded-linux-opensource-src-4.5.3-arm。在qte-arm目录下编译arm架构的编译工具链,用于交叉编译在arm开发板上运行的程序。
B、编译安装触摸屏库软件tslib-1.4.tar.gz
解压tslib-1.4.tar.gz文件到当前目录,进入到解压后的tslib-1.4目录。运行:
./autogen.sh
./configure --prefix=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/tslib-1.4 --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
make
sudo make install
这样就可以在/usr/local/Trolltech/QtEmbedded-4.5.3-arm/tslib-1.4目录下看到相关的应用程序、共享库、配置文件等。
C 、编译安装qte-arm (进入到qt-embedded-linux-opensource-src-4.5.3-arm目录)
./configure -prefix /usr/local/Trolltech/QtEmbedded-4.5.3-arm \
> -no-qt3support \
> -qt-zlib \
> -qt-libtiff \
> -qt-libpng \
> -qt-libmng \
> -qt-libjpeg \
> -make libs \
> -nomake examples \ (因为这个是arm版本,所以编译出来的程序只能在arm开发板上运行,编译时把这些给去掉,加快编译过程)
> -nomake demos \
> -nomake docs \
> -no-nis \
> -no-cups \
> -no-iconv \
> -xplatform qws/linux-arm-g++ \
> -embedded arm \
> -little-endian \
> -qt-freetype \
> -depths 8,16,24,32 \
> -qt-gfx-linuxfb \
> -no-gfx-transformed \
> -no-gfx-qvfb \
> -no-gfx-vnc \
> -no-gfx-multiscreen \
> -qt-kbd-usb \
> -qt-kbd-tty \
> -qt-mouse-pc \
> -no-glib \
> -qt-mouse-tslib -I /usr/local/Trolltech/QtEmbedded-4.5.3-arm/tslib-1.4/include -L /usr/local/Trolltech/QtEmbedded-4.5.3-arm/tslib-1.4/lib
make
make install
编译选项-qt-mouse-tslib需要用到触摸屏功能的动态库,所以得把之前编译安装的tslib库包含进来。
至此,Qt/E的编译安装工作算是完成了,把这两个都编译好所花时间大约3个小时
接下来进行移植。(我用的是NFS启动的文件系统,所以这个移植和一般的移植有点不一样,主要是把需要的文件拷贝到NFS文件系统的相应位置,然后对环境进行配置。)
A、tslib 的环境变量和配置
(以下内容主要摘自TSlib校准原理)
在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。
Tslib
是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在
Qtopia 4.*版本中,默认的Tslib版本为Tslib 1.4。在Qtopia 2.*版本中,默认的Tslib版本为Tslib 1.3。
在 嵌入式中,由于触摸屏的种类多样、质量不一,采用Tslib 的参考配置往往无法获得较好的触摸屏触摸效果,同样需要经过大量的测试才能得到满意的配置参数,恶劣情况下,甚至需要对Tslib 的算法进行进一步的优化。下面就Tslib 的环境变量、配置文件等进行简要的介绍。
1)环境变量
为了实现Tslib 的正确运行,需要对如下的Tslib 的环境变量进行配置:
TSLIB_TSDEVICE //触摸屏设备文件名
Default (no inputapi): /dev/touchscreen/ucb1x00
Default (inputapi): /dev/input/event0
TSLIB_CALIBFILE //校准的数据文件,由ts_calibrate 校准程序生成
Default: ${sysconfdir}/pointercal
TSLIB_CONFFILE //配置文件名
Default: ${sysconfdir}/ts.conf
TSLIB_PLUGINDIR //插件目录
Default: ${datadir}/plugins
TSLIB_CONSOLEDEVICE //控制台设备文件名
Default: /dev/tty
TSLIB_FBDEVICE //FrameBuffer设备名
Default: /dev/fb0
以上环境变量在实际开发中的实际配置可以根据实际情况决定。
2)配置文件
除了环境变量以外,Tslib 的配置文件ts.conf 同样是个十分重要的部分,在ts.conf 中配置了需要加载的插件、插件加载顺序以及插件的一些约束参数,这些配置参数对触摸屏的触摸效果具有十分重要的影响。
下面是Tslib 1.4 中的ts.conf 的参考配置:
# Uncomment if you wish to use the linux input layer event interface
# module_raw input
# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
# module_raw collie
# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860
# module_raw corgi
# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface
# module_raw ucb1x00
# Uncomment if you're using an HP iPaq h3600 or similar
# module_raw h3600
# Uncomment if you're using a Hitachi Webpad
# module_raw mk712
# Uncomment if you're using an IBM Arctic II
# module_raw arctic2
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
其中 pthres 为Tslib提供的触摸屏灵敏度门槛插件;variance 为Tslib提供的触摸屏滤波算法插件;dejitter 为Tslib提供的触摸屏去噪算法插件;linear 为Tslib 提供的触摸屏坐标变换插件。
tslib 的实际配置:
去掉module_raw input前面的#号,同时把其他#号注释项全部删除,以免给后来的操作带来麻烦。我的最终ts.conf 内容为:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
B、tslib、qte-arm 的移植
目 前我是使用nfs方式启动开发板的,所以这个“移植”不大像真正意义上的移植。新建一个/opt/utuLinux2.6.24/s3c2440_recover目录作为开发板nfs方式启动所要挂载的根文件系统目录,里面是开发板自带的文件系统的压缩包,解压之后的文件夹。
1)在/utuLinux2.6.24/s3c2440_recove目录下新建opt子目录,然后再新建一个qt/lib目录。
cd /utuLinux2.6.24/s3c2440_recove
mkdir opt
cd opt
mkdir qt
cd qt
mkdir lib
拷贝/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib目录下的 libQtCore、libQtGui、libQtNetwork 动态链接库及其对应的所有符号链接到qt/lib目录下。
2)
在/utuLinux2.6.24/s3c2440_recove目录的usr目录下新建一个
local/Trolltech/QtEmbedded-4.5.3-arm/lib/fonts目录,然后到/usr/share/fonts目录找到
wqy(文泉驿)的字体文件并拷贝过来。
3)拷贝/usr/local/Trolltech/QtEmbedded-4.5.3-arm/tslib-1.4目录到/utuLinux2.6.24/s3c2440_recove目录下
4)设置环境变量。编辑/utuLinux2.6.24/s3c2440_recove/etc/profile文件(即开发板系统上的/etc/profile文件),输入如下内容(假定当前工作目录为/utuLinux2.6.24/s3c2440_recove):
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\$ '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH
export QTDIR=/opt/qt
export QPEDIR=$QTDIR
export T_ROOT=/tslib-1.4
export PATH=$T_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_KEYBOARD=USB:/dev/input/event1
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export QWS_DISPLAY=LinuxFb:mmWidth45:mmHeight60:0
export QWS_SIZE=320x240
(注:红色字体是后来自己添加的,经过修改的)
到这里,tslib、qte-arm的移植工作算是完成了,至于上面环境变量的意思,
5)测试。以nfs的方式启动开发板上的系统,然后执行ts_calibrate命令对触摸屏进行校正,如果该命令能成功执行,那么恭喜你,任务完成了。当然,你还可以执行ts_test命令做进一步的测试。也可以编写一个简单的helloworld到开发板上进行测试。
6)可能出现的问题汇总
1.在执行./ts_calibrate命令对触摸屏进行校正的时候,出现如下错误:
./ts_calibrate:error while loading shared libraries:libts-0.0.so.0:cannot open shared object file:Error 40
解决办法:
#echo $LD_LIBRARY_PATH //查看lib路径
#export LD_LIBRARY_PATH=$T_ROOT/lib
ts_open:No such file or directory
解决办法:
出错原因是我的NFS文件系统在/dev下就有event0,而不是在/input下面。所以
#export TSLIB_TSDEVICE=/dev/event0
2.在执行./helloworld的时候出现如下错误:
./t1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决办法:
将/usr/local/arm/3.4.1/arm-linux/lib下面的libstdc++.so.6及相关库文件拷贝到/utuLinux2.6.24/s3c2440_recover/lib(nfs文件系统目录)下。
QWSTslibMouseHandlerPrivate: ts_open() failed with error: 'No such file or directory'
解决办法:
export QWS_MOUSE_PROTO=tslib:/dev/event0
Cannot create qte data directory: /tmp/qtembedded-0
原因:在根目录下没有创建tmp目录
解决办法:
在根目录下mkdir tmp
至此,终于完成了整个移植过程。
chinaunix网友2010-04-28 13:32:15
您好,照着您的博客,我的第一个QT程序也可以在mini2440开发板上运行了,我现在有两个问题想问你一下:1)我现在开机总是要进行触摸屏校准,网上说,校准一次之后会生成一个配置文件,下次有这个配置文件了就不需要再次校准了,为什么我的要总校准呢? 2)我的触摸屏好用了,可是鼠标不好用,怎么做能让鼠标和触摸屏一起好用呢?USB的驱动是有的,我在之前没加tslib的时候可以看到终端有鼠标移动的打印信息的。希望得到您的帮助
chinaunix网友2010-03-24 15:37:26
麻烦你问一下啊,移植完之后,你运行自己编写Qt程序会很卡吗??为什么我一直之后,触摸屏可以校准,也可以运行tslib自带的测试程序,可是,运行Qt例子时候,触摸点击鼠标可以很准确的跟着走,但是程序按键要很久才响应呢??