基于Qt/Embedded的GUI移植及无线网络功能的开发
摘 要
具有友好用户界面的嵌入式系统已成为当今嵌入式相关研究的的热点。本文介绍了系统平台构建,分别叙述了嵌入式Linux内核的配置与编译,Qt/Embedded图形界面系统的移植与开发,以及基于嵌入式Linux的无线网络功能模块的开发与实现。运行结果表明,方案合理,运行可靠。
关键词
嵌入式Linux;Qt/Embedded;Qtopia;GPRS;无线网络
1 引言
随着信息技术的发展和数字化产品的普及,嵌入式设备被广泛应用。主流的嵌入式操作系统有WinCE,Linux,VxWorks, pSOS, PalmOS等等。Linux的优势在于其完全开放的操作系统,可以给开发者一定的独立性和自由度,允许它们自己掌控自己的产品。另外,是否具有良好的人机图形界面,方便用户操作,是衡量嵌入式设备性能的重要标准。Qt/Embedded是著名的Qt库开发商Trolltech公司开发的基于嵌入式Linux系统的Qt版本,广泛应用的KDE等项目即使用Qt作为支持库,它以良好的代码结构、强大的可定制功能以及统一的API都给用户提供了极高的便利性,QT/Embedded已经逐渐成为GUI的事实标准。
2 嵌入式Linux系统的移植和开发 2.1 硬件开发环境
硬件系统采用的是Embest EduKit-III开发平台, 采用了SAMSUNG 公司的以ARM9 为内核的处理器S 3C 2410, 该处理器核心频率可达到 200M ,具有低功耗、低成本等卓越性能和显著优点,同时具有JTAG 调试等功能;针对掌上智能设备的功能比较复杂,消耗资源较多,选取了 64M 的SDRAM和 128M 的Nand Flash,针对此项目的开发,摒弃了一些不必要的模块,保留了USB接口模块,标准串行口模块,显示屏(触摸屏)模块,基于无线通讯功能的实现,选取了Siemens MC35为核心的GPRS无线模块,整个硬件环境如图1所示。
2.2 嵌入式Linux系统内核的配置与移植
首先,嵌入式系统在运行的初期即在操作系统内核运行之前,需要一段程序初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,这就是Boot Loader程序[1],这里我们选用了韩国Mizi公司的Vivi引导程序。
然后是Linux内核的移植,出于实际功能的需要,我们采用了普遍应用于嵌入式系统的 2.4.18 版的内核。这里有一个相当重要的概念——交叉编译[2]:由于宿主机与目标机的CPU一般不相同,宿主机也就是我们常用的PC机是以X86为核心的,而目标板则是ARM体系结构的,因此需要在宿主机机上建立一个用于目标机的交叉编译环境,也就是将各种二进制工具程序集成为工具链,其中包括如GNU的链接器(ld)、GNU的汇编器(as)、ar(产生修改和解开一个存档文件)、C编译器(gcc)以及C链接库(glibc)等等。这里宿主机采用Redhat9.0,工具链选择了cross-2.95.3交叉编译工具包。下列是工具和内核源文件列表及说明:
--------------------------------------------
◆ binutils- 2.11.2 包含有ld、ar、as等一些产生或者处理二进制文件的工具。
◆ gcc-core-2.95.3 包含GCC的主体部分。
◆ gcc-g++2.95.3 使GCC编译C++程序。
◆ glibc- 2.2.4 libc是很多用户层应用都要用到的库,即C链接库。
◆ glibc-linuxthreads- 2.2.4 libc用于支持Posix线程单独发布的压缩包。
◆ inux- 2.4.18 +rmk7 Linux的内核及其支持ARM的补丁包。
-----------------------------------------
在交叉编译环境建立好以后,可以对内核进行配置并制作映像文件。这里需要注意的是,针对不同开发商提供的硬件要进行不同的配置,并打上相应的补丁程序。
2.3 Qtopia图形用户界面文件系统的移植
在建立好内核的基础上,要完成根文件系统(root filesystem)的创建。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载,它是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。这里我们选择嵌入式系统常用的CRAMFS文件系统,它是Linux创始人Linus开发的一个适用于嵌入式系统经压缩以及只读的小型文件系统[3]。
在完成无图形界面的CRAMFS文件系统的建立后,这里重点阐述一下带Qtopia图形界面文件系统开发环境的建立和移植。
Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本,与X11版本的Qt在最大程度上接口兼容,采用帧缓存(framebuffer)作为底层图形接口。Qt/Embedded类库完全采用C++封装,并且有着丰富的控件资源以及较好的可移植性,大范围的Qt/Embedded API可用于多种开发项目。Qt/Embedded的实现结构如表1所示。
表 1 Qt /Embedded的实现结构
Qtopia是基于QT/Embedded开发的一个嵌入式的窗口系统和应用程序集,如地址本、图像浏览、Media播放器等,还包括娱乐和配置工具,广泛用于PDA等掌上设备。Qtopia平台由Qtopia 库和Qtopia server/laucher组成。Qtopia server/laucher是控制窗口系统、进程间通信、发起所有应用和其他核心任务的主要服务程序[3]。
整个GUI系统的构建需要对Qt/Embedded、Qtopia依次分别编译,然后有机地整合在一起。Qt/Embedded为Qtopia提供了底层支持,GUI系统的图形库窗口组建都由Qt/Embedded实现。以下构建过程所需工具文件和源码包列表及说明:
----------------------------------------------
◆ Tmake1.11 生成和管理Makefile文件
◆ Qt/Embedded 2.3.7 QT的库文件
◆ Qt 2.3.2 for X11 为了生成相应的QtDesigner和qvfb以便在宿主机上开发和调试应用程序
◆ Qtopia 1.7.0 图形用户界面开发包
◆ e2fsprogs-1.35 ext2 文件系统工具包
◆ tslib 触摸屏工具包
◆ pegsrc v6b jpeg 解码包
----------------------------------------------
将上述开发包依次解压,然后编译。这里需要注意的是根据运行环境的不同,需要建立两个程序开发环境:一种是针对X86在pc机上运行使用虚拟缓冲帧qvfb(Qt/Embedded Virtual Framebuffer )的开发环境,这样我们就可以先在RedHat9环境下虚拟嵌入式程序的运行,从而节约开发时间。另外一种是针对能够在ARM开发板上运行的程序的开发环境。不同的开发对象要使用不同的编译器,这里就引出了环境变量的设置问题,例如针对ARM板开发时需要定义:
TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
而对能够运行在X86体系结构上的程序则为:
TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
图2 图形界面文件列表
当开发环境建好之后,在无图形界面的CRAMFS的基础上,新建qt目录,拷贝编译过的Qtopia必需目录及相关文件到此目录下;从编译Qtopia时使用的编译器还书库目录中,拷贝程序运行时所需的函数库到lib目录下,并替换原无Qt文件系统的lib目录。然后拷贝基于Qt/Embedded的动态函数库及字库文件,并建立一个作为Qtopia图形界面运行时的工作目录,用于存放运行时产生的中间文件。已加入编译Qtopia图形界面文件系统后的目录如图2所示。
最后,修改CRAMFS文件系统的运行参数,主要修改两个文件,即存放于/usr/etc/目录下的运行环境配置文件profile和运行QPE图形界面启动的rc.local,设定系统运行的环境变量。
以上为整个嵌入式系统的移植,经过映像打包后就可以烧录并运行在在开发板上了。
3 GPRS无线网络功能的实现
3.1 模块说明
嵌入式系统一般应用于小型便携式设备上,传统的有线上网方式往往无法适应现场的需要,无线网络接入以其方便、快捷的优点正被广泛应用远程监控、数据采集和各种娱乐电子产品中。这里选取了Siemens MC35无线模块,支持GRPS Class 8/Class B和标准AT指令,并预留了话筒接口,支持GSM900和GSM1800双频网络。
当插入一般GSM网络的SIM卡后,嵌入式操作系统即可通过串口发送AT指令控制电话的拨打和接通;当开通GPRS网络服务后,就可以采用拨号上网的方式实现Internet网络的接入。
3.2 协议基础
Linux下通过GPRS上网必须使用PPP协议进行拨号, PPP(Point-to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案[4]。
建立一个PPP连接需要以下过程:
在PPP的两端建立一条物理连接,通常为电话连接,但也有直接电缆连接或虚拟的tunnel连接的形式。具体如何建立连接,例如拨号等,并不属于PPP协议本身的任务。
由PPP的服务器端对客户端进行验证,可以有最简单登录的验证方式、PAP或CHAP等验证方式。由于PAP和CHAP并不在线路上传输口令本身,因此更为安全,不必担心口令会泄露出去。
验证完毕之后,PPP服务器将按照配置,分配给客户IP地址,并将网关地址和其他的一些配置信息传送给客户。如果是Microsoft客户,还可以按照MS的扩展协议分配给客户NetBIOS名字服务器的地址。这样就建立了一条PPP连接。
Linux对PPP提供了两种不同方式的支持,一种为内核级PPP,它将PPP协议代码编译进内核,并运行一个PPP守护进程pppd,提供对PPP的支持,这是一种传统的方法,但配置起来较困难。另一种为用户级PPP,它使用一个应用程序ppp,通过通用tunnel设备传递PPP数据,配置较为容易。针对此开发项目这里使用用户级PPP 来建立拨号方式的Internet连接。
3.3 模块配置与实现
首先在编译Linux内核时需要配置kernel使它支持如下PPP选项:
PPP(point-to-point) support
PPP multilink support(EXPERIMENTAL)
PPP support for async serial prots
PPP support for sync tty ports
PPP Deflate compression
PPP BSD-Compress compression
然后采用最新的pppd源码包ppp- 2.4.3 ,经过交叉编译后拷贝到嵌入式文件系统的/usr/sbin目录下,同时在嵌入式文件系统/dev下建立一个ppp设备,并经行相关配置。这里最重要的是配置在Linux下拨号采用的脚本文件ppp-on、chat-script和配置文件options,还有其实内容为空的两个验证文件pap-secrets和chap-secrets。
最主要的ppp-on脚本如下:
#/bin/sh
pppd -d -detach lock /dev/ttyS0 57600 kdebug 4 file /etc/ppp/options
nocrtscts noipdefault netmask 255.255.255.0
defaultroute connect /etc/ppp/chat-script
这里调用了pppd拨号命令,并对拨号端口进行了配置,最后调用了chat-script脚本文件:
#! /bin/sh
exec chat -v /
TIMEOUT 5 /
'' AT /
OK /
AT+CGDCONT=1,/"IP/",/"CMNET/" /
OK /
ATD*99***1# /
CONNECT ''
文件中使用AT指令对串口进行控制,因为目前中国GPRS用户拨号上网并没有采用用户帐号和密码进行登陆,所以帐号密码都为空。在完成以上配置后,直接运行ppp-on程序即可实现GPRS拨号上网。
以上拨号程序是通过Shell脚本编程完成的,可以修改/usr/etc/rc.local配置文件,设置ppp-on程序在开机时自动加载;也可以把脚本程序封装起来,直接放在桌面应用程序中去,由用户自由控制。在丰富的第三方软件的支持下,用户即可以实现WEB页浏览、电子邮件的发送和实时的聊天功能。 4 结束语
本文介绍了图形化的嵌入式Linux操作系统的移植和无线网络功能的实现,通过软、硬件的优化设计,整个嵌入式系统已经测试并运行正常,具有良好的稳定性;同时在GPRS无线上网的基础下,已成功实现网页浏览和收发文件的功能,可以用于智能手机、远距离监控、车载导航等方面。通过预留的USB接口还可以实现摄像头的图像采集功能。如今,嵌入式Linux系统还正处在不断发展的阶段,随着功能的不断增加,还有许多问题需要进一步的开发和研究。
参考文献
[1] 孙天泽,袁文菊,张海峰.嵌入式设计及Linux驱动开发指南. 基于ARM9处理器 [M].北京:电子工业出版社,2005.
[2] [美]Craig Hollabaugh嵌入式Linux--硬件、软件与接口[M].陈雷,钟书毅等译. 北京:电子工业出版社,2003
[3] Karim Yaghmour. 构建嵌入式Linux系统[M] 北京:中国电力出版社
[4] 倪继利.Qt及Linux操作系统窗口设计[M].北京:电子工业出版社,2006
[5] 王波.FreeBSD使用大全[M].北京:机械工业出版社,2002