摘 要:本文简要阐述嵌入式Linux GUI用途及前景,分析了几种嵌入式GUI的基本架构,并详细叙述了基于Qt/Embedded图形用户系统在s3c2410处理器上的移植开发步骤,粗略指出了Qt/Embedded的优缺点,可为嵌入式GUI开发者提供实用参考。
关键词:嵌入式Linux Qt/Embedded移植 GUI
1.概述
我们时常在PC机上看到WINDOWS图形用户界面,以及LINUX上的KDE、GNOME,这些图形用户界面美观且方便用户操作,功能全面。而嵌入式系统经常有一些特殊的要求,PC机上的图形窗口系统是不能满足的。比如特殊的外观效果,控制提供给用户的函数,提高装载速度,特殊的低层图形或输入设备。因此,嵌入式系统必定要有自己的图形用户界面。嵌入式图形用户界面就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统。
当今世界,嵌入式系统正以它体积小、专用性等特点深入社会应用的各个层次。在某些嵌入式应用领域中,比如PDA、HandHeld PC、AutoPC等嵌入式系统中,图形用户界面的性能将直接影响整个系统的性能,是产品制造商和最终用户共同关注的问题。如何针对特定的平台,选择适合的GUI进行移植,定制和改进,是嵌入式系统开发者共同关注的问题。
2.嵌入式Linux GUI简介
一个能够移植到多种硬件平台上的嵌入式GUI系统,应用至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层GAL(Graphic Abstract Layer),基于输入设备(如键盘,触摸层等)的输入抽象层IAL(Input Abstract Layer)。GAL层完成系统对具体的显示硬件设备的操作,极大程度上隐蔽各种不同硬件的技术实现细节,为编程序开发人员提供统一的图形编程接口。 IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。GAL层与IAL层的设计概念,可以极大程序地提高嵌入式GUI的可移植性,如图1所示。目前应用于嵌入式Linux系统中比较成熟,功能也比较强大的GUI系统底层支持库有SVGA lib、LibGGI、Xwindow、framebuffer等。
API编程接口
嵌入式GUI
GAL层 IAL层
图形显示设备 输入设备
图1:可移植嵌入式GUI的实现结构
对于 Linux 下的 GUI 开发来说,是一个很宽泛的的话题,它本身继承了 Xlib、Xt、Motif 等传统 Unix 下的 GUI 开发工具,又有 GTK+、QT 这样在 Linux 上更流行的 GUI 工具箱。
嵌入式Linux系统有代表性的GUI系统主要有MiniGUI、MicroWindows、Tiny X以及Qt/Embedded。这些GUI系统在接口定义、体系结构、功能特性等方面存在着很大的差别。
Tiny-X,是标准X-windows在嵌入式系统的小巧实现,作为一个图形环境,X-window是成功的,但由于在体系接口上的原因,限制了它对游戏、多媒体的支持能力。
Nano-X Window System(原来叫MicroWindows),其主要特 {MOD}在于提供了C/S体系结构,同时也提供了相对完善的图形功能。但却无任何硬件加速能力,图形引擎中也存在着许多未经优化的低效算法。
MiniGUI,是建立在比较成熟的图形引擎之上,其特点是小巧精致。它尽量保持与Win32的兼容,这样在Win CE应用的场合,也可以使用MiniGUI。
Qt/Embedded,是一个专门为小型设备提供图形用户界面的应用框架和窗口系统。提供了丰富的窗口小部件(Widgets),并且还支持窗口部件的定制,因此它可以为用户提供漂亮的图形界面。Qt 是 KDE 等项目使用的 GUI 支持库,所以有许多基于 Qt 的 X Window 程序可以非常方便地移植到 Qt/Embedded 版本上。
另外还有一些高级图形库,如SDL,MESA,OPENGL,DIRECTFB,ALLEGRO等,在开发游戏及多媒体软件方面有各自的优势。
3.嵌入式GUI的选取,移植步骤
3.1 Qt/Embedded选取
Qt/Embedded是著名的Qt库开发商Trolltech公司开发的面向嵌入式系统的Qt版本。Qt/Embedded同样是Server/Client结构,它延续了Qt在X上的强大功能,在底层摒弃了X lib,仅采用framebuffer作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件,底层接口支持键盘、GPM鼠标、触摸屏以及用户自定义的设备等。
Qt/Embedded类库完全采用C++封装,丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面。它的类库接口完全兼容于同版本的Qt-X11,使用X下的开发工具可以直接开发基于Qt/Embedded的应用程序GUI界面。
Qt/Embedded当前的最新版本为3.3.2,能够支持Trolltech的手持应用套件Qtopia。
3.2 针对Qt/Embedded的实现特点,移植该嵌入式GUI系统一般分为以下几个步骤:
1) 设计硬件开发平台,并移植Linux操作系统;
2) 采用静态链接进Linux内核的方式,根据该平台显示设备的显示能力,开发framebuffer驱动程序;
3) 开发针对该平台的鼠标类设备驱动程序,一般为触摸屏或USB鼠标;
4) 开发针对该平台的键盘类设备驱动程序,一般为板载按钮或USB键盘;
5) 根据framebuffer驱动程序接口,选择并修改Qt/Embedded中的QLinuxFbScreen和QgfxRaster类;
6) 根据鼠标类设备驱动程序,实现该类设备在Qt/Embedded中的操作接口;
7) 根据键盘类设备驱动程序,实现该类设备在Qt/Embedded中的操作接口;
8) 根据需要选择Qt/Embedded的配置选项,交叉编译Qt/Embedded的动态库;
9) 交叉编译Qt/Embedded中的Example测试程序,在目标平台上运行测试。
4.Qt/Embedded在Edukit-III 2410实验平台上移植和应用
4.1 开发平台
本实验平台采用s3c2410核心处理器,64M SDRAM,32M NAND FLASH(用于固化带Qt/Embedded图形界面的文件系统),20键矩阵键盘,外部接口主要有两路RS232串口,USB主从接口,ps/2接口,jtarg接口,采用320x240分辨率的TFT LCD和S3C2410内部LCD控制模块作为显示设备,S3C2410内部触摸屏控制器;S3C2410内部的USB Host控制器,较好地支持了USB接口的键盘和鼠标,可采用USB接口的鼠标/键盘或触摸屏作为输入设备。
GUI实现方案采用了Qt/Embedded 2.3.7和QTOPIA 1.7.0 (基于Qt/Embedded 2.x系列的手持套件,下载地址ftp://ftp.trolltech.com)系统,QTOPIA是Trolltech推出的Qt 掌上机环境(Qt Palmtop Environment,俗称 Qpe)。Qpe 提供了一个基本桌面窗口,并且该环境为开发提供了一个易于使用的界面。Qpe 包含全套的个人信息管理(Personal Information Management (PIM))应用程序、因特网客户机、实用程序等等。然而,为了将 Qt/Embedded 或 Qpe 集成到一个产品中,需要从 Trolltech 获得商业许可证。
整个系统结构如图2所示。
图2:基于Linux及Qt/Embedded的嵌入式软件开发平台体系结构图
4.2 Qt/Embedded库的编译
在获得Qt/Embedded的源码(free版的源码可在www.trolltech.com下载) 之后,如果要做Qt/Embedded的开发,最好把Qt/Embedded编译成为两个版本,一个是主机版,一个是目标版,将其分别解压到两个目录(/qte/qte-2.3.7-host/和/qte/qte-2.3.7-target/)
4.2.1 编译主机版本:
(1) 设置环境变量
export QTDIR=/qte/qte-2.3.7-host
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
(2) 运行./configure
cd $QTDIR
./configure -depths 4,8,16 -no-ipv6 -no-cups -no-pch –qvfb
(3) 编译Qt/Embedded函数库
make sub-src
(4) 编译Qt/Embedded辅助开发工具
cd tools;make
这一步就会成一个可以在主机环境(x86)下运行的uic指令,放在$QTDIR/bin目录中。
4.2.2 编译目标版本:
(1) 设置环境变量
export QTDIR=/qte/qte-2.3.7-target
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
(2) 运行./configure
cd $QTDIR
./configure -depths 4,8,16 -no-ipv6 -no-cups -no-pch -qvfb -embedded arm
(3) 复制uic命令
cp /qte/qte-2.3.7-host/bin/uic /qte/qte-2.3.7-target/bin/
(4) 编译Qt/Embedded函数库
make sub-src
到此为止,已经将基于Qt/Embedded的嵌入式GUI开发系统建立。但是要注意的是,开发中我们可能需要用到Qt/Embedded中没有的库,那么就需要在安装编译配置Qt之前将所需的库准备好,在配置编译Qt/Embedded选项时用 -enable-lib* 选上即可。
4.3 安装其他工具
4.3.1 安装progen工具
progen工具根据源文件生成相应的.pro文件,例如:progen –n hello –o hello.pro
4.3.2 安装tmake工具
tmake是根据.pro文件生成Makefile文件的工具,例如:tmake hello.pro –o Makefile
4.4 Qt/Embedded应用程序的开发流程如下:
(1)使用Qt Designer设计用户界面,生成ui文件;
(2)使用vi编辑器编写源代码,用progen工具或qmake生成pro文件;
(3)使用tmake或者qmake根据pro文件生成Makefile文件;
(4)运行make,生成可执行文件;
(5)打开qvfb,运行应用程序。
在开发中需要特别注意的是,Qt/Embedded图形引擎是通过直接写入帧缓冲来实现的,那么我们在宿主机上用qvfb(vitural framebuffer)来模拟帧缓冲。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序,它使用了共享存储区域(虚拟的帧缓冲)来模拟帧缓冲并且在一个窗口中(qvfb)模拟一个应用来显示帧缓冲,通过指定显示设备的宽度和颜 {MOD}深度,使得虚拟出来的缓冲帧和物理的显示设备在每个像素上保持一致,同时显示区域被周期性的刷新。qvfb它允许我们在桌面环境及其上运行Qt嵌入式程序,而不需要在命令台和X11之间来回切换,调试应用程序时不需要总是刷新嵌入式设备的FLASH存储空间,从而缩短开发周期。
5.结论
嵌入式系统属于资源受限系统,因此嵌入式GUI开发也必须考虑系统开销的问题,这就需要对具体应用进行精心分析,使得GUI系统满足对用户特定的需要。Qt/Embedded延续了Qt在桌面系统的所有功能,丰富的API接口和基于组件的编程模型使得嵌入式Linux系统中的应用程序开发更加便捷,广泛用于高级消费电子开发;虽然Qt/Embedded的API库在有些时候显得过于臃肿,但它有面向对象的体系结构,资源占用少,抗锯齿文本和混和视频的象素映射等优点,已其成为嵌入式GUI开发的一大利具。