前言:看ok6410上落伍out的qtopia不爽很久了,Qt4.7.0正式release了,干脆就移植下
摘要:飞凌ok6410开发板上移植Qt4.7.0 内容:
主机环境为ubuntu10.04,交叉工具链为飞凌自带的 这次移植就直接切入主题,不考虑x11版本qvfb的提供和x86版本的Qt4.7.0 for embedde。
1.编译tslib,tslib的下载地址已经改变了,现在为http://github.com/kergoth/tslib/downloads,不过已经很久没更新了,解压到自定义目录,然后执行以下步骤:
#./autogen.sh
#./configure –prefix=/home/cnnbboy/mytslib/ –host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install
一般来说,会顺利安装完毕,安装完毕后,就直接编译Qt4.7.0
2.编译Qt4.7.0,解包从qt.nokia.com下载的源码,然进入源码目录,进行编译安装,进行如下操作:
#./configure ”
-release ”
-shared ”
-fast ”
-no-largefile ”
-qt-sql-sqlite ”
-no-qt3support ”
-no-xmlpatterns ”
-no-mmx ”
-no-3dnow ”
-no-sse ”
-no-sse2 ”
-no-svg ”
-no-webkit ”
-qt-zlib ”
-qt-gif ”
-qt-libtiff ”
-qt-libpng ”
-qt-libmng ”
-qt-libjpeg ”
-make libs ”
-nomake tools ”
-nomake examples ”
-nomake docs ”
-nomake demo ”
-no-nis ”
-no-cups ”
-no-iconv ”
-no-dbus ”
-no-openssl ”
-xplatform qws/linux-arm-g++ ”
-embedded arm ”
-little-endian ”
-qt-freetype ”
-depths 16,18 ”
-qt-gfx-linuxfb ”
-no-gfx-transformed ”
-no-gfx-multiscreen ”
-no-gfx-vnc ”
-no-gfx-qvfb ”
-qt-kbd-usb ”
-no-glib ”
-qt-mouse-tslib -I/home/cnnbboy/mytslib/include -L/home/cnnbboy/mytslib/lib
这些参数是我移植Qt4.5.1时代就可开始用的参数,当然,随着经验的增加,参数也越来越熟悉,目前我使用这些参数配置,一般可以在两个小时内完成编译。
编译完成后,安装
#sudo make install 就会安装入默认的路径/usr/local/Trolltech/QtEmbedded-4.7.0-arm
说个题外话,虽然trolltech已经被nokia收购多年了,但是安装路径里还保留着trolltech这个名字,奇趣,还有多少人能记着这个缔造Qt的公司呢。
3.移植,也就是把编译完毕的库文件想办法复制到开发板上,前面已经谈到过在ok6410上NFS启动,所以将库到文件系统下即可,执行步骤如下; #mkdir /forlinx/root/usr/local/Trolltech/QtEmbedded-4.7.0-arm 将Qt4.7.0的库文件拷贝至该目录
#cp -r /usr/local/Trolltech/QtEmbedded-4.7.0-arm/lib /forlinx/root/usr/local/Trolltech/QtEmbedded-4.7.0-arm
#mkdir /forlinx/root/usr/local/tslib-arm 将tslib的库和插件拷贝至该目录
#cp /home/cnnbboy/mytslib/* /forlinx/root/usr/local/tslib-arm
这些准备ok后,就是设置环境变量了,如下:
export QTDIR=/usr/local/Trolltech/QtEmbedded-arm
export T_ROOT=/usr/local/tslib-arm
export PATH=$QTDIR/bin:$PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO=tslib:/dev/input/event0
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib 这些就是根据自己放库文件来设置的,这时选取一个example编译就可以在班子上跑起来。
注意点:
1.跑自己移植的Qt之前,需要把原来板子配置的qtopia去掉,直接编译/etc/init.d/rcS,将最后一行启动qtopia的语句注释掉即可;
2.需要注意的是TSLIB_TSDEVICE=/dev/input/event1,而不是TSLIB_TSDEVICE=/dev/input/event0,这个是跟板子触摸设置有关;
后记: 飞凌在wince上实力的确不错,但是linux上就只能说一般了,从提供的手册和软件内容就可以看出来。对于我来说,板子还是学习用的,在未来的计划里,将逐步抛弃原来的工具,重新移植内核,文件系统,制作交叉工具链等,培养自己完整的一套开发体系。
------------------------------------------------------------------------------------
使用DirecetFB支持Qt4.7.0
摘要:如何在ok6410上使用Directfb,并且使用它支持Qt4.7.0
关键字:directfb 1.2.8 Qt4.7.0 tslib ok6410
1.前言:
很久之前就已经听说过directFb,但实际上由于时间和精力的关系,一直没有去好好地了解。这次小师弟的项目在Qt的刷新效率上出现了瓶颈,想到directfb具有硬件图形加速功能,于是就向他推荐了。同时,帮人帮到底,打算自己先做一遍,再告诉他方法。
实际上做了之后,曲折程序大大出乎我意料,在途中碰到了好几个问题,历经波折,最后发现可能是由于在软件版本方面导致了我过程的艰难。由于个人喜好,diretfb我选取了最新的1.4.5,导致最后启动Qt时,出现了启动直接崩溃的问题,虽然打开了debug模式,阅读了近4000多行的run log,但是也没有解决。
而最后,发现在ubunut10.04里使用的directfb是1.2.8的版,我也选用了该版本,在相同的流程后,Qt例程很正常地启动,并且触摸校准也可用,再次验证折腾linux下的,版本间的组合可以让人疯狂。
这次花费四天的工作,让我发现网上Qt+directfb资料极其稀少,至少笔者没有找可以一用的教程,所以记录下这篇心得,希望可以帮助后来者。
准备工作:
硬件环境:
主机 Ubuntu10.4
开发板 ok6410
2.软件环境:
已配置好的ok6410交叉编译工具链
Qt4.7.0源码包http://qt.nokia.com/downloads
Tslib
Directfb1.2.8源码包 http://www.directfb.org/index.php?path=Main%2FDownloads
DirectFB-example1.2.0源码包 http://www.directfb.org/index.php?path=Main%2FDownloads&page=1
Tslib1.0源码包 http://github.com/kergoth/tslib/downloads
Libjpegv8b源码包 http://www.ijg.org/
Libpng1.2.44源码包 http://www.libpng.org/pub/png/libpng.html
Zlib1.2.5源码包 http://www.zlib.net/
Freetype源码包 http://freetype.sourceforge.net/index2.html
其中,除了libpng和directfb,其他软件都是最新的版本。关于directfb依赖的软件,我们可以看源码目录下的README文件,里面清晰地描述了directfb必要的软件,关于这方面,随着对directfb的深入,可能会逐步讲述。
源码下载完毕后,统一放在/home/cnnbboy/directFb目录下
3.实际操作:
3.1directfb移植
要是Qt4.7.0跑在directfb之上,就要先把directfb移植到板子上,并且测试通过。而在编译Directfb前,需要将必要的源码包安装完毕
(1)tslib1.0编译安装
先解压源码
#tar xvf kergoth-tslib-1.0-0-gd7f5dae.tar.gz
目录名字更改下并且进入
#mv kergoth-tslib-1.0-0-gd7f5dae tslib-1.0
#cd tslib-1.0
然后进行编译编译安装
#./autogen.sh
#./configure –prefix=/home/cnnbboy/tslib-arm –host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install
最后导入一个环境变量,用于准备最后的directFb编译用
#export TSLIB=/home/cnnbboy/tslib-arm
(2)libjpeg编译安装
先解压源码
#tar xvf jpegsrc.v8b.tar.gz
#cd jpeg-8b
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/libjpeg-arm –enable-shared
#make
#make install
导入环境变量
#export LIBJPEG=/home/cnnbboy/libjpeg-arm
(3)libpng编译安装
先解压源码
#tar xvf libpng-1.2.44.tar.gz/
#cd libpng-1.2.44
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/libpng-arm
#make
#make install
导入环境变量
#export LIBPNG=/home/cnnbboy/libpng-arm
(4)freetype编译安装
先解压源码
#tar xvf freetype-2.4.2.tar.gz
#cd freetype-2.4.2
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/freetype-arm
#make
#make install
导入环境变量
#export FREETYPE=/home/cnnbboy/freetype-arm
(5)zlib编译安装
先解压源码
#tar xvf zlib-1.2.5.tar.gz
#cd zlib-1.2.5
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/zlib-arm
#make
#make install
导入环境变量
#export ZLIB=/home/cnnbboy/zlib-arm
当以上这些这些软件编译安装完毕后,就可以配置编译directfb了
(6)directfb和directfb-example配置编译安装
编译安装前先导入前面设置的环境变量
export LDFLAGS=“$LDFLAGS -L$TSLIB/lib -L$LIBJPEG/lib -L$LIBPNG/lib -L$FREETYPE/lib -L$ZLIB/lib”
export CFLAGS=“$CFLAGS -I$TSLIB/iclude -I$LIBJPEG/include -I$LIBJPEG/include -I$FREETYPE/include -I$ZLIB/include”
这两个环境变量的作用是帮助directfb编译找到需要的库文件和头文件
解压源码目录
#tar xvf DirectFB-1.2.8.tar.gz
#cd DirectFB-1.2.8
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/directFB-arm –with-gfxdrivers=none –with-inputdrivers=all –enable-png –enable-jpeg –disable-tiff –enable-zlib –enable-sdl=no –enable-gif=no –disable-x11 –enable-debug –sysconfdir=/etc –enable-fbdev
配置参数并不打算在这里详细讲解了,因为主要是为Qt所用,而不是直接用directfb进行UI的开发。
#make
#make install
导入环境变量
#export DIRECTFB=/home/cnnbboy/directFB-arm
安装完毕后,就可以移植了,同时为了检测direct是否可用,另外也编译directfb-example
先清除原有环境变量,导入新的环境变量
#unset LDFLAGS
#unset CFLAGS
export LDFLAGS=“$LDFLAGS -L$TSLIB/lib -L$LIBJPEG/lib -L$LIBPNG/lib -L$FREETYPE/lib -L$ZLIB/lib -L$DIRECTFB/lib”
export CFLAGS=“$CFLAGS -I$TSLIB/iclude -I$LIBJPEG/include -I$LIBJPEG/include -I$FREETYPE/include -I$ZLIB/include -I$DIRECTFB/include”
原理同前面一样,解压源码
#tar xvf DirectFB-examples-1.2.0.tar.gz
#cd DirectFB-examples-1.2.0.tar.gz
配置编译安装
#./configure –host=arm-linux –prefix=/home/cnnbboy/directFB-example
#make
#make install
安装完毕后,就可以开始移植,并在ok6410板子上测试
(7)移植directfb并测试
同样,在以前的文章里笔者已经有ok6410的NFS环境的搭建,只要把相关文件拷贝进入即可,在主机终端里执行
#cp -r /home/cnnbboy/directFB-arm /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/directFB-example /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/tslib-arm /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/libjpeg-arm /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/libpng-arm /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/freetype-arm /forlinx/root/home/cnnbboy
#cp -r /home/cnnbboy/zlib-arm /forlinx/root/home/cnnbboy
然后,启动kermit,进入开发板终端
#ls -l /home/cnnbboy/directFB-arm
#ls -l /home/cnnbboy/directFB-example
可以发现文件都已经存在,然后设置开发板环境,准备测试directfb例程
export TSLIB=/home/cnnbboy/tslib-arm
export LIBJPEG=/home/cnnbboy/libjpeg-arm
export LIBPNG=/home/cnnbboy/libpng-arm
export FREETYPE=/home/cnnbboy/freetype-arm
export ZLIB=/home/cnnbboy/zlib-arm
export DIRECTFB=/home/cnnbboy/directFB-arm
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export LD_LIBRARY_PATH=$TSLIB/lib:$LIBJPEG/lib:$LIBPNG/lib:$FREETYPE/lib:$ZLIB/lib:$DIRECTFB/lib
这是从理论下,directfb应当可以跑起来了,当然准备的例程就是为了测试用,不过千万别忘忘了在/etc目录下配置directfbrc
#vi /etc/directfbrc
添加
system=fbdev
fbdev=/dev/fb0
wm=default
然后保存退出
最后,就可以测试了
#cd /home/cnnbboy/directFB-arm/bin
#ls
可以看到许多directfb的程序
#./dfbinfo
顺利启动后,就可以看到directr启动的相关信息
至此,directfb的移植就完成,下面就是Qt4.7.0进行基于directfb的编译和移植
3.2 Qt4.7.0基于directfb的编译安装移植
Qt文档是做得十分出色的,所以关于支持directfb内容,是能在Qt的文档中找到的
http://doc.qt.nokia.com/4.7/qt-embeddedlinux-directfb.html
在细节上不清楚的部分,可以去仔细阅读文档
(1)在Qt4.7.0的编译参数的改变
如果要让Qt4.7.0能使用directfb,那配置参数也要加上
./configure -plugin-gfx-directfb
./configure -qt-gfx-directfb
这两个配置参数是选择性的
(2)修改qmake.conf
注意,根据自己目标平台来选择,比如笔者针对的是arm-linux,那qmake.conf就应该应该修改在Qt源码目录下
$QTSOURCE/mkspecs/qws/linux-arm-g++的目录
添加如下两句
QT_CFLAGS_DIRECTFB = -I/home/cnnbboy/directFB-arm -D_REENTRANT
QT_LIBS_DIRECTFB = -L/home/cnnbboy/directFB-arm /lib/-ldirect -ldirectfb -lfusion
注意目录应该是针对自己directfb的安装目录
(3)配置编译安装Qt4.7.0
解压Qt4.7.0源码,并且进入
#tar xvf qt-everywhere-opensource-src-4.7.0.tar.gz
#cd qt-everywhere-opensource-src-4.7.0.tar.gz
配置编译安装Qt4.7.0
#./configure -release -shared -fast -no-largefile -qt-sql-sqlite -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 16,18 -no-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-gfx-directfb -I/home/cnnbboy/directFB-arm/include -L/home/cnnbboy/directFB-arm/lib -no-glib -qt-mouse-tslib -I/home/cnnbboy/tslib-arm/include -L/home/cnnbboy/tslib-arm/lib
#make
#make install
安装完毕后,就能进行移植了
(4)移植基于directfb的Qt4.7.0
前面有文章已经描述过Qt4.7.0的移植了,因此过程简单描述下
#cd /usr/local/Trolltech/QtEmbedded4.7.0-arm
#sudo cp -r lib/ plugins/ /forlinx/root/usr/local/Trolltech/QtEmbedded4.7.0-arm
这样,如果使用NFS启动,在开发板终端发现就能发现已经存在这些文件了
(5)例程测试
为了验证功能是否正常,应当编译一个小程序来运行看看,先进入编译的Qt源码目录,进入后
#cd example/mainwindows/application
#/usr/local/Trolltech/QtEmbedded4.7.0-arm/bin/qmake
#make
生成application程序后,拷贝至开发板NFS的目录
#cp application /forlinx/root/home/cnnbboy
最后,就是执行程序测试
#./application -qws -display directfb
在终端上首先会出现directfb的启动log,然后开发板上就会顺利出现application的界面,当界面出现的那瞬间,对于历尽艰难的笔者来说,是无比的喜悦。
4.总结
对于过程出现的问题,也是需要解决的
(1)directfb编译依赖其他的软件库,因此要确定之前编译安装软件路径的正确
(2)在PC上directfb安装的目录在哪,那在开发板上就应该对应一致,不然就会出现system not found的现象,更为深层次是由于directfb在加载是会加载模块,如果在配置时没有指定,而开发板上安装位置和PC不一致,自然就无法找到
(3) 软件版本不要选太新,笔者就是吃了版本组合的亏,白白浪费2天在解决不知名的错误上,同时directfb应该和libpng对应,当笔者选用 directfb1.2.x时,libpng选用1.4.x,就出现在了 can not find -lpng12,说明libpng需要1.2.x版本才可以通过
(4)最后编译Qt测试例程时,如果出现undefined reference to `ts_read_raw’这样的错误,请修改qmake.conf文件,添加-lts参数,如下
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
这个是Qt4.7.0的bug,与tslib和directfb无关。
5.参考文献
(1)Qt for Embedded Linux and DirectFB http://doc.qt.nokia.com/4.7/qt-embeddedlinux-directfb.html
(2)嵌入式linux GUI–DirectFB + GTK至尊秘笈 http://www.directfb.com.cn/viewthread.php?tid=383
(3)DirectFB wiki http://www.directfb.org/wiki/index.php/Main_Page
本文出处:http://blog.cnnbboy.com,欢迎大家一起交流。