WinCE5.0显示驱动对DirectDraw 功能的支持
--作者:赖玉平(Auly)aulyp@163.com
方框图:
上图中DDI 和HAL 单元都是显示设备驱动程序的组成部分
DDI 单元的导出函数是DrvEnableDriver,HAL 单元的导出函数是HALInit。DDI 单元为GDI 提供服务,HAL 单元及Windows CE 自带的以软件模拟的方式提供对DirectDraw 功能支持的HEL 单元为DirectDraw 服务。GDI和DirectDraw 都是Windows CE 操作系统的GWES 子系统的组成部分,前者主要负责画矩形、直线、圆等简单的几何型图及较简单的块传输、画直线的硬件加速,后者可以画复杂的二维图案和更高级的硬件加速。
1 LCD 控制器驱动程序动态链接库的另一个重要的导出函数是HALInit,HALInit 函数在驱动程序初始化阶段被DirectDraw 调用。HALInit 函数的全部实现代码都是为了构造一个为DirectDraw 提供功能支持信息的DDHALINFO 结构体。
2 HALInit 函数的执行主要就是调用两个函数:
FillHelCaps 函数负责初始化DDHALINFO 结构体的ddHelCaps 成员。是设备驱动程序用软件模拟支持的DirectDraw能力, 由于与特定的显示设备硬件无关,所以填充ddHelCaps 成员的工作就由微软代劳,
buildDDHALInfo 函数负责初始化lpddhi 指针所指向的DDHALINFO 结构体数据的与硬件相关的内容,这部分记录的是上图中的HAL 单元的DirectDraw 支持能力,而HAL 单元是显示设备驱动程序的组成部分,必须由用户负责实现。
3 在buildDDHALInfo里,通过一个全局结构体g_pGPE,获得初始化信息(SUNSAMG2450BSP).
在Halcaps.cpp中
lpddhi->vmiData.ddpfDisplay.dwRGBBitCount 回传LCD位数
CreateSurface 是DDHAL_DDCALLBACKS 结构体的成员函数,该结构体是DirectDraw 对象回调函数的容器,这此都是与硬件特别相关的函数,必须实现
DDHAL_DDCALLBACKS,
DDHAL_DDCOLORCONTROLCALLBACKS
DDHAL_DDEXEBUFCALLBACKS
DDHAL_DDKERNELCALLBACKS
DDHAL_DDMISCELLANEOUSCALLBACKS
DDHAL_DDPALETTECALLBACKS
DDHAL_DDSURFACECALLBACKS
DDHAL_DDHALMEMORYCALLBACKS
DDHAL_DDVIDEOPORTCALLBACKS
DDKERNELCAPS
以上这些结构体,实现与操作系统的交互,在这些结构中定义各种信息。系统通过这里定义的接口调用驱动程序。
详情看李大为的著作,14章
在Windows CE 操作系统的显示设备驱动程序中,DirectDraw 显示表面用DDGPESurf 类表示。所谓
DirectDraw 显示表面,就是加入了对DirectDraw 支持功能的显示表面。DirectDraw 显示表面与一般的显
示表面是具体与抽象的关系,DDGPESurf是GPESurf 类的子类
DDGPESurf 类成员中:
m_ePixelFormat 成员记录DirectDraw 显示表面的像素格式