您的位置 首页 嵌入式

带你知道WinCE Display驱动开发

在WinCE中,Display驱动由GWES模块来管理。WinCE提供了两种架构的Display驱动模型,可以满足不同的硬件需求。一种是基于WinCE DDI的Display驱动模型

在WinCE中,Display驱动由GWES模块来办理。WinCE供给了两种架构的Display驱动模型,能够满意不同的硬件需求。一种是依据WinCE DDI的Display驱动模型,另一种是依据DirectDraw的Display驱动模型。下面将对两种架构作简略介绍。

1. Display驱动模型

WinCE下的Display驱动直接由GWES模块办理,它会直接被GWES模块办理和调用。Display驱动实际上也是分层的,其间包括GPE库,该库处理一些默许的绘图,相当于驱动的MDD层。用户只需求开发和硬件相关的PDD层驱动就能够了。在WinCE中,整个架构如图:

如图,Application为一个应用程序,该程序会调用图形设备接口函数(GDI),而GDI函数是由Coredll.dll模块导出的。Coredll.dll会将函数调用的参数打包,然后触发对另一个进程的本地进程调用(LPC),一切的绘图和开窗口的作业被传给内核中GWES模块。GWES模块被称为图形,窗口和事情子体系,专门处理图形输出和用户输入等事情及相关的一切交互。GWES模块会调用Display驱动完结对显现硬件的操作。Display驱动由GPE和DDL.dll组成,GPE完结根本的默许绘图作业,而DDI.dll实际上从GPE类上承继而来的,并完成了相关的显现硬件的操作。

2. DirectDraw Display驱动模型

DirectDraw供给了独立于硬件的直接拜访显现设备的才能。它能够经过直接拜访硬件笼统层(HAL)中的一些函数来到达直接操作显现设备的意图,在这个进程中,不再需求图形设备接口(GDI)的转化。这种直接的办法能够使图画愈加衔接,也提高了显现的功用。为了完成这样的功用,需求在显现驱动上扩展能够直接拜访相关硬件的函数。这些函数会被DirectDraw模块调用,并构成DirectDraw的硬件笼统层(DDHAL)。DirectDraw显现驱动架构如图:

如图,DirectDraw的真实完成代码都驻留在gwes.dll模块中,应用程序仅仅衔接了一个小的客户端,被称为DDRAW.dll署理,该署理首要担任用户进程与体系之间的长途DirectDraw COM接口衔接。这样,用户恳求会被传送到内核的GWES模块中。针对DirectDraw,WinCE供给了一个名为DirectDraw的GPE库(DDGPE),它是从GPE类上面承继而来的。实际上,DirectDraw显现驱动是由DDGPE和DDHAL组成,而DDGPE中现已包括了DDHAL的功用。用户需求从DDGPE类承继并完成相关函数即可。GWES.dll模块中包括GDI和DDRAW两个组件,这两个组件会调用驱动中的DDGPE的相关接口完结对硬件的操作。

在上述两种架构中,用户能够依据自己的硬件状况挑选相应的架构。第一种架构是依据GPE类承继来完成的,第二种架构是依据DDGPE类承继来完成的,而第二种架构的DDGPE类又是从第一种架构的GPE类承继而来。关于两品种的详细界说,可拜见” \WINCE600\PUBLIC\COMMON\OAK\INC”途径下的gpe.h和ddgpe.h文件。

本Blog将依据Display驱动模型来介绍,DirectDraw Display驱动模型不在这儿介绍。

WinCE下的Display驱动是依据GPE类来完成的,其间GPE中现已完成了根本的制作作业,相当于MDD层。用户需求承继该类,并完成里边的其他一些函数,所以用户完成的相当于PDD层。

GPE类是一个笼统类,其间包括许多纯虚函数,只能用于承继。用户在承继了GPE类今后,要对GPE类中的纯虚函数做相应的完成。开发Display驱动的大致过程如下:

(1) 承继GPE类并界说一个该类的实例。

(2) 完成GetGPE()函数,把该类的实例回来给上层的DDI接口。

(3) 完成DrvEnableDriver(..)和DisplayInit(..)函数并导出这两个接口。

(4) 完成GPE类中的函数。

下面将详细介绍完成的过程:

1 承继GPE类

首要,依据GPE类进行承继,假如想在Display驱动支撑Rotation能够从GPERotate类上面承继。实际上,在”gpe.h”中有如下界说:

typedef GPE GPERotate;

能够看出GPERotate类便是GPE类。在这儿,用户从GPE类上面承继就能够了,举个比如如下:

class NewGPE: public GPE

{

private:

GPEMode m_ModeInfo;

DWORD m_colorDepth;

DWORD m_VirtualFrameBuffer;

DWORD m_FrameBufferSize;

BOOL m_CursorDisabled;

BOOL m_CursorVisible;

public:

NewGPE(void);

virtual INT NumModes(void);

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

virtual INT InVBlank(void);

virtual SCODE SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries);

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

virtual SCODE SetPointerShape(GPESurf *mask, GPESurf *colorSurface, INT xHot, INT yHot, INT cX, INT cY);

virtual SCODE MovePointer(INT xPosition, INT yPosition);

virtual void WaitForNotBusy(void);

virtual INT IsBusy(void);

virtual void GetPhysicalVideoMemory(unsigned long *physicalMemoryBase, unsigned long *videoMemorySize);

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

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

virtual SCODE BltPrepare(GPEBltParms *blitParameters);

virtual SCODE BltComplete(GPEBltParms *blitParameters);

virtual ULONG GetGraphicsCaps();

virtual ULONG DrvEscape(

SURFOBJ *pso,

ULONG iEsc,

ULONG cjIn,

PVOID pvIn,

ULONG cjOut,

PVOID pvOut);

SCODE WrappedEmulatedLine (GPELineParms *lineParameters);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/135622.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部