CN1428688A - 通用图形适配器 - Google Patents

通用图形适配器 Download PDF

Info

Publication number
CN1428688A
CN1428688A CN 02156169 CN02156169A CN1428688A CN 1428688 A CN1428688 A CN 1428688A CN 02156169 CN02156169 CN 02156169 CN 02156169 A CN02156169 A CN 02156169A CN 1428688 A CN1428688 A CN 1428688A
Authority
CN
China
Prior art keywords
uga
equipment
firmware
efi
ugafwgetchilddevice
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 02156169
Other languages
English (en)
Other versions
CN1295595C (zh
Inventor
M·马切索微茨
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN1428688A publication Critical patent/CN1428688A/zh
Application granted granted Critical
Publication of CN1295595C publication Critical patent/CN1295595C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明涉及通用图形适配器(UGA),它是通过固件以标准方式封装和抽象低级别图形硬件的硬件独立的设计。UGA是固件标准,希望它包含现有或计划中的硬件,包括VGA。UGA不需要使用实址模式汇编语言、直接硬件寄存器或对程序的帧缓冲器访问,这样就提供了超过传统系统的优点。UGA支持基本绘图操作、连续显示模式以及功率调节。作为基于固件的标准,UGA促进了更新系统以支持发展以及新硬件的特点。

Description

通用图形适配器
本申请要求了2001年12月13日提交的美国申请序列号60/341140题为UNIVERSAL GRAPHICS ADAPTER的专利申请的权利。
技术领域
本发明一般涉及视频图形显示,并且尤其涉及便于通过固件服务实现的硬件独立的视频显示,该服务抽象视频硬件并向操作系统提供接口。
背景技术
视频图形阵列(VGA)是用于个人计算机(PC)的图形显示系统。VGA已成为用于PC的事实上的(de facto)标准之一,在文本模式中提供720乘400像素的分辨率以及图形模式中分辨率的选择(例如640乘480乘16色、320乘200乘256色)。VGA是采用模拟信号而不是数字信号的硬件专用标准。自从1987年VGA首次出现以来产生了其他标准,但VGA还是保持为最小兼容标准并从而基本上所有PC都支持VGA。然而VGA还是有缺陷。
例如,VGA是针对硬件的,这样对VGA编程就需要硬件、软件以及汇编和/或机器语言的知识,这使得这样的编程变得困难。此外,由于PC持续发展VGA一些最初的需要变得较难以支持,这需要汇编和/或机器编码的BIOS(基本输入输出系统)码的大量修改以支持发展。从上世纪80年代VGA标准向如今已过时的硬件和软件提出了要求,比如Int 10服务的使用、非线性帧缓冲器、有限范围的显示模式以及采用实模式汇编语言的直接寄存器寻址。进一步的制约包括BIOS代码在实模式x86环境中执行,以及把视频BIOS图像限制为64K的最大绝对值。此外,VGA受限于旧版本的I/O(输入/输出)以及具有非浮动存储器以及非直观、非线性帧缓冲器布局的存储器应用。另外,VGA具有有限的模式支持(例如80×25×70Hz字符以及640×480×16色图形)。VGA也不支持在移动计算环境中变得日益重要的功率管理。另外,在现有的操作系统下在多监控器配置中没有VGA适配器的固件支持。
除了显示设备提供的高性能设备能力外,实质上所有显示设备还都支持VGA。许多PC在系统引导之前需要VGA设备在机器中,并且BIOS加电自检(POST)消息需要VGA设备用于显示。除了是事实上的通用标准外,VGA现在也是过时的标准,由于PC平台的出现,它的性能没有重大的变化。
发明内容
为了提供本发明一些方面的基本理解,以下提出了本发明的简要概述。这个概述不是本发明的广泛综述。不希望等同于本发明的关键和重要部分或者勾勒出本发明的范围。它的唯一目的就是以简化的形式描述本发明的一些概念作为之后显示的更详细描述的开头。
通用图形适配器(UGA)是通过固件以标准方式封装和抽象低级别图形硬件的硬件独立设计。UGA是固件标准,希望它包含现有或计划中的硬件,包括VGA。UGA不需要使用实模式汇编语言、直接硬件寄存器或对程序的帧缓冲器访问,这样就提供了优于传统系统有利点。UGA支持基本绘图操作、连续显示模式以及功率调节。作为基于固件的标准,UGA促进了更新系统以支持发展以及新硬件的特点。
UGA减缓了VGA的不足,但并没有使基本图形操作更难以进行。例如,使用固件包含硬件的实现简化了符合UGA说明书的各种显示适配器,而无需硬件的改变。示例的UGA固件接口说明书如这里所附的附录A,并且它是本专利申请说明书的所考虑部分。UGA有利于设备提供多个BIOS,包括UGA和VGA BIOS在内,例如任选项ROM(只读存储器)。不会改变VGA寄存器集合,因此混合显示适配器会在现有的机器中继续运行,并且与允许UGA的操作系统一起工作。从这一点来看,UGA通过提供显示适配器字设备的标准化计算和处理而扩展了即插即用(PnP)和ACPI(在PCI总线后)的概念。
UGA的特点包括,但不仅限于:由固件包含了硬件细节;通过固件实现所提供的设备能力;由固件提供本机模式的支持;无需访问旧版本的I/O端口或存储器;只在PCI(外围部件互连,一种本地总线标准)空间采用基地址寄存器(BAR);无需实模式执行环境;没有把BIOS的容量限为64K;便于把新的功能添加到BIOS;跨平台支持(例如x86、安腾);改进的总图形硬件和驱动器质量以及能够以较高级的语言(例如C对汇编/机器)对BIOS进行编码。
UGA以不同的方式使不同阶层的用户受益。例如,基本上所有用户都从改进的预引导和后引导经历中受益。当用户首先开启计算机时,它们会用高分辨率的图形显示出现,在加电自检(POST)期间和/或之前OEM(其他设备制造商)可以在其上放置图形。例如,这可以包括用于修正或配置与操作系统遵循同一模式的系统的工具。想要利用多监视器支持的有经验的用户将不需要了解在其中一个显示适配器上如何禁用VGA BIOS。在对缺乏高性能显示驱动器的移动PC上的操作系统较早版本更新的用户可以从功率管理的驱动器支持中受益,而不像传统的VGA驱动器。
UGA具有其他优点。例如,可以用高级语言(例如C、C#)而不是用汇编开发BIOS。这样,BIOS可以较易于保存,因为高级语言编程技术比汇编技术更广泛地应用。此外,不会把BIOS容量限为64K,因此当新的特点可用或需要时可以添加对它们的支持。显示适配器会是对于Int 10支持或x86汇编程序没有硬件限制而与平台无关,这样就便于适应及发展新的显示硬件。不需要新的显示适配器支持新的显示适配器中的VGA寄存器集合,这样就便于适配器设计的革新。使显示硬件支持固件中的UGA,它可以减少芯片容量。此外,不需要独立硬件供应商提供UGA设备驱动器,因为可以作为操作系统的一部分提供UGA驱动器。这样,适配器会更及时地推向市场。
操作系统可以提供UGA驱动器。UGA硬件抽象层包含了本机UGA驱动支持以及VGA驱动器,它便于系统支持VGA和UGA设备间的转换。在本发明的一个例子中,如果两种支持类型都可用,可把系统缺省配置为UGA。
为了以上的和相关目标的达成,在这里结合以下描述和附图描述了本发明某些说明性方面。然而这些方面只是表示采用本发明原理的各种方法中的一小部分,并且希望本发明包括所有这样的方面以及它们的等价。从以下本发明详细描述同时结合考虑附图,本发明的其他优点和新颖性特点会变得明显。
附图说明
图1通过所提供的接口和与寄存器接口交互动作的传统VGA特定的BIOS,将BIOS与UGA固件的抽象UGA硬件作比较。
图2根据本发明的一个方面说明允许UGA的操作系统的实例结构。
图3根据本发明的一个方面说明用于UGA允许的显示适配器的示例UGA设备树。
图4是根据本发明的一个方面说明UGA I/O服务请求调度的流程图。
图5是根据本发明的一个方面说明UGA输出范围协商的流程图。
图6是根据本发明的一个方面说明UGA设备计算的流程图。
图7根据本发明的一个方面说明具有能与UGA固件互动的子设备的显示设备。
图8根据本发明的一个方面本发明可操作的示例计算环境的示意框图。
图9根据本发明的一个方面说明UGA允许的显示适配器的示例任选项ROM格局。
图10根据本发明的一个方面说明UGA适配器的示例拓扑结构。
附录A是示例UGA固件接口,并且该附录是本专利申请说明书所考虑的部分。
附录B是示例可扩充固件接口通用图形适配器(EFI-UGA)捆绑协议,并且该附录是本专利申请说明书所考虑的部分。
具体实施方式
现在参照附图描述本发明,其中全部附图中类似的标号用于标注相应的部件。在以下描述中,为了说明,提出许多特定细节以提供对本发明透彻的理解。然而对于本领域技术人员明显的是可以无需这些特定细节实施本发明。在其他情况下,为了便于本发明的描述在框图中示出熟知的结构和设备。
在用于本发明时,术语“计算机部件”指的是计算机有关的实体,或是硬件、硬件和软件的组合、软件,或是执行中的软件。例如,计算机部件可以是(但不仅限于是)在处理器上运行的进程、处理器、对象、可执行的、执行线程、程序和计算机。通过说明,在服务器上运行的应用程序以及服务器都是计算机部件。一个或多个计算机部件可驻留在执行的进程和/或线程中,并且计算机部件可局限于一台计算机上和/或分布在两个或多个计算机之间。
UGA是超越VGA的下一代图形适配器技术。UGA抽象图形硬件并且提供UGA的固件接口,它简化固件接口(例如操作系统和图形显示设备)不同侧的实体之间的平台独立交互作用。从UGA固件提供UGA固件接口。在本发明的一个例子中,系统固件和UGA HAL驱动器采用接口进行与UGA硬件的基本操作。该层替换旧版本的视频BIOS。在该例中,UGA固件把单一入口点输出到外部世界(例如系统固件、操作系统运行时间)。一个示例的输出入口点就是UgaFwDispatchService,它是负责根据UGA设备类型和I/O请求类型把UGA I/O请求调度到UGA固件中的合适处理程序。因此一个示例的UGA说明书定义了五种UGA设备类型(UgaDtParentBus、UgaDtGraphicsController、UgaDtOutputController、UgaDtOutputPort、UgaDtOther)以便于通过入口点与操作系统的交互动作。
UGA提供高分辨率、高色度、多个监控器支持、GDI(图形设备接口)加速以及LFB(线性帧缓冲器)布局独立。UGA定义在UGA硬件上IHV(独立硬件供应商)可实现的接口以便于通过UGA固件与操作系统互动。这样,作为操作系统,固件和/或硬件发展了,只要保持这样的实体间的接口,这样的变化就能独立于其他实体,这最小化了这样的变化对有关实体的影响,在影响较大的传统系统上提供有利之处。例如,可以更新图形显示硬件部件以提供更高的分辨率。只要硬件部件保持对UGA固件的接口,UGA固件和操作系统都不需要由于图形显示硬件的改变而改变。这提供了超越传统系统优点,传统系统中硬件部件的更新需要修补用于操作的操作系统。
UGA便于调度显示控制器固件的I/O服务请求、便于报告、协商和配置输出控制器和设备的显示能力范围、便于计算显示控制器设备以及它们的子设备并且便于显示控制器设备和它们子设备的功率调节。这样的服务便于产生平台独立的图形显示环境,提供超越传统系统的优点。
UGA定义了可用高级语言(例如C、C++)书写的固件的固件接口说明书,可编译该语言以由系统BIOS和/或操作系统虚拟机伪代码(p-code)和/或字节代码解释。UGA固件可位于显示设备和/或综合环境的系统中。
现在转到图1,通过采用本发明,操作系统100可通过存储在BIOS中的UGA固件120与抽象的UGA硬件110交互。这样的固件可由从板上执行环境中执行的高级语言(例如C、C++)编译的字节代码解释。固件120实现便于操作系统100和硬件110间非硬件特定的互动。这样的接口包括类似device_on、device_off、device_accept_data、device_provide_data以及device_report_children的抽象。在附录A中描述了一个示例接口。这样的接口便于操作系统到硬件互动的灵活的解决途径,其中把硬件如何进行某些任务的细节限制为硬件。这与传统的情况产生对比,其中操作系统130通过实现标准VGA寄存器接口的VGA规范、硬件规范、BIOS 150与VGA硬件140交互。以低级别的语言(例如汇编、机器语言)对BIOS 150进行传统编码。
现在转到图2,说明了包括便于通过到UGA硬件220的UGA接口的访问的UGA虚拟机210的系统200。UGA虚拟机210可用固件实现并可存储在于UGA硬件220相关的芯片上的BIOS中。系统200说明了一种计算机部件的配置,其中保持了与UGA硬件230的旧版本兼容性。传统地,对UGA硬件230的访问是通过Int 10、VGA I/O寄存器接口240。
在系统200中,引导时间应用程序242和/或运行时间应用程序250可以认为系统200通过硬件抽象层260(HAL)和UGA核心服务270的互动只有UGA硬件220。HAL 260把视频显示硬件的细节抽象为接口。引导时间应用程序242调用引导时间显示API(应用程序接口)280在POST期间进行例如显示消息的动作和/或把功率显示在首页中(例如商标显示屏)。运行时间应用程序250调用运行时间显示API 290以进行显示操作(例如显示文本、显示图形)。虽然引导时间应用程序242和/或运行时间应用程序250可以希望与UGA硬件220互动,但是系统200只有VGA硬件230。这样,HAL 260可以实现抽象的方法以与VGA硬件230通过传统的寄存器接口240一起工作。然而存在UGA硬件220时,HAL 260可以实现抽象的方法通过UGA虚拟机210来工作以与UGA硬件220互动。
现在转到图3,说明了与UGA相关的计算机部件的层次结构300。层次结构300包括五种实例设备,它在如附录A所附的实例UGA固件说明书中定义,它便于通过设备与所附设备通信。在层次300的顶层是父设备310(例如UgaDtParentBus)。操作系统可与父设备310交互动作,父设备310可以是通过UGA固件接口的物理的和/或逻辑的设备。采用两条信息与设备、设备标识符(例如你想与哪个设备通信)和请求类型(例如你想要设备做什么)通信。在本发明的一个例子中,用户想要设备所做的称作为服务。UGA固件接口可以定义一组由设备进行的服务。这样服务包括(但不仅限于)功率调节(例如开启、关闭、进入低功率状态、进入高功率状态)、设备描述(例如提供EDID(扩展显示识别数据标准)数据)以及数据通信(例如接受数据、提供数据)。
层次300还包括图形控制器(例如UgtDtGraphicsController)。这样的控制器可以进行用于操作系统操作(例如服务)并还可与其他子计算机部件(例如设备)交互。例如,一个或多个其他设备330(例如UgaDtOther)可以逻辑地和/或物理地连接于控制器设备320。操作系统可以通过父设备310传送到图形控制器320并由此到达其他设备330。相似地,操作系统可以通过父设备310传送到图形控制器320并由此到达输出控制器340或350(例如UgaDtOutputController)。虽然只说明了一个其他设备330和两个输出控制器340和350,但是可以理解本发明可以采用这样设备的不同组合。输出控制器340可连接于实际输出设备(例如与监视器相连的端口342)并且输出控制器350可连接于另一个实际输出设备(例如与电视机相连的输出端口344)。
这样,在附录A中所附UGA固件说明书中定义的例子,层次300便于操作系统与实际输出设备以及位于操作系统和实际设备之间的物理的和/或逻辑的设备的通信。在本发明的一个例子中,层次300中识别的一个或多个计算机部件位于视频图形适配卡上。通过说明,视频图形卡具有两个输出端口,一个是电视输出,一个是计算机监视器输出。这样的输出可有效地连接于输出控制器,便于进行类似识别输出设备能力以及进行设备功率调节的步骤。相似地,输出控制器可有效地连接于图形控制器,它依次有效地连接于总线,便于把视频图形适配卡连接到主系统。传统地,视频图形卡上通过VGA寄存器接口对多于一个物理和/或逻辑实体的单独访问是不现实的,即使是完全可能的话。这样,对于访问位于一个物理设备上的多个物理和/或逻辑设备,UGA固件接口提供超越传统系统的优点。
由以上所示和所述的示例系统看来,参照图4到6地流程图对理解根据本发明实现的方法会更好。虽然为了简要说明起见,以一系列的框图描述和示出所述方法,但可以理解和明白的是本发明并不仅限于这些框的顺序,就如根据本发明一些框可以以不同顺序出现和/或与来自这里所示和所述的其他框并发地出现。此外,可以不需要所有所示的框图来实现根据本发明的方法。此外,附加和/或备选的方法可采用这里未示出的附加框。在本发明的一个例子中,这样的方法可实现为计算机可执行指令和/或操作,这些指令和操作可存储在计算机可读取介质上,包括(但不仅限于)ASIC、CD、DVD、RAM、ROM、PROM、EERPOM、磁盘、载波和记忆条。
现在转到图4,以流程图的形式示出了用于I/O服务请求调度的方法400。在410,UGA客户创建环境,它包括类似设备身份、输入缓冲器的位置和容量、输出缓冲器的位置和容量以及请求类型的创建信息。在420,调用方法(例如UgaHalDisplayService(Context,IoRequest)开始通过UGA固件接口层调度抽象的服务。在430,确定在410创建的环境是否有效,并在440确定所请求的I/O操作是否有效。如果在430或440的确定为否,那么处理进行到450产生状态代码。但是如果确定430和440为是,那么处理进行到460。
在460,确定是否有UGA硬件可用于所请求的抽象UGA服务。如果在460确定为否,那么就没有UGA硬件,并且仿真处理抽象的UGA调用以与可用的VGA硬件交互动作。但是如果在460的确定为是,那么在470把服务调度到UGA固件接口中的下一最低级。相似地,在480,把服务调度到下一最低级直到在490到499调用实际的服务例程。服务例程490以及492到491表示一组用于第一UGA设备的服务。服务例程496以及498到499表示一组用于第二UGA设备的服务。UGA设备实现一组抽象的UGA服务。这样,UGA设备可表现为类似实现对UGA客户机的接口的抽象硬件,它把操作系统简化为硬件通信和控制。该抽象直接与传统的VGA寄存器接口形成对比,其中操作系统必须意识到并实现用于与VGA硬件通信的寄存器接口。
这样,为了调用UGA固件方法,UGA客户机可以调用从提供UGA设备特定环境和UGA I/O请求框的UGA固件输出的入口点(例如UgaFwDisplayService)。通过UGA固件使用UGA设备环境以识别I/O请求希望的UGA设备。UGA客户提供对UGA设备的环境、UGA I/O请求框以及与UGA I/O请求框相关的输入和输出缓冲器的存储器存储。UGA客户机填写UGA I/O请求框请求代码以及输入和/或输出缓冲器的位置与容量。成功完成了I/O请求,UGA固件就把返回字节的数量置于I/O请求框中,并根据UGA I/O请求代码和设备环境用所请求的数据填充输出缓冲器。UGA固件可返回表示对于每个UGA I/O请求的I/O请求状态(例如成功/失败)的状态代码。
UGA固件运行时间环境(例如系统固件、操作系统)可实现UGA硬件抽象层(UGA HAL)以便于对UGA和非UGA(例如VGA)显示设备的公共接口。这样,固件客户机可以假设UGA固件是可供使用的,并且对于非UGA设备UGA HAL便于转换来自UGA客户和非UGA(例如VGA、固件、网络)输出设备的UGA I/O请求。此外,依照UGA规范的固件可实现用于非本地的显示控制器设备。远端显示设备对于UGA客户机来说表现为本地显示设备,包括UGA HAL。
现在转到图5,以流程图示出用于协商输出范围的方法500。输出范围与显示设备能做的相关。例如,第一显示设备能够显示640乘480@60Hz,同时第二显示设备能够显示1280乘1024@80Hz。如果两个显示设备与同一图形控制器相关,那么使用本发明能确保设备能力的交集。
在510,创建初始值。这样的初始值包括(但不仅限于)创建对于可用设备集合的索引以及创建输出控制器的环境。在520,读取有关设备能力的信息。例如,可调用UgaFwEditSegment(context)检索设备能力的EDID数据(例如128字节、256字节)描述。这样的EDID数据包含离散值(例如用于具有一种能力的设备)和/或值域(例如用于多能力设备)。在530确定这是否是第一设备读数。如果是这样,那么就在534确定数据读取是否成功。如果不是,就发生了致命性错误并且处理进行到540。但是如果读取成功,就在570就把当前确定的输出范围创建为在520的初始范围读数。如果不是第一读取,那么就在532确定读取是否成功。如果读取不成功,那么处理进行到580,其中识别下一潜在设备并且创建环境便于下一设备的读取描述数据。如果读取确实成功,那么处理继续在550,其中进行先前确定的范围和当前读取范围之间的相交。在560,确定交集计算是否确定了新的范围。如果这样,那么在570更新所确定的交集范围并且处理进行到580。
在585,确定描述性数据是否要从另一设备读取。如果确定为是,那么处理进行到520读取这样的描述性数据。如果确定为否,那么处理结束并且可以安全地使用位于所确定的输出范围内的视频模式。
这样,系统固件和/或操作系统产生了为输出控制器和从附于控制器的输出端口返回的显示能力数据的交集。该交集定义了由所连接的设备支持的视频模式范围。这样,在交集中识别的模式可在输出控制器上设置,并且可显示在附于输出端口(它附于输出控制器)的输出设备上。
至少部分根据为输出端口和/或控制器返回的EDID数据,所支持的相交的视频模式范围可包含可用模式的离散或连续集。这样系统固件和/或操作系统可从交集的范围请求一模式。随后,系统固件和/或操作系统可在识别设备环境、I/O请求类型以及所请求的模式数据(例如横向分辨率、纵向分辨率、颜色深度、刷新率)的输出控制器上调用UGA固件视频设置方法(例如UgaFwSetVideoMode),并且根据这样的信息,UGA固件可以调度用于I/O请求以及UGA子设备的I/O处理器方法。例如,UGA固件可以采用表驱动算法,它分析离散模式范围和/或用于连续和/或离散模式范围的定时公式(例如VESAGTF)以对UGA硬件进行编程设置所需模式。
图6说明了设备计算方法600的流程图。在610,通过或区域初始设备(例如UgaDtParentBus)相关的数据开始递归计算。给定初始数据,在620创建环境便于与设备交互。这样在630,使用环境通过诸如UgaFwStartDevice的调用开启初始设备。在640,确定是否可以开启设备。如果不,那么在670把环境设置为父环境。如果设备可以开启,那么处理进行到650进行获取与子设备(它与当前设备相关)相关的数据的尝试。例如,调用UgaFwGetChildDevice检索子数据。在660,确定是否获取子数据。如果在660确定为否,那么处理进行到670,其中把环境设置为父设备的环境。但是如果在660的确定为是,那么处理回到620,其中为子设备创建环境,并且继续深度优先遍历来搜索该子设备的儿子。
在680,确定是否有有效父环境。如果不,那么完成了深度优先遍历。如果这样,那么处理进行到690,其中开始递归计算的下一迭代。
这样的递归计算方法便于支持不同设备的UGA固件。UGA固件说明书可以定义一组在用于通过所计算的UGA设备的UGA固件实现的I/O服务。服务类型与UGA I/O请求代码相关联,并且这样的I/O请求代码可添加到UGA固件的规范中。设计UGA固件I/O模型便于添加到UGA固件规范的新I/O请求代码和/或新设备类型并同时使其保持在UGA客户机、UGA运行时间环境以及UGA固件之间的兼容性。
通过使用递归计算方法,UGA固件支持一个或多个视频子设备,包括(但不仅限于)父总线、图形控制器、输出控制器、输出端口以及其他设备类型。对于计算的UGA设备,UGA固件可以提供可由系统BIOS和IHV视频驱动器解释附加设备描述符数据、支持一般子设备驱动器的标准化PnP标识符以及设备描述字串。UG设备可与唯一环境相关联,或者共用环境可由与单个UGA适配器相关的UGA设备共用。
为了计算UGA设备,系统固件和/或操作系统使用诸如深度优先算法遍历UGA设备树。可以为这些设备调用UGA固件方法(例如UgaFwStartDevice、UgaFwGetChildDevice)。在本发明的一个例子中,在计算和/或开启子设备之前执行设备环境的创建以及父设备的开启方法。
系统BIOS和/或操作系统把设备环境以及I/O请求类型传递到UGA固件,根据信息它调度I/O请求和UGA子设备的I/O处理方法。通过使用递归计算方法,UGA固件可以提供一个或多个输出控制器和/或输出端口。这样所计算的端口可附于物理输出设备(例如CRTC监控器、平板、电视机)。对于所计算的输出端口,系统固件和/或操作系统调用数据获取方法(例如UgaFwGetEditSegment)指定设备环境和I/O请求类型。根据这些信息,UGA固件调度I/O请求和UGA子设备的I/O处理方法。随后UGA固件返回附于输出端口的输出设备的显示识别和配置数据。例如,可以以VESA(视频电子标准协会)标准中所定义的EDID格式返回这样的信息。UGA固件通过诸如DDC(显示数据信道标准)和/或实现特定通信信道从输出设备读取EDID信息。如果不能从输出设备得到EDID数据,那么UGA固件可以创建EDID。
如果UGA固件不能实现,或者在使用输出端口设备的数据获取方法(例如UgaFwGetEditSegment)时失败,那么UGA固件实现一组设备信道I/O例程(例如UgaFwDeviceChannelOpen、UgaFwDeviceChannelRead、UgaFwDeviceChannelWrite、UgaFwDeviceChannelClose),它们使得系统固件和/或操作系统能直接与输出设备通过DDC或其他由实现特定的通信信道通信。
相似于对输出端口的处理,对于所计算的输出控制器,系统固件和/或操作系统调用数据获取方法(例如UgaFwGetEditSegment)指定设备环境和I/O请求类型。根据这些信息,UGA固件调度I/O请求和UGA子设备的I/O处理器方法。随后UGA固件返回输出控制器的显示识别和配置数据。例如,可以VESAEDID格式返回这样的信息。由UGA固件根据UGA显示适配器的硬件能力提供输出控制器设备的EDID数据。在本发明的一个例子中,必须通过输出控制器设备的UGA固件来实现数据获取方法。
关于本发明简化的功率调节,对于加电使用自顶向下的树遍历,对于断电使用自下到顶的树遍历。对于设备,调用UGA固件方法(例如UgaFwSetPowerState)探查功率状态并引起功率改变。可以禁止这样的方法,在这种情况下删去设置当前调用方法的功率状态。系统固件和/或操作系统可以把设备环境、I/O请求类型、功率请求类型、所请求的设备状态以及所请求的功率状态传递到UGA固件。这样,UGA设备支持多个功率状态,并且UGA固件可以调度与这样的功率状态调节有关的I/O请求和子设备的I/O处理器方法。
本发明的一个例子把UGA实现为EFI(可扩展固件接口)驱动器。这样,EFI-UGA捆绑协议附于如这里作为本专利申请说明书考虑部分的附录B。
图7说明了与显示设备710以及与它的子设备712到718互动的操作系统700。传统地,VGA系统无法与这样的子设备712到718互动。UGA便于计算通过UGA固件接口的这样的子设备712到718,并且如果子设备712到718提供UGA固件接口,操作系统700就可以与它们交互动作。这样,UGA固件的一个例子可以支持不同类型的多个子设备并提供计算这样的子设备、对这样的子设备进行功率调节、询问和控制这样的子设备的状态、设置这样子设备的显示模式以及便于基本绘图操作的方法。
为了提供本发明不同方面的附加说明,希望图8和以下讨论提供合适计算环境810的简要和一般的描述,其中可以实现本发明的不同方面。虽然以上以在一台或多台计算机上运行的计算机可执行部件、指令和/或操作的一般说明描述了本发明,但是本领域的技术人员会理解本发明可结合其他程序模块实现和/或实现为硬件和软件的组合。一般,程序模块包括完成特定目标或实现特定抽象数据类型例程、程序、部件、数据结构等等。此外,本领域的技术人员会理解可用计算机系统配置实施创造性的方法,这些配置包括单处理器或多处理器计算机系统、小型计算机、大型计算机、个人计算机、手提式计算设备、基于微处理器或可编程消费电子装置以及类似装置,它们中的每个可操作上耦合于一个或多个相关设备。在分布计算环境中实施本发明所说明的方面,其中由通过通信网络连接的远端处理设备完成某些任务。在分布计算环境中,程序模块位于本地和远端存储设备中。
参照图8实现本发明不同方面的示例环境810包括计算机812,计算机812包括处理单元814、系统存储器816和系统总线818。系统总线818把包括(但不仅限于)系统存储器816的系统部件耦合到处理单元814。处理单元814可以是任何类型的处理器。双微处理器以及其他多处理器结构也可用作处理单元814。
系统总线818可以是几种总线接口的任何一种,包括使用任何类型总线结构的存储器总线或存储器控制器、外部总线以及本地总线。系统存储器822包括只读存储器(ROM)820以及随机存取存储器(RAM)822。在ROM 820中存储包含帮助诸如在开启期间在计算机812内元件之间传输信息的基本例程的基本输入/输出系统(BIOS)。
BIOS可以包括诸如UGA固件。
计算机812进一步包括硬盘驱动器824、磁盘驱动器826(例如从可卸磁盘828读去或写入其中)和光盘驱动器830(例如读取CD-ROM光盘832或从其他光介质读取或写入其中)。硬盘驱动器824、磁盘驱动器826和光盘驱动器830可分别通过硬盘驱动器接口834、磁盘驱动器接口836和光盘驱动器接口838连接于系统总线818。驱动器和它们相关的计算机可读取媒介提供用于计算机812的数据、数据结构、计算机部件、计算机可执行指令等等的非易失性存储。虽然以上计算机可读取媒介的描述指的是硬盘、可卸磁盘以及CD,但是应该理解在示例操作环境中也可使用由计算机可读取的其他类型媒介,例如zip驱动器、磁带、闪存卡、数字视频光盘、盒带、ASIC以及类似装置,进一步理解任何这样的媒介包含进行本发明方法的计算机可执行指令。
在驱动器和RAM 822中可存储多个程序模块,包括操作系统840、一个或多个应用程序842、其他程序模块844和程序数据846。可以理解本发明可用不同操作系统或操作系统的组合实现。
用户可以通过键盘848和诸如鼠标850的指示设备把指令和信息输入计算机812。其他输入设备(未示出)可以包括话筒、IR遥控、游戏摇杆、游戏垫、卫星式转盘、扫描仪或类似设备。这些和其他的输入设备经常通过耦合于系统总线818的串行接口连接于处理单元814,但也可由其他接口连接,比如并行口、游戏端口、通用串行总线(“USB”)、IR(红外)接口等等。监视器854或其他类型的显示设备也通过诸如视频适配器856的接口连接于系统总线818。除了监视器之外,计算机通常包括其他外部输出设备(未示出)比如扬声器、打印机等等。
计算机812可在使用逻辑上连接到诸如远端计算机858的一个或多个远端计算机的网络环境中工作。远端计算机858可以是工作站、服务器计算机、路由器、个人计算机、基于微处理器的娱乐设备、对等设备或其他普通网络节点,并且通常包括与计算机812相关的所描述的许多或所有元件,虽然为了简单起见,只说明了存储器存储设备860。所描述的逻辑连接包括局域网(LAN)862和广域网(WAN)864。这样的网络环境在办公室、公司范围计算机网络、企业内部网和因特网是常见的。
当用于LAN环境中时,计算机812通过网络接口或适配器866连接于网络862。当用于WAN环境时,计算机812通常包括调制解调器868,或连接于LAN上的通信服务器,或具有其他通过WAN 864建立通信的装置,比如因特网。调制解调器(可以是内部或外部的)通过串口接口852连接于系统总线818。在网络环境中,有关计算机812描述的程序模块或它们的部分可以存储在远端存储器存储设备860中。可以理解所示的网络连接是示例性的并且可使用在计算机之间建立通信链路的其他装置。
图9说明了可任选的ROM,其中存储多个视频适配器图像。例如,第一图像支持旧版本的X886视频BIOS,同时第二图像支持UGA BIOS。为了支持UGABIOS,第二图像可以包括便于UGA固件字节代码与运行时间环境的互动的固件特定的捆绑(例如EFI或UGA)。第二图像还包括便于与系统固件捆绑和UGA固件服务调度的运行时间接口的支持库捆绑。UGA固件服务调度接收UGA设备想要的呼叫、识别用户想要通话的设备以及用户想要进行的服务。调度器调用UGA固件服务中的合适方法。这样,把多个图像存储在可选ROM中的能力便于同时支持旧版本的系统和提供超越传统系统的可互操作性改进的UGA系统。
以上所述的包括本发明的例子。当然为了描述本发明不可能描述每个可能的部件或方法的组合,但本领域的技术人员会理解本发明许多进一步的组合和改变是可能的。因此,希望本发明包含所有的替代、修改和变化,它们都落入所附权利要求书的主旨和范围中。此外,对于属于“包括”在详细描述或权利要求书中所用的范围,希望这样的术语以相似于术语“包含”的包容性方式,就如包含在权利要求中可解释为过渡词。
                  附录A
UGA通用图形适配器固件接口说明书
第一部分
1.1 UGA接口命名规范
UgaFwXxxx--由UGA固件输出到系统固件和操作系统的方法以及UGA IO请求处理器。
VmlXxxx--由虚拟机(VM)通过UGAVMXXX.LIB I/O库输出到UGA固件的方法。注意:在前缀中1是小写的L。
第二部分
UGA固件接口
由UGA固件提供UGA固件接口。系统固检和UGA HAL驱动器采用这个接口进行与UGA硬件的基本操作。这一层替代旧版本的视频BIOS。
2.1 UGA接口-常量和数据类型
UGA_DATA_WIDTH 
UGA_DEVICE_ID
UGA_DEVICE_STATE
UGA_DEVICE_TYPE
UGA_IO_REQUEST_CODE
UGA_MEMORY_CACHING_TYPE
UGA_MEMORY_TRANSFER_TYPE
UGA_PHYSICAL_ADDRESS
UGA_POWER_REQUEST_TYPE
        <!-- SIPO <DP n="16"> -->
        <dp n="d16"/>
UGA_POWER_STATE_DEVICE
UGA_POWER_STATE_SYSTEM
UGA_STATUS
UGA_VERSION_NUMBER
UGA_DATA_WIDTH
  typedef enum UGA_DATA_WIDTH
  {

     UgaDwInt8=1,

     UgaDwInt16,

     UgaDwInt32,

     UgaDwInt64
  }UGA_DATA_WIDTH,*PUGA_DATA_WIDTH;
UGA_DEVICE_ID
  typedef UINT32 UGA_DEVICE_ID,*PUGA_DEVICE_ID;
UGA_DEVICE_PROPERTY
  typedef enum_UGA_DEVICE_PROPERTY
  {

     UgaDpType=1,

     UgaDpId,

     UgaDpAcpiId,

     UgaDpPnpId,

   UgaDpDescription,

   UgaDpManufacturer,

   UgaDpPrivateData=0x10000
  }UGA_DEVICE_PROPERTY,*PUGA_DEVICE_PROPERTY;
        <!-- SIPO <DP n="17"> -->
        <dp n="d17"/>
只对于IHV的指定特性才保留UgaDpPrivateData和较高特性的ID。
UGA_DEVICE_STATE
  typedef enum _UGA_DEVICE_STATE
  {

   IN UgaDsEnable=1,

      IN UgaDsDisable,

      OUT UgaDsNotAvailable,

      OUT UgaDsDisabled,

      OUT UgaDsEnabled,

      OUT UgaDsActive
   }UGA_DEVICE_STATE,*PUGA_DEVICE_STATE;
UGA_DEVICE_TYPE
  typedef enum _UGA_DEVICE_TYPE
  {

   UgaDtParentBus=1,

   UgaDtGraphicsController,

   UgaDtOutputController,

   UgaDtOutputPort,

   UgaDtOther
  }UGA_DEVICE_TYPE,*PUGA_DEVICE_TYPE;
UGA_IO_REQUEST_CODE
  typedef enum _UGA_IO_REQUEST_CODE
  {

   UgaIoGetVersion=1,

   UgaIoGetChildDevice,

   UgaIoStartDevice,

   UgaIoStopDevice,

   UgaIoFlushDevice,

   UgaIoResetDevice,
        <!-- SIPO <DP n="18"> -->
        <dp n="d18"/>
   UgaIoGetDeviceState,

   UgaIoSetDeviceState,

   UgaIoSetPowerState,

   UgaIoGetMemoryConfiguration,

   UgaIoSetVideoMode,

   UgaIoCopyRectangle,

   UgaIoGetEdidSegment,

   UgaIoDeviceChannelOpen,

   UgaIoDeviceChannelClose,

   UgaIoDeviceChannelRead,

   UgaIoDeviceChannelWrite,

   UgaIoGetPersistentDataSize,

   UgaIoGetPersistentData,

   UgaIoSetPersistentData,

   UgaIoGetDevicePropertySize,

   UgaIoGetDeviceProperty,

   UgaIoBtPrivateInterface
  }UGA_IO_REQUEST_CODE,*PUGA_IO_REQUEST_CODE;
UGA_MEMORY_CACHING_TYPE
  typedef enum_UGA_MEMORY_CACHING_TYPE
  {

   UgaMcNonCached=1,

   UgaMcCached,

   UgaMcWriteCombined
  }UGA_MEMORY_CACHING_TYPE,*PUGA_MEMORY_CACHING_TYPE;
UGA_MEMORY_TRANSFER_TYPE
  typedef enum_UGA_MEMORY_TRANSFER_TYPE
  {

   UgaMtSystemToVideo=1,

   UgaMtVideoToSystem,

   UgaMtVideoToVideo
        <!-- SIPO <DP n="19"> -->
        <dp n="d19"/>
  }UGA_MEMORY_TRANSFER_TYPE,*PUGA_MEMORY_TRANSFER_TYPE;
UGA_PHYSICAL_ADDRESS
  typedef UINT64 UGA_PHYSICAL_ADDRESS,*PUGA_PHYSICAL_ADDRESS;
UGA_POWER_REQUEST_TYPE
  typedef enum _UGA_POWER_REQUEST_TYPE
  {

   UgaPrProbe=1,

   UgaPrCommit,

   UgaPrCancel
  }UGA_POWER_REQUEST_TYPE,*PUGA_POWER_REQUEST_TYPE;
UGA_POWER_STATE_DEVICE
  typedef enum _UGA_POWER_STATE_DEVICE
  {

   UgaPsD0=1,

   UgaPsD1,

   UgaPsD2,

   UgaPsD3
  }UGA_POWER_STATE_DEVICE,*PUGA_POWER_STATE_DEVICE;
UGA_POWER_STATE_SYSTEM
  typedef enum _UGA_POWER_STATE_SYSTEM
  {

   UgaPsS0=1,

   UgaPsS1,

   UgaPsS2,

   UgaPsS3,

   UgaPsS4,
        <!-- SIPO <DP n="20"> -->
        <dp n="d20"/>
   UgaPsS5
  }UGA_POWER_STATE_SYSTEM,*PUGA_POWER_STATE_SYSTEM;
UGA_STATUS
   typedef UINT32 UGA_STATUS,*PUGA_STATUS;
UGA_STATUS的值是32位的值设置如下
    30-31     16-29     O-15
    严重性     保留     状态码
严重性位定义如下:00-成功01-信息10-警告11-错误UGA_STATUS指定义如下:(TBD)#define UGA_STATUS_SUCCESS                        ((UGA_STATUS)0x00000000)#define UGA_STATUS_INFORMATIONAL                  ((UGA_STATUS)0x40000000)#define UGA_STATUS_WARNING                        ((UGA_STATUS)0x80000000)#define UGA_STATUS_ERROR                          ((UGA_STATUS)0xc0000000)#define UGA_STATUS_INVALID_DEVICE                 ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000001))#define UGA_STATUS_INVALID_MODE                   ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000002))#define UGA_STATUS_INVALID_FUNCTION               ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000003))#define UGA_STATUS_UNSUPPORTED                    ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000004))#define UGA_STATUS_OPERATION_FAILED               ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000005))#define UGA_STATUS_DEVICE_BUSY                    ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000006))#define UGA_STATUS_INSUFFICIENT_BUFFER            ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000007))#define UGA_STATUS_NO_MORE_DATA                   ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000008))#define UGA_STATUS_TIMEOUT                        ((UGA_STATUS)(UGA_STATUS_ERROR|0x00000009))#define UGA_STATUS_INVALID_PARAMETER              ((UGA_STATUS)(UGA_STATUS_ERROR|0x0000000a))
#define UGA_STATUS_OUT_OF_RESOURCES               ((UGA_STATUS)(UGA_STATUS_ERROR|0x0000000b))UGA_VERSION_NUMBERtypedef UINT32 UGA_VERION_NUMBER,*PUGA_VERSION_NUMBER;UGA_VERSION_NUMBER的值是32位的值设置如下
    16-31     8-15     0-7
    保留     版本主号     版本次号
2.2 UGA固件接口-数据结构
  UGA_CHANNEL_TRANSFER

  UGA_DEVICE

  UGA_DEVICE_DATA

  UGA_IO_REQUEST

  UGA_MEMORY_CONFIGURATION

  UGA_MEMORY_TRANSFER

  UGA_POWER_REQUEST

  UGA_VERSION

  UGA_VIDEO_MODE

  UGA_VM_VERSION
  UGA_CHANNEL_TRANSFER

  typedef struct _UGA_CHANNEL_TRANSFER

  {

     VOID UNALIGNED *pvBuffer;

     UINT64 ui64Size;

     BOOLEAN bEndOfTrahsfer;
        <!-- SIPO <DP n="22"> -->
        <dp n="d22"/>
  }UGA_CHANNEL_TRANSFER,*PUGA_CHANNEL_TRANSFER;
UGA_CHANNEL_TRANSFER包含UGA固件所需信息以在开启的设备信道和存储缓冲器之间进行数据传输。
成员
pvBuffer
用于向开启的设备信道发送或从其接收数据的指向源或目标存储缓冲器的虚指针。
ui64Size
所请求数据传输的字节容量。
bEndOfTransfer
指定UGA固件是否应该在相同方向期望遵循附加信道传输请求。FALSE表示附加传输仍旧待决。TRUE表示批量中的最后传输。UGA_DEVICEtypedef struct_UGA_DEVICE{
 PVOID pvDeviceContext;
 PVOID pvSharedContext;
 PVOID pvRunTimeContext;
 struct _UGA_DEVICE *pParentDevice;
 PVOID pvBusIoServices;
 PVOID pvStdIoServices;
 UGA_DEVICE_DATA deviceData;
}UGA_DEVICE,*PUGA_DEVICE;
UGA_DEVICE指定与由UgaFwGetChildDevice所计算的设备相关的设备对象。系统固件/操作系统为每个所计算的设备分配UGA_DEVICE。把指向该对象的指针传递到UGA固件方法。这是不透明的对象--UGA固件不能直接废除任何它的字段--它的结构可以无需通知而改变。UGA_DEVICE_DATAtypedef struct_UGA_DEVICE_DATA{
  UGA_DEVICE_TYPE deviceType;
  UGA_DEVICE_ID deviceId;
  UINT32 ui32DeviceContextSize;
  UINT32 ui32SharedContextSize;
}UGA_DEVICE_DATA,*PUGA_DEVICE_DATA;
UGA_DEVICE_DATA指定由UgaFwGetChildDevice方法返回的设备数据。
成员
deviceType
指定设备类型。
deviceld
视频IHV定义的设备ID。
ui32DeviceContextSize
为所计算的UGA设备分配的环境缓冲器的请求的字节容量。由系统固件/操作系统分配该缓冲器。UGA固件可使用该缓冲器存储任何运行时设备的特定信息。
ui32SharedContextSize
为UGA适配器分配的共享的环境缓冲器的请求的字节容量。由系统固件/操作系统分配该缓冲器。UGA固件可使用该缓冲器存储任何运行时设备的特定信息。
UGA_IO_REQUEST
  typedef struct _UGA_IO_REQUEST
  {

     IN UGA_IO_REQUEST_CODE ioRequestCode;

   IN PVOID pvInBuffer;

   IN UINT64 ui64InBufferSize;

   OUT PVOID pvOutBuffer;

   IN UINT64 ui64OutBufferSize;

   OUT UINT64 ui64BytesReturned;
  }UGA_IO_REQUEST,*PUGA_IO_REQUEST;
UGA_MEMORY_CONFIGURATION
        <!-- SIPO <DP n="24"> -->
        <dp n="d24"/>
  typedef struct _UGA_MEMORY_CONFIGURATION
  {

   UINT64 ui64VideoMemorySize;

   UINT64 ui64PrimaryOffset;

   UINT32 ui32PrimaryDelta;

   UINT64 ui64OffScreenOffset;

   UINT64 ui64OffScreenSize;

   UINT32 ui32OffScreenAlignment;
  }UGA_MEMORY_CONFIGURATION,*PUGA_MEMORY_CONFIGURATION;
UGA_MEMORY_TRANSFER
  typedef struct _UGA_MEMORY_TRANSFER
  {

   UGA_MEMORY_TRANSFER_TYPE transferType;

   union

   {

      struct

      {

         UINT64 ui64Source;

         UINT64 ui64Destination;

      }videoToVideo;
  struct

      {

         VOID UNALIGNED *pvSource;

         UINT64 ui64Destination;

      }systemToVideo;

      struct

      {

         UINT64 ui64Source;

         VOID UNALIGNED *pvDestination;

      }videoToSystem;
  };
        <!-- SIPO <DP n="25"> -->
        <dp n="d25"/>
  INT32 i32Width;

  INT32 i32Height;

  INT32 i32SourceDelta;

  INT32 i32DestinationDelta;

  BOOLEAN bEndOfTransfer;

  }UGA_MEMORY_TRANSFER,*PUGA_MEMORY_TRANSFER;
UGA_MEMORY_TRANSFER包含由UGA固件所需的信息以进行存储器数据的传输。
成员
transferType
指定传输类型:
pvSource
指向位于系统存储器中的传输源的虚指针。
pvDestination
指向位于系统存储器中的传输目标的虚指针。
ui64Source
来自位于视频存储器的传输源帧缓冲器开始的偏移。
ui64Destination
来自位于视频存储器的传输目标帧缓冲器开始的偏移。
i32Width
传输区宽度的字节数。
i32Height
传输区高度的行数。
i32SourceDelta
在源传输区两个邻近行的开始点之间的字节数。
i32DestinationDelta
在目标传输区两根邻近行的开始点之间的字节数。
bEndOfTransfer
指定UGA固件是否应该期望要遵循附加调用UgaFwCopyRectangle。FALSE表示待决的附加传输。TRUE表示批量中最后的传输。如果需要UGA固件可把TRUE的值解释为提示清洗像素高速缓存行。
UGA_POWER_REQUEST
typedef struct _UGA_POWER_REQUEST

  {

      UGA_POWER_REQUEST_TYPE powerRequestType;

      UGA_POWER_STATE_DEVICE powerStateDevice;

      UGA_POWER_STATE_SYSTEM powerStateSystem;

  }UGA_POWER_REQUEST,*PUGA_POWER_REQUEST;
UGA_VERSION
typedef struct _UGA_VERSION

  {

      UGA_VERSION_NUMBER vmUgaSpecificationVersion;

      UGA_VERSION_NUMBER vmVirtualMachineVersion;

      UGA_VERSION_NUMBER fwUgaSpecificationVersion;

      UGA_VERSION_NUMBER fwFirmwareVersion;

  }UGA_VERSION,*PUGA_VERSION;
UGA_VIDEO_MODE
typedef struct _UGA_VIDEO_MODE

  {

      UINT32 ui32HorizontalResolution;

      UINT32 ui32VerticalResolution;

      UINT32 ui32ColorDepth;

      UINT32 ui32RefreshRate;

  }UGA_VIDEO_MODE,*PUGA_VIDEO_MODE;
UGA_VM_VERSION
typedef struct _UGA_VM_VERSION
   {

      UGA_VERSION_NUMBER vmUgaSpecificationVersion;

      UGA_VERSION_NUMBER vmVirtualMachineVersion;
   }UGA_VM_VERSION,*PUGA_VM_VERSION;
2.3 UGA固件接口
UGA固件把单一入口点输出到外部世界(系统固件、操作系统运行时)。输出的入口点称作为UgaFwDispatchService。UgaFwDispatchService可负责在UGA固件内根据UGA设备类型和IO请求类型把UGA IO请求调度到合适的处理器。
UgaFwDispatchService具有两个参数:PUGA_DEVICE pDevice和PUGA_IO_REQUEST ploRequest。UgaFwDispatchService可确定请求所希望的设备类型,用于调用VM库的方法VmlGetDeviceType(pDevice)。UGA固件不能废除UGA_DEVICE数据结构内的任何字段--这是不透明对象并且其内部结构今后无需通知就可改变。
UGA规范1.0定义了以下UGA设备类型:(图10)
UgaDtParentBus
UgaDtGraphicsController
UgaDtOutputController
UgaDtOutputPort
UgaDtOther
UGA_IO_REQUEST包含指向输入及输出缓冲器的指针、两个缓冲器的长度、存储输出缓冲器中由UGA固件返回的多个字节的字段,以及在UGA_IO_REQUEST.ioRequestCode字段中的IO请求代码。
TBD:我们应该也把UGA_IO_REQUEST宣称为不透明对象并定义方法以处理其字段吗?
UGA规范1.0定义以下UGA IO请求代码:UgaloGetVersionUgaloGetChildDeviceUgaloStartDeviceUgaloStopDeviceUgaloFlushDeviceUgaloResetDeviceUgaloGetDeviceStateUgaloSetDeviceStateUgaloSetPowerStateUgaloGetMemoryConfigurationUgaloSetVideoModeUgaloCopyRectangleUgaloGetEdidSegmentUgaloDeviceChannelOpenUgaloDeviceChannelCloseUgaloDeviceChannelReadUgaloDeviceChannelWriteUgaloGetPersistentDataSizeUgaloGetPersistentDataUgaloSetPersistentDataUgaloGetDevicePropertySizeUgaloGetDevicePropertyUgaloBtPrivatelnterface
对于各UGA设备,UGA固件开始接受后面跟有UgaIoGetChildDevice IO请求的UgaIoStartDevice,从UGA设备树的顶部移向底部。在计算和开启设备备之后可接收其他IO请求。UgaDtParentBus是特别情况--它启动UGA设备计算过程,并且除了UgaIoGetVersion以及UgaIoGetChildDevice之外它不用于任何其他代码。
2.4.1 UGA固件接口--入口点UGA_STATUSUGA_FW_CALL_TYPE_APIUgaFwDispatchService(
IN PUGA_DEVICE pDevice,
IN PUGA_IO_REQUEST pIoRequest
 );
UgaFwDispatchService是仅有的从UGA固件输出的入口点,并且它用作主要UGA服务调度例程。
这是所需的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
返回值
UGA固件状态代码。
2.4.2 UGA固件接口--IO请求处理器UgaFwBtPrivateInterface  可选,只用于引导时间UgaFwCopyRectangle  需要的UgaFwDeviceChannelClose   需要的*UgaFwDeviceChannelOpen    需要的*UgaFwDeviceChannelRead    需要的*UgaFwDeviceChannelWrite   需要的*UgaFwFlushDevice       需要的UgaFwGetChildDevice       需要的UgaFwGetDeviceProperty    需要的UgaFwGetDevicePropertySize         需要的UgaFwGetDeviceState       需要的UgaFwGetEdidSegment       需要的*UgaFwGetMemoryConfiguration     需要的UgaFwGetPersistentData    可选的UgaFwGetPersistentDataSize      可选的UgaFwGetVersion           可选的UgaFwResetDevice          需要的UgaFwSetDeviceState             需要的UgaFwSetPersistentData          可选的UgaFwSetPowerState              需要的UgaFwSetVideoMode               需要的UgaFwStartDevice            需要的UgaFwStopDeVice             需要的*对于专用硬件配置不需要这些方法
UgaFwBtPrivatelnterface
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwBtPrivateInterface(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwBtPrivateInterface提供方法把OEM/IHV特定请求发送到UGA固件并在系统和UGA固件之间交换自由格式的数据。
这是可选的仅用于引导时间的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvlnBuffer
IHV/OEM定义。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
IHV/OEM定义。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlBtPrivatelnterface.
UgaFwCopyRectangle
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwCopyRectangle(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwCopyRectangle从视频到视频存储器、从系统到视频存储器或从视频到系统存储器复制数据。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvlnBuffer
指向UGA_MEMORY_TRANSFER对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
不支持在源区和目标区之间的位映像转换--两个区域必须使用同一格式。UGA 1.0只支持作为RGB 565的16bpp以及作为xRGB的32bpp。
另见
UgaFwGetChildDevice.
UgaFwDeviceChannelClose
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDeviceChannelClose(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwDeviceChannelClose关闭与从设备的通信信道。
除了具有内置非PnP显示器(例如膝上型计算机)的OEM系统以外,这是需要的方法,它不支持外部PnP显示设备。对于这样的OEM系统,必须实现UgaFwGetEdidSegment方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwDeviceChannelClose主要用于从显示设备检索EDID(对于新的EDID格式灵活的支持)。此外,IHV驱动器写入器可以使用该方法与其它视频子设备通信。
另见
UgaFwGetChildDevice,UgaFwDeviceChannelOpen,UgaFwDeviceChannelRead,UgaFwDeviceChannelWrite,UgaFwGetEdidSegment.
UgaFwDeviceChannelOpen
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDeviceChannelOpen(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwDeviceChannelOpen开始与从设备的通信信道。
除了具有内置非PnP显示器(例如膝上型计算机)的OEM系统以外,这是需要的方法,它不支持外部PnP显示设备。对于这样的OEM系统,必须实现UgaFwGetEdidSegment方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwDeviceChannelOpen主要用于从显示设备检索EDID(对于新的EDID格式灵活的支持)。此外,IHV驱动器写入器可以使用该方法与其它视频子设备通信。
另见
UgaFwGetChildDevice,UgaFwDeviceChannelRead,UgaFwDeviceChannelWrite,UgaFwDeviceChannelClose,UgaFwGetEdidSegment.
UgaFwDeviceChannelRead
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDeviceChannelRead(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwDeviceChannelRead读取来自从设备的数据块。
除了具有内置非PnP显示器(例如膝上型计算机)的OEM系统以外,这是需要的方法,它不支持外部PnP显示设备。对于这样的OEM系统,必须实现UgaFwGetEdidSegment方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_CHANNEL_TRANSFER对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwDeviceChannelRead主要用于从显示设备检索EDID(对于新的EDID格式灵活的支持)。此外,IHV驱动写入其可以使用该方法与其它视频子设备通信。
另见
UgaFwGetChildDevice,UgaFwDeviceChannelOpen,UgaFwDeviceChannelClose,UgaFwDeviceChannelWrite,UgaFwGetEdidSegment.
UgaFwDeviceChannelWrite
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDeviceChannelWrite(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UaFwgDeviceChannelWrite把数据块写入从设备。
除了具有内置非PnP显示器(例如膝上型计算机)的OEM系统以外,这是需要的方法,它不支持外部PnP显示设备。对于这样的OEM系统,必须实现UgaFwGetEdidSegment方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_CHANNEL_TRANSFER对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwDeviceChannelWrite主要用于从显示设备检索EDID(对于新的EDID格式灵活的支持)。此外,IHV驱动器写入器可以使用该方法与其它视频子设备通信。
另见
UgaFwGetChildDevice,UgaFwDeviceChannelOpen,UgaFwDeviceChannelClose,UgaFwDeviceChannelRead,UgaFwGetEdidSegment.
UgaFwFlushDevice
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwFlushDevice(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwFlushDevice负责清洗任何到硬件的待决写入,确保所有DMA操作完成等等。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
从这个例程返回后UGA硬件必须保持完全空闲直到调用一些其他的UGA方法--系统固件/OS可以接触该设备的PCI配置空间。
另见
UgaFwGetChildDevice.
UgaFwGetChildDevice
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetChildDevice(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwGetChildDevice返回关于与pDevice设备对象相关的设备的子设备的信息。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向基于0的子索引(UINT32值)。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向UGA_DEVICE_DATA对象。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwGetChildDevice必须报告所有设备,它由UGA适配器支持,不管他们在计算时是否可用。UgaFwGetDeviceState方法用于根据每个所需确定设备的当前状态。
把UGA_DEVICE_DATA.ui32SharadContextSize特性设为非零值,告诉运行时环境分配给定容量的共享环境缓冲器,把它与当前计算的设备相关,并把所有后续计算设备指向同一缓冲器,只要计算返回零,如那些设备所共用的环境容量。一般只对于根设备把共享环境容量设为非零值,而对于所有后续计算的设备则设为零。
使用UgaFwGetDevicePropertySize和UgaFwGetDeviceProperty方法可得到关于UGA设备的附加信息。
另见
UgaFwGetDeviceState,UgaFwGetDevicePropertySize,UgaFwGetDeviceProperty.
UgaFwGetDeviceProperty
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetDeviceProperty(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwGetDeviceProperty返回关于设备的静态信息。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvlnBuffer
指向UGA_DEVICE_PROPERTY对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向设备特性数据的存储。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwGetDevicePropertySize.
UgaFwGetDevicePropertySize
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetDeVicePropertySize(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwGetDevicePropertySize返回关于设备的静态信息的容量。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_DEVICE_PROPERTY对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向设备特性容量的存储(UINT64)。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwGetDeviceProperty.
UgaFwGetDeviceState
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetDeviceState(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwGetDeviceState返回与设备对象相关的设备当前状态。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向UGA_DEVICE_STATE对象。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwSetDeviceState.
UgaFwGetEdidSegment
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetEdidSegment(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwGetEdidSegment返回设备的EDID数据。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向EDID区段号(UINT32)。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向EDID区段数据的存储。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量(UGA_MAX_EDID_SEGMENT_LENGTH)。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
该方法用于计算的UgaDtOutputController和UgaDtOutputPort设备。
对于UgaDtOutputController设备,UgaFwGetEdidSegment返回各个输出控制器的能力,即视频适配器本身的能力。
如果UGA固件为给定的UgaDtOutputPort设备提供I2C方法并且对于该设备的EDID通过I2C协议是可访问的,那么该方法可能会失效。对于UgaDtOutputController设备以及对于缺省不支持I2C协议的UgaDtOutputPort设备(例如电视机、一些膝上型计算机平板显示器),该方法必须一直成功。
对于较小EDID的旧版本监控器该方法可能失效。
另见
UgaFwGetChildDevice.
UgaFwGetMemoryConfiguration
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetMemoryConfiguration(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwGetMemoryConfiguration返回视频存储器配置数据。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向UGA_MEMORY_CONFIGURATION对象。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
对于计算的UgaDtOutputController设备调用该方法。
视频存储器配置数据根据当前选择的视频模式而变化。通常在UgaFwSetVideoMode调用之后调用UgaFwGetMemoryConfiguration。
另见
UgaFwGetChildDevice,UgaFwSetVideoMode.
UgaFwGetPersistentData
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetPersistentData(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwGetPersistentData返回自由格式的IHV定义的设备配置数据。由系统固件把该数据存储在非易失性媒介上并且它在重新引导时保持不变。
这是可选的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向要读取的字节数(UINT64)。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向用于读取数据的存储。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwGetPersistentDataSize,UgaFwSetPersistentData.
UgaFwGetPersistentDataSize
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetPersistentDataSize(
     IN PUGA_DEVICE pDevice,
     IN PUGA_IO_REQUEST pIoRequest
     );
UgaFwGetPersistentDataSize返回可用于UGA设备的持久性存储区域的字节容量。由系统固件和硬件提供用于设备的持久性存储区域。
这是可选的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向持久性数据缓冲器的容量。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwGetPersistentData,UgaFwSetPersistentData.
UgaFwGetVersion
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwGetVersion(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwGetVersion返回版本信息。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
指向UGA_VERSION对象。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
UgaFwResetDevice
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwResetDevice(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwResetDevice重置设备为初始状态。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
对于UgaDtGraphicsController和UgaDtOutputController设备,该方法不能失效--它必须把那些设备重置为初始状态,此时可使用任何其他UGA方法,尤其是UgaFwSetVideoMode。在紧急情况下可由操作系统使用UgaFwResetDevice。
另见
UgaFwGetChildDevice.
UgaFwSetDeviceState
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwSetDeviceState(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwSetDeviceState把子设备的当前状态设置为允许和禁用。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_DEVICE_STATE对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
为了在任何时刻确定设备的实际状态,必须发出处理对UgaFwDeviceState的调用。调用者不应根据传递到UgaFwSetDeviceState的设备状态值对当前设备状态作任何假设。
如果对于UgaDtOutputController和UgaDtOutputPort设备调用UgaFwSetDeviceState,那么UGA固件应期望遵循UgaFwSetVideoMode调用,即UGA固件不应自主设置视频模式,即使这是完成设置状态请求所需的。
另见
UgaFwGetChildDevice,UgaFwGetDeviceState.
UgaFwSetPersistentData
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwSetPersistentData(
IN PUGA_DEVICE pDevice,
IN PUGA_IO_REQUEST pIoRequest
);
UgaFwSetPersistentData写入自由格式的IHV定义的设备配置数据。由系统固件把该数据存储在非易失性媒介上并且它在重新引导时保持不变。
这是可选的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向要写入的数据。
ploRequest->ui64InBufferSize
输入缓冲器字节容量(要写入的字节数)。
ploRequest->pvOutBuffer
指向写入的字节数(UINT64)。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwGetPersistentDataSize,UgaFwGetPersistentData.
UgaFwSetPowerState
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwSetPowerState(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwSetPowerState查明是否可以设置、放弃查明,或设置(确认查明)设备电源状态。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_POWER_REQUEST对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
该设备在UgaPrProbe和UgaPrCommit或UgaPrCancel请求之间保持空闲。该方法不能无效UgaPrCommit请求。
另见
UgaFwGetChildDevice.
UgaFwSetVideoMode
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwSetVideoMode(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwSetVideoMode设置视频模式。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
指向UGA_VIDEO_MODE对象。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
该方法用于计算的UgaDtOutputController设备。
所需的像素深度和色彩排序(小endian):
16bpp--RGB 565
32bpp--xRGB
对于附件UGA适配器,必须支持在60Hz的800×600×32bpp。该模式对于集成视频实现是可选的。
另见
UgaFwGetChildDevice,UgaFwGetEdidSegment.
UgaFwStartDevice
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwStartDevice(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwStartDevice在其他UGA固件可用于设备的时候开启和初始化与设备对象相关的该设备的状态。
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
UgaFwStartDevice的代码是不可丢弃的!在引导过程的POST/INIT阶段期间由固件使用它,但是它也可由OS在其他任何时刻使用,例如在多监控器初始化期间或电源管理周期期间。
另见
UgaFwGetChildDevice.
UgaFwStopDevice
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwStopDevice(
    IN PUGA_DEVICE pDevice,
    IN PUGA_IO_REQUEST pIoRequest
    );
UgaFwStopDevice停止UGA设备。它负责清除所有与pDevice相关的资源--pDevice会消失!
这是需要的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
ploRequest->ioRequestCode
UGA IO请求代码。
ploRequest->pvInBuffer
不用。
ploRequest->ui64InBufferSize
输入缓冲器字节容量。
ploRequest->pvOutBuffer
不用。
ploRequest->ui64OutBufferSize
输出缓冲器字节容量。
ploRequest->ui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
第3部分
虚拟机接口
由系统固件(引导时间)和操作系统(运行时间)提供虚拟机接口。UGA固件使用该接口从其运行环境请求基本服务。UGA-VM桩根(stub)包括为与UGA固件代码连接的UGAVMXXX.LIB静态库的一部分。
3.1虚拟机接口--常量和数据类型
UGA_FW_CALL_TYPE_API
UGA_FW_CALL_TYPE_SERVICE
UGA_FW_CALL_TYPE_VML
UGA_FW_I2C_READ_CLOCK_LINE
UGA_FW_I2C_READ_DATA_LINE
UGA_FW_I2C_WRITE_CLOCK_LINE
UGA_FW_I2C_WRITE_DATA_LINE
UGA_FW_I2C_CONTROL
UGA_FW_SERVICE
UGA_FW_SERVICE_DISPATCH
UGA_FW_CALL_TYPE_XXXX
#define UGA_FW_CALL_TYPE_API
#define UGA_FW_CALL_TYPE_SERVICE
        <!-- SIPO <DP n="60"> -->
        <dp n="d60"/>
#define UGA_FW_CALL_TYPE_VML
UGA_FW_I2C_READ_CLOCK_LINE
typedef
UGA_STATUS
(*PUGA_FW_I2C_READ_CLOCK_LINE)(

  IN PUGA_DEVICE pDevice,

  OUT PUINT8 pui8Data

  );
UGA_FW_I2C_READ_DATA_LINE
typedef
UGA_STATUS
(*PUGA_FW_I2C_READ_DATA_LINE)(

  IN PUGA_DEVICE pDevice,

  OUT PUINT8 pui8Data

  );
UGA_FW_I2C_WRITE_CLOCK_LINE
typedef
UGA_STATUS
(*PUGA_FW_I2C_WRITE_CLOCK_LINE)(

  IN PUGA_DEVICE pDevice,

  OUT PUINT8 pui8Data

  );
UGA_FW_I2C_WRITE_DATA_LINE
typedef
        <!-- SIPO <DP n="61"> -->
        <dp n="d61"/>
UGA_STATUS
(*PUGA_FW_I2C_WRITE_DATA_LINE)(

  IN PUGA_DEVICE pDevice,

  OUT PUINT8 pui8Data

  );
UGA_FW_I2C_CONTROL
typedef struct _UGA_FW_I2C_CONTROL
{
   PUGA_FW_I2C_READ_CLOCK_LINE pfnI2cReadClockLine;
   PUGA_FW_I2C_READ_DATA_LINE pfnI2cReadDataLine;
   PUGA_FW_I2C_WRITE_CLOCK_LINE pfnI2cWriteClockLine;
   PUGA_FW_I2C_WRITE_DATA_LINE pfnI2cWriteDataLine;
   UINT32 ui32I2cDelay;//100ns units
} UGA_FW_I2C_CONTROL,*PUGA_FW_I2C_CONTROL;
UGA_FW_SERVICE
typedef
UGA_STATUS
(UGA_FW_CALL_TYPE_SERVICE *PUGA_FW_SERVICE)(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
   );
UGA_FW_SERVICE_DISPATCH
typedef
UGA_STATUS
(UGA_FW_CALL_TYPE_API *PUGA_FW_SERVICE_DISPATCH)(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
        <!-- SIPO <DP n="62"> -->
        <dp n="d62"/>
  );
3.3虚拟机接口--方法
VmlBtPrivateInterface
VmlCopySystemMemory
VmlGetDeviceContext
VmlGetDeviceld
VmlGetDeviceType
VmlGetParentDevice
VmlGetPersistentData
VmlGetPersistentDataSize
VmlGetSharedContext
VmlGetTimeStamp
VmlGetVersion
VmlI2cGetEdidSegment
VmlI2cRead
VmlI2cStart
VmlI2cStop
VmlI2cWrite
        <!-- SIPO <DP n="63"> -->
        <dp n="d63"/>
VmlPciAllocateCommonBuffer
VmlPciCopyDeviceMemory
VmlPciFlush
VmlPciFreeCommonBuffer
VmlPciGetRomlmage
VmlPciLockSystemMemory
VmlPciMapDeviceloSpace
VmlPciMapDeviceMemory
VmlPciPollDeviceloPort
VmlPciPollDeviceMemory
VmlPciReadConfigurationSpace
VmlPciReadDeviceloPort
VmlPciReadDeviceMemory
VmlPciUnlockSystemMemory
VmlPciUnmapDeviceloSpace
VmlPciUnmapDeviceMemory
VmlPciWriteConfigurationspace
VmlPciWriteDeviceloPort
        <!-- SIPO <DP n="64"> -->
        <dp n="d64"/>
VmlPciWriteDeviceMemory
VmlSetPersistentData
VmlSleep
VmlBtPrivatelnterface
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlBtPrivateInterface(

  IN PUGA_DEVICE pDevice,

  IN PVOID pvInBuffer,

  IN UINT64 ui64InBufferSize,

  OUT PVOID pvOutBuffer,

  IN UINT64 ui64OutBufferSize,

  OUT PUINT64 pui64BytesReturned

  );
VmlBtPrivateInterface提供方法把OEM/IHV特定请求发送到系统固件并在UGA和系统固件之间交换自由格式的数据。该方法只可用于引导时间并且在OS运行时间并不从VM输出。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ploRequest
指向UGA IO请求分组。
pvInBuffer
IHV/OEM定义。
ui64InBufferSize
输入缓冲器字节容量。
pvOutBuffer
IHV/OEM定义。
ui64 OutBufferSize
输出缓冲器字节容量。
pui64BytesReturned
关于输出缓冲器中的返回字节数。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,UgaFwBtPrivateInterface.
VmlCopySystemMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlCopySystemMemory(
   IN PUGA_DEVICE pDevice,
   OUT VOID UNALIGNED *pvDestination,
   IN VOID UNALIGNED *pvSource,
   IN UINT64 ui64Length
   );
VmlCopySystemMemory把数据从系统存储器中的源位置复制到系统存储器中的目标位置。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvDestination
指向系统存储器中的源位置。
pvSource
指向系统存储器中待复制数据的位置。
ui64Length
指定要复制的字节数。
返回值
UGA固件状态代码
注释
pvDestination和pvSource必须指向系统存储器中的地址。该函数不能用于访问设备物理存储器。源地址+长度不能超过目标地址。
另见
UgaFwGetChildDevice,VmlPciAllocateCommonBuffer,VmlPciMapSystemMemory,VmlPciReadDeviceMemory,VmlPciWriteDeviceMemory.
VmlGetDeviceContext
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetDeviceContext(
   IN PUGA_DEVICE pDevice,
   OUT PVOID*ppvDeviceContext
   );
VmlGetDeviceContext把指针返回与由pDevice指向的设备对象有关的IHV定义的设备特定环境。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ppvDeviceContext
指向到设备环境指针的存储。
返回值
UGA固件状态代码
注释
UGA固件指定在父设备的UgaFwGetChildDevice处理器中每个计算的UGA设备的设备环境容量。在UGA_DEVICE_DATA.ui32DeviceContextSize字段中返回子设备的设备环境容量。
另见
UgaFwGetChildDevice,VmlGetSharedContext.
VmlGetDeviceld
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetDeviceId(
   IN PUGA_DEVICE pDevice,
   OUT PUGA_DEVICE_ID pDeviceId
   );
VmlGetDeviceId返回与由pDevice所指向的设备对象相关的IHV定义的设备特定设备ID。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pDeviceld
指向设备ID值的存储。
返回值
UGA固件状态代码
注释
UGA固件指定在父设备的UgaFwGetChildDevice处理器中每个计算的UGA设备的设备ID。在UGA DEVICE DATA.deviceId字段中返回子设备的设备ID值。
另见
UgaFwGetChildDevice,VmlGetDeviceType.
VmlGetDeviceType
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetDeviceType(
   IN PUGA_DEVICE pDevice,
   OUT PUGA_DEVICE_TYPE pDeviceType
   );
VmlGetDeviceType返回与pDevice所指向的设备对象相关的设备类型。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pDeviceType
指向设备类型值的存储。
返回值
UGA固件状态代码
注释
UGA固件指定在父设备的UgaFwGetChildDevice处理器中每个计算的UGA设备的设备类型。在UGA_DEVICE_DATA.deviceType字段中返回子设备的设备类型值。
另见
UgaFwGetChildDevice,VmlGetDeviceld.
VmlGetParentDevice
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetParentDevice(
   IN PUGA_DEVICE pDevice,
   OUT PUGA_DEVICE *ppParentDevice
   );
VmlGetParentDevice返回指向与由pDevice所指向的设备对象相关的设备的父设备对象的指针。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ppParentDevice
指向到父设备对象指针的存储。
返回值
UGA固件状态代码
注释
UGA运行时环境仅保持与父设备的链路。如果需要UGA固件本身保持与设备环境种子设备的链路(例如在UgaFwStartDevice处理器中使用VmiGetParentDevice和VmlGetDeviceContext)。
另见UgaFwGetChildDevice,UgaFwStartDevice,VmlGetDeviceContext,VmlGetParentDevice.
VmlGetPersistentData
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetPersistentData(
   IN PUGA_DEVICE pDevice,
   OUT VOID UNALIGNED*pvBuffer,
   IN UINT32 ui32Offset,
   IN UINT32 ui32Length
   );
VmlGetPersistentData返回自由格式的IHV/OEM定义的设备配置数据。由系统固件把该数据存储在非易失性媒介上并且它在重新引导时保持不变。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvBuffer
关于返回包含从设备的持久存储区域读取的数据。
ui32Offset
指定从设备持久性存储区域的开始的字节数的偏移。
ui32Length
指定从设备持久存储区域读取的数据字节数的长度。
返回值
UGA固件状态代码。
另见
VmlGetPersistentDataSize,VmlSetPersistentData
VmlGetPersistentDataSize
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetPersistentDataSize(
   IN PUGA_DEVICE pDevice,
   OUT PUINT32 pui32Size
   );
VmlGetPersistentDataSize返回可用于设备的持久性存储区域的字节容量。由系统固件和硬件提供用于设备的持久性存储区域。
这是可选的方法。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pui32Size
关于返回包含可用于设备的持久性存储区域的字节容量。
返回值
UGA固件状态代码。
注释
另见
VmlGetPersistentData,VmlSetPersistentData
VmlGetSharedContext
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetSharedContext(
    IN PUGA_DEVICE pDevice,
    OUT PVOID *ppvSharedContext
    );
VmlGetSharedContext返回指向对于给定显示适配器由UGA固件计算的所有设备之间共用的IHV定义的环境的指针。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ppvSharedContext
指向到共用环境指针的存储。
返回值
UGA固件状态代码。
注释
UGA固件对UgaFwGetChildDevice处理器中的每个计算的UGA设备指定同一容量的共享环境。在UGA_DEVICE_DATA.ui32DeviceContextSize字段中返回共享环境容量。
另见
UgaFwGetChildDevice,VmlGetDeviceContext.
VmlGetTimeStamp
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetTimestamp(
IN PUGA_DEVICE pDevice,
OUT PUINT64 pui64TimeStamp
);
VmlGetTimeStamp以100纳秒为单位返回当前时间标记值。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pui64TimeStamp
指向时间标记值的存储。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
VmlGetVersion
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlGetVersion(
   IN PUGA_DEVICE pDevice,
   OUT PUGA_VM_VERSION pVmVersion
   );
VmlGetVersion返回虚拟机版本信息。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pVmVersion
指向虚拟机版本信息的存储。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
VmlI2cGetEdidSegment
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlI2cGetEdidSegmnent(
    IN PUGA_DEVICE pDevice,
    IN PUGA_I2C_CONTROL pi2cControl,
    IN UINT8 ui8Segment
    OUT PVOID pvBuffer,
    OUT PUINT32 pui32Length
    );
VmlI2cGetEdidSegment返回设备的EDID数据。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pl2cControl
指定指向UGA_I2C_CONTROL结构的指针。调用者必须用指向SDA(串行数据)和SCL(串行时钟)行轮转回叫例程以及由I2C从设备(监视器)所需的I2C延迟初始化该结构的字段。
ui8Segment
指定基于0的EDID区段号。EDID区段总为256字节长度,并且它可以包含一个或两各128字节的EDID、一个256字节的EDID、一部分大于256字节的EDID(在写入时间不存在),或根本没有EDID。
pvBuffer
关于返回包含EDID区段数据
pui32Length
关于返回包含由pvBuffer指向的缓冲器中返回的EDID数据字节数。
返回值
UGA固件状态代码。
注释
另见
UGA_I2C_CONTROL,UgaFwGetChildDevice.
VmlI2cRead
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlI2cRead(
   IN PUGA_DEVICE pDevice,
   IN PUGA_I2C_CONTROL pI2cControl,
   OUT VOID UNALIGNED*pvBuffer,
   IN UINT32 ui32Length
   );
VmlI2cRead从I2C从设备读取数据块。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pl2cControl
指定指向UGA_I2C_CONTROL结构的指针。调用者必须用指向SDA(串行数据)和SCL(串行时钟)行轮转回叫例程以及由I2C从设备(监视器)所需的I2C延迟初始化该结构的字段。
pvBuffer
关于返回包含从I2C从设备读取的数据。
ui32Length
指定要读取的数据字节长度。
返回值
UGA固件状态代码。
注释
另见
UGA_I2C_CONTROL,UgaFwGetChildDevice,VmlI2cStart,VmlI2cStop,VmlI2cWrite.
VmlI2cStart
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlI2cStart(
   IN PUGA_DEVICE pDevice
   IN PUGA_I2C_CONTROL pI2cControl
   );
VmlI2cStart使I2C开始与从设备通信。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pl2cControl
指定指向UGA_I2C_CONTROL结构的指针。调用者必须用指向SDA(串行数据)和SCL(串行时钟)行轮转回叫例程以及由I2C从设备(监视器)所需的I2C延迟初始化该结构的字段。
返回值
UGA固件状态代码。
注释
另见
UGA_I2C_CONTROL,UgaFwGetChildDevice,VmlI2cRead,VmlI2cWrite,VmlI2cStop.
VmlI2cStop
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlI2cStop(
   IN PUGA_DEVICE pDevice
   IN PUGA_I2C_CONTROL pI2cControl
   );
VmlI2cStop停止I2C与从设备的通信。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pl2cControl
指定指向UGA_I2C_CONTROL结构的指针。调用者必须用指向SDA(串行数据)和SCL(串行时钟)行轮转回叫例程以及由I2C从设备(监视器)所需的I2C延迟初始化该结构的字段。
返回值
UGA固件状态代码。
注释
另见
UGA_I2C_CONTROL,UgaFwGetChildDevice,VmII2cStart,VmII2cRead,VmII2cWrite.
VmII2cWrite
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlI2cWrite(
   IN PUGA_DEVICE pDevice,
   IN PUGA_I2C_CONTROL pI2cControl,
   IN VOID UNALIGNFD *pvBuffer,
   IN UINT32 ui32Length
   );
VmlI2cWrite把数据块写入I2C从设备。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pl2cControl
指定指向UGA_I2C_CONTROL结构的指针。调用者必须用指向SDA(串行数据)和SCL(串行时钟)行轮转回叫例程以及由I2C从设备(监视器)所需的I2C延迟初始化该结构的字段。
pvBuffer
包含要写入I2C从设备的数据。
ui32Length
指定要写入的数据字节长度。
返回值
UGA固件状态代码。
注释
另见
UGA_I2C_CONTROL,UgaFwGetChildDevice,VmlI2cStart,VmlI2cStop,VmlI2cRead.
VmlPciAllocateCommonBuffer
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciAllocateCommonBuffer(
    IN PUGA_DEVICE pDevice,
    IN UINT64 ui64Length,
    IN UGA_MEMORY_CACHING_TYPE cachingType,
    OUT PVOID *ppvHostAddress,
    OUT PUGA_PHYSICAL_ADDRESS pDeviceAddress
    );
VmlPciAllocateCommonBuffer分配邻接的非可分页系统存储器并对其映射,以使它同时可从处理器和设备DMA操作的作用于的访问。
参数
pDevice指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui64Length
指定要分配的存储器字节号。
cachingType
指定UGA_MEMORY_CACHING_TYPE值,它表示考虑所请求的存储器的缓存类型。固件可使用的可能值是:
UgaMcNonCached
不能由处理器对所请求的存储器进行高速缓存。
UgaMcCached
处理器可以对所请求的存储器进行高速缓存。
UgaMcWriteCombined
所请求的存储器允许写入组合(通常对于帧缓冲器)。
ppvHostAddress
关于返回包含所分配范围的虚基地址。
pDeviceAddress
关于返回包含总线转换的所分配范围物理基地址。
返回值
UGA固件状态代码
注释
VmlPciAllocateCommonBuffer分配从处理器和设备可达到的系统存储器。该存储器邻近于设备。该方法建立对于设备的转换,包括如必要加载映射寄存器。
VmlPciAllocateCommonBuffer分配至少一页存储区,不管所请求的ui64Length。在请求小于PAGE_SIZE字节数的成功分配之后,调用者只访问所请求的ui64Length。在请求大于PAGE_SIZE字节数整数倍的成功分配之后,在最后分配页上的任何剩余字节对于调用者是不可访问的。
如果UGA固件需要若干页普通缓冲器空间,但是页之间不需要邻接,那么驱动器应该对VmlPciAllocateCommonBuffer进行若干一页的请求,而不是整个的请求。这种方式保持了邻接的存储区。
另见
UgaFwGetChildDevice,VmlPciFreeCommonBuffer.
VmlPciCopyDeviceMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciCopyDeviceMemory(
    IN PUGA_DEVICE pDevice,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64DestinationOffest,
    IN UINT64 ui64SourceOffest,
    IN UINT64 ui64Count,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciCopyDeviceMemory把设备存储块的内容从一处复制到另一处。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui8BarIndex
指定存储器或IO窗孔(aperture)的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64DestinationOffset
为复制操作的目标指定BAR相对偏移。
ui64SourceOffset
为复制操作的源指定BAR相对偏移。
ui64Count
指定要进行存储器操作的数量。
dataWidth
指定存储操作的宽度。
返回值
UGA固件状态代码
注释
源和目标区域不能重叠。
另见
UgaFwGetChildDevice.
VmlPciFlush
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciFlush(
    IN PUGA_DEVICE pDevice
     );
VmlPciFlush清洗传递到设备的所有数据。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
VmlPciFreeCommonBuffer
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciFreeCommonBuffer(
    IN PUGA_DEVICE pDevice,
    IN PVOID pvHostAddress,
    IN UINT64 ui64Length,
    IN UGA_MEMORY_CACHING_TYPE cachingType
    );
VmlPciFreeCommonBuffer清空由VmlPciAllocateCommonBuffer分配的普通缓冲器,连同缓冲器使用的所有资源。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvHostAddress
指定所分配范围的虚基地址。
ui64Length
指定要解除分配的存储器的字节号。
cachingType
指定UGA_MOMORY_TYPE值。
返回值
UGA固件状态代码。
注释
传递到VmlPciFreeCommonBuffer的参数必须准确匹配传递到VmlPciAllocateCommonBuffer并由其返回的参数。UGA固件不能清空部分所分配的普通缓冲器。
另见
UgaFwGetChildDevice,VmlPciAllocateCommonBuffer.
VmlPciGetRomlmage
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciGetRomImage(
    IN PUGA_DEVICE pDevice,
    OUT VOID UNALIGNED*pvOutputBuffer,
    IN UINT32 ui32Offset,
    IN UINT32 ui32Length
    );
VmlPciGetRomImage提供对系统存储器中PCI可选ROM复制的访问。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvOutputBuffer
关于返回包含从可选ROM图像读取的数据。
ui32Offset
指定从可选ROM图像开始的字节偏移。
ui32Length
指定要读取的可选ROM图像上的字节长度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice.
VmlPciLockSystemMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciLockSystemMemory(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvHostAddress,
    IN OUT PUINT64 pui64Length,
    IN UGA_MEMORY_TRANSFER_TYPE transferType,
    OUT PUGA_PHYSICAL_ADDRESS pDeviceAddress,
    OUT PVOID *ppvMapping
    );
VmlPciLockSystemMemory使物理页由定位并锁定在存储器中的虚地址范围映射。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvHostAddress
指定要锁定的存储块的虚地址。
pui64Length
指定要锁定的存储块的字节长度。
关于返回包含由该操作锁定的邻接物理存储块的长度。返回的长度小于在pvAddress指向在物理存储器中不邻接虚地址范围时所请求长度。
transferType
指定使用锁定的系统存储缓冲器进行的DMA传输的类型。有效值是UgaMtSystemToVideo和UgaMtVideoToSystem。
pDeviceAddress
关于返回包含总线转换的锁定的存储范围的物理基地址。
ppvMapping
关于返回指向系统存储器映射信息。这是只用于匹配VmlPciSystemMemory调用的不透明数据。
返回值
UGA固件状态代码。
注释
VmlPciLockSystemMemory必须分配对于PCI设备可视的暂时传输缓冲器。在这个情况下,VmlPciLockSystemMemory把由pvHostAddress指向的缓冲器内容复制到UgaMtSystemToVideo传输操作的暂时传输缓冲器中,并且VmlPciLockSystemMemory把暂时传输缓冲器的内容复制到UgaMtVideoToSyustem操作中。由于双缓冲器的可能性,CPU直接访问由对于给定的传输操作在VmlPciLockSystemMemory和VmlPciUnlockSystemMemory之间匹配的pvHostAddress所指向的缓冲器是非法的。
如果pui64Length中的返回的长度小于初始值,那么可由返回的长度更新pvAddress,并且VmlPciLockSystemMemory对于剩余长度可再次调用。重复该操作直到成功锁定整个存储区域。如果必须使用对VmlPciLockSystemMemory的多次调用来锁定整个存储区域,那么这意味着把虚邻接存储区域映射到多个独立的邻接物理存储块。在这种情况下,也通过ppvMapping变量返回多个映射值。为了把映射值用于对VmlPciUnlockSystemMemory的匹配调用,调用者必须存储所有返回的映射值。
另见
UgaFwGetChildDevice,VmlPciUnlockSystemMemory.
VmlPciMapDeviceloSpace
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciMapDeviceIoSpace(
    IN PUGA_DEVICE pDevice,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UINT64 ui64Length,
    IN PUGA_UGA_MEMORY_CACHING_TYPE cachingType
    );
VmlPciMapDeviceIoSpace把设备特定物理IO地址映射到非分页的系统空间。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
为要映射的IO范围指定BAR相对基址偏移。
ui64Length
指定要映射的IO范围的字节长度。
cachingType
指定UGA_MEMORY_CACHING_TYPE值,它表示考虑所请求的存储器的高速缓存类型。UGA固件可使用的可能值是:
UgaMcNonCached
不能由处理器对所请求的存储器进行高速缓存。
UgaMcCached
处理器可以对所请求的存储器进行高速缓存。
UgaMcWriteCombined
所请求的存储器允许写入组合(通常对于帧缓冲器)。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciUnmapDeviceloSpace.
VmlPciMapDeviceMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciMapDeviceMemory(
    IN PUGA_DEVICE pDevice,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UINT64 ui64Length,
    IN PUGA_UGA_MEMORY_CACHING_TYPE cachingType
    );
VmlPciMapDeviceMemory把设备特定物理存储地址范围映射到非分页的系统空间。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
为要映射的存储地址范围指定BAR相对基址偏移。
ui64Length
指定要映射的存储地址范围的字节长度。
cachingType
指定UGA_MEMORY_CACHING_TYPE值,它表示考虑所请求的存储器的高速缓存类型。UGA固件可使用的可能值是:
UgaMcNonCached
不能由处理器对所请求的存储器进行高速缓存。
UgaMcCached
处理器可以对所请求的存储器进行高速缓存。
UgaMcWriteCombined
所请求的存储器允许写入组合(通常对于帧缓冲器)。
返回值
UGA固件状态代码。
注释
另见
  UgaFwGetChildDevice,VmlPciUnmapDeviceMemory.

  VmlPciPollDeviceloPort

  UGA_STATUS

  UGA_FW_CALL_TYPE_VML

  VmlPciPollDeviceIoPort(

      IN PUGA_DEVICE pDevice,

      OUT VOID UNALIGNED *pvData,

      IN UINT8 ui8BarIndex,

      IN UINT64 ui64Offset,

      IN VOID UNALIGNED *pvMask,

      IN VOID UNALIGNED *pvValue,

      IN UGA_DATA_WIDTH dataWidth,

      IN UINT64 ui64TimeOut

      );
VmlPciPollDevicePort轮询特定位模式的设备IO端口。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
关于返回包含从轮询的IP端口读取的最终非屏蔽的值。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要轮询的IO端口BAR的相对字节偏移。
pvMask
指向与从轮询的IO端口读取的值进行与操作的掩码。
pvValue
指向与从轮询的IO端口读取的并与由pvMask指向的掩码进行与操作的值比较的值。
dataWidth
指定从轮询的IO端口读取的以及存储在pvMask、pvValue和pvData的值的数据宽度。
ui64TimeOut
指定以100纳秒为单位的轮询操作的超时值。
返回值
UGA固件状态代码。
注释
VmlPciPollDevicePort在超时到达之前没有匹配时返回UGA_STATUS_TIMEOUT。否则,VmlPciPollDevicePort在读取匹配模式之后立即返回UGA_STATUS_SUCCESS。
另见
  UgaFwGetChildDevice,VmlPciPollDeviceMemory.

  VmlPciPollDeviceMemory

  UGA_STATUS

  UGA_FW_CALL_TYPE_VML

  VmlPciPollDeviceMemory(

      IN PUGA_DEVICE pDevice,

      OUT VOID UNALIGNED *pvData,

      IN UINT8 ui8BarIndex,

      IN UINT64 ui64Offset,

      IN VOID UNALIGNED *pvMask,

      IN VOID UNALIGNED *pvValue,

      IN UGA_DATA_WIDTH dataWidth,

      IN UINT64 ui64TimeOut

      );
VmlPciPollDeviceMemory轮询特定位模式的设备存储器位置。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
关于返回包含从轮询的设备存储器位置读取的最终非屏蔽的值。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要轮询的设备存储器BAR相对字节偏移。
pvMask
指向与从轮询的设备存储器位置读取的值进行与操作的掩码。
pvValue
指向与从轮询的设备存储器位置读取的并与由pvMask指向的掩码进行与操作的值比较的值。
dataWidth
指定从轮询的设备存储器位置读取的以及存储在pvMask、pvValue和pvData的值的数据宽度。
ui64TimeOut
指定以100纳秒为单位的轮询操作的超时值。
返回值
UGA固件状态代码。
注释
VmlPciPollDeviceMemory在超时到达之前没有匹配时返回UGA_STATUS_TIMEOUT。否则,VmlPciPollDeviceMemory在读取匹配模式之后立即返回UGA_STATUS_SUCCESS。
另见
UgaFwGetChildDevice,VmlPciPollDeviceloPort.
VmlPciReadConfigurationSpace
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciReadConfigurationSpace(
    IN PUGA_DEVICE pDevice,
    OUT VOID UNALIGNED *pvBuffer,
    IN UINT32 ui32Offset,
    IN UINT32 ui32Count,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciReadConfigurationSpace从UGA设备PCI配置头文件读取数据。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvBuffer
关于返回包含从UGA设备的PCI配置头文件读取的数据。
ui32Offset
指定从设备配置数据开始的字节偏移。VmlPciReadConfigurationSpace从该偏移处开始读取设备配置数据。
ui32Count
指定配置空间读取数。
dataWidth
指定从配置空间读取的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciWriteConfigurationSpace.
VmlPciReadDeviCeloPort
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciRaadDeviceIoPort(
    IN PUGA_DEVICE pDevice,
    OUT VOID UNALIGNED *pvData,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciReadDeviceIoPort从设备IO端口读取值。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
关于返回包含从IO端口读取的值。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要读取的IO端口的BAR相对字节偏移。
dataWidth
指定从IO端口读取的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciReadDeviceMemory,VmlPciWriteDeviceloPort,VmlPciWriteDeviceMemory.
VmlPciReadDeviceMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciReadDeviceMemory(
    IN PUGA_DEVICE pDevice,
    OUT VOID UNALIGNED *pvData,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UINT64 ui64Count,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciReadDeviceMemory从设备存储器读取数据块。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
关于返回包含从设备存储器读取的数据块。由pvData指向的缓冲器必须至少为(dataWidth*ui64Count)字节长度。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的素引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要读取的设备存储器的BAR相对字节基址偏移。
ui64Count
指定从ui64Offset开始执行的dataWidth读取数。
dataWidth
指定从设备存储器读取的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetchildDevice,VmlPciReadDeviceloPort,vmlPciWriteDeviceloPort,VmlPciWriteDeviceMemory.
VmlPciUnlockSystemMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciUnlockSystemMemory(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvHostAddress,
    IN UINT64 ui64Length,
    IN PVOID pvMapping
    );
VmlPciUnlockSystemMemory解锁由VmlPciLockSystemMemory锁定的物理页。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvHostAddress
指定要解锁的存储块的虚地址。
ui64Length
指定要解锁的存储块的字节长度。
pvMapping
指定由VmlPciLockSystemMemory返回的系统存储器映射信息。
返回值
UGA固件状态代码。
注释
VmlPciLockSystemMemory必须分配对于PCI设备可视的暂时传输缓冲器。在这个情况下,VmlPciLockSystemMemory把由pvHostAddress指向的缓冲器内容复制到UgaMtSystemToVideo传输操作的暂时传输缓冲器中,并且VmlPciLockSystemMemory把暂时传输缓冲器的内容复制到UgaMtVideoToSyustem操作中。由于双缓冲器的可能性,CPU直接访问由对于给定的传输操作在VmlPciLockSystemMemory和VmlPciUnlockSystemMemory之间匹配的pvHostAddress指向的缓冲器是非法的。
UGA固件不能解锁部分锁定的邻接物理存储块。如果必须使用多次调用来锁定映射到多个不连接物理存储块的邻接虚存储块,那么调用者必须使用对VmlPciUnlockSystemMemory的多次匹配调用以解锁对应每个物理存储块传递pvHostAddress、ui64Length和pvMapping的多个物理存储块。
另见
UgaFwGetChildDevice,VmlPciLockSystemMemory.
VmlPciUnmapDeviceloSpace
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciUnmapDeviceIoSpace(
    IN PUGA_DEVICE pDevice,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UINT64 ui64Length
    );
VmlPciUnmapDeviceIoSpace对由VmlPciMapDeviceIoSpace映射的设备特定物理IO地址进行去映射。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui8BarIndex
指定存储器或IO孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要被去映射的IO范围BAR相对基址偏移。
ui64Length
指定要被去映射的IO范围的字节长度。
返回值
UGA固件状态代码。
注释
传递到VmlPciUnmapDeviceIoSpace的参数必须准确匹配传递到VmlPciMapDeviceIoSpace并从其返回的参数。UGA固件不能去映射部分映射的设备物理IO范围。
另见
UgaFwGetChildDevice,VmlPciMapDeviceloSpace.
VmlPciUnmapDeviceMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciMapDeviceMemory(
    IN PUGA_DEVICE pDevice,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UINT64 ui64Length
    );
VmlPciUnmapDeviceMemory对由VmlPciMapDeviceMemory映射的设备特定物理存储器地址范围进行去映射。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要被去映射的存储器地址范围BAR相对基址偏移。
ui64Length
指定要被去映射的存储器地址范围的字节长度。
返回值
UGA固件状态代码。
注释
传递到VmlPciUnmapDeviceMemory的参数必须准确匹配传递到VmlPciMapDeviceMemory并从其返回的参数。UGA固件不能去映射部分映射的设备物理IO范围。
另见
UgaFwGetChildDevice,VmlPciMapDeviceMemory.
VmlPciWriteConfigurationSpace
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciReadConfigurationSpace(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvBuffer,
    IN UINT32 ui32Offset,
    IN UINT32 ui32Count,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciWriteConfigurationSpace把数据写入UGA设备PCI配置头文件。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvBuffer
指向写入UGA设备的PCI配置头文件的数据。
ui32Offset
指定从设备配置数据开始的字节偏移。VmlPciWriteConfigurationSpace从该偏移处开始写入设备配置数据。
ui32Count
指定配置空间写入数。
dataWidth
指定写入配置空间的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciReadConfigurationSpace.
VmlPciWriteDeviceloPort
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciWriteDeviceIoPort(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvData,
    IN UINT8 ui8BarIndex,
    IN UINT64 ui64Offset,
    IN UGA_DATA_WIDTH dataWidth
    );
VmlPciWriteDeviceIoPort把值写入设备IO端口。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
指向写入IO端口的值。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要写入的IO端口的BAR相对字节偏移。
dataWidth
指定写入IO端口的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciReadDeviceloPort,VmlPciReadDeviceMemory,VmlPciWriteDeviceMemory.
VmlPciWriteDeviceMemory
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlPciWriteDeviceMemory(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvData,
    IN UINT8 ui8BarIndex,
    IN UINT64  ui64Offset,
    IN UINT64 ui64Count,
    IN UGA_DATA WIDTH dataWidth
    );
VmlPciWriteDeviceMemory把数据块写入设备存储器。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvData
指向写入设备存储器的数据块。由pvData指向的缓冲器必须至少为(dataWidth*ui64Count)字节长度。
ui8BarIndex
指定存储器或IO窗孔的PCI配置头文件基址寄存器(BAR)的基于0的索引。所有UGA MMIO和IO操作都使用BAR相对定址。该值的有效范围是0-5。
ui64Offset
指定要写入的设备存储器的BAR相对字节基址偏移。
ui64Count
指定从ui64Offset开始执行的dataWidth写入数。
dataWidth
指定写入设备存储器读取的值的数据宽度。
返回值
UGA固件状态代码。
注释
另见
UgaFwGetChildDevice,VmlPciReadDeviceloPort,VmlPciReadDeviceMemory,VmlPciWriteDeviceloPort.
VmlSetPersistentData
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlSetPersistentData(
    IN PUGA_DEVICE pDevice,
    IN VOID UNALIGNED *pvBuffer,
    IN UINT32 ui32Offset,
    IN UINT32 ui32Length
    );
VmlSetPersistentData写入自由格式的IHV/OEM定义的设备配置数据。由系统固件把该数据存储在非易失性媒介上并且它在重新引导时保持不变。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
pvBuffer
指向要写入设备的持久存储区域的数据。
u32Offset
指定从设备持久性存储区域的开始的字节数的偏移。
ui32Length
指定从设备持久存储区域写入的数据字节数的长度。
返回值
UGA固件状态代码。
注释
另见
VmlGetPersistentDataSize,VmlGetPersistentData.
VmlSleep
UGA_STATUS
UGA_FW_CALL_TYPE_VML
VmlSleep(
    IN PUGA_DEVICE pDevice,
    IN UINT64 ui64Duration
    );
VmlSleep把UGA固件执行挂起一定数量的100纳秒单位。
参数
pDevice
指定与由UgaFwGetChildDevice计算的设备相关的设备对象。由UgaFwGetChildDevice计算的各设备具有与其相关的唯一设备对象。
ui64Duration
指定100纳秒单位数。
返回值
UGA固件状态代码。
注释
当前最小的“可设定”值为10,它意味着对于任何持续时间<=10,延迟至少为10*100ns=1μs长。
另见
UgaFwGetChildDevice.
                      附录B
EFI-UGA捆绑
EFI_UGA_IO_PROTOCOL
第一部分
EFI_UGA_IO_PROTOCOL
EFI_UGA_IO_PROTOCOL把EFI接口提供给显示适配器固件,它与UGA固件接口规范兼容。为了简化EFI客户代码实现,除了单一的UGA固件调度入口点,EFI_UGA_IO_PROTOCOL还输出CreateDevice和DeleteDevice方法。
在本文件中示出的EFI_UGA_IO_PROTOCOL的实现和EFI-UGA驱动器捆绑代码实例完全是一般的,并且独立于显示硬件结构。它们作为EFI驱动器库的一部分。
视频ROM必须输出EFI_UGA_IO_PROTOCOL以兼容EFI 1.1。
1.1 EFI_UGA_IO_PROTOCOL方法
该选项列出了EFI_UGA_IO_PROTOCOL的方法。该方法用于创建和初始化UGA设备对象、删除UGA设备对象,以及把I/O请求分组发送到UGA设备对象。
EFI_UGA_IO_CREATE_DEVICE
EFI_UGA_IO_DELETE_DEVICE
EFI_UGA_IO_DISPATCH_SERVICE
EFI_UGA_IO_CREATE_DEVICE
EFI_UGA_IO_CREATE_DEVICE方法创建和初始化UGA设备对象。
typedef
EFI_STATUS
(*EFI_UGA_IO_CREATE_DEVICE)(
    IN EFI_UGA_IO_PROTOCOL *This,
    IN UGA_DEVICE *ParentDevice,
    IN UGA_DEVICE_DATA *DeviceData,
    IN VOID *RunTimeContext,
    OUT UGA_DEVICE **Device
    );
参数
This
指向EFI_UGA_IO_PROTOCOL结构。
ParentDevice
指向要创建的设备的父母的UGA_DEVICE结构。NULL值表示被创建的设备对象是计算的根;即要创建UgaDtParentBus类型(见UGA_DEVICE_DATA的计算)的UGA设备对象。
DeviceData
指向包含要创建的设备的UGA设备数据的UGA_DEVICE_DATA结构。
RunTimeContext
指向包含要创建的设备的运行时间环境特定的环境的存储器位置。
Device
指向接收所创建设备UGA_DEVICE结构地址的存储器位置。
返回值
该方法返回标准EFI状态代码。
头文件
在efiuga.h中声明,包括efiuga.h和uga.h。
注释
视频IHV不需要实现该方法。它包括在EFI VML静态库中。对于实现细节,见EFI-UGA捆绑以及EFI_UGA_IO_PROTOCOL实现实例的2.1部分。
EFI_UGA_IO_DELETE_DEVICE
EFI_UGA_IO_DELETE_DEVICE方法删除UGA设备对象,它是在先前调用EFI_UGA_IO_CREATE_DEVICE方法中创建的。
typedef
EFI_STATUS
(*EFI_UGA_IO_DELETE_DEVICE)(
    IN EFI_UGA_IO_PROTOCOL *This,
    IN UGA_DEVICE *Device
    );
参数
This
指向EFI_UGA_IO_PROTOCOL结构。
Device
指向要删除的设备的UGA_DEVICE结构。
返回值
该方法返回标准EFI状态代码。
头文件
在efiuga.h中声明,包括efiuga.h和uga.h。
注释
视频IHV不需要实现该方法。它包括在EFI VML静态库中。对于实现细节,见EFI-UGA捆绑以及EFI_UGA_IO_PROTOCOL实现实例的2.1部分中实例代码。
EFI_UGA_IO_DISPATCH_SERVICE
EFI_UGA_IO_DISPATCH_SERVICE方法把UGA I/O请求分组发送到UGA设备对象。
typedef
UGA_STATUS
UGA_FW_CALL_TYPE_API
(*EFI_UGA_IO_DISPATCH_SERVICE)(
    IN UGA_DEVICE *Device,
    IN UGA_IO_REQUEST IoRequest
    );
参数
Device
指向与所计算的UGA设备相关的设备对象的UGA_DEVICE结构。
IoRequest
指定包含UGA I/O请求分组的UGA_IO_REQUEST结构。
返回值
该方法返回标准EFI状态代码。
头文件
在efiuga.h中声明,包括efiuga.h和uga.h。
注释
视频IHV必须实现该方法。对于实现细节,见UGA固件接口实现实例的2.2部分。
该方法是主要的UGA固件服务调度例程。除了实现该方法,视频IHV必须实现任何在IoRequest.ioRequestCode中指定的函数。(见该方法可调用的函数名称列表的UGA_IO_REQUEST_CODE的计算。)
1.2 EFI_UGA_IO_PROTOCOL结构
由EFI_UGA_IO_PROTOCOL方法使用在本部分中列出的结构以保持关于特定UGA设备对象的信息。
EFI_UGA_IO_PROTOCOL
EFI_UGA_IO_PROTOCOL_CONTEXT
EFI_UGA_IO_PROTOCOL
EFI_UGA_IO_PROTOCOL结构包含用于创建UGA设备、删除UGA设备以及把消息发送到UGA设备的函数地址。
typedef struct_EFI_UGA_IO_PROTOCOL{
    EFI_UGA_IO_CREATE_DEVICE CreateDevice;
    EFI_UGA_IO_DELETE_DEVICE DeleteDevice;
    EFI_UGA_IO_DISPATCH_SERVICE DispatchService;
}EFI_UGA_IO_PROTOCOL;
成员
CreateDevice
指向用于创建UGA设备对象的函数。
DeleteDevice
指向用于删除UGA设备对象的函数。
DispatchService
指向用于把消息发送到UGA设备对象的函数。
头文件
在efiuga.h中声明,包括efiuga.h。
EFI_UGA_IO_PROTOCOL_CONTEXT
EFI_UGA_IO_PROTOCOL_CONTEXT结构包含EFI_UGA_IO_PROTOCOL结构的信息,连同与PCI视频适配器相关的处理。
typedef struct_EFI_UGA_IO_PROTOCOL_CONTEXT{
    EFI_UGA_IO_PROTOCOL Protocol;
    EFI_HANDLE Controller;
}EFI_UGA_IO_PROTOCOL_CONTEXT;
成员
Protocol
指定EFI_UGA_IO_PROTOCOL的结构。
Controller
是到PCI视频适配器的句柄。EFI运行时环境提供该值。
头文件
在efiuga.h中声明,包括efiuga.h。
1.3 EFI_UGA_IO_PROTOCOL的常量
该部分列出了EFI_UGA_IO_PROTOCOL的常量
EFI_UGA_IO_PROTOCOL_GUID
EFI_UGA_IO_PROTOCOL_GUID
EFI_UGA_IO_PROTOCOL_GUID使EFI-UGA I/O协议的GUID。
#define EFI_LUGA_IO_PROTOCOL_GUID\
     {0x61a4d49e,0x6f68,0x4f1b,0xb9,0x22,0xa8,0x6e,0xed,0xb,0x7,0xa2}
头文件
在efiuga.h中声明,包括efiuga.h。
第2部分
实现实例
该部分提供实例代码,说明如何实现EFI-UGA捆绑以及EFI_UGA_IO_PROTOCOL。该部分还提供了UGA固件接口实现的实例代码。
2.1 EFI-UGA捆绑以及EFI_UGA_IO_PROTOCOL的实现
2.2 UGA固件接口实现
2.1 EFI-UGA捆绑以及EFI_UGA_IO_PROTOCOL的实现实例
/*++
This code and information is provided ″as is″ without warranty of any
kind,either expressed or implied,including but not limited to the
implied warranties of merchantability and/or fitness for a particular
purpose.
Copyright(c)2000-2001 Microsoft Corporation
Module Name:
   efiuga.h
Abstract:
   This is an implementation of EFI-UGA binding code.
Author:
   Michael Maciesowicz(mmacie)07-August-2001
Environment:
   Firmware boot-time and OS kernel mode run-time.
Notes:
Revision History:
--*/
#ifndef _EFIUGA_H_
#define _EFIUGA_H_
#include ″vml.h″
extern const UINT16 g_ui16UgaFwPciVendorId;
extern const UINT16 g_ui16UgaFwPciDeviceId;
extern const UINT16 g_ui16UgaFwPciSubvendorId;
extern const UINT16 g_ui16UgaFwPciSubdeviceId;
extern const UINT8 g_ui8UgaFwPciDeviceRevision;
//
// BUGBUG:Remove from here once EFI_UGA_IO_PROTOCOL is in EFI 1.1.
//
#define EFI_UGA_IO_PROTOCOL_GUID\
   {0x61a4d49e,0x6f68,0x4f1b,0xb9,0x22,0xa8,0x6e,0xed,0xb,0x7,0xa2}
typedef
EFI_STATUS
(EFIAPI *EFI_UGA_IO_CREATE_DEVICE)(

  IN struct _EFI_UGA_IO_PROTOCOL *This,

  IN UGA_DEVICE *ParentDevice,

  IN UGA_DEVICE_DATA *DeviceData,

  IN VOID *RunTimeContext,

  OUT UGA_DEVICE **Device

  );
typedef
EFI_STATUS
(EFIAPI *EFI_UGA_IO_DELETE_DEVICE)(

  IN struct _EFI_UGA_IO_PROTOCOL *This,

  IN UGA_DEVICE *Device

  );
typedef struct _EFI_UGA_IO_PROTOCOL
{
   EFI_UGA_IO_CREATE_DEVICE CreateDevice;
   EFI_UGA_IO_DELETE_DEVICE DeleteDevice; 
   PUGA_FW_SERVICE_DISPATCH DispatchService;
}EFI_UGA_IO_PROTOCOL;
        <!-- SIPO <DP n="108"> -->
        <dp n="d108"/>
typedef struct _EFI_UGA_IO_PROTOCOL_CONTEXT
{
   EFI_UGA_IO_PROTOCOL Protocol;
   EFI_HANDLE Controller;
}EFI_UGA_IO_PROTOCOL_CONTEXT;
#define EFI_UGA_IO_PROTOCOL_CR(This)\

  ((EFI_UGA_IO_PROTOCOL_CONTEXT *)&(((EFI_UGA_IO_PROTOCOL_CONTEXT *) (This))->Protocol))
extern PUGA_FW_SERVICE_DISPATCH UgaFwDispatchService;
extern EFI_HANDLE gMyImageHandle;
extern EFI_GUID gEfiUgaIoProtocolGuid;
//
//BUGBUG:Remove to here once EFI 1.1 is in the build.
//
EFI_STATUS
EFIAPI
EfiUgaDriverEntryPoint(
   IN EFI_HANDLE ImageHandle,
   IN EFI_SYSTEM_TABLE *SystemTable
   );
EFI_STATUS
EFIAPI
EfiUgaControllerDriverSupported(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE Controller,
   IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
   );
EFI_STATUS
EFIAPI
EfiUgaControllerDriverStart(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE_Controller,
   IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
   );
EFI_STATUS
EFIAPI
EfiUgaControllerDriverStop(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE_Controller,
   IN UINTN NumberOfChildren,
   IN EFI_HANDLE *ChildHandleBuffer
   );
EFI_STATUS
EFIAPI
EfiUgaCreateDevice(
   IN EFI_UGA_IO_PROTOCOL *This,
   IN UGA_DEVICE *ParentDevice,
   IN UGA_DEVICE_DATA *DeviceData,
   IN VOID *RunTimeContext,
   OUT UGA_DEVICE **Device
   );
EFI_STATUS
EFIAPI
EfiUgaDeleteDevice(
   IN EFI_UGA_IO_PROTOCOL *This,
   IN UGA_DEVICE *Device
   );
#endif//_EFIUGA_H_
        <!-- SIPO <DP n="109"> -->
        <dp n="d109"/>
/*++
This code and information is provided ″as is″ without warranty of any
kind,either expressed or implied,including but not limited to the
implied warranties of merchantability and/or fitness for a particular
purpose.
Copyright(c)2000-2001 Microsoft Corporation
Module Name:
   efiuga.c
Abstract:
   This is an implementation of EFI-UGA binding code.
Author:
   Michael Maciesowicz(mmacie)24-July-2001
Environment:
   Firmware boot-time and OS kernel mode run-time.
Notes:
Revision History:
--*/
#include ″efiuga.h″
EFI_STATUS
EFIAPI
EfiUgaDriverEntryPoint(
   IN EFI_HANDLE ImageHandle,
   IN EFI_SYSTEM_TABLE *SystemTable
   )
/*++
Routine Description:
   This is a main entry point to EFI driver.
Arguments:
   ImageHandle-Specifies driver′s image handle.
   SystemTable-Specifies EFI system data table.
Return Value:
   EFI status code.
--*/
{
   EFI_STATUS Status;
   static EFI_DRIVER_BINDING_PROTOCOL EfiUgaDriverBinding=
   {

    EfiUgaControllerDriverSupported,

    EfiUgaControllerDriverStart,

    EfiUgaControllerDriverStop,

    1
   };
   //
   //Initialize the EFI Library.
   //
   EfiInitializeDriverLib(ImageHandle,SystemTable);
   //
   //Attach the Driver Binding Protocol to the driver′s ImaGe Handle.
   //
   Status=gBS->InstallProtocolInterface(
        <!-- SIPO <DP n="110"> -->
        <dp n="d110"/>
    &ImageHandle,

    &gEfiDriverBindingProtocolGuid,

    EFI_NATIVE_INTERFACE,

    &EfiUgaDriverBinding);
   return Status;
}
EFI_STATUS
EFIAPI
EfiUgaControllerDriverSupported(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE_Controller,
   IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
   )
/*++
Routine Description:
   This routine checks compatiblity between EFI driver image and
   hardware.This a required entry point for EFI driver.
Arguments:
   This-Specifies EFI driver binding protocol,
   Controller-Specifies PCI controller.
   RemainingDevicePath-Specifies additional EFI device path.
Return Value:
   EFI status code.
--*/
{
   EFI_STATUS EfiStatus; 
   EFI_PCI_IO_PROTOCOL *PciIo;
   UINT16 VendorId;
   UINT16 DeviceId;
   UINT16 SubvendorId;
   UINT16 SubdeviceId;
   UINT8 DeviceRevision;
   //
   //Open PCI IO protocol.
   //
   PciIo=NULL;
   EfiStatus=gBS->OpenProtocol(

    Controller,

    &gEfiPciIoProtocolGuid,

    &PciIo,

    gMyImageHandle,              //Global set by DriverLib

    Controller,

    EFI_OPEN_PROTOCOL_BY_DRIVER);
   //
   //Read vendor ID from the PCI configuration header.
   //
   if(!EFI_ERROR(EfiStatus))
   {

   EfiStatus=PciIo->Pci. Read(

      PciIo,

      EfiPciIoWidthUint16,

      0x0,

      1,

      &VendorId);
   }
   //
   //Read device ID from the PCI configuration header.
   //
   if(!EFI_ERROR(EfiStatus))
        <!-- SIPO <DP n="111"> -->
        <dp n="d111"/>
   EfiStatus=PciIo->Pci.Read(

    PciIo,

    EfiPciIoWidthUint16,

    0x2,

    1,

    &DeviceId);
}
//
//Read subvendor ID from the PCI configuration header.
//
if (!EFI_ERROR(EfiStatus))
{
   EfiStatus=PciIo->Pci.Read(

    PciIo,

    EfiPciIoWidthUint16,

    0x2c,

    1,

    &SubvendorId);
}
//
//Read subdevice ID from the PCI configuration header.
//
if(!EFI_ERROR(EfiStatus))
{
   EfiStatus=PciIo->Pci.Read( 

    PciIo,

    EfiPciIoWidthUint16,

    0x2e,

    1,

    &SubdeviceId
}
//
//Read device revision from the PCI configuration header.
//
if(!EFI_ERROR(EfiStatus))
{
  EfiStatus=PciIo->Pci.Read(

   PciIo,

   EfiPciIoWidthUint8,

   0x8,

   1,

   &DeviceRevision);
}
//
//Verify against driver’s data.
//
if(!EFI_ERROR(EfiStatus))
{
  if((VendorId==g_ui16UgaFwPciVendorId)&&

  (DeviceId==g_ui16UgaFwPciDeviceId)&&

  (SubvendorId==g_ui16UgaFwPciSubvendorId)&&

  (SubdeviceId==g_ui16UgaFwPciSubdeviceId)&&

  (DeviceRevision==g_ui8UgaFwPciDeviceRevision))
  {

  EfiStatus=EFI_SUCCESS;
  }
  else
  {

  EfiStatus=EFI_UNSUPPORTED;
  }
}
//
//Close PCI IO protocol.
//
if(PciIo)
{

  gBS->CloseProtocol(

      Controller,
        <!-- SIPO <DP n="112"> -->
        <dp n="d112"/>
       &gEfiPciIoProtocolGuid,

       gMyImageHandle,

       Controller);

    PciIo=NULL;
   }
   return EfiStatus;
}
EFI_STATUS
EFIAPI
EfiUgaControllerDriverStart(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE Controller,
   IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
   )
/*++
Routine Description:
   This routine starts EFI driver. This a required entry point for EFI driver.
Arguments:
   This-Specifies EFI driver binding protocol.
   Controller-Specifies PCI controller.
   RemainingDevicePath-Specifies additional EFI device path.
Return Value:
   EFI status code.
--*/
{
   EFI_STATUS EfiStatus;
   EFI_UGA_IO_PROTOCOL_CONTEXT *UgaIoContext=NULL;
   //
   //Allocate UGA IO protocol context.
   //
   EfiStatus=gBS->AllocatePool(

    EfiBootServicesData,

    sizeof(EFI_UGA_IO_PROTOCOL_CONTEXT),

    &UgaIoContext);
   //
   //Publish UGA IO protocol.
   //
   if(!EFI ERROR(EfiStatus))   
   {

   //

   //BUGBUG:Intel-MS sync pending(DispatchService definition).

   //

   UgaIoContext->Protocol.CreateDevice=EfiUgaCreateDevice;

   UgaIoContext->Protocol.DeleteDevice=EfiUgaDeleteDevice;

   UgaIoContext->Protocol.DispatchService=UgaFwDispatchService;

   UgaIoContext->Controller=Controller;

   EfiStatus=gBS->InstallMultipleProtocolInterfaces( 

      Controller,

      &gEfiUgaIoProtocolGuid,

      &(UgaIoContext->Protocol),

      NULL);
   }
   //
   //Clean-up if anything failed.
   //
   if(EFI_ERROR(EfiStatus))
   {
        <!-- SIPO <DP n="113"> -->
        <dp n="d113"/>
     if(UgaIoContext)

     {

        gBS->FreePool(UgaIoContext);

        UgaIoContext=NULL;

     }
   }
   return EfiStatus;
}
EFI_STATUS
EFIAPI
EfiUgaControllerDriverStop(
   IN EFI_DRIVER_BINDING_PROTOCOL *This,
   IN EFI_HANDLE Controller,
   IN UINTN NumberOfChildren,
   IN EFI_HANDLE *ChildHandleBuffer
   )
/*++
Routine Description:
   This routine stops EFI driver.This a required entry point for EFI driver.
Arguments:
   This-Specifies EFI driver binding protocol.
   Controller-Specifies PCI controller.
   NumberOfChildren-Specifies number of child devices of PCI controller.
   ChildHandleBuffer-Specifies list of child device handles of PCI controller.
Return Value:
   EFI status code.
--*/
{
   EFI_STATUS EfiStatus;
   EFI_UGA_IO_PROTOCOL *UgaIo;
   EFI_UGA_IO_PROTOCOL_CONTEXT *UgaIoContext;
   //
   //Open UGA IO protocol.
   //
   EfiStatus=gBS->OpenProtocol(

    Controller,

    &gEfiUgaIoProtocolGuid,

    &UgaIo,

    gMyImageHandle,

    Controller,

    EFI_OPEN_PROTOCOL_GET_PROTOCOL);
   //
   //Remove UGA IO protocol from the system.
   //
   if(!EFI_ERROR(EfiStatus))
   {

   //

   //Get UGA IO protocol context.

   //

   UgaIoContext=EFI_UGA_IO_PROTOCOL_CR(UgaIo);

   //

   //Close UGA IO protocol.

   //

   gBS->CloseProtocol(

      Controller,

      &gEfiUgaIoProtocolGuid,

      gMyImageHandle,

      Controller);
        <!-- SIPO <DP n="114"> -->
        <dp n="d114"/>
   //

   //Uninstall UGA IO protocol.

   //

   EfiStatus=gBS->UninstallMultipleProtocolInterfaces(

      Controller,

      &gEfiUgaIoProtocolGuid,

      &(UgaIoContext->Protocol),

      NULL);
   }
   //
   //Free UGA IO protocol context.
   //
   if(!EFI_ERROR(EfiStatus))
   {

    gBS->FreePool(UgaIoContext);
   }
   return EfiStatus;
}
//
//BUGBUG:Intel-MS sync pending(RunTimeContext).
//
EFI_STATUS
EFIAPI
EfiUgaCreateDevice(
   IN EFI_UGA_IO_PROTOCOL *This,
   IN UGA_DEVICE *ParentDevice,
   IN UGA_DEVICE_DATA *DeviceData,
   IN VOID *RunTimeContext,
   OUT UGA_DEVICE **Device
   )
/*++
Routine Description:
   This routine creates and initializes UGA device object.
Arguments:
   This-Specifies UGA IO protocol.
   ParentDevice-Specifies UGA parent device. NULL inticates root of the

    enumeration-UGA device object for UgaDtParentBus will be created.
   DeviceData-Specifies UGA device data.
   RunTimeContext-Specifies run-time environment specific context.
   Device-Specifies storage for pointer to created UGA device.
Return Value:
   EFI status code.
--*/
}
   EFI_UGA_IO_PROTOCOL_CONTEXT *UgaIoContext;
   EFI_STATUS EfiStatus=EFI_SUCCESS;
   EFI_PCI_IO_PROTOCOL *PciIo=NULL;
   UGA_DEVICE *NewDevice=NULL;
   VOID *DeviceContext=NULL;
   VOID *SharedContext=NULL;
   ASSERT(This!=NULL);
   ASSERT(DeviceData!=NULL);
   ASSERT(Device!=NULL);
   //
   //Get UGA IO protocol context.
   //
        <!-- SIPO <DP n="115"> -->
        <dp n="d115"/>
UgaIoContext=EFI_UGA_IO_PROTOCOL_CR(This);
//
//Check if root of enumeration.
//
if(ParentDevice==NULL)
{
   //
   //Root device-open PCI IO protocol and fill in default device data.
   //
   EfiStatus=gBS->OpenProtocol(

    UgaIoContext->Controller,

    &gEfiPciIoProtocolGuid,

    &PciIo,

    gMyImageHandle,

    UgaIoContext->Controller,

    EFI_OPEN_PROTOCOL_BY_DRIVER);
   if(!EFI_ERROR(EfiStatus))
   {

    DeviceData->deviceType=UgaDtParentBus;

    DeviceData->deviceId=0;

    DeviceData->ui32SharedContextSize=0;

    DeviceData->ui32DeviceContextSize=0;
   }
}
else
{

    PciIo=(EFI_PCI_IO_PROTOCOL *) (ParentDevice->pvBusIoServices);
}
//
//Allocate context data for UGA device.
//
if(!EFI_ERROR(EfiStatus))
{
  EfiStatus=gBS->AllocatePool(

   EfiBootServicesData,

   sizeof(UGA_DEVICE),

   &NewDevice);
}
if(!EFI_ERROR(EfiStatus))
{
  if(DeviceData->ui32DeviceContextSize)
  {

  EfiStatus=gBS->AllocatePool(

     EfiBootServicesData,

     DeviceData->ui32DeviceContextSize,

     &DeviceContext);
  }
  else
  {

     DeviceContext=NULL;
  }
}
if(!EFI_ERROR(EfiStatus))
{
   if(DeviceData->ui32SharedContextSize
   {

    EfiStatus=gBS->AllocatePool(

       EfiBootServicesData,

       DeviceData->ui32SharedContextSize,

       &SharedContext);
   }
   else if(ParentDevice)
   {

    SharedContext=ParentDevice->pvSharedContext;

  }

  else

  {

     SharedContext=NULL;

   }
}
        <!-- SIPO <DP n="116"> -->
        <dp n="d116"/>
   //
   //Set up device context record.
   //
   if(!EFI_ERROR(EfiStatus))
   {

   NewDevice->pvDeviceContext=DeviceContext;

   NewDevice->pvSharedContext=SharedContext;

   NewDevice->pvRunTimeContext=RunTimeContext;

   NewDevice->pParentDevice=ParentDevice;

   NewDevice->pvBusIoServices=PciIo;

   NewDevice->pvStdIoServices=gBS;

   gBS->CopyMem(&(NewDevice->deviceData),DeviceData,sizeof(UGA_DEVICE_DATA));
   }
   //
   //Clean-up if anything failed.
   //
   if(EFI_ERROR(EfiStatus))
   {

   if((ParentDevice==NULL)&& PciIo)

   {

     gBS->CloseProtocol(

        UgaIoContext->Controller,

        &gEfiPciIoProtocolGuid,

        gMyImageHandle,

        UgaIoContext->Controller);

     PciIo=NULL;

   }

   if(DeviceData->ui32SharedContextSize && SharedContext)

   {

     gBS->FreePool(SharedContext);

     SharedContext=NULL;

   }

   if(DeviceContext)

   {

      gBS->FreePool(DeviceContext);

      DeviceContext=NULL;

    }

    if(NewDevice)

    {

       gBS->FreePool(NewDevice);

       NewDevice=NULL;

     }
   }
   *Device=NewDevice;
   return EfiStatus;
}
EFI_STATUS
EFIAPI
EfiUgaDeleteDevice(
   IN EFI_UGA_IO_PROTOCOL *This,
   IN UGA_DEVICE *Device   
   )
/*++
Routine Description:
   This routine deletes UGA device object.
Arguments:
   This-Specifies UGA IO protocol.
   Device-Specifies UGA device object to delete.
Return Value:
   EFI status code.
        <!-- SIPO <DP n="117"> -->
        <dp n="d117"/>
--*/
{

    EFI_UGA_IO_PROTOCOL_CONTEXT *UgaIoContext;

    ASSERT(This!= NULL);

    ASSERT(Device!= NULL);

    UgaIoContext=EFI_UGA_IO_PROTOCOL_CR(This);

    //

    //Check if root device.

    //

    if(Device->pParentDevice==NULL)

    {

      //

      //Root device-close PCI IO protocol.

      //

      gBS->CloseProtocol(

         UgaIoContext->Controller,

         &gEfiPciIoProtocolGuid,

         gMyImageHandle,

         UgaIoContext->Controller);

    }

    //

    //Free context data.

    //

    //Note:Shared context was only allocated for UGA devices with

    //non-zero deviceData.ui64SharedContextSize.

    //

    if(Device->deviceData.ui32SharedContextSize)

    {

      gBS->FreePool(Device->pvSharedContext);

    }

    if(Device->pvDeviceContext)

    {

      gBS->FreePool(Device->pvDeviceContext);

    }

   gBS->FreePool(Device};

   /*++

   return EFI_SUCCESS;

   }
2.2 UGA固件接口实现实例
This code and information is provided ″as is″ without warranty of any
kind,either expressed or implied,including but not limited to the
implied warranties of merchantability and/or fitness for a particular
purpose.
Copyright(c)2000-2001 Microsoft Corporation
Module Name:
   dispatch.c
Abstract:
   This is the UGA firmware driver implementation template.
   This module contains dispatch routines for UGA services.
   This template assumes following sample logical layout of
   UGA adapter:
Figure A0215616901231
Author:
   Michael Maciesowicz(mmacie)30-October-2000
Environment:
   Firmware boot-time and OS kernel mode run-time.
Notes:
Revision History:
--*/
#include″ugafw.h″
UGA_STATUS
UGA_FW_CALL_TYPE_API
UgaFwDispatchService(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
   )
/*++
Routine Description:
   This is a main UGA firmware service dispatch routine.
   This is a required method.
Arguments:
   pDevice  -Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
Return Value:
   UGA status code.
--*/
{
        <!-- SIPO <DP n="119"> -->
        <dp n="d119"/>
    UGA_STATUS ugaStatus;

    UGA_DEVICE_TYPE ugaDeviceType;

    static PUGA_FW_SERVICE apUgaFwService[]=

    {

       UgaFwDispatchService_UgaDtParentBus,

       UgaFwDispatchService_UgaDtGraphicsController,

       UgaFwDispatchService_UgaDtOutputController,

       UgaFwDispatchService_UgaDtOutputPort,

       UgaFwDispatchService_UgaDtOther

    };

    ASSERT(NULL!=pDevice);

    ASSERT(NULL!=pIoRequest);

    //

    //Get device type associated with passed UGA_DEVICE object.

    //

    ugaStatus=VmlGetDeviceType(pDevice,&ugaDeviceType)

    //

    //VmlGetDeviceType()call should never fail.

    //

    ASSERT(UGA_SUCCESS(ugaStatus));

    //

    //Dispatch service request to dispatch routine for given device type.

    //

    if((ugaDeviceType<UgaDtParentBus)||{ugaDeviceType>UgaDtOther))

    {

      ASSERT(FALSE);

      //

      //Set number of bytes returned and status code.

      //

      pIoRequest->ui64BytesReturned=0;

      ugaStatus=UGA_STATUS_INVALID_DEVICE;

    }

    else

    {

       ugaStatus=(*apUgaFwService[ugaDeviceType-1])(pDevice, pIoRequest);

    }

    return ugaStatus;
}     //UgaFwDispatchService()
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDispatchService_UgaDtParentBus(
   IN PUGA_DEVICE pDevice,
   IN OUT_PUGA_IO_REQUEST pIoRequest
   )
/*++
Routine Description:
   This is UGA firmware service dispatch routine for parent bus.
   This is a required method.
Arguments:
   pDevice-Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
Return Value:
   UGA status code.
--*/
{
   UGA_STATUS ugaStatus;
   static PUGA_FW_SERVICE apUgaFwService[]=
        <!-- SIPO <DP n="120"> -->
        <dp n="d120"/>
  { 

     Common_UgaFwGetVersion,                                       //UgaIoGetVersion

     UgaDtParentBus_UgaFwGetChildDevice,                             //UgaIoGetChildDevice

     NULL,                                                    //UgaIoStartDevice

     NULL,                                                    //UgaIoStopDevice

     NULL,                                                    //UgaIoFlushDevice

     NULL,                                                    //UgaIoResetDevice

     NULL,                                                    //UgaIoGetDeviceState

     NULL,                                                    //UgaIoSetDeviceState

     NULL,                                                    //UgaIoSetPowerState

     NULL,                                                    //UgaIoGetMemoryConfiguration

     NULL,                                                    //UgaIoSetVideoMode

     NULL,                                                    //UgaIoCopyRectangle

     NULL,                                                    //UgaIoGetEdidSegment

     NULL,                                                    //UgaIoDeviceChannelOpen

     NULL,                                                    //UgaIoDeviceChannelClose

     NULL,                                                    //UgaIoDeviceChannelRead

     NULL,                                                    //UgaIoDeviceChannelWrite

     NULL,                                                    //UgaIoGetPersistentDataSize

     NULL,                                                    //UgaIoGetPersistentData

     NULL,                                                    //UgaIoSetPersistentData

     NULL,                                                    //UgaIoGetDevicePropertySize

     NULL,                                                    //UgaIoGetDeviceProperty

     NULL                                                      //UgaIoBtPrivateInterface

  };

  ASSERT(NULL!=pDevice);

  ASSERT(NULL!=pIoRequest);

  //

  //Dispatch service request.

  //

  ugaStatus=UgaFwDispatchDeviceService(pDevice,pIoRequest,apUgaFwService);

  return ugaStatus;
}   //UgaFwDispatchService_UgaDtParentBus()
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDispatchService_UgaDtGraphicsController(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
   )
/*++
Routine Description:
   This is UGA firmware service dispatch routine for graphics controller.
   This is a required method.
Arguments:
   pDevice-Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
Return Value:
   UGA status code.
--*/
{
   UGA_STATUS ugaStatus;
   static PUGA_FW_SERVICE apUgaFwService[]=
   {

    Common_UgaFwGetVersion,                                     //UgaIoGetVersion

    UgaDtGraphicsController_UgaFwGetChildDevice,                   //UgaIoGetChildDevice

    UgaDtGraphicsController_UgaFwStartDevice,                      //UgaIoStartDevice

    UgaDtGraphicsController_UgaFwStopDevice,                       //UgaIoStopDevice

    UgaDtGraphicsController_UgaFwFlushDevice,                      //UgaIoFlushDevice

    UgaDtGraphicsController_UgaFwResetDevice,                      //UgaIoResetDevice

    UgaDtGraphicsController_UgaFwGetDeviceState,                   //UgaIoGetDeviceState

    UgaDtGraphicsController_UgaFwSetDeviceState,                   //UgaIoSetDeviceState

    UgaDtGraphicsController_UgaFwSetPowerState,                    //UgaIoSetPowerState

    UgaDtGraphicsController_UgaFwGetMemoryConfiguration,           //UgaIoGetMemoryConfiguration
        <!-- SIPO <DP n="121"> -->
        <dp n="d121"/>
           NULL,                                                       //UgaIoSetVideoMode

           NULL,                                                       //UgaIoCopyRectangle

           NULL,                                                       //UgaIoGetEdidsegment

           UgaDtGraphicsController_UgaFwDeviceChannelOpen,                    //UgaIoDeviceChannelOpen

           UgaDtGraphicsController_UgaFwDeviceChannelClose,                   //UgaIoDeviceChannelClose

           UgaDtGraphicsController_UgaFwDeviceChannelRead,                    //UgaIoDeviceChannelRead

           UgaDtGraphicsController_UgaFwDeviceChannelWrite,                   //UgaIoDeviceChannelWrite

           UgaDtGraphicsController_UgaFwGetPersistentDataSize,                //UgaIoGetPersistentDataSize

           UgaDtGraphicsController_UgaFwGetPersistentData,                    //UgaIoGetPersistentData

           UgaDtGraphicsController_UgaFwSetPersistentData,                    //UgaIoSetPersistentData

           UgaDtGraphicsController_UgaFwGetDevicePropertySize,                //UgaIoGetDevicePropertySize

           UgaDtGraphicsController_UgaFwGetDeviceProperty,                    //UgaIoGetDeviceProperty

           UgaDtGraphicsController_UgaFwBtPrivateInterface                     //UgaIoBtPrivateInterface

  };

  ASSERT(NULL!=pDevice);

  ASSERT(NULL!=pIoRequest);

  //

  //Dispatch service request.

  //

  ugaStatus=UgaFwDispatchDeviceService(pDevice,pIoRequest,apUgaFwService);

  return ugaStatus;
}   //UgaFwDispatchService_UgaDtGraphicsController()
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDispatchService_UgaDtOutputController(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
   )
/*++
Routine Description:
   This is UGA firmware service dispatch routine for output controller.
   This is a required method.
Arguments:
   pDevice-Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
Return Value:
   UGA status code.
--*/
{
   UGA_STATUS ugaStatus;
   static PUGA_FW_SERVICE apUgaFwService[]=
   {

     Common_UgaFwGetVersion,                                     //UgaIoGetVersion

     UgaDtOutputController_UgaFwGetChildDevice,                    //UgaIoGetChildDevice

     UgaDtOutputController_UgaFwStartDevice,                       //UgaIoStartDevice

     UgaDtOutputController_UgaFwStopDevice,                        //UgaIoStopDevice

     UgaDtOutputController_UgaFwFlushDevice,                       //UgaIoFlushDevice

     UgaDtOutputController_UgaFwResetDevice,                       //UgaIoResetDevice

     UgaDtOutputController_UgaFwGetDeviceState,                    //UgaIoGetDeviceState

     UgaDtOutputController_UgaFwSetDeviceState,                    //UgaIoSetDeviceState

     UgaDtOutputController_UgaFwSetPowerState,                     //UgaIoSetPowerState

     UgaDtOutputController_UgaFwGetMemoryConfiguration,            //UgaIoGetMemoryConfiguration

     UgaDtOutputController_UgaFwSetvideoMode,                      //UgaIoSetVideoMode

     UgaDtOutputController_UgaFwCopyRectangle,                     //UgaIoCopyRectangle

     UgaDtOutputController_UgaFwGetEdidSegment,                    //UgaIoGetEdidSegment

     UgaDtOutputController_UgaFwDeviceChannelOpen,                 //UgaIoDeviceChannelOpen

     UgaDtOutputController_UgaFwDeviceChannelClose,                //UgaIoDeviceChannelClose

     UgaDtOutputController_UgaFwDeviceChannelRead,                 //UgaIoDeviceCharnelRead

     UgaDtOutputController_UgaFwDeviceChannelWrite,                //UgaIoDeviceChannelWrite

     UgaDtOutputController_UgaFwGetPersistentDataSize,             //UgaIoGetPersistentDataSize

     UgaDtOutputController_UgaFwGetPersistentData,                 //UgaIoGetPersistentData

     UgaDtOutputController_UgaFwSetPersistentData,                 //UgaIoSetPersistentData

     UgaDtOutputController_UgaFwGetDevicePropertySize,             //UgaIoGetDevicePropertySize
        <!-- SIPO <DP n="122"> -->
        <dp n="d122"/>
           UgaDtOutputController_UgaFwGetDeviceProperty,           //UgaIoGetDeviceProperty

           UgaDtOutputController_UgaFwBtPrivateInterface            //UgaIoBtPrivateInterface

  };

    ASSERT(NULL !=pDevice);

    ASSERT(NULL !=pIoRequest);

    //

    //Dispatch service request.

    //

    ugaStatus=UgaFwDispatchDeviceService(pDevice,pIoRequest,apUgaFwService);

    return ugaStatus;
}     //UgaFwDispatchService_UgaDtOutputController()
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDispatchService_UgaDtOutputPort(

    IN PUGA_DEVICE pDevice,

    IN OUT PUGA_IO_REQUEST pIoRequest

    )
/*++
Routine Description:

    This is UGA firmware service dispatch routine for output port.

    This is a required method.
Arguments:

    pDevice  -Specifies a device object associated with an enumerated UGA device.

    pIoRequest-Points to UGA IO request packet.
Return Value:

    UGA status code.
--*/
{   

    UGA_STATUS ugaStatus;

    static PUGA_FW_SERVICE apUgaFwService[]=

    {

           Common_UgaFwGetVersion,                                 //UgaIoGetVersion

           UgaDtOutputPort_UgaFwGetChildDevice                      //UgaIoGetChildDevice

           UgaDtOutputPort_UgaFwStartDevice,                       //UgaIoStartDevice

           UgaDtOutputPort_UgaFwStopDevice,                        //UgaIoStopDevice

           UgaDtOutputPort_UgaFwFlushDevice,                       //UgaIoFlushDevice

           UgaDtOutputPort_UgaFwResetDevice,                       //UgaIoResetDevice

           UgaDtOutputPort_UgaFwGetDeviceState,                    //UgaIoGetDeviceState

           UgaDtOutputPort_UgaFwSetDeviceState,                    //UgaIoSetDeviceState

           UgaDtOutputPort_UgaFwSetPowerState,                     //UgaIoSetPowerState

           NULL,                                               //UgaIoGetMemoryConfiguration

           NULL,                                               //UgaIoSetVideoMode

           NULL,                                               //UgaIoCopyRectangle

           UgaDtOutputPort_UgaFwGetEdidSegment,                   //UgaIoGetEdidSegment

           UgaDtOutputPort_UgaFwDeviceChannelOpen,                //UgaIoDeviceChannelOpen

           UgaDtOutputPort_UgaFwDeviceChannelClose,               //UgaIoDeviceChannelClose

           UgaDtOutputPort_UgaFwDeviceChannelRead,                //UgaIoDeviceChannelRead

           UgaDtOutputPort_UgaFwDeviceChannelWrite,               //UgaIoDeviceChannelWrite

           UgaDtOutputPort_UgaFwGetPersistentDataSize,            //UgaIoGetPersistentDataSize

           UgaDtOutputPort_UgaFwGetPersistentData,                //UgaIoGetPersistentData

           UgaDtOutputPort_UgaFwSetPersistentData,                //UgaIoSetPersistentData

           UgaDtOutputPort_UgaFwGetDevicePropertySize,            //UgaIoGetDevicePropertySize

           UgaDtOutputPort_UgaFwGetDeviceProperty,                //UgaIoGetDeviceProperty

           UgaDtOutputPort_UgaFwBtPrivateInterface                 //UgaIoBtPrivateInterface

  };

  ASSERT(NULL !=pDevice);

  ASSERT(NULL !=pIoRequest);

  //

  //Dispatch service request.

  //
        <!-- SIPO <DP n="123"> -->
        <dp n="d123"/>
  ugaStatus=UgaFwDispatchDeviceService(pDevice,pIoRequest,apUgaFwService);

  return ugaStatus;
}   //UgaFwDispatchService_UgaDtOutputPort()
UGA_STATUS
UGA_FW_CALL_TYPE_SERVICE
UgaFwDispatchService_UgaDtOther(
   IN PUGA_DEVICE pDevice,
   IN OUT PUGA_IO_REQUEST pIoRequest
   )
/*++
Routine Description:
   This is UGA firmware service dispatch routine for other device.
   This is an optional method.
Arguments:
   pDevice  -Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
Return Value:
   UGA status code.
--*/
{
   UGA_STATUS ugaStatus;
   static PUGA_FW_SERVICE apUgaFwService[]=
   {

           Common_UgaFwGetVersion,                                   //UgaIoGetVersion

           UgaDtOther_UgaFwGetChildDevice,                            //UgaIoGetChildDevice

           UgaDtOther_UgaFwStartDevice,                               //UgaIoStartDevice

           UgaDtOther_UgaFwStopDevice,                                //UgaIoStopDevice

           UgaDtOther_UgaFwFlushDevice,                               //UgaIoFlushDevice

           UgaDtOther_UgaFwResetDevice,                               //UgaIoResetDevice

           UgaDtOther_UgaFwGetDeviceState,                            //UgaIoGetDeviceState

           UgaDtOther_UgaFwSetDeviceState,                            //UgaIoSetDeviceState

           UgaDtOther_UgaFwSetPowerState,                             //UgaIoSetPowerState

           NULL,                                                   //UgaIoGetMemoryConfiguration

           NULL,                                                   //UgaIoSetVideoMode

           NULL,                                                   //UgaIoCopyRectangle

           NULL,                                                   //UgaIoGetEdidSegment

           UgaDtOther_UgaFwDeviceChannelOpen,                      //UgaIoDeviceChannelOpen

           UgaDtOther_UgaFwDeviceChannelClose,                     //UgaIoDeviceChannelClose

           UgaDtOther_UgaFwDeviceChannelRead,                      //UgaIoDeviceChannelRead

           UgaDtOther_UgaFwDeviceChannelwrite,                     //UgaIoDeviceChannelWrite

           UgaDtOther_UgaFwGetPersistentDataSize,                  //UgaIoGetPersistentDataSize

           UgaDtOther_UgaFwGetPersistentData,                      //UgaIoGetPersistentData

           UgaDtOther_UgaFwSetPersistentData,                      //UgaIoSetPersistentData

           UgaDtOther_UgaFwGetDevicePropertySize,                  //UgaIoGetDevicePropertySize

           UgaDtOther_UgaFwGetDeviceProperty,                      //UgaIoGetDeviceProperty

           UgaDtOther_UgaFwBtPrivateInterface                       //UgaIoBtPrivateInterface

  };

    ASSERT(NULL !=pDevice);

    ASSERT(NULL !=pIoRequest);

    //

    //Dispatch service request.

    //

    ugaStatus=UgaFwDispatchDeviceService(pDevice,pIoRequest,apUgaFwService);

    return ugaStatus;
}     //UgaFwDispatchService_UgaDtOther()
UGA_STATUS
UgaFwDispatchDeviceService(

    IN PUGA_DEVICE pDevice,

    IN OUT PUGA_IO_REQUEST pIoRequest,

    IN PUGA_FW_SERVICE *ppUgaFwService

    )
        <!-- SIPO <DP n="124"> -->
        <dp n="d124"/>
/*++
Routine Description:
   This is UGA firmware service dispatch routine for passed in device type specific
   dispatch table.
   This is an optional method.
Arguments:
   pDevice   -Specifies a device object associated with an enumerated UGA device.
   pIoRequest-Points to UGA IO request packet.
   ppUgaFwService-Points od array of pointers to device type specific UGA services.
Return Value:
   UGA status code.
--*/
{
   UGA_STATUS ugaStatus;
   ASSERT(NULL!=pDevice);
   ASSERT(NULL!=pIoRequest);
   ASSERT(NULL!=ppUgaFwService);
   //
   //Dispatch device type specific service request.
   //
   if(pIoRequest->ioRequestCode<UgaIoGetVersion)
   {

   ASSERT(FALSE);

   //
   //Set number of bytes returned and status code.

   //

   pIoRequest->ui64BytesReturned=0;

   ugaStatus=UGA_STATUS_INVALID_FUNCTION;
   }
   else if(pIoRequest->ioRequestCode>UgaIoBtPrivateInterface)
   {

    //

    //Set number of bytes returned and status code.

    //

    pIoRequest->ui64BytesReturned=0;

    ugaStatus=UGA_STATUS_UNSUPPORTED;
   }
   else if(NULL==ppUgaFwService[pIoRequest->ioRequestCode-1])
   {

     //

     //Set number of bytes returned and status code.

     //

     pIoRequest->ui64BytesReturned=0;

     ugaStatus=UGA_STATUS_UNSUPPORTED;
   }
   else
   {

     ugaStatus=(*ppUgaFwService[pIoRequest->ioRequestCode-1])(pDevice,pIoRequest);
   }
   return ugaStatus;

   }    //UgaFwDispatchDeviceService()

Claims (30)

1.一种通用图形适配器(UGA)系统,包括:
与UGA硬件接口的UGA虚拟机;以及
UGA硬件抽象层(UGA HAL),它通过UGA虚拟机接收有关UGA硬件的信息,UGA HAL把UGA硬件的细节抽象为接口。
2.按权利要求1所述的系统,其特征在于UGA虚拟机以固件实现。
3.按权利要求1所述的系统,其特征在于UGA虚拟机存储在与UGA相关的芯片上。
4.按权利要求1所述的系统,其特征在于UGA HAL实现抽象方法以通过寄存器接口与VGA硬件交互动作。
5.按权利要求1所述的系统,其特征在于进一步包括定义设备要进行的一组服务的UGA固件接口。
6.按权利要求5所述的系统,其特征在于一组服务包括功率调节。
7.按权利要求5所述的系统,其特征在于一组服务包括设备描述。
8.按权利要求5所述的系统,其特征在于一组服务包括数据通信。
9.按权利要求1所述的系统,其特征在于进一步包括与UGA HAL交互动作的UGA核心服务。
10.一种调度I/O服务请求的方法,包括:
从通用图形适配器(UGA)客户机接收抽象的环境;以及
通过UGA固件接口调度抽象的环境。
11.按权利要求10所述的方法,其特征在于进一步包括确定环境是否有效。
12.按权利要求10所述的方法,其特征在于进一步包括确定I/O服务请求是否有效。
13.按权利要求11所述的方法,其特征在于进一步包括如果环境无效就产生状态代码。
14.按权利要求12所述的方法,其特征在于进一步包括如果I/O服务请求无效就产生状态代码。
15.按权利要求10所述的方法,其特征在于进一步包括UGA硬件是否可用于抽象的UGA服务。
16.按权利要求15所述的方法,其特征在于进一步包括通过模拟处理抽象的UGA服务以与可用的视频图形适配器(VGA)硬件交互动作。
17.按权利要求15所述的方法,其特征在于进一步包括把服务调度到通过UGA固件接口的下一最低级。
18.按权利要求17所述的方法,其特征在于进一步包括通过UGA固件接口的下一最低级迭代直到调用服务例程。
19.一种协商输出范围的方法,包括:
创建初始值;
通过读取设备确定设备的初始范围;
判断设备是否读取第一设备,如果判断为是,则判断数据是否成功读取,且如果判断为是,则把输出范围设定为初始范围读取。
20.按权利要求19所述的方法,其特征在于进一步包括如果数据读取不成功就发出致命出错。
21.按权利要求19所述的方法,其特征在于进一步包括如果设备的读取没有成功就识别下一潜在设备。
22.按权利要求21所述的方法,其特征在于进一步包括创建环境以便于从下一设备读取描述数据。
23.按权利要求19所述的方法,其特征在于如果设备不是第一读取设备但是读取成功就在先前确定范围和当前读取范围之间进行相交。
24.按权利要求19所述的方法,其特征在于进一步包括确定是否有要从中读取描述数据的另一设备。
25.一种计算设备的方法,包括:
获取与初始设备相关的数据并创建环境以便于与设备互动;
使用环境开启初始设备;
确定是否可以开启设备,如果不能就把环境设为父环境;以及
如果可以开启初始设备就获取与子设备相关的数据。
26.按权利要求26所述的方法,其特征在于进行递归地应用以计算多个设备。
27.一种使用权利要求25方法的通用图形适配器(UGA)以支持多个视频子设备。
28.一种通用图形适配器(UGA)系统,包括:
与硬件接口的装置;以及
通过固件以标准方式封装和抽象硬件细节的装置。
29.按权利要求28所述的系统,其特征在于进一步包括更新系统支持新的硬件的装置。
30.按权利要求28所述的系统,其特征在于进一步包括与视频图形适配器(VGA)硬件交互动作的装置。
CNB021561699A 2001-12-13 2002-12-13 通用图形适配器以及调度i/o服务请求的方法 Expired - Fee Related CN1295595C (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US34114001P 2001-12-13 2001-12-13
US60/341,140 2001-12-13
US10/157,067 2002-05-29

Publications (2)

Publication Number Publication Date
CN1428688A true CN1428688A (zh) 2003-07-09
CN1295595C CN1295595C (zh) 2007-01-17

Family

ID=23336389

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB021561699A Expired - Fee Related CN1295595C (zh) 2001-12-13 2002-12-13 通用图形适配器以及调度i/o服务请求的方法

Country Status (1)

Country Link
CN (1) CN1295595C (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113535266A (zh) * 2021-07-15 2021-10-22 上海高仙自动化科技发展有限公司 硬件设备适配方法、装置、芯片及电子设备

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5481754A (en) * 1990-05-18 1996-01-02 International Business Machines Corporation Apparatus and method for bios interface to features in multiple adapter cards in one operation using registers with bits distributed across the adapter cards
JP2760731B2 (ja) * 1992-04-30 1998-06-04 株式会社東芝 グラフィックス互換性を可能にする高性能グラフィックスアダプタ用外部インターフェース回路
KR100265934B1 (ko) * 1997-04-18 2000-09-15 윤종용 컴퓨터의 비디오 바이오스 체크 장치 및 체크방법

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113535266A (zh) * 2021-07-15 2021-10-22 上海高仙自动化科技发展有限公司 硬件设备适配方法、装置、芯片及电子设备
CN113535266B (zh) * 2021-07-15 2023-03-14 上海高仙自动化科技发展有限公司 硬件设备适配方法、装置、芯片及电子设备

Also Published As

Publication number Publication date
CN1295595C (zh) 2007-01-17

Similar Documents

Publication Publication Date Title
CN1073276A (zh) 语言的中性对象
CN1073540A (zh) 管理类方法名
CN1749958A (zh) 使用形状的公用图表
CN1048563C (zh) 用于信息处理系统的图形处理器以及外部存储系统
CN1728685A (zh) 促进可分页模式虚拟环境中的数据传输的方法和系统
CN1163837C (zh) 网络访问管理系统和方法
CN1669018A (zh) 手持终端框架系统
CN1702634A (zh) 便利无环境主机干预下的可分页模式虚拟环境存储管理
CN1795453A (zh) 实时墨迹作图
CN1744036A (zh) 报告软件中支持定制图形表示的系统和方法
CN1922576A (zh) 操作系统
CN1076378A (zh) 用于电视游戏系统等具有可编程图形处理器的外部存储系统
CN1768275A (zh) 测试摸拟装置、测试模组模拟装置以及记录此程式的记录媒体
CN1609794A (zh) 用于计算机平台的编程接口
CN1833240A (zh) 维护包内部件之间的关系的方法和装置
CN1804835A (zh) 多级设备性能分层结构
CN101052949A (zh) 操作系统
CN1679026A (zh) Web服务设备和方法
CN1524216A (zh) 软件构件插件程序结构的系统和方法
CN1875345A (zh) 在编译过程中表示和检查程序组件的一致性的可扩展类型系统
CN1296811C (zh) 信息处理装置及其控制方法和控制装置
CN1869923A (zh) 系统数据接口及相关体系结构
CN1761956A (zh) 基于片段的串行化系统与方法
CN1781089A (zh) 构建包含预编页码文档的包的方法和系统
CN100342691C (zh) 多模式对话处理方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20070117

Termination date: 20141213

EXPY Termination of patent right or utility model