Microsoft Windows CE 显示设备的驱动程序和硬件 Jason Black and Jon Christiansen September 1997 介绍 在Microsoft? Windows? CE操作系统2.0版本中对图形显示结构进行了根本上的改变 。在1.0版本中,图形设备接口(GDI)直接与显示设备的硬件相连接。在2.0版本中,G DI与一个或多个显示驱动程序连接,这些显示驱动程序依次与显示设备的硬件相连接。 这种显示结构使Windows CE能够使用各种显示设备,而不需要每个设备都有一个根据硬 件编程的接口程序。新的Windows CE GDI仅仅是向多功能性迈进的一小步。 首先,我们将考虑一下Windows CE显示设备驱动程序成功的几个因素。这里我们先 讨论一下显示设备驱动程序应该实现的接口功能,和可以用于简化显示设备驱动程序开 发任务的图形基本引擎类。同时也讲一讲设备驱动程序对GDI的支持。 其次,我们将给出一个详细列表,列出Windows CE所支持的每种像素灰度所对应的 显示缓冲格式,并讲述一下显示设备的硬件。由于显示设备驱动程序是GDI和显示设备之 间的纽带,硬件有效的支持了显示驱动程序,也就有效的支持了GDI。 Windows CE显示设备驱动程序 象Windows CE的其他部分一样,显示驱动程序接口(DDI)Microsoft Windows NT? DDI的一个子集。如果你不熟悉Windows NT DDI,在编写你的Windows CE驱动程序之前 你可以先读一下Windows NT Device Driver Kit (DDK)的显示设备驱动程序的有关章节 。 Windows CE仅仅使用了来自Windows NT DDI的基本图形引擎函数和驱动程序函数。Wind ows CE和Windows NT之间的不同造成了Windows CE显示设备驱动程序的下列差别: Windows CE显示设备驱动程序总是提供一组相同的功能,GDI不需查询关于驱动程序能力 的任何信息。 Windows CE显示设备驱动程序不能拒绝十分复杂的操作,它反过来调用GDI将复杂的操作 分解成简单的步骤。因为Windows CE所有的显示设备驱动程序支持相同的功能,在调用 显示设备驱动程序之前,GDI第一步可以将复杂的操作分解为简单的操作。 Windows CE显示设备驱动程序被编译为动态连接库(.dll文件)而不是编译成库文件( .lib文件)。 Windows CE所有的显示设备驱动程序必须实现一组DDI函数,GDI调用这组函数初始 化显示设备驱动程序和将图形输出到显示设备上。除了DDI函数,有一组被称为基本图形 引擎(GPE)类的Microsoft Visual C++?类,显示设备驱动程序可以使用它们方便的进 行硬件加速。使用GPE类及其方法实现对基于S3Trio64显示设备硬件的加速,便是实现显 示设备驱动程序加速的一个例子。如果你显示设备的硬件使用不同的芯片组,你可以改 变GPE方法的实现方式以适应你的硬件特性。 注意是否使用GPE类是随意的。你在编写显示设备驱动程序时,可以不使用它们,只 不过代价是你的DDI功能的实现将更加复杂。注意微软提供的GPE类要求你所用显示设备 的硬件必须有一个连续的帧缓冲区。如果你显示设备的硬件不是如此(例如,如果它使 用一个固定大小的移动窗口来存取整个显示内存),那么它就不能使用GPE类。要得到更 多的信息,请参阅本文的“Windows CE显示设备硬件推荐”部分,尤其是“脏矩形区的 驱动”子专题。 Windows CE显示设备的驱动在许多方面与一般的设备驱动不同。最主要的不同在于 它们没有明显的输入/输出流接口,因此,它们不能被设备管理器管理,它们也不能调用 RegisterDevice。结果,没有特别的设备文件或其他文件系统途径与显示设备驱动程序 相对应。当应用程序需要使用显示设备驱动程序,使用显示设备的.dll文件名调用Crea teDC时,显示设备驱动程序被装入。这时,Windows CE装入显示设备驱动程序并进行相 应的初始化,以便于将该设备的上下文返回给发出调用的应用程序。当然,缺省的显示 设备驱动程序被自动装入。 DDI 函数 下列表格中列出了显示设备和打印设备驱动程序的DDI函数。显示设备驱动程序应当 实现这里列出的所有显示设备DDI函数;打印设备驱动程序应当实现所有列出的打印DDI 函数。但是,只有DrvEnableDriver必须在显示设备驱动程序的DLL中表示出。因此,只 有DrvEnableDriver必须遵循这个名字;而其他函数可以根据你的需要进行调用,因为它 们是通过DrvEnableDriver返回的函数指针表示出来。不论它们被谁调用,它们都必须遵 照在WinDDI.H中定义的原型。 表1 DDI 函数 函数 目的 DrvAnyBlt 以弹性或透明的方式进行位块传送 DrvBitBlt 以剪贴或屏蔽的方式进行通常的位块传送 DrvContrastControl 使用软件调节显示设备的硬件设置 DrvCopyBits 将创建的GDI打印区发送给打印设备驱动程序 DrvCreateDeviceBitmap 创建并管理位图 DrvDeleteDeviceBitmap 删除设备位图 DrvDisableDriver 提醒驱动程序GDI不再需要它并准备卸载它 DrvDisablePDEV 提醒驱动程序GDI不再需要特定的打印或显示设备。 DrvDisableSurface 提醒驱动程序GDI不再需要特定的绘图平面 DrvEnableDriver 由驱动程序表示初始化入口点,并将其他DDI函数指针返回给GDI DrvEnablePDEV 将一个PDEV(物理显示设备的逻辑表示)返回给GDI DrvEnableSurface 创建一个绘图平面并将它与一个PDEV关联 DrvEndDoc 将完成打印所需的控制信息发送给一个文档 DrvFillPath 用画笔填充一个路径 DrvGetMasks 获取显示设备当前模式的颜色掩码 DrvGetModes 列出显示设备所支持的显示模式 DrvMovePointer 确保不受GDI干扰的移动指针 DrvPaint 用画笔绘制特定的区域。 DrvPowerHandler 被调用来处理能量高和能量低的提示 DrvQueryFont 获取字体公制单位信息 DrvRealizeBrush 用GDI指定的参数创建一个画笔 DrvRealizeColor 将一个RGB颜色映射到最接近的设备所支持的一个有效的颜色上 DrvSetPalette 设置显示设备调色板 DrvSetPointerShape 设置指向一个新的形状的指针并更新显示 DrvStartDoc 将启动打印所需的控制信息发送给一个文档 DrvStartPage 将启动打印所需的控制信息发送给一个新的页面 DrvStrokePath 绘制一个路径 DrvTransparentBlt 以透明方式进行位块传送 DrvUnrealizeColor 以该显示设备的格式将一个颜色映射给一个RGB值 使用GPE类 示例显示设备驱动程序使用GPE类。尽管GPE类是任选的,但是使用它可以极大的方 便对显示设备驱动程序的编写。如果你使用GPE类,那么你只需提供使你的显示设备硬件 功能正常和实现加速所需的新代码。 GPE类要求你的显示设备的引见使用一个连续的帧缓冲区。这就是说,显示设备内存 必须位于一个邻近的内存范围内。修改GPE类来使用一段不相邻的帧缓冲区则需要你付出 很大的努力。 要创建一个基于GPE类的显示设备驱动程序,需按照下列步骤: 为你的工程创建一个目录。 从一个示例驱动程序目录中将文件复制到你的工程目录中,例如S3Trio64目录。 在这些文件中对特定的设备名进行全局替换,例如用你的设备名替换“S3Trio64”。 改变Config.CPP以便于将你的显示设备设置为一种线性帧缓冲区模式。 禁用所有特定硬件的加速。 编译并测试这个没有加速的驱动程序。GPE将使用软件仿真生成输出。 添加你自己的硬件加速代码. 支持的显示设备服务 Windows CE GDI提供了一些服务来支持显示设备,以预先定义的结构的方式并带有作用 在其上的函数,和一些独立的C函数。预先定义的结构提供了对画笔、剪贴区域、调色板 、笔画、填充方式和转换的支持。独立方式的C函数提供了对设备位图和平面的支持。 表2 GDI 结构和函数 结构和函数 目的 BRUSHOBJ 用于表示实心或模式笔画和填充操作的画笔结构 BRUSHOBJ_pvAllocRbrush 给画笔分配内存的函数 BRUSHOBJ_pvGetRbrush 重新获取指向指定笔画指针的函数 CLIPOBJ 表示剪贴区域的结构 CLIPOBJ_bEnum 列举在剪贴区域中的剪贴矩形的函数 CLIPOBJ_cEnumStart 给剪贴区域中列举出的矩形设置参数的函数 EngCreateDeviceBitmap 用于使GDI为设备位图创建句柄的函数 EngCreateDeviceSurface 用于使GDI创建将由显示设备驱动程序管理的设备平面的函数 EngDeleteSurface 用于通知GDI显示设备驱动程序不再需要该设备平面的函数 PALOBJ_cGetColors 将颜色复制到调色板的函数 PATHDATA 存储部分绘画轨迹的结构 PATHOBJ_bEnum 列举绘画轨迹中PATHDATA记录的函数 PATHOBJ_vEnumStart 使绘画轨迹准备好列举它的组件线段的函数 PATHOBJ_vGetBounds 返回绘画轨迹所限制的矩形的函数 XLATEOBJ 用于从一个调色板向另一个调色板传送颜色的结构 XLATEOBJ_cGetPalette 重新从一个索引指出的调色板获取颜色的函数 显示设备缓冲区的格式 Windows CE GDI支持带有多种颜色灰度和颜色模式的显示设备,从仅用一位表示的 颜色到调色板调制出的颜色直到真32位RGB。每一种格式种又支持几种不同的像素排列方 式,这取决于对显示内存的访问是否支持字节方式、双字节字方式、或四字节DWORD方式 。 所有显示缓冲区格式都假定显示设备上像素的顺序是从左到右,和从上到下的。也 就是说,像素(0,0)位于显示设备的左上角,像素(width-1,height-1)位于显示设 备的右下角。 每个像素用一位表示的格式One-Bit-Per-Pixel Format 每个像素用一位表示的格式是针对简单的黑白显示设备的。0表示黑,1表示白。由 多个像素组成字节,如像素(0,0)位于显示内存第一个字节的最高位上。这种格式的 内存可以被排列成下列方式: 每个像素用两位表示的格式 尽管任意4条目的调色板都可以使用,但是每个像素用两位表示的格式是4级灰度显 示设备的一种典型用法。各灰度级所表示的内容可以根据下列表格确定: Bit 1 Bit 0 Gray Level 0 0 黑 0 1 深灰 1 0 浅灰 1 1 白 这种格式的内存可以被排列成下列方式: 每个像素用四位表示的格式 每个像素用四位表示的格式是常用的一种调色板格式。帧缓冲区本身可以被实现为 将两个像素组成一个字节,或每个字节表示一个像素两种方式。这种格式的内存可以被 排列成下列方式: 如果你选择使用每字节表示一个像素的方式,那么驱动程序应当将显示方式表示成 每个像素使用8位的16色调色板方式。每个字节中相对应的位应当是位于低阶的半字节, 而高阶的半字节应当总是0。 每个像素用八位表示的格式 每个像素用八位表示的格式可以很理想的用一个软件改变的调色板来将8位的值映射 到24位的颜色。由于执行、兼容性和图象质量的原因,微软推荐使用缺省的Windows CE 调色板。 每个像素用15位或16位表示的格式 每个像素用15位或16位表示的格式是一种掩码的格式,并且不被调色。对于每个像 素用15位或16位表示的格式,像素是用两字节的字存储的;每个像素用15位表示的格式 浪费了每个字的最高位。微软推荐使用下列掩码来提取红、绿、蓝数值: 颜色 Fifteen-Bit (5-5-5 RGB) Sixteen-Bit (5-6-5 RGB) 红 0x7C00 0xF800 绿 0x3E00 0x07E0 蓝 0x001F 0x001F 正如每个像素用15位表示的掩码所显示的,每个字的低15位包含该像素的数据。未 用的位应当是0。这种格式的内存可以被排列成下列方式: 每个像素用24位表示的格式 每个像素用24位表示的格式是一种真彩色的格式,其中每个像素用红、绿、蓝各8位 的方式存储。这种格式有一些优点和缺点。优点是这种方式的图象质量非常好,因为每 个像素恰好占3个字节,它们可以被一起放置而不会浪费内存。缺点是这种方式中有半数 的像素跨越DWORD边界,在存取和解码时会有执行效率上的损失。这种格式的内存可以被 排列成下列方式: 每个像素用32位表示的格式 每个像素用32位表示的格式是另一种真彩色的格式。这种格式不会使像素产生跨越 DWORD边界的情况,但是在内存使用上效率低。在这种格式中有两种方式安排颜色信道。 一种方式是将蓝色放在每个像素最不重要的字节中,另一种方式将红色放在最不重要的 字节中。这些选项与PAL_BGR和PAL_RGB方式相对应。你可以使用下列掩码来从每个像素 中提取红、绿、蓝和alpha信道: Color PAL_RGB Mask PAL_BGR Mask Red 0x000000FF 0x00FF0000 Green 0x0000FF00 0x0000FF00 Blue 0x00FF0000 0x000000FF 这种格式的内存可以被排列成下列方式: Windows CE显示设备硬件推荐 对用于Windows CE操作系统的显示设备硬件,微软有一些推荐标准。这些推荐标准 有益于提高执行效率和方便你进行显示设备驱动程序的开发。即使你的硬件与这些推荐 的标准并不一致,你仍然可以编写功能完善的显示设备驱动程序。或者在你的产品设计 周期中想改变它的硬件设计为时已晚,在实现驱动程序并且或者降低其性能需要花费额 外的努力。 内存布局 微软强烈推荐你的显示设备硬件要使用线性帧缓冲区,你应当能够读写缓冲区。你 全部的显示内存应当是连续的,更好的情况下,应当是一个线性存取的窗口,并能够覆 盖整个帧缓冲区。对于不符合这个推荐标准的硬件,如果你选择使用GPE,那么将需要你 对GPE类做实质性的修改。参见本文的"Using GPE Classes"部分,可以获得更多的信息 。 你的显示设备硬件还应当使用一种被支持的像素格式、压缩和排列的组合。关于此 内容更多的信息,可以阅读本文的"Display Buffer Formats"部分。显示设备硬件的帧 缓冲区应当有下列特性: 自顶向下的格式,像素(0,0)在左上角,像素(width-1,height-1)在右下角。 帧缓冲区的步幅,即表示显示设备上一个扫描行在内存中占的字节数,应当是四字节的 整数倍,即使这将意味着在每个扫描行的末尾将填充一些无用的字节。 CPU不需做“排”选择就可以存取整个帧缓冲区。 帧缓冲区不应当使用位面,在位面中帧缓冲区被用于每种颜色信道或强度部件。 脏矩形驱动程序 如果你打算使用GPE类来实现一个显示设备驱动程序,但你的显示设备硬件不支持GP E类(例如,如果帧缓冲区不是线性的),那么你可能会考虑编写一个“脏矩形”驱动程 序。 在这中模式中,GPE类维护一个在内存中的独立于设备的位图(DIB)来表示帧缓冲 区。一旦在内存中的DIB被修改了,GPE就会通知脏矩形驱动程序。脏矩形驱动程序就会 响应,将DIB中改变了的或“脏”的部分复制到显示设备上,执行所需的任何改变。 脏矩形驱动程序在内存使用上和执行速度上花费很大的代价。这些应当仅仅作为实 现对无法与GPE需要兼容的硬件进行支持的最后一种手段。 加速 为了减少代价,微软推荐你使用可以进行下列加速操作的显示设备硬件: 纯色填充。尤其是,其pbo->iSolidColor成员不是0xFFFFFFFF的Blt操作。 SRCCOPY Blt操作。 如果你的平台使用光标,那么包括光标的显示。 用单像素以内的精确度绘制实线。 屏蔽SRCCOPY Blt操作。 你的Windows CE设备经常执行的其他图形操作。 总结 在Windows CE 2.0版中,显示设备驱动程序在可视化显示结构中扮演了一个关键性 的角色。按照本文中所列的设计策略创建的显示设备驱动程序和显示设备硬件,将使基 于Windows CE的设备可以充分的利用新GDI所具有的增强的图形显示能力。 关于此内容的其他信息 关于Microsoft Windows CE Embedded Toolkit for Visual C++ 5.0,可以参阅Mi crosoft Windows CE Web站点。该工具将提供给MSDN Library的普通订户。 同时,记得阅读下列文章,都包含在MSDN Library中: "Embedded Development with Microsoft Windows CE 2.0," 由Franklin Fite Jr.和R andy Kath编写。 "Introducing the Windows CE Embedded Toolkit for Visual C++ 5.0," 由David Pe llerin编写。 "Microsoft Windows CE Graphics Features," 由Jon Christiansen编写。 "Microsoft Windows CE Memory Use," 由John Murray编写。 "The Microsoft Windows CE Communications Model," 由Guy Smith编写。 "Real-Time Systems with Microsoft Windows CE," 由John Murray编写。 "The Win32 Programming Model: A Primer for Embedded Software Developers," 由 David Pellerin编写。 本文中包含的信息代表微软公司在本文发表时关于此问题的观点。由于微软必须及时对 变化的市场条件作出反应,请不要将它认为是微软所承担的部分责任的许诺,在本文发 表后微软将不确保所表示的任何信息的精确性。本文仅仅是为了提供一些信息。 此白皮书仅仅是出于提供一些情报的目的。在本文中,微软不做任何保证、表示或暗指 。(转载自MSDN) -- ※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.61.53] |
[返回顶部] [刷新] [同主题模式] [普通模式] [版内查询] | |
来这个版的人常去的其他版面: [Circuit][DSPTech][MCUTech][NetResources][Commun][LinuxDev][Love] |
[我的百宝箱] [返回首页] [上级目录] [根目录] [令狐冲精华区搜索] [返回顶部] [刷新] [返回]