分类:
2009-05-25 18:33:58
1 系统平台构建
本文构建的系统是实现一个掌上信息处理终端系统,集个人数字助理应用、网络应用、多媒体应用于一身,并成功运行在XSbase255嵌入式开发板上。整个系统包括四部分:(1)引导装载程序(BootLoader),这是一段驻留在开发板上的代码,系统上电后首先被执行,对CPU、内存等进行初始化,完成内核映像的装载和引导;(2)Linux内核,是在官方的2.4.18 linux内核基础上,加入了相应的硬件驱动和新的文件系统而构成的;(3)图形用户界面,采用基于Qt/Embedded的Qtopia桌面环境;(4)应用程序的编写与添加。本文重点介绍图形用户界面的移植和添加应用程序。表1给出了整个系统平台的结构。
表1 系统平台构建
2 硬件平台的选择
3嵌入式GUI的移植
3.1Qt/Embedded选取
嵌入式Linux系统的有代表性的GUI系统主要有MiniGUI、MicroWindows、Tiny X以及Qt/Embedded。这些GUI系统在接口定义、体系结构、功能特性等方面存在着很大的差别。
MicroWindows,其主要特色在于提供了C/S体系结构,同时也提供了相对完善的图形功能。但却无任何硬件加速能力,图形引擎中也存在着许多未经优化的低效算法。
MiniGUI,是建立在比较成熟的图形引擎之上,其特点是小巧精致。它尽量保持与Win32的兼容,这样在Win CE应用的场合,也可以使用MiniGUI。
最终,在分析和比较了各种GUI的特点,我们选用Qt/Embedded作为移植对象。
3.2 Qt/Embedded底层支持分析
Qt/Embedded 以原始 Qt 为基础,并做了许多出色的调整以适用于嵌入式环境。Qt/Embedded 通过 Qt API 与 Linux I/O 设施直接交互,成为嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省内存,因为它不需要一个X服务器或是Xlib库,它在底层撅弃了X lib,采用framebuffer(帧缓冲)作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse输入事件。Qt/Embedde的应用程序可以直接写内核缓冲帧,这避免开发者使用繁琐的Xlib/Server系统。
表2 Qt/Embedded与Qt/X11的比较
Qt/Embedded的底层图形引擎基于framebuffer,framebuffer出现在2.2.x以上内核的版本当中的一种驱动程序接口。这种接口采用mmap系统调用,将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映象,将其映射到进程地址空间之后,就可以直接进行读写操作了,而写操作可以立即反映在屏幕上。framebuffer驱动程序[1]是最重要的驱动程序之一,正是这个驱动程序才能使系统屏幕显示内容。其实现分为两个方面:一是对LCD及其相关部件的初始化,包括画面缓冲区的创建和对DMA通道的设置;二是对画面缓冲区的读写,具体到代码为read、write等系统调用接口。
3.3 Qt/Embedded和Qtopia的移植。
移植过程中我们采取了宿主机和目标板的开发模式。宿主机是一台运行Linux 的PC 机,目标板即hybus开发板。先在宿主机上调试通过后,再移植到目标板上。
3.3.1 宿主机上的移植
前面介绍过Qt/Embedded直接写入帧缓冲,在宿主机上则是通过qvfb(vitural framebuffer)来模拟帧缓冲。qvfb是X窗口用来运行和测试Qtopia应用程序的系统程序,允许我们在桌面及其上开发Qt嵌入式程序,而不需要在命令台和X11之间来回切换。qvfb使用了共享存储区域(虚拟的帧缓冲)来模拟帧缓冲并且在一个窗口中(qvfb)模拟一个应用来显示帧缓冲,显示的区域被周期性的改变和更新。通过指定显示设备的宽度和颜色深度,虚拟出来的缓冲帧和物理的显示设备在每个像素上保持一致。这样我们在每次调试应用时不需要总是刷新嵌入式设备的FLASH存储空间,从而加速了应用的编译、连接和运行周期。
因此在最初编译配置嵌入式Linux内核时必须使其支持帧缓冲。宿主机上的移植需要的工具及环境变量见表3。其中环境变量可以直接用export 来声明,也可以在~/.bash_profile脚本文件中进行设置。
Qtopia即QPE(Qt PalmtopEnvironment)是由著名的Trolltech公司基于Qt的嵌入式版本Qt/Embedded库的基础上,专门针对PDA、SmartPhone这类运行嵌入式Linux的移动计算设备和手持设备所开发的开放源码的一套应用程序包和开发库。Qtopia是基于qt/embedded程序库编写的应用程序环境,(Qtopia是Qt在Linux/embedded Linux版本里的一个application实现。)界面优美。主要应用于高端手机,pda等嵌入式系统,具有广阔的发展前景。
表3 宿主机移植所需工具及环境变量声明
表4 Qtopla配置编译及其架构
3.3.2 目标板上的移植
目标板上的移植与宿主机类似,只需将编译参数做一定的修改即可。表4列出了qtopia移植中qtembedded共享库的支持,环境变量声明和关键的编译配置命令,以及最后目标板上qpe的架构。图1是在XSbase255开发系统上移植Qt/Embedded和Qtopia的显示截图。
图1 基于XSbase的Qtopia图形
表5 文件系统组织图
4添加应用程序到qtopia
如前所述,我们已经安装好了Qtopia应用环境。下面介绍如何在Qtopia里添加我们编写的应用程序(camera)例子,具体Qt程序的编写不在本文内容之内。
1) 建立camera程序的图标文件
2)重新交叉编译qtopia
3)建立.desktop文件,将其保存在qtopia/apps/applications目录下,具体内容可参考qtopia自带应用的.desktop文件。
4)制作文件系统映像
我们需要利用原有的文件系统映像,把新建的应用程序的相关文件加入其中。表5为我们下载到Flash中的JFFS2的文件系统结构。根目录下除opt以外的文件目录都来自原有文件系统。我们首先需要把新建的应用程序的相关文件(包括启动器文件,包含了图标的库文件libqte.so.*和应用程序的可执行文件)复制到qpe的对应的目录下。接下来通过JFFS2工具mkfs.jffs2创建生成新的文件系统映像。利用bootloader将生成的文件系统映像下载后写入flash,从而为内核启动作好了根文件挂载的准备。
5)自动运行
我们对嵌入式系统上的linux启动过程进行了研究,若要使qpe能够自动运行,我们需要改写其脚本文件(表6),在etc/profile脚本中,做如下添加。
表6 脚本文件的改写
图2 添加camera程序后的Qtopia
重新运行qtopia,就可以看到我们添加的应用的图标,点击此图标就可以运行此应用程序了。图2是我们编写的Camera程序在Qtopia下的截图。
转自: