使用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源码包
Tslib
Directfb1.2.8源码包 %2FDownloads
DirectFB-example1.2.0源码包 %2FDownloads&page=1
Tslib1.0源码包
Libjpegv8b源码包
Libpng1.2.44源码包
Zlib1.2.5源码包
Freetype源码包
其中,除了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的文档中找到的
在细节上不清楚的部分,可以去仔细阅读文档
(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
(2)嵌入式linux GUI–DirectFB + GTK至尊秘笈
(3)DirectFB wiki