WinCE Display驱动开发介绍
发布时间:2008/9/5 0:00:00 访问次数:844
在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);
virtu
在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);
virtu