6.2.2 MiniGUI的移植
由于MiniGUI较好地将硬件设备抽象为GAL层和IAL层,移植时只需要针对自身的硬件特点按照GAL层调用接口和IAL层调用接口来做内部实现即可。
实现了FrameBuffer的Linux驱动后,配置MiniGUI选择Native的GAL引擎,便可以使用FrameBuffer作为MiniGUI的图形发生引擎。
MiniGUI的IAL层将输入设备的输入事件最终映射为GUI系统API层的消息事件。IAL层默认处理两种设备的输入操作:键盘设备和鼠标设备。键盘设备向上层提供不同的按键输入信息,鼠标设备提供单击、抬起和落笔坐标等的信息。在实现MiniGUI与输入设备驱动的接口时,采用Select的方式获得输入设备的动作,并转换为消息队列中的消息。消息参数按照Win32接口定义为点击键编号或鼠标当前的坐标(其中触摸屏事件与鼠标事件类似)。通过编写针对硬件开发系统的IAL支持代码,实现了IAL层的移植。
1.MiniGUI在上位机Linux上的移植
MiniGUI中多字体和字符集支持是通过设备上下文(DC)的逻辑字体(LOGFONT)实现的。在创建逻辑字体时指定相应的字符集,其内部实现为对于所需显示字符的所属字符集的识别处理,最终调用相应字符集的处理函数组。应用程序在启动时,可切换系统字符集,如GB2312、BIG5、EUCKR和UJIS等。MiniGUI的这种字符集支持方式不同于采用UNICODE的解决方案。在节省系统资源的意义上讲,这种实现更加适合于嵌入式系统时应用,是MiniGUI的一大创新点。MiniGUI同时支持包括ttf、bdf、type 1、vbf等多种字体格式,可以根据需要配置MiniGUI来支持相应字体的显示。MiniGUI能在CPU主频为30 MHz,仅有4MB RAM的系统上正常运行(使用uClinux操作系统),这是其他针对嵌入式产品的图形系统,如MicroWindows或Qt/Embedded无法达到的。
MiniGUI移植软件包一共有以下4种。
libminigui-1.6.x.tar.gz:MiniGUI函数库源代码,其中包括libminigui、libmgext和libvcongui。
minigui-res-1.6.x.tar.gz:MiniGUI所使用的资源,包括基本字体、图标、位图和鼠标光标。
mde-1.6.x.tar.gz:MiniGUI的综合演示程序。
mg-smaples-1.6.x.tar.gz:MiniGUI编程指南的配套示例程序。
具体的移植过程如下。
1)安装资源文件
[root@linuxj root]#tar –xzvf minigui-res-1.6.x.tar.gz |
默认的安装路径是/usr/local/lib/minigui/res,可以修改minigui-res-1.6.x目录下的config.linux来更改安装路径和编译参数。这些资源服务器Linux和嵌入式处理器可以共用。
2)配置和编译MiniGUI库文件
[root@linuxj root]#tar –xzvf libminigui-1.6.x.tar.gz |
当然在编译MiniGUI函数库的时候可以给定库的安装路径,一般建议编译两个版本的MiniGUI库,一个是在大机器的Linux上运行用的库,一个是针对嵌入式操作系统使用的库。编译大机器上库的目的是为以后在写应用程序的时候先在大机器上调试服务的。当然最后程序还是要在目标板上跑,所以还要为目标处理器编译一个库。MiniGUI 就是使用autogen、utoconf的一个典型例子,用configure来生成配置文件和makefile文件;编译好之后在./configure的参数prefix指定的目录下面有个lib目录,该目录下的内容如下。
[root@linuxj lib]# ls -l |
其中etc目录下是MiniGUI运行时的配置文件,include目录下是MiniGUI的头文件,lib目录下则是库文件,minigui目录下是资源文件。修改/etc/ld.so.conf文件,在结尾加上一行prefix指定的路径,把此路径加入到库的加载路径中,否则运行例子程序时会出现如下的错误:error while loading shared libraries: libminigui-1.6.so.2
3)编译例子程序
[root@linuxj root]#tar –xzvf mde-1.6.x.tar.gz |
4)运行例子程序
在mde-1.6.x或mg-samples-1.6.x目录下都有一些程序可以运行,如果在Linux上运行,建议修改MiniGUI.cfg中的gal_engine和ial_engine为qvfb。
因此必须为主机安装qvfb。安装方法如下:
[root@linuxj root]#tar –xzvf qvfb-1.0.tar.gz |
编译成功之后,在qvfb/qvfb目录下有个qvfb的可执行程序。不过在运行./qvfb前,一定先启动X-Window,启动方法startx。qvfb启动可以加参数,具体的用法如下:
./qvfb [–width width] [–height height] [–depth depth] |
就是指定qvfb的参数是320×240,32位颜色深度。启动之后可以看到一个窗口,如图6-1所示。
![]() |
| 图6-1 启动qvfb时出现窗口 |
当然也可以不加参数启动qvfb,通过图6-1所示窗口里的“File”菜单修改参数。
qvfb启动之后,就可以启动MiniGUI里面的例子程序了。在运行程序之前要注意MiniGUI.cfg里面设置的参数要和qvfb的参数一致。
5)MiniGUI.cfg文件说明
MiniGUI库编译好之后,到编译出来的prefix目录下的/etc/目录。在/efc/目录下可以看到一个MiniGUI.cfg文件,这个文件是MiniGUI运行时配置选项。
从MiniGUI.cfg文件中可以看出,此文件的格式比较简捷,其基本格式如下。
[段名]
参数名=参数值
所以修改起来也比较方便,这里介绍几个重要的段,而且在移植的时候是很可能需要修改的段。
① system段
该段指定了MiniGUI运行时使用的输入、输出引擎,以及鼠标设备和协议类型。指定的输入、输出引擎必须是编译配置MiniGUI库时多个引擎中的一个。该段定义如下。
gal_engine:指定使用的图形引擎;
defaultmode:指定图形引擎的显示模式,格式为:宽×高-显示位数(bpp);
ial_engine:指定使用的输入引擎;
mdev:指定鼠标设备文件;
mtype:指定鼠标协议类型。
上面的例子里面GAL使用的是FrameBuffer,而且尺寸是320×240,16位深度的颜色,如果你的LCD定义不是这样,需要根据系统的实际设计来更改。IAL层默认的engine是console,默认的设备是鼠标。如果使用ARM嵌入式系统,而且没有用到鼠标的话,这个地方不需要mdev。还有一个要注意的是,一般来说在嵌入式系统中,如果使用键盘的话,mdev=/dev/keypad,如果使用触摸屏的话,mdev=/dev/ts。
自1.6.8版本起,MiniGUI提供通过环境变量修改图形及输入引擎的方式。比如,你的MiniGUI已经包含了fbcon和qvfb两种图形引擎,以及对应的console和qvfb输入引擎,并在MiniGUI.cfg或内建资源中指定了使用qvfb图形及输入引擎。但在运行时,你可以通过如下方式指定fbcon和console引擎,而不需要修改MiniGUI.cfg文件或者内建资源配置文件。
$ export gal_engine=fbcon |
② fbcon段
该段是在system段gal_engine的键值指定为fbcon时使用,表示运行fbcon时使用的显示模式。若该段未定义或键值为空,则使用system段定义的键值。该段只包含一个defaultmode键,具体含义和system段相同。该段在嵌入式ARM-Linux中的使用较为普遍,尤其是带LCD显示的系统。
③ qvfb段
该段是在system段gal_engine的键值指定为qvfb时使用,表示运行qvfb时使用了X-Window的哪个display及显示模式。
④ 定义资源的段
主要有rawbitmapfonts、varbitmapfonts、qpf、truetypefonts和type1fonts段,这里需要注意的是,资源文件的路径一定要和MiniGUI/res的路径一致。
⑤ Cursorinfo段
该段指定了MiniGUI要装载的鼠标光标的相关信息。如果在编译配置MiniGUI时使用了—disable-cursor选项,则MiniGUI会忽略Cursorinfo段。该段的参数及所代表含义主要有以下几点:Cursorpath是指定光标所在路径;Cursornumber是指定装载的光标个数,可通过减少个数并删除对应光标减少MiniGUI的存储空间占用量;cursor<NR>是指定编号为<NR>的光标。如果系统中不使用鼠标的话,建议在编译MiniGUI时加上参数—disable-cursor。
⑥ Imeinfo段
该段指定了GB2312输入法要装载的输入法个数及对应的模块。该段定义的主要参数及所代表含义有:imetabpath表示输入法模块所在路径;imenumber表示装载输入模块个数,ime<NR>表示编号为NR的输入法模块pinyin、wubi、shuangpin、ziranma等,它们分别表示全拼、五笔、双拼、自然码等输入法模块。如果在配置MiniGUI时打开了GB2312输入法(enable-imegb2312),则会根据imenumber的值装载指定的输入法模块。如果imenumber的值为0,则输入法模块仅提供内码输入法。
| 回书目 上一节 下一节 |
|
· SQL Server入门到精通.. · 交换技术配置手册技术.. · 超级网管员——网络应.. · 网络服务器配置与应用.. · Linux集群技术自测试题.. · JavaSript核心技术自测.. |
· ARP攻击与防范技术自测.. · 国庆挑战自己参加自测 .. · 《网管员必读—网络应.. · 历次技术自测 获奖网友.. · 51CTO国庆七天技术自测.. · 9.2.2 无线AP |
|
|||
| · McWill、WiMAX、3G博弈 · 网管系统介绍 · 网络管理系统如何支撑I.. · CISSP认证成长之路 · 51CTO国庆充电专题之好.. · 网络技术经典基础教程 · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 |
· 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 · 我是黑客我怕谁——讲.. · Solaris 10 配置管理 · Solaris基础知识入门 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · C#技术开发指南 · Solaris 10 配置管理 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·虚拟化改变操作系统的角.. ·拯救系统管理员 |
·美国选民:我为什么选布什 ·VMware公司中文命名挑战赛 |
| ·体验Windows Server 2008.. ·将超星图书转成PDF文档 |
·使用 Office Communicati.. ·VMware Workstation 6.01.. |
| · 华为、贝恩资本22亿美元.. · NGN:下一代网络 · 网络访问中断大排查 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· Google推出唯一硬件——.. · 硬盘之父获得诺贝尔物理.. · 理性面对四核服务器选购 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 硬盘之父获得诺贝尔物理.. · 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. |