Embedded 版 (精华区)
发信人: sundream (boliqiu), 信区: Embedded_system
标 题: 将X-WINDOW换成MICROWINDOWS
发信站: 哈工大紫丁香 (Tue Jul 31 13:01:21 2001) , 转信
我并不知道将X-WINDOW换成MICROWINDOWS
有什么好处!对于嵌入式开发有什么帮助?
4. 将X-WINDOW换成MICROWINDOWS
Microwindows是使用分层结构的设计方法。允许改变不同的层来适应实际的应用。在最底
一层,提供了屏幕、鼠标/触摸屏和键盘的驱动,使程序能访问实际的硬件设备和其它用户
定制设备。在中间一层,有一个轻巧的图形引擎,提供了绘制线条,区域填充、绘制多边
形、裁剪和使用颜色模式的方法。在最上一层,提供了不同的API给图形应用程序使用。这
些API可以提供或不提供桌面和窗口外型。目前,Microwindows支持Windows Win32/WinCE
GDI和Nano-X API。这些API提供了Win32和X窗口系统的紧密兼容性,使得别的应用程序可
以很容易就能移植到Microwindows上。
设备驱动:设备驱动接口在device.h中定义。一个Microwindows程序通常有屏幕、鼠标和
键盘驱动。中间层设备无关图形引擎核心函数将直接调用设备驱动来执行硬件相关操作。
这样,我们在Microwindows中改变或增加硬件设备时不会影响整个系统的工作。
屏幕驱动:目前,在屏幕驱动方面,有支持Linux 2.2.x的framebuffer系统的驱动,有16
为ELKS和MSDOS系统的VGA显卡驱动。可以通过配置纯硬件bios驱动(scr_bios.c、vgapla
n4.c、mempl4.c、scr_herc.c)来直接初始化VGA硬件,也可以利用PC BIOS来开始和结束
图形模式。Framebuffer驱动(scr_fb.c、fb.c、fblin?.c)提供了1、2、4和8位色显示函
数,还有8、15、16、24和32色真彩显示的函数。在Linux下,Framebuffer系统通过打开/
dev/fb0(或getenv(“FRAMEBUFFER”))和使用mmap函数把显示内存变成线性内存。一
些显示模式,如在VGA 4色环境下,要求OUT指令由屏幕驱动程序发出,而像素包装驱动使
用读写framebuffer来实现。所有的图形模式初始化和还原都是由Linux内核来完成。
屏幕驱动是本系统中最复杂的驱动,在设计上很容易就能移植一个新的硬件到Microwindo
ws上来。一个屏幕驱动必须提供ReadPixel、DrawPixel、DrawHorzLine和DrawVertLine等
函数功能。这些函数从显存中读写像素,绘制水平线和垂直线。裁剪功能在设备无关层处
理。目前,所有的鼠标动作、文本绘制和位图绘制都是基于上面的基本函数实现的。如果
显示器使用调色板,必须调用SetPalette函数,除非系统连接了一个与系统调色板相配的
静态调色板。初始化时,屏幕驱动返回包括屏幕x、y值和颜色模式等的值。
Microwindows目前提供两种字体模式。提供了等比例字体从.bdf或其它格式转换为Microw
indows字体的转换工具。
屏幕驱动可以选择实现bitblitting,具体是对返回标记执行或(OR)操作PSF_HAVEBLIT。
目前,位的blitting允许Microwindows执行屏幕外绘制。Microwindows允许任何对物理屏
幕的图形操作通过以下方式进行,首先执行到屏幕外的图形操作,然后复制(bit-blitte
d)到物理屏幕。实现一个blitting屏幕驱动相当复杂。实现blitting屏幕驱动首先要考虑
的是底层显示硬件是否支持传送用于framebuffer的硬件地址。如果支持,在物理屏幕上的
绘制函数就可以用于在屏幕外缓冲区的绘制。这是使用framebuffer驱动的方法。系统使用
malloc分配的内存地址代替用mmap分配的物理framebuffer地址。在系统不使用实际物理内
存地址的情况下(X或MS窗口),必须写两套函数,一套用于图形系统硬件,一套用于内存
地址。另外,需要知道在两种格式之间的复制方法。实际上,所有四种操作,screen-to-
memory,memory-to-screen,memory-to-memory和screen-to-screen,Microwindows都支
持。当然,位的blitting函数必须要快。查看fblin8.c和mempl4.c文件可以找到支持两种
显示硬件类型的例子。
如果你要写自己的屏幕驱动程序,推荐你先从PC BIOS(scr_bios.c)驱动开始,或者看看
framebuffer的驱动程序(scr_fb.c),scr_fb.c被fblin?.c函数包装起来以至能读写各种
framebuffer格式。先不要设置PSF_HAVEBLIT标记,开始时不要写bitblit函数。
注意:目前所有的SCREENDEVICE函数指针必须最少用空函数来实现。由于速度的原因,系
统总是认为函数指针是有效的。所以,就算不实现bitblit,也要提供一个什么事也不做的
bit-blit过程。
鼠标驱动:目前,Microwindows支持三种鼠标。mou_gpm.c提供了Linux下鼠标的GPM驱动
,mou_ser.c 提供了Linux和ELKS下串口鼠标的驱动,mou_dos.c提供了MSDOS下鼠标的int
33驱动。鼠标驱动的最基本功能是转换鼠标数据,返回鼠标的相对或绝对位置和按键。另
外,Brad LaRonde写了一个触摸屏的驱动程序mou_tp.c,在某些场合可以代替鼠标工作。
它返回触摸笔在显示屏表面的x、y坐标。
在Linux下,Microwindows在主循环执行select函数,通常传递鼠标和键盘的文件描述符给
select函数。如果系统不支持select函数或者在文件描述符中没有传递鼠标的数据,可以
用Poll函数获取鼠标活动信息。
键盘驱动:提供了两种键盘驱动。第一种是kbd_tty.c,用于Linux和ELKS系统,通过打开
和读取文件描述符的方法来实现。第二种是kbd_bios.c,用于MSDOS系统,通过读取PC BI
OS的击键来实现。原来的键盘驱动只返回8位键盘数据,没有扩展功能键的区分能力。0.8
9pre7版本重写了键盘驱动,提供了扫描码、up/down事件、重发控制等功能。
MicroGUI – 设备无关图形引擎:调用屏幕、鼠标和键盘驱动程序来跟硬件打交道Microw
indows的核心图形函数位于设备无关的图形引擎层中。用户应用程序从不直接调用核心图
形引擎函数,因为Microwindows提供了相关的API(将在下章论述)。核心图形引擎函数独
立与应用程序API有几个原因。其一,在客户/服务器模式下,核心图形函数常常驻留在服
务器上。其二,由于速度上的原因,核心图形函数使用内部文本字体和位图格式,这与标
准API数据结构有区别。其三,核心图形函数常常使用指针,从不使用标识,等等。
在Microwindows中,核心图形函数总是遵守GdXXX的命名方式,它们只关心图形输出,不是
窗口管理。另外,所有的裁剪和颜色转换都在这一层处理。下面的文件组成了Microwindo
ws的核心模块:
devdraw.c 核心图形函数(线、圆、多边形、文本、位图、颜色转换)
devclip.c 核心剪裁函数(devclip2.c是新的y-x-banding运算法则、devc
lip1.c是旧的)
devrgn.c 相交/联合/相减/异或生成区域动态分配的函数
devmouse.c 鼠标指针更新和剪裁的核心函数
devkbd.c 核心键盘处理程序
devpalX.c 提供1、2、4和8位色调色板支持。
应用程序接口:目前,Microwindows提供两种不同的应用程序接口。窗口管理器实现标题
栏和关闭按钮的绘制,并处理程序的图形输出要求。
Microwindows API最初是初始化屏幕、键盘和鼠标,然后是在select循环中等待事件。当
有事件发生时,如果发生的是系统事件(如键盘、鼠标行为),则事件会转换为expose事
件或paint等事件传送给应用程序。如果是用户请求图形操作,则将参数转换后调用相应的
GdXXX引擎函数。注意,窗口与原始图形操作相对的概念在API层处理。说得更精确些是,
API定义好窗口、坐标系统等,然后转换成屏幕相关参数传给核心引擎函数(GdXXX),执
行实际操作。这一层定义了图形上下文和屏幕设备上下文,并传递包括裁剪的信息给核心
引擎函数。
目前,Microwindows API的源程序是mwin/win*.c,而Nano-X API的源程序是nanox/srv*.
c。
Microwindows API:Microwindows API在设计上尽量顺从Microsoft Win32和WinCE GDI标
准。目前,支持大部分的图形绘制和裁剪工作、支持自动绘制窗口标题栏、支持窗口的拖
动。Microwindows API使用消息机制,允许编写应用程序时无需考虑系统最终是否使用窗
口管理器。目前,Microwindows API不是客户/服务器模式,在第4章有详细讨论。
Nano-X API:Nano-X API是模仿David Bell 写的mini-x服务器开发出来的。它的API宽松
地仿照X 窗口系统的Xlib API,但函数以GrXXX的方式命名,而不是X...。目前,Nano-X
API使用客户/服务器模式,但不提供窗口的自动装饰、标题栏和用户窗口移动。
--
※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 202.97.206.198]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:7.292毫秒