reactos操作系统实现(147)

来源:互联网 发布:伯明翰学派 知乎 编辑:程序博客网 时间:2024/04/30 05:15

通过上面的学习,可以了解到GDI最终的输出都是通过小端口向显示硬件输出,以便在显示器上显示所需要显示的内容。那为什么需要有小端口驱动程序呢?其实这是为了方便所有显示卡制造厂家编写驱动程序,同时又可以让制造厂家保密他们的内部技术秘密。使用小端口的驱动程序,也可以统一显示驱动程序的接口,也就把显示驱动程序功能简化开发。下面来分析目录里reactos/drivers/video/miniport/vga的小端口显示驱动程序,它的入口函数如下:

#001  VP_STATUS NTAPI

#002  DriverEntry(IN PVOIDContext1,

#003              IN PVOIDContext2)

#004  {

#005   VIDEO_HW_INITIALIZATION_DATA InitData;

#006 

 

清空显示卡的硬件初始化结构。

#007   VideoPortZeroMemory(&InitData, sizeof InitData);

#008 

 

设置结构的大小。

#009    InitData.HwInitDataSize =sizeof(InitData);

#010    /* FIXME: Fill in InitDatamembers  */

 

缺省开始的设备号为0

#011   InitData.StartingDeviceNumber = 0;

#012 

 

小端口驱动程序提供的功能函数。

#013    /*  Export driver entry points...  */

#014    InitData.HwFindAdapter =VGAFindAdapter;

#015    InitData.HwInitialize =VGAInitialize;

#016    InitData.HwStartIO =VGAStartIO;

#017    /* InitData.HwInterrupt =VGAInterrupt;  */

#018    InitData.HwResetHw =VGAResetHw;

#019    /* InitData.HwTimer =VGATimer;  */

#020 

 

调用基础显示驱动程序的初始化函数VideoPortInitialize,这个函数在文件reactos/drivers/video/videoprt/videoprt.c里。

#021    return  VideoPortInitialize(Context1, Context2,&InitData, NULL);

#022  }

 

显示驱动程序初始化结构,在初始化驱动程序过程里需要使用它来保存显示驱动程序的回调用函数给显示驱动程序来使用,这个结构如下:

#001  typedef struct_VIDEO_HW_INITIALIZATION_DATA {

 

本结构的大小,一般用来区分不同版本的结构。

#002    ULONG  HwInitDataSize;

 

显示卡接口类型。

#003    INTERFACE_TYPE  AdapterInterfaceType;

 

查找一个显示设备是否可以使用。

#004   PVIDEO_HW_FIND_ADAPTER HwFindAdapter;

 

执行初始化任务。

#005    PVIDEO_HW_INITIALIZE  HwInitialize;

 

指向小端口驱动中断处理函数。

#006    PVIDEO_HW_INTERRUPT  HwInterrupt;

 

设备IO控制函数。

#007    PVIDEO_HW_START_IO  HwStartIO;

 

指明设备扩展所需要保存数据的大小。

#008    ULONG  HwDeviceExtensionSize;

 

启动的设备号。

#009    ULONG  StartingDeviceNumber;

 

复位显示设备硬件。

#010    PVIDEO_HW_RESET_HW  HwResetHw;

 

定时调用函数。

#011    PVIDEO_HW_TIMER  HwTimer;

 

系统使用的DMA函数。

#012    PVIDEO_HW_START_DMA  HwStartDma;

 

设置显示设备的电源状态。

#013    PVIDEO_HW_POWER_SET  HwSetPowerState;

 

获取显示设备的电源状态。

#014    PVIDEO_HW_POWER_GET  HwGetPowerState;

 

获取子设备的描述信息。

#015   PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor;

 

查询硬件的接口。

#016   PVIDEO_HW_QUERY_INTERFACE HwQueryInterface;

 

子设备扩展结构的大小。

#017    ULONG  HwChildDeviceExtensionSize;

 

定义设备使用的IO和内存位置、大小。

#018    PVIDEO_ACCESS_RANGE  HwLegacyResourceList;

 

用来表示上面的结构有多少个。

#019    ULONG  HwLegacyResourceCount;

 

获取一些在PCI里没有出现的信息。

#020   PVIDEO_HW_LEGACYRESOURCES HwGetLegacyResources;

 

是否允许设备启动前枚举子设备。

#021    BOOLEAN  AllowEarlyEnumeration;

 

保留给系统使用。

#022    ULONG  Reserved;

#023  } VIDEO_HW_INITIALIZATION_DATA,*PVIDEO_HW_INITIALIZATION_DATA;

原创粉丝点击