qt移植问题

经过了半个多月,终于移植成功了,好兴奋!之所以这么长时间是由于板子上自带的是Qtopia1.7.0+qte2.3.7,移植的时候不知道该怎么做。 用过nfs挂载的方式,不是nfs启动,只是把必要的文件挂载上去,这个时候可以运行程序,但是有两个鼠标的箭头,一个是系统的,一个是qte的,qte 的没有办法使用,因为没有移植tslib.但是如果移植tslib的话估计会跟板子里面的有冲突,所以不知道该怎么办。查资料的时候好多都是用NFS启动 的,可是我之前有试过弄成NFS启动的,但是没有成功,昨天晚上又试了一下,成功启动,所以后面就进行的很顺利了。下面记录一下重要过程,以防以后忘记。
主 要参考了这篇文章
http://blog.chinaunix.net/u3/109488/showart_2138306.html 

我 的系统环境以及软件准备如下: 
主机操作系统: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 的软件安装包可以到http://ftp3.ie.freebsd.org/pub/trolltech/pub/qt/source/ 下 载,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

至 此,终于完成了整个移植过程。

你可能感兴趣的:(qt,module,library,path,ubuntu,file,Linux,Device,Driver)