>
首页 » 技术文章 » MiniGUI在数字电视机顶盒中的应用

MiniGUI在数字电视机顶盒中的应用

作者:刘国梁 马维华  时间:2006-12-04 19:52  来源:电子设计信息网-www.edires.net
摘 要:MiniGUI是目前嵌入式产品中比较流行的图形用户界面支持系统,但是在电视机顶盒中的应用并不多见。本文首先分析了MiniGUI的特点和设计结构,证明MiniGUI同样适用于电视机顶盒,然后着重阐述了MiniGUI在一款数字电视机顶盒平台上的移植过程。

关键词:MiniGUI;嵌入式技术;机顶盒;移植

随着数字电视的普及,国内外众多公司相继推出各自的数字电视机顶盒等相关产品。由于机顶盒的关键技术相对透明,当前的机顶盒产品的功能大多相近,因此良好的UI(用户界面系统)就成为一个比较重要的卖点。

目前市场上的机顶盒中采用的GUI(图形用户界面支持系统)大多为Qt/Embedded与WinCE自带的图形引擎或是厂商自行开发的GUI。但由于前两者昂贵的费用以及后者的可移植性太差,很多厂商纷纷把注意力集中到Linux下免费的GUI系统。

MiniGUI是一种面向嵌入式或实时系统的图形用户界面支持系统。它主要运行在Linux平台上,是一个多窗口GUI支持系统,采用类Win32的API接口。它也是遵循GPL条款的纯自由软件,可以运行在任何POSIX兼容平台上。MiniGUI对系统资源占用很少,它的高性能和高稳定性完全满足机顶盒对GUI系统的要求,同时由于它的可移植性又为后续产品的开发减少了工作量。我们成功地在一款数字电视机顶盒开发平台上实现了MiniGUI的移植。

1 MiniGUI介绍

目前的MiniGUI 免费版本为1.3.3, 分为MiniGUI-Lite版本和MiniGUI-Threads版本。前者基于进程控制,稳定性好,但不支持多窗口,后者基于线程控制,实时性好,支持多窗口。

1. 1 MiniGUI的特点
MiniGUI是一款优秀的GUI,它的主要特点有:
(1)提供了完备的多窗口机制;
(2)对话框和预定义的控件类;
(3)消息传递机制;
(4)多字符集和多字体支持;
(5)全拼、五笔等汉字输入法支持;
(6)BMP、GIF、JPEG等常见图像文件的支持;
(7)小巧,包含全部功能的库文件大小为300kB左右;
(8)可配置,可根据项目需求进行定制配置和编译;
(9)可移植性好。

1. 2 MiniGUI的层次结构
图1为MiniGUI的层次结构图。MiniGUI引入了图形和输入抽象层(GAL和IAL)的概念,抽象层的概念类似Linux内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上,而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序结构。从整体结构上看,MiniGUI是分层设计的,在最底层,GAL和IAL提供底层图形接口以及鼠标和键盘的驱动;中间层是MiniGUI的核心层,其中包括窗口系统必不可少的各个模块;最顶层是API,即编程接口。

图1 MiniGUI层次结构图

1. 3 MiniGUI的消息循环机制
在任何GUI系统中,均有事件或消息驱动的概念。在MiniGUI中,使用消息驱动作为应用程序的创建构架。在消息驱动的应用程序中,计算机外设发生的事件,例如键盘键的敲击、鼠标键的按击等,都由支持系统收集,将其以事先的约定格式翻译为特定的消息。应用程序一般包含有自己的消息队列,系统将消息发送到应用程序的消息队列中。应用程序可以建立一个循环,在这个循环中读取消息并处理消息,直到特定的消息传来为止。这样的循环称为消息循环。一般消息由代表消息的一个整型数和消息的附加参数组成。

应用程序一般要提供一个处理消息的标准函数,在消息循环中,系统可以调用此函数,应用程序在此函数中处理相应的消息。图2是一个消息驱动的应用程序的简单构架示意图。Lite版本与Threads版本的区别在于Lite版本只有一个消息队列,而Threads版本中每个线程维护一个消息队列。

图2 消息队列结构

2 Envision 8620L开发板

Envision 8620L是SigmaDesign公司最新推出的高性能开发板,主要提供高清晰度数字电视终端解决方案。它采用EM8620L音视频处理整合芯片, 基于uClinux嵌入式操作系统。开发板上包含USB、Ethernet、flash media、PCI、Mini PCI和PCMCIA(for 802.11a/b/g card)等通用接口,并且支持s - video、YPbPr和DV I等视频信号输出。Envision 8620L开发板还提供完整的SDK软件开发包和交叉编译环境,用户可以直接在SDK提供的API接口上编程,无须与底层硬件交互。

EM8620L是专为音视频解码而开发的功能强大的整合芯片。图3是EM8620L芯片的结构图,它包含1块ARM7通用RISC芯片、两块音频解码DSP、两块视频解码DSP,还包含有专门解码TS流(传输流,传输数字电视信号的标准) 的DEMUX(解复用) 芯片。EM8620L的主要功能特点包括: ①支持MPEG -1、MPEG -2、MPEG -4和WMV9格式的视频解码; ②支持杜比AC3、MP3、DVD-Audio、AAC、WMA格式的音频解码; ③支持画中画功能; ④支持高解析度的OSD (On Screen Draw)输出; ⑤支持5. 1声道音频输出; ⑥支持1路高清数字电视TS流解码(1920 ×1080 pMPEG -4) ; ⑦支持两路标清数字电视TS流同时解码(720 ×576p MPEG -2) ; ⑧包含支持矢量字体的2D图形加速器; ⑨采用0. 15μm低功耗CMOS工艺制造。

图3 Envision 8620L结构图

3 MiniGUI在Envision 8620L开发板上的移植过程

MiniGUI的最大特点在于它把与硬件相关的部分(GAL和IAL)独立出来,大大简化了用户的移植过程,用户只需根据自己的硬件情况适当地修改相关部分,无需修改MiniGUI的内核。由于MiniGUI的可配置性,使我们可以根据机顶盒的特殊要求而量身订做适合机顶盒的MiniGUI。

3. 1 在GAL接口上实现新的图形引擎
利用GAL,MiniGUI可以在许多已有的图形函数库上运行,比如SVGALib和LibGGI,并且可以非常方便地将MiniGU I移植到其他POSIX系统上,只需要根据抽象层接口实现新的图形引擎即可。实际上,包含在MiniGUI 1.3.3版本中的私有图形引擎(Native Engine)就是建立在FrameBuffer之上的图形引擎。系统维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针,系统利用一个指针保存当前使用的图形引擎。每个图形引擎的数据结构定义了该图形引擎的一些信息,比如标识符、属性等,更重要的是,它实现了GAL所定义的各个接口,包括初始化和终止、图形上下文管理、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等等。

Envision 8620L开发板自带GFX图形引擎,该图形引擎包含了对EM8620L芯片中2D图形加速器的支持,因而在图形的绘制中有更好的性能。所以我们在移植过程中将私有图形引擎(Native Engine)替换为自带的GFX图形引擎。

首先,在代码实现上,MiniGUI通过GFX数据结构来表示图形引擎,因此我们修改文件src/gal/native/native.c,用GFX图形引擎的函数替换原来的接口函数,即在GFX数据结构中替换相应的接口函数指针。这里值得注意的是, GFX图形引擎的函数与GAL提供的接口并不是完全一一对应,有许多接口函数其实是另外的接口函数的进一步封装,因此这些函数并不需要被替换。

其次,我们知道,图形显示有个显示模式的概念,一个像素可以用1个比特表示,也可以用2、4、8、15、16、24、32个比特表示,不同的模式也要使用不同的驱动函数:画一个1比特的单色点和画一个24位的真彩点显然是不一样的。所以图形驱动程序使用了子驱动程序的概念来支持各种不同的显示模式。MiniGUI子图形驱动程序接口如下:
type def struct {
 int ( *Init) ( PSD psd) ;
 void ( *DrawPixel) ( PSD psd, int x, int y, gfx_pixel
c) ;
 gfx_pixel ( *ReadPixel) ( PSD psd, int x, int y) ;
 void ( *DrawHL ine) ( PSD psd, int x, int y, int w,
gfx_pixel c) ;
 void ( *PutHLine ) ( GAL gal, int x, int y, int w,
void*buf) ;
 void ( *GetHL ine) ( GAL gal, int x, int y, int w,
void* buf) ;
 void ( *DrawVLine) ( PSD psd, int x, int y, in tw,
gfx_pixel c) ;
 void ( *PutVLine) ( GAL gal, int x, int y, int w,
void*buf) ;
 void ( *GetVLine) ( GAL gal, int x, int y, int w,
void*buf) ;
 void ( *PutBox) ( GAL gal, int x, int y, int w, int
h, void*buf ) ;
 void ( *GetBox) ( GAL gal, int x, int y, int w, int h, void*buf ) ;
 void ( *PutBoxMask) ( GAL gal, int x, int y, int w,
int h, void* buf) ;
 void ( *CopyBox) ( PSD p sd, int x1, int y1, intw, int
h, int x2, int y2) ;
} SUBDR IVER, *PSUBDR IVER;

MiniGUI通过图形驱动程序的初始函数Open直接将子驱动程序的各功能函数赋到图形驱动程序的接口函数指针。我们修改文件src/gal/native/ fb.c,分别为各种显示模式声明一个子驱动程序结构实体,并在每个实体中填上相应的GFX图形引擎中的功能函数指针。这样,在上层调用图形绘制的时候,调用私有图形引擎,而实际使用的就是GFX图形引擎。

3. 2 在IAL接口上实现新的输入引擎
MiniGUI自带支持标准PC上鼠标与键盘的IAL引擎(Native IAL) ,以及几种特定开发板的IAL引擎。由于机顶盒的特殊性,我们不需要鼠标操作,仅需要很少几个按键(在机顶盒的前置面板上) ,需要对红外遥控器的支持。Envision 8620L开发板自带完整的红外遥控器的驱动,因此我们需要做的是改写Native输入引擎,将遥控器上的按键映射成标准键盘上的按键。

IAL结构和GAL结构类似。在代码实现上,MiniGUI通过INPUT数据结构来表示输入引擎,分为鼠标驱动与键盘驱动两部分,由于不需要鼠标,在这里我们仅讨论键盘驱动部分,以下是键盘部分的接口函数:
int ( *update_keyboard) ( void) ;
char*( *get_keyboard_state) ( void) ;
void ( *suspend_keyboard) ( void) ;
void ( *resume_keyboard) ( void) ;
void ( *set_leds) ( unsigned int leds) ;

修改文件src/gal/native/native.c,使键盘驱动函数指针指向相应的红外遥控器驱动函数。例如将update_keyboard指向红外遥控器驱动函数intirda _update_key(void)。修改文件src/kernel/event.c,在将输入引擎的数据转换为MiniGUI上层能够理解的消息时,将遥控器上的键映射成标准键盘的按键。这样当MiniGUI使用Native输入引擎时,就包含了对红外遥控器的支持。

3. 3 MininiGUI的裁减和交叉编译
在完成了对GAL和IAL的改写之后,我们下一步就可以编译运行在开发板上的MiniGUI函数库了。在这之前,我们还需要对MiniGUI进行配置。前面提到过,MiniGUI的可配置性使我们可以选择机顶盒应用当中需要的功能,同时可以去除不必要的部分,减少生成库的体积。MiniGUI提供一系列的条件编译开关来选择实际参加编译的代码。以下是在移植过程当中比较重要的几个开关:
( 1 ) - lite, 决定是选择MiniGUI-Lite 还是MiniGUI-Threads, 基于多窗口的考虑, 我们选择MiniGUI-Threads。
(2) - newgal,MiniGUI在1.1.0版本后开发了新的GAL层,支持软件图形加速、优化显存的应用。由于开发板自带图形加速器,且我们对Native GAL引擎的改写都是基于原来的GAL,因此我们还是选用旧的GAL。
(3) - incoreres,内嵌资源选项。如果开启选项,MiniGUI在编译时就将位图、几种标准字体及MiniGUI的初始配置文件内置在生成库里;否则,就将位图、字体以及MiniGUI.cfg文件拷至开发板。
下面是实际移植过程中所采用的脚本,其中arm- elf - gcc是Envision 8620L开发板提供的交叉编译链:
CC = arm - elf - gcc. / configure \
- - build = i386 - linux \
- - host = arm - elf - linux \
- - target = arm - elf - linux \
- - enable-incoreres \
- - disable-lite \
- - disable-newgal \
- - enable-nativegal \
- - enable-nativeial \
. .
. .
在libminigui1.3.3 /目录下执行完配置脚本后,将生成新的Makefile,然后可以继续执行make和makeinstall命令编译并安装libminigui。在执行make install操作时, 用户必须具用root 权限。安装成功后,MiniGUI的函数库和头文件以及配置文件等资源将被安装到usr/local/目录(默认路径)中,现在我们就可以在开发板上使用MiniGUI来编写UI程序了。

4 结束语

目前市场上采用MiniGUI做GUI系统的机顶盒产品还不多见,但由于MiniGUI的众多优点,笔者相信在不久的将来,一定会有越来越多的机顶盒厂商会考虑采用MiniGUI。


相关推荐

机顶盒是电视的智能化补充

银河  机顶盒  电视  2012-12-30

深圳同洲电子携手芯片厂商速位互动战略合作

揣测2013年:诺基亚和摩托罗拉的春天会来吗?

Google  机顶盒  Android  2012-12-24

谷歌“赔本”出售摩托罗拉机顶盒

谷歌  机顶盒  手机  2012-12-23

谷歌启动整合 传挖角三星高管接手摩托罗拉

谷歌  机顶盒  智能手机  2012-12-23

传微软明年将推出Xbox机顶盒 挑战苹果电视

微软  机顶盒  芯片  2012-11-22
在线研讨会
焦点