by My Team Member WZF
在扬创UTU-2440 ARM开发板上成功移植了Qtopia4.2.0,Qtopia4.3.3,以及QtopiaCore4.3.5,QtEmbedded4.4。总结移植过程及TSLIB库在嵌入式设备上的应用。
首先必须明白,现在称的Qtopia4与Qt3的名称有一些变化,Qtopia4.x包括了原Qtopia在内的一整套程序,而Qt3.x中的qt- embedded在Qt4.4以前叫Qtopia-core,在Qt4.4中又改回Qt-embedded这个名字。(名字真多……)
对于一般QT4程序的嵌入式开发,只需要移植QtopiaCore就可以了。
移植前需要配置好编译环境,本文中采用的编译环境是:
主机系统:Ubuntu 8.04.1
主机编译器:GCC 4.2.4(Ubuntu 4.2.4-1ubuntu3)
交叉编译器:arm-linux-gcc-3.4.1
软件资源:qtopia-opensource-src-4.2.0.tar.gz
qtopia-opensource-src-4.3.3.tar.gz
qtopia-core-opensource-4.3.5.tar.gz
qt-embedded-linux-opensource-src-4.4.3.tar.gz
这里以qtopia-opensource-src-4.3.3.tar.gz为例,其它几种包的移植方法类似,其中qtopia-opensource-src-4.2.0的移植方法可以参考以下链接:
[1]http://blog.chinaunix.net/u2/86537/showart_1676803.html
移植QTOPIA:
设定工作目录为/home/arm
在工作目录下,解压qtopia-opensource-src-4.3.3.tar.gz
编译之前,打开qtopia-opensource-src-4.3.3/qtopiacore/qt/src/gui/embedded/qmouselinuxtp_qws.h
加上这2行:#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW(如果采用TSLIB这步似乎可以不做,未验证)
还有需要注意的地方是:看一下 qmouselinuxtp_qws.cpp /dev/h3600_tsraw, 是不是你板子上的驱动文件名字,如果不是改成一样就可以了。[2 ]
由于qtopia不能直接在源码目录中直接编译,所以还要单独建立一个目录,这里新建一个build目录
root@linux:/home/arm # mkdir build
root@linux:/home/arm # cd build
可以配置编译时的选项,通过configure的参数选择需要编译哪些模块或功能,关于configure的参数可以通过configure --help或者在源码包根目录下的README.html中查找。
这里仅给出一个例子,不一定完全要按这样写,但是,-xplatform linux-arm-g++ 和 -embedded arm 一定要加上以表明是交叉编译。
此外 -prefix指定了编译完后image安装的位置,默认为./image,注意!编译完成后程序一定要在这个指定的位置运行,否则会出错!
root@linux:/home/arm/build # ../qtopia-opensource-4.3.3/configure -edition phone -xplatform linux-arm-g++ -arch arm -prefix /opt/Qtopia -no-qvfb -displaysize 272x480 -no-ssl -no-bluetooth -no-dbus -no-drm -no-v4l2 -no-modem -no-libamr -extra-qt-config "-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg" -extra-qtopiacore-config "-xplatform qws/linux-arm-g++ -embedded arm -qt-mouse-linuxtp -qt-mouse-tslib -I/home/arm/tslib/include -L/home/arm/tslib/lib"
上面的例子中,将tslib库也编译进去作为触摸屏校准,由于我一开始用linuxtp触摸屏总是不能校准(反向),因此后来改用tslib。需要注意的是,这里需要指定tslib的头文件的库所在位置,所以必需在这个步骤之前交叉编译好tslib并把它放到/home/arm/tslib下。
交叉编译tslib的过程如下:[3 ][5 ]
root@linux:/home/arm # svn co svn://svn.berlios.de/tslib/trunk/tslib tslib
如果没有安装svn,请sudo apt-get install subversion
然后cd tslib
#export CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
#echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
#./autogen
//避免检查ac_cv_func_malloc_0_nonnull
#echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
//配置目标机、缓冲、安装路径
#./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=/home/arm/tslib
# make
# make install
如果出现错误,请检查m4,autoconf,automake是否已经安装。
tslib的配置将在本文的末尾详述。
接着说Qtopia4,上一步configure结束后,按照提示依次执行make,make install
这样在build目录下会得到image目录,里面的东西就是我们需要的了。
将image里面的文件通过NFS挂载或者其它方式移动到开发板的/opt/Qtopia目录下,然后编写一下shell脚本,内容如下:
#!/bin/sh
export set QTDIR=/opt/Qtopia
export set QPEDIR=/opt/Qtopia
export set KDEDIR=/opt/Qtopia
export set QWS_KEYBOARD="USB:/dev/input/event1"
export set QWS_MOUSE_PROTO="LinuxTP:/dev/h3600_tsraw"
export set PATH=$QPEDIR/bin:$PATH
export QWS_DISPLAY="LinuxFb:mmWidth105:mmHeight65:0"
export QWS_SIZE=480x272
export set LD_LIBRARY_PATH=$PATH:$QTDIR/lib:$QPEDIR/lib
$QTDIR/bin/qpe &
注意:此shell脚本中关于触摸屏的尺寸是针对三星4.3寸触摸屏。
执行脚本,如果显示及触摸屏反应一切正常,则基本移植成功,注意此时在/etc下必须要有校准文件pointercal
如果提示时区错误,则必须在/usr/share下存在zoneinfo,也可以参照[1 ]修改文件的位置。
如果提示共享库连接的错误,则可能是当时共享库与编译时所使用的库版本不同,可以参照另一篇文章《utu2440-利用busybox制作文件系统》进行更新。
如果没有pointercal,则可以通过tslib进行校准,方法如下:[3 ][4 ]
将/home/arm/tslib中的所有文件拷到开发板的某个目录下,这里假设为/usr/share/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 //设备名
Default: /dev/fb0
以上环境变量在实际开发中的实际配置可以根据实际情况决定。
除了环境变量以外,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
这里我把# module_raw h3600 的注释去掉了。
我写了一个SHELL脚本来实现TSLIB的校准:
1 #!/bin/sh
2 export TSLIB_ROOT=/usr/share/tslib
3 export TSLIB_TSDEVICE=/dev/h3600_tsraw
4 export TSLIB_FBDEVICE=/dev/fb0
5 export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
6 export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
7 export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
8 export QWS_MOUSE_PROTO="TPanel:/dev/h3600_tsraw"
9 export TSLIB_CALIBFILE=/etc/pointercal
10 export TSLIB_CONSOLEDEVICE=none
11 $TSLIB_ROOT/bin/ts_calibrate
要在加载TSLIB的情况下运行Qtopia,需要将原来的SHELL脚本改为:
1 #!/bin/sh
2 export TSLIB_ROOT=/usr/share/tslib
3 export TSLIB_TSDEVICE=/dev/h3600_tsraw
4 export TSLIB_FBDEVICE=/dev/fb0
5 export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
6 export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
7 export TSLIB_CALIBFILE=/etc/pointercal
8 export TSLIB_CONSOLEDEVICE=none
9 export HOME=/root
10 export QTDIR=/opt/Qtopia
11 export QPEDIR=/opt/Qtopia
12 export KDEDIR=/opt/Qtopia
13 export LD_LIBRARY_PATH=$PATH:$QTDIR/lib:$TSLIB_ROOT/lib:$LD_LIBRARY_PATH
14 export QWS_KEYBOARD="USB:/dev/input/event1"
15 export QWS_MOUSE_PROTO="Tslib:/dev/h3600_tsraw"
16 export PATH=$QPEDIR/bin:$PATH
17 export QWS_SIZE=480x272
18 export QWS_DISPLAY="LinuxFb:mmWidth115:mmHeight65:0"
19 [ -f /etc/pointercal ] || /usr/bin/calibrate
20 $QPEDIR/bin/qpe &
注意第15行中的Tslib
第19行的意思是,当/etc/pointercal不存在时(即触摸屏还没有进行校准),启动QTLIB校准程序(假设校准程序的脚本放在/usr/bin下,脚本名称为calibrate),校准程序执行后会在/etc下生成校准文件pontercal
对于一些包(库)的安装,可以通过设置configure的参数来进行交叉编译,这样就可以免去修改Makefile的麻烦,常见的方法是在 configure的后面加上参数--host=arm-linux(当然还可以是其它架构)。具体请看参考资料[5 ]。对于某一些包,如zlib,这种方法可能无效,因此建议在configure之前先用configure --help查看一下是否支持这样的参数。对于此法无效的包来说,只好先configure再改Makefile了。
我也尝试过移植QtExtended4.4,但是编译时出现Prerequisite failed的错误,暂时没找到解决方案,也没有再研究。
[1]http://blog.chinaunix.net/u2/86537/showart_1676803.html
[2]http://blog.chinaunix.net/u2/86537/showart_1666271.html
[3]TSLIB校准过程 http://www.mangbar.com/document/8a80809d19bd3a240119ccd45b90399e
[4]tslib-1.4 交叉编译和分析文档http://linux.chinaunix.net/bbs/archiver/tid-1042741.html
[5]Configure 参数选项详解http://www.linuxdiyf.com/viewarticle.php?id=22076
[6]http://blog.chinaunix.net/u2/86537/showart_1668831.html