本文介绍的内容是关于 Qt opia 移植实验过程,以实验报告的形式向大家展现内容,方便又很清晰的浏览内容。
一、准备工作
了解QT库的使用
了解QTopia移植步骤
学习如何使用Tslib来构建带有触摸屏的GUI系统
二、实验原理
1、实验程序介绍
本章重点讲述如何利用源代码一步一步的将Qtopia(一套基于QT的GUI界面)移植到Filesystem中,最终可以在开发板上看到Qtopia运行起来。
2、实验原理
目前嵌入式Linux的主流GUI系统主要有MiniGUI、Microwindows、OpenGUI、Qt/Embedded,这些GUI在接口定义、体系结构、功能特性存在很大差别,采取的技术路线也有所不同。MiniGUI是建立在比较成熟的图形引擎之上,开发的重点在于窗口系统,其小巧精致并且尽量与Win32兼容。MicroWindows目前开发的重点在底层的图形引擎,窗口系统和图形接口方面功能比较欠缺,与Win32和X Windows窗口系统保持兼容,提供了相对完善的图形功能。OpenGUI基于一个用汇编实现的x86图形内核,提供了一个高层的C/C++图形/窗口接口,它的资源消耗小,可移植性差,不支持多进程。
我们这次的实验用的就是基于Qt/Embedded,它具有良好的扩展性和众多优秀的配套工具。
实验过程中,一共用到4个源代码包,下面是它们的介绍说明:
Qt/Embedded:Qt/Embedded是一个多平台的C++图形用户界面应用程序框架,其对象容易扩展,可移植性好,支持多个GUI平台的交互开发。现在,Qt/Embedded被广泛地应用于各种嵌入式产品和设备中,从消费电器(如智能手机、机顶盒)到工业控制设备(如医学成像设备、移动信息系统等)。因此本实训项目选择Qt/Embedded为系统的GUI。
Qtopia :Qtopia 是Trolltech 公司为采用嵌入式Linux 操作系统的消费电子设备而开发的综合应用平台, 它基于Qt/Embedded框架,所以在编译Qtopia之前先要搭建好Qt/Embedded框架。另外Qtopia包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。
Tslib:在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
Tmake:tmake是一个很好用的生成和管理makefile的工具,他是由Trolltech这家公司开发的,用perl写成。
3、移植流程图
图1 流程示意图
三、实验步骤
1、实验准备
首先需要下载如下资源:
- qtopia-free-1.7.0.tar.bz2
- qt-embedded-2.3.7.tar.bz2
- tmake-1.11.tar.gz
- Tslib-1.3.tar.gz
其次,需要保证能够正常使用交叉编译工具链,即可以正常使用诸如arm-linux-gcc的命令
解压这四个压缩包分别到如下几个目录:
- qtopia-free-1.7.0.tar.bz2 /work/qtopia-1.7.0
- qt-embedded-2.3.7.tar.bz2 /work/qt-2.3.7
- tmake-1.11.tar.gz /work/tmake-1.11
- Tslib-1.3.tar.gz /work/tslib-1.3
2、设置环境变量
在Shell中输入下了命令,也可以做一个脚本文件来执行
- export export QTDIR=/work/qt-2.3.7
- export export QPEDIR=/work/qtopia-1.7.0
- export LD_LIBRARY_PATH=/work/qt-2.3.7/lib:$LD_LIBRARY_PATH
- export TMAKEDIR=/work/tmake-1.11
- export TMAKEPATH=/work/tmake-1.11/lib/qws/linux-arm-g++
- export PATH=/work/tmake-1.11/bin:$PATH
3、编译Tslib 1.3
在Shell界面输入如下命令,假设当前目录是”/work”
- [root@emdoor work]#cd tslib-1.3
- [root@emdoor tslib-1.3]#export CC=arm-linux-gcc //选择编译工具链
- [root@emdoor tslib-1.3]#./autogen.sh
- [root@emdoor tslib-1.3]#./configure --host=arm-linux //生成ARM版本的Tslib
- [root@emdoor tslib-1.3]#make
- [root@emdoor tslib-1.3]#cp -a src/.libs/* ../qt-2.3.7/lib/
- [root@emdoor tslib-1.3]$cp -a plugins/.libs/*.so ../qt-2.3.7/lib/
- //拷贝生成的库文件到QT/E源码中
- [root@emdoor tslib-1.3]$cp -a src/*.h ../qt-2.3.7/include //拷贝文件到QT/E源码中
这样我们就生成Tslib的库文件与链接文件了
4、编译QT/E 2.3.7
由于我们最终要编译的是qtopia 1.7.0,而它对应的QT/E库文件是2.3.7,所以我们需要交叉编译一个它专用的QT/E框架,即库文件
(1)首先即要确保步骤2已经完成,并且生成的库文件都是ARM架构的,可以用下列代码测试一下:
- [root@emdoor tslib-1.3]$ file /work/qt-2.3.7/lib/libts* //反馈信息中会有ARM字样
(2)为了能在Qt/E中顺利使用触摸屏,还需要做如下修改
修改configs/ linux-arm-g++-shared的第41行,红色部分为新添加内容,表示在编译过程中,调用libts.so库文件,即导入了我们步骤二生成的触摸屏驱动程序
SYSCONF_LIBS = -lm –lts
从实验源代码中的补丁目录,找到一个名字为“qwsmouse_qws.cpp”替换掉qt-2.3.7目录下对应的同名文件(src/kernel目录内),由于该代码修改的内容较多,笔者在此就不一一描述,该修改主要将tslib的调用方式嵌入到Qt/E中,感兴趣的读者可以自行解读该代码。
(3)进入源代码目录,使用configure进行配置
- [root@emdoor qt-2.3.7]$ cd $QTDIR
- [root@emdoor qt-2.3.7]$ cp /work/qtopia-1.7.0/src/qt/qconfig-qpe.h src/tools/
- [root@emdoor qt-2.3.7]$ ./configure -xplatform linux-arm-g++ -qconfig qpe
注意:qtopia 1.7.0针对QT/E 2.3.7预设了一个配置脚本qconfig-qpe.h,所以要将其拷贝到src/tools目录下,然后在configure中就可以用”—qconfig”调用了
(4)随后QT的配置过程中会跳出几个问题,回答如下:
- Q:… license? A:yes
- Q:color depth? A:16
- Q:Virtual Framebuffer? A:no
(5)***就直接编译了:
[root@emdoor qt-2.3.7]$ make sub-src //sub-src表示仅编译src目录下的内容
5、编译Qtopia 1.7.0
- [root@emdoor qt-2.3.7]$ cd $QPEDIR
- [root@emdoor qtopia-1.7.0]$ ./configure -xplatform linux-arm-g++
- [root@emdoor qtopia-1.7.0]$ make
这样就会在当前目录生成整个GUI界面的所有可执行文件和配置文件
6、压缩CodeSize
生成的系统有点冗余,可以用arm-linux-strip工具将多余的调试信息剥离开,减小Qtopia的体积:
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment bin/*
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment plugins/*/*
- [root@emdoor qtopia-1.7.0]$ arm-linux-strip -R .note -R .comment $QTDIR/lib/libqte.so* $QTDIR/lib/libqpe.so*
7、构建Run-time目录
由于Otopia目录下还存在的源代码之类的文件,而且它的运行离不开QT/E的共享库文件,所以我们新建一个qpe目录,然后把Qtopia给放进去:
- [root@emdoor qtopia-1.7.0]$ mkdir ../qpe
- [root@emdoor qtopia-1.7.0]$ cd ../qpe
- [root@emdoor qpe]$ cp -aR ../qt-2.3.7/lib/ ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/lib/* ./lib
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/apps ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/bin ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/plugins ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/i18n ./
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/pics . /
- [root@emdoor qpe]$ cp -aR ../qtopia-1.7.0/etc . /
- [root@emdoor qpe]$ cp ../tslib/etc/ts.conf /qpe/etc
- [root@emdoor qpe]$ cp ../tslib/tests/.libs/ts.calibrate /qpe/bin
8、整合入filesystem
(1)进入由上一章节生成的busybox的Filesystem,将qpe目录拷贝到Filesystem中的usr目录下,即目标板运行起来时,qpe的绝对路径是/usr/qpe
(2)新建一个Qtopia运行脚本qpe.sh ,具体代码如下:
- /usr/qpe/qpe.sh
- export QTDIR=/usr/qpe
- export QPEDIR=/usr/qpe
- export LANG=zh_CN
- export LD_LIBRARY_PATH=/usr/qpe/lib:$LD_LIBRARY_PATH
- export QT_TSLIBDIR=/usr/qpe/lib
- export TSLIB_CONFFILE=/usr/qpe/etc/ts.conf
- export TSLIB_PLUGINDIR=/usr/qpe/lib
- export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/ucb1x00
- export KDEDIR=/usr/qpe
- cd /usr/qpe/bin
- ./ts_calibrate
- ./qpe -qws
(3)修改etc目录下的inittab文件,在该文件的末尾加入如下代码:
- x:5:once:/usr/qpe/qpe.sh &> /dev/null
(4)根据busybox实验的步骤进行格式化和运行即可
小结:Qt opia 移植实验过程的内容介绍完了,希望对你有所帮助。关于Qt/Embedded,它是一个多平台的C++图形用户界面应用程序框架,其对象容易扩展,可移植性好,支持多个GUI平台的交互开发。