微软 Windows CE显示驱动程序和硬件
介绍
Microsoft Windows CE操作系统的图形显示风格在版本2.0中有很大变化,在版本1.0中,图形设计界面(GDI)直接与显示硬件相接,在版本2.0中GDI与一个或更多显示驱动程序相连,它们反过来与显示硬件相连。这种显示技术使得Windows CE能使用各种不同的显示设备而无需对每个设备都有硬件代码程序,新的Windows CE GDI将小步骤与多用途结合起来。
本论文首先考虑一个好的Windows CE显示驱动程序具有的特征,它讨论了显示驱动程序,应该执行的设备驱动程序界面功能,同样图形原始引擎级别,能用来简化写显示驱动程序,GDI支持设备驱动程序亦在讨论之列。
本论文然后列举了Windows CE支持的每个像素深度的详细、显示缓冲格式,并讨论显示硬件,因为显示驱动程序是GDI与显示设备之间通道、显示驱动程序的硬件支持,也需支持GDI。
Windows CE显示驱动程序
像Windows CE大多数一样,显示驱动程序界面(DDI)为微软Windows NT的DDI的子集合,如果你不熟悉Windows NT DDI,在写入你的Windows CE显示驱动程序前,应该阅读Windows NT设备驱动程序包的显示驱动程序部分。
Windows CE仅使用Windows NT DDI中最基本的图形引擎和驱动程序函数.Windows CE和Windows NT的差别,有下述细节:
Windows CE显示驱动程序总有相同功能,GDI并不查询驱动程序能力信息;
Windows CE显示驱动程序并不拒绝复杂的操作,它调其回GDI,以使操作分成简单几步,因为所有Windows CE显示驱动程序支持相同功能,GD能够在首次调用显示驱动程序前分解复杂操作。
Windows CE显示驱动程序被编辑成动态链接库(.DLL文件)而不是库函数(.LIB文件)。
所有Windows CE显示驱动程序必须执行一套DDI函数,它由.GDI调用初始化显示驱动程序和绘制以显示,除了DDI函数,这有一套VC++类,它调用图形初级引擎(GPE)类,显示驱动程序用它使硬件加速更容易,标准的显示驱动程序调用GPE类和加速是基于S3Trio64的显示硬件,如果你的显示硬件使用不同的视像芯片,你能够改变GPE调用方式以适合你的硬件能力。
注意使用GPE类是可选择的,你能够不需它们而写入你的显示驱动程序,代价是使DDI函数的执行更加复杂,注意,由微软提供的GPE类需要你的显示硬件有一个flat 帧(frame)缓冲区,如果你的显示硬件没有,例如,它使用定制可移动窗口来连接整个显存,它可能不能使用GPE类,为获得更详细信息,参与本文中Windows CE显示硬件推荐部分,特别是Dirty Rec Drivers子部分。
Windows CE显示驱动程序在许多方式上与通常的设备驱动程序不同,最主要不同是他们不暴露I/O接口。因此,他们不能被设备管理器管理,因此寄存器从来不能被它们调用。结果,这没有特别设备文件或其它文件系统记录,以与活动显示驱动程序相协调,显示驱动程序装载的机制是一个使用显示驱动程序的应用软件,调用带有显示驱动程序名的Create DC函数动态链接文件。这使Windows CE能装载显示驱动程序,并初始化以使设备上下文能够返回调用应用默认的显示驱动程序,当然是自动加载。
DDI函数
下面表格列举了显示和打印驱动程序的DDI函数显示驱动程序,应执行此处列举的全部显示DDI函数。打印驱动程序则应执行全部的打印DDI函数。然而,仅有Drve Enable Drive必须由显示驱动程序的动态链接库(DLL)输出。所以,仅有DrvEnableDrive必须有名称,其它函数可随意调用,因为他们由Drr Enable Driver返回的,函数指针输出到GDI,无论谁被调用,总是跟随定义在Win DDI.H文件中的原型。
函数
用途
DrvAnyBlt
有扩展或透明位块传送
DrvBitPlt
有剪切和屏蔽的通常位块传送
Drv ConstrostControl
允许软件、硬件对照调整
DrvCopyBits
发送GDI设计的打印段到打印驱动程序
DrvCreateDeviceBitmap
设计和管理位图
DrvDeleteDeviceBitmap
删除设计位图
DrvDisableDriver
通知驱动程序GDI不再需要它,并准备卸载它
DrvDisableP.D.Ev.
通知驱动程序GDI不再需要特殊打印或显示设备
DrvDisableSwrface
通知驱动程序GDI不再需要特殊绘制表面
DrvEnableDriver
由驱动程序输出初始记录,为GDI的DDI函数返回指针
DrvEnablePDEv
为GDI返回一个PDEV,它是一个物理显示设备的逻辑表示
DrvEnablesface
设计一个绘制界面,并把它与PDEV相连
DrvEmdDoc
发送任何所需的完成打印文件控制信息
DrvFillpath
用毛刷填充路径
DrvGetMask
为目前显示设备模式获取颜色屏蔽
DrvGetMode
列举、显示设备支持的显示模式
DrvMorePointer
移动指针,保证GDI不干涉
DrvPaint
用毛刷漆出一个特定区
DrvPowerHandler
调用处理、上电、掉电通知
DrvAweryFont
获得字体公制信息
DrvRealizeBrush
创建由GDI指定参数毛刷
DrvReamoceColor
把一个RGB颜色,映射到由设备支持最可能获得颜色
DrvSeepalette
设置显示设备调色盘
DrvSeepointershape
对光标设置新形状并更新显示
DrvStareDoc
发送任意的开始打印文件信息
Drvstartpage
发送任意的打印新页的信息
DrvshokePath
删除路径
DrvtransparentBrt
透明位块传送
Drvunrealizecolor
将显示设备制式的颜色映成RGB值
使用GPE类
标准显示驱动程序使用图形引擎工程(GPE)类,当GPE类可选择时,使用它们可很容易处理写入显示驱动程序,如果你使用GPE类,你仅需提供所需新代码,来使显示硬件功能正常操作加速。
GPE类需要你的显示硬件使用一个flat frame缓冲区,也就是显存必须位于一个邻近的内存范围,修正GPE类来使用一个非连续frame buffer将很费力气。
为创建一个基于GPE类显示驱动程序,用下述步骤:
为项目设一子目录;
由标准驱动目录,例如S3Trio64目录复制文件到你的项目目录;
全面更改文件中设定设备名,例如将“S3Trio64”改为你的设备名;
更改config.cpp以使它把你的显示设备,放在一个线性frame-buffer模式;
使指定硬件加速失效;
建立并测试这些非加速驱动程序GPE,将用软件产生输出;
加入你的硬件加速模式。
GDI提供的支持显示驱动程序服务
Windows CE GDI以预先定义函数结构和一些独立C函数形式,提供服务支持显示驱动程序,预定制结构提供毛刷、剪切区、调色板、删除和填充路径、转化的支持、独立的C函数提供设备位图和界面支持。
函数结构
用途
BRVSHOBJ
代表一个执行用实线或网格删除填充操作的毛刷
BRVSHOBJ_PVALLOCRbrush
为毛刷分配内存
BRUSHOBJ_PVGeeRbrush
为特定毛刷返回指针
CLIPOBJ
代表剪切区结构
CLIPOBJ-BESUM
从剪切区,列举剪切矩形的函数
CLIPOBJ-CenumStart
为列举剪切区的剪切矩形设置参数
EngcreateDericeBitmap
使GDI对设备位图进行处理
EngcreatedeviceSurFace
通过GDI创建一个显示驱动程序管理的设备界面
EngDeleteSurface
通知GDI显示驱动程序不再需要设备界面
PALOBJ-C GetColors
将颜色复制到调色板上
PATHDAT
存储部分绘制路径的结构
PATHOBJ-Benum
由绘制路径中列举PATHDATA记录
PATHOBJ-VenumStart
一个绘制路径列举它的线性部分
PATHOBJ-V GetBoints
返回绘制路径的有限制矩形区
XLATEOBJ
用来在调色板之间传送色彩
XLATEOBJ-C GET PALETTE
由指定的调色盘返回颜色
显示缓冲格式
Windows CE GDI支持广泛的色彩深度和色彩模式,由一色到可调的真32位RGB,每个格式也支持几个像素序,这依靠于显示是否是1位、2位或4位的。
所有的显示缓冲格式,假定了显示像素顺序从左到右、从上到下,即像素(0,0)在左上角像素(Wisth-1,height-1)在右下角。
1像素位格式
它为简单的黑白显示,0代表黑,1代表白。像素被以字节形式存储,这样像素(0,0)被放在显示内存第一个字节最高位。
2像素位格式
虽然任何4-entry调色板都可工作,但两象素位格式是典型地用于作为4级灰度显示,灰度级由下列表表示:
1位
0位
灰度级别
0
0
黑
0
1
灰
1
0
亮灰
1
1
白
4像素位格式
它通常是可调色格式,frame buffer可以2像素/一字节或1像素/一字节形式。
如果你选择,一个像素/字节方式执行,驱动程序将以16色调色板的8位/像素的显示模式,每个字节中相关位为低位字节,高位字节全为0。
8像素位格式
它是可用软件控制调色板的制式,它把八位值映射成24位色。
由于运行、兼容性、图像质量原因,微软推荐使用含有默认Windows CE调色板。
15或16像素位格式
它是屏蔽格式,不可调色。对15或16位像素像素以每两字节存储,15像素位,浪费了每个字最高位,微软推荐纯红、绿、蓝的匹配如下:
颜色
15位(5-5-5RGB)
16位(5-6-5RGB)
Red
0x7C00
0xF800
Green
0x3E00
0x07E0
Blue
0x001F
0x001F
在15位/像素匹配符中,每个命令的低15位包含像素数据,不用位为0。
24位/像素格式
它是真彩格式,每个像素对红、绿、蓝各存储8位,此种格式有其优点和不足,优点是图像质量好,因为每个像素占3字节,他们不浪费内存,不足之处是既然设计中像素一半穿越字符边界,在联连和解码像素时将引起操作后果。
32位/像素格式
它是另一种真彩格式,这种格式将不会使像素超过Dword边界,但内存利用效率不高,它有两种方式安排色彩通道,一个是蓝色作为每个像素中最弱作用字节,另一种是将红色作为最弱作用字节,与之相应为PAL-BGR和PAL-RGB模式,在每个像素中你能抽取红、绿、蓝的下列匹配符合通道。
Color
PAL_RGB Mask
PAL_BGR Mask
Red
0x000000FF
0x00FF0000
Green
0x0000FF00
0x0000FF00
Blue
0x00FF0000
0x000000FF
Windows CE显示硬件推荐
微软公司推荐使用10种Windows CE操作系统的显示硬件,这些硬件被证明是可操作的,并使你的显示驱动程序开发变得更容易,即使你的硬件不是所推荐的,你仍能写入一个完全功能的显示,驱动程序,或如果它在产品设计后期难以更改硬件设计,代价是在驱动程序和/或减少操作上附加努力。
内存布局
微软强烈推荐你显示硬件使用线性frame缓冲区,你能够向缓冲区读和写操作。所有的显示器内存应该是连续、适合的,此外,应是一个线性联接窗口覆盖整个frame缓冲区,使用非微软所推荐的硬件时,如果你选择使用它,就需要对GPE类进实质性改动,详细信息参见本论文的使用GPE类部门。
你的显示硬件也要使用可支持的像素格式,存储和像素序组合、详细信息,阅读本论文的,显示缓存格式部分。这种显示硬件frame缓冲应有如下性质:
由上至下格式,像素(0,0)在左上角,像素(width-1,height-1)在右下方;
frame缓冲区,内存中用来代表显示中的一个扫描行的字节数,应该是一组四字节,甚至用未用字节来填充每个扫描行末端;
整个frame缓冲区必须与CPU可连接,而不用CPU运行空白选择.
Frame缓冲区:不使用bit-planes,它的每个色彩通道或暗度都有分离frame缓冲区。
Dirty Rect缓冲区
如果你希望使用GPE类来执行显示驱动程序,但你的显示硬件没有被支持GPE类(例如,如果frame缓冲区非线性),然后你可能考虑写“dirty rece driver”。
在这个模式,GPE类维持一个内存中独于设备的位图(DIB),它代表frame缓冲区,当内存的DIB被修改时,GPE将通知dirty rect driver,以复制DIB更改的或“dirty"部分到,显示设备进行转换操作。
Direy rect drivers以占用内存和牺牲运行速度为代价,他们仅应做为支持硬件的最后手段,当这些硬件不能满足GPE需求。
加速
微软推荐你使用能加速下列操作的显示硬件,按重要性排列如下:
实色填充,特别的Bit操作,它的pb0-isolid color数不是OXFFFFFFF。
SRCCOPY Bit操作;
光标显示,如果你的平台使用光标;
用子像素绘制实线;
匹配SRCCOPY Bit操作;
其它的由Windows CE设备执行图像操作。
总结
在Windows CE 2.0中,显示驱动程序在可视化显示技术中发生关键性作用,与本论文中提到的设计策略相协调的,显示驱动程序和显示硬件将允许基于Windows CE的设备充分利用新GDI的增强图像显示能力。