新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > WinCE Display驱动开发介绍

WinCE Display驱动开发介绍

作者:时间:2011-05-28来源:网络收藏

2 实现GetGPE函数

在定义了NewGPE类之后,我们需要实现一个实例,首先定义一个该类的指针:

static GPE *gGPE = (GPE*)NULL;

然后实现GetGPE函数,如下:

GPE *GetGPE(void)

{

if (!gGPE)

{

gGPE = new NewGPE();

}

return gGPE;

}

在该函数中,创建了一个NewGPE的实例。在这个时候NewGPE构造函数会被调用,一般我们会在这里面作一些与显示相关的初始化的工作。该函数返回gGPE指针给上层接口。

3 实现DrvEnableDriver和Init函数

对上层的GWES模块提供了20多个函数接口,但是这些函数并不是直接提供出来的,实际上只是通过一个DrvEnableDriver(..)函数来完成的。该函数在的MDD层中没有实现,所以需要在PDD层中定义,如下:

BOOL APIENTRY DrvEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data, PENGCALLBACKS engineCallbacks)

{

BOOL fOk = FALSE;

// make sure we know where our registry configuration is

if(gszBaseInstance[0] != 0) {

fOk = GPEEnableDriver(engineVersion, cj, data, engineCallbacks);

}

return fOk;

}

engineVersion:DDI版本号,目前为DDI_DRIVER_VERSION。

cj:DRVENABLEDATA结构的大小。

data:指向DRVENABLEDATA结构体。

engineCallbacks:指向一个回调函数结构体,传入一些GDI函数到Display中。

其中,DRVENABLEDATA结构中包含了Display驱动中的设备接口函数的指针,在DrvEnableDriver函数中调用了GPEEnableDriver函数,该函数会导出GWES模块所需的所有Display驱动的接口函数。同时GWES模块通过第四个参数engineCallbacks提供回调函数供Display驱动调用。该函数在”ddi_if”中定义。

另一个重要的函数是DisplayInit函数,它是第一个被执行的Display驱动中的函数,该函数主要用于读取注册表中的一些信息并作判断。该函数是可选的,也可以不在驱动中实现它。

BOOL APIENTRY DisplayInit(LPCTSTR pszInstance, DWORD dwNumMonitors)

{

DWORD dwStatus;

HKEY hkDisplay;

BOOL fOk = FALSE;

if(pszInstance != NULL) {

_tcsncpy(gszBaseInstance, pszInstance, dim(gszBaseInstance));

}

// sanity check the path by making sure it exists

dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, hkDisplay);

if(dwStatus == ERROR_SUCCESS) {

RegCloseKey(hkDisplay);

fOk = TRUE;

}

else

{

RETAILMSG(0, (_T(SALCD2: DisplayInit: can't open '%s'rn), gszBaseInstance));

}

return fOk;

}

pszInstance:注册表中显示驱动的相关注册表值

dwNumMonitors:支持的Monitor的个数

在该函数中主要通过读取注册表信息判断显示驱动的存在,如果返回错误,则GWES会停止Display驱动的初始化。当然,用户可以根据自己的要求灵活掌握,也可以在这里初始化显示设备或做其他的初始化工作。

4 实现GPE类中的函数

由于NewGPE继承于GPE类,所以必须实现GPE类中的所有纯虚函数,这些函数实际上就是PDD层驱动中需要实现的函数,如下:

4.1 virtual SCODE GetModeInfo(GPEMode *pMode, INT modeNumber)

获得显示模式。

pMode:输出显示模式结构

modeNumber:显示模式索引号

4.2 virtual int NumModes(void)

获得当前驱动支持的显示模式的个数

4.3 virtual SCODE SetMode(INT modeId, HPALETTE *palette)

设置显示模式。

modeId:显示模式索引号

palette:调色板指针,指向一个由EngCreatePalette函数创建的调色板

4.4 virtual SCODE AllocSurface(GPESurf **surface, INT width, INT height, EGPEFormat format, INT surfaceFlags)

在系统内存中创建一个绘图平面。

surface:指向被分配的内存的指针

width:宽度

height:高度

format:绘图平面格式

surfaceFlags:标记位,标明在哪分配内存

4.5 virtual SCODE SetPointerShape(GPESurf *pMask, GPESurf *pColorSurface, INT xHot, INT yHot, INT cX, INT cY);

设置光标形状。

pMask:指向一个包含光标形状的掩码

pColorSurface:指向被光标使用的颜色绘图平面

xHot:光标热点的X坐标

yHot:光标热点的Y坐标

cX:光标宽度

cY:光标高度

4.6 virtual SCODE MovePointer(int x, int y)

移动光标到指定位置或者隐藏光标

x:光标移动位置的x坐标,若为-1表示隐藏光标。

y:光标移动位置的y坐标

4.7 virtual SCODE BltPrepare(GPEBltParms *blitParameters)

在做位块传输前会先执行该函数,用于确定执行BLT的函数

blitParameters:指向一个GPE的位块传输参数的结构体

4.8 virtual SCODE BltComplete(GPEBltParms *blitParameters)

该函数用于释放在BltPrepare中申请的资源

blitParameters:指向一个GPE的位块传输参数的结构体

4.9 virtual SCODE Line(GPELineParms *lineParameters, EGPEPhase phase)

画线函数

lineParameters:指向一个GPE的Line结构体,描述所画的线

phase:画线所处的阶段,具体描述如下

gpeSingle:画单根线

gpePrepare:准备画线

gpeContinue:画线过程中

gpeComplete:画线完成

在这里要提一点,有时我们会看到在该函数中调用另一个函数WrappedEmulatedLine(..),这个函数在的PUBLIC目录下的参考Display驱动中也可以找到,该函数是一个快速的画线函数,里面采用了Bresenham画线算法,通过采用运行速度快的加减和移位运算来完成画线。

4.10 virtual SCODE SetPalette(const PALETTEENTRY *pSource, USHORT firstEntry, USHORT numEntries)

设置调色板

pSource:指向一个调色板入口信息的结构体

firstEntry:第一个入口

numEntries:入口的个数

4.11 virtual int InVBlank(void)

显示设备是否处于垂直消隐期间

上述函数在GPE类中均被定义为纯虚函数,需要在继承类中实现,也就是在我们的驱动程序中实现。这些函数是必须实现的。根据显示的需求,还可以在显示驱动中添加其他的函数,比如对光标的支持,对旋转的支持等,如下:

4.12 void CursorOn(void)

使能光标显示。

4.13 void CursorOff(void)

禁止光标显示。

4.14 void SetRotateParms(void)

设置屏幕翻转参数。

4.15 void DynRotate(int angel)

支持动态翻转。

angel:翻转角度

4.16 ULONG *APIENTRY DrvGetMasks(DHPDEV dhpdev)

获得显示模式的RGB掩码

dhpdev:指向掩码信息,比如RGB565模式为(0xf800,0x07e0,0x001f)

NOTE:该函数必须在驱动中被实现。

4.17 PowerHandler(BOOL bOff)

电源控制。

bOff:TRUE表示关闭电源,FALSE表示打开电源

4.18 ULONG DrvEscape(DHPDEV dhpdev, SURFOBJ* pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut)

该函数提供给应用程序的一个直接访问显示驱动的接口,和流设备驱动中的IoCtls函数类似。应用程序通过调用ExtEscape函数传送操作码和数据给显示设备驱动,DrvEscape函数会接收到数据并进行处理,然后返回相应结果给EstEscape函数。用户也可以根据需要自己定义相应的操作码。

dhpdev:设备句柄

pso:指向一个绘图平面的结构

iEsc:操作码

cjIn:输入数据buffer的大小

pvIn:指向输入数据buffer

cjOut:输出数据buffer的大小

pvOut:指向输出数据buffer


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭