CN102725744B - 用于usb驱动程序接口函数的扩展的方法和系统 - Google Patents
用于usb驱动程序接口函数的扩展的方法和系统 Download PDFInfo
- Publication number
- CN102725744B CN102725744B CN201180006002.6A CN201180006002A CN102725744B CN 102725744 B CN102725744 B CN 102725744B CN 201180006002 A CN201180006002 A CN 201180006002A CN 102725744 B CN102725744 B CN 102725744B
- Authority
- CN
- China
- Prior art keywords
- usb
- function
- client
- driver
- usbdi
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/10—Program control for peripheral devices
- G06F13/102—Program control for peripheral devices where the programme performs an interfacing function, e.g. device driver
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44505—Configuring for program initiating, e.g. using registry, configuration files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Systems (AREA)
- Stored Programmes (AREA)
- Control Of El Displays (AREA)
Abstract
描述用于USB驱动程序接口函数的扩展。在实施例中,计算机指令和数据交换的输入/输出在USB核心驱动程序栈中进行管理。一组USB驱动程序接口被USB核心驱动程序栈暴露,并且USB驱动程序接口包括与对应于客户端USB设备的USB客户端函数驱动程序接口的USB驱动程序接口函数。用于USB驱动程序接口函数的扩展也被USB核心驱动程序栈暴露来与USB客户端函数驱动程序接口。
Description
背景技术
计算机设备通常被实现来利用USB(通用串行总线),其中USB是用于在计算机设备和/或诸如计算机鼠标、键盘、打印机、显示设备、数字摄像机等之类的外部外围设备内的数据通信或在计算机设备和/或外部外围设备之间的数据通信的通信链路。计算机设备可以具有若干USB端口,其中外围设备经由这些USB端口利用USB电缆来连接。一般,与计算机设备相集成或连接到计算机设备的外围设备具有相应组合的发现、枚举和与外围设备通信的设备驱动程序(driver),诸如以接收和/或传送数据与指令。计算机设备实现暴露API(应用程序接口)的USB核心驱动程序栈,并且用于外围设备的设备驱动程序与API接口来请求处理器操作和/或数据交换。
发明内容
提供这个发明内容部分来介绍下面在具体描述部分中进一步描述的用于USB驱动程序接口函数(function)(或接口功能)的扩展的简化概念。这个发明内容部分并不旨在标识所请求保护的主题的基本特性,也不旨在用于确定所请求保护的主题的范围。
描述用于USB驱动程序接口函数的扩展。在实施例中,计算机指令和数据交换的输入/输出在USB核心驱动程序栈(stack)中进行管理。一组USB驱动程序接口被USB核心驱动程序栈暴露,并且USB驱动程序接口包括与对应于客户端USB设备的USB客户端函数(或功能)驱动程序接口的USB驱动程序接口函数。用于USB驱动程序接口函数的扩展也被USB核心驱动程序栈暴露来与USB客户端函数驱动程序接口。在各种实施例中,用于USB驱动程序接口函数的扩展能够被实现来将USB核心驱动程序栈与遗留的、新的和未来版本的USB客户端函数驱动程序接口。
在其它的实施例中,复合设备驱动程序对于客户端USB设备的个别函数(或功能)注册它自己。USB核心驱动程序栈枚举USB客户端函数驱动程序并生成函数句柄,其中每一个函数句柄对应于客户端USB设备的个别函数。USB核心驱动程序栈能够随后利用对应于与USB客户端函数驱动程序相关联的客户端USB设备的个别函数的函数句柄来识别导致运行失败(runtime failure)的USB客户端函数驱动程序。复合设备驱动程序还能够通知USB核心驱动程序栈:复合设备驱动程序将控制暂停客户端USB设备的个别函数。
在其它实施例中,USB核心驱动程序栈能够接收来自USB客户端函数驱动程序的能力版本请求,并返回USB核心驱动程序栈支持用于USB驱动程序接口函数的扩展的指示。USB核心驱动程序栈还能够经由USB驱动程序接口函数的扩展从USB客户端函数驱动程序接收合同版本标识符。合同版本标识符指示USB客户端函数驱动程序利用来与USB核心驱动程序栈接口的一组操作规则。此外,能够实施先检查协议,其指导USB客户端函数驱动程序在经由USB驱动程序接口与USB核心驱动程序栈接口之前检查USB驱动程序接口函数的可用性。
在其它实施例中,USB核心驱动程序栈包括USB主控制器,其支持存储在几乎不连续缓冲区中的缓冲数据。此外,USB核心驱动程序栈能够向端点分配多个数据流队列用于输入/输出,并管理多个数据流队列的输入/输出。
附图说明
用于USB驱动程序接口函数的扩展的实施例参考以下附图来描述。贯穿这些附图使用相同的数字来引用相似的特性和组件:
图1示出其中能够实现用于USB驱动程序接口函数的扩展的实施例的示例系统;
图2示出根据一个或多个实施例的用于USB驱动程序接口函数的扩展的(一种或多种)示例方法;
图3示出根据一个或多个实施例的用于USB驱动程序接口函数的扩展的(一种或多种)附加的示例方法;
图4示出根据一个或多个实施例的用于USB驱动程序接口函数的扩展的(一种或多种)附加的示例方法;
图5示出根据一个或多个实施例的用于USB驱动程序接口函数的扩展的(一种或多种)附加的示例方法;
图6示出能够实现用于USB驱动程序接口函数的扩展的实施例的示例设备的各种组件。
具体实施方式
实施例规定:对于USB驱动程序接口函数的扩展能够被USB核心驱动程序栈暴露,以提供新的能力并将USB核心驱动程序栈与遗留的、新的和未来版本的USB客户端函数驱动程序接口。用于USB驱动程序接口函数的扩展提供但并不限于以下特性之中的任何一个或多个:注册和注销用于客户端USB设备的复合函数驱动程序;设置用于包括多个函数的复合函数驱动程序的USB函数句柄数据;在USB客户端函数驱动程序和USB核心驱动程序栈之间为了新的、当前的和/或遗留的兼容性而协商USB接口版本;检查USB栈能力实现,以便在利用USB驱动程序接口函数之前确定USB核心驱动程序栈的能力;支持存储在几乎不连续缓冲区中的缓冲数据;以及给端点分配多个数据流队列,其中端点提供批量端点和将与端点相关联的多个输入/输出队列。
虽然所描述的用于USB驱动程序接口函数的扩展的系统和方法的特性和概念能够在任何数量的不同的环境、系统和/或各种配置中进行实现,但是用于USB驱动程序接口函数的实施例的扩展在以下示例系统和环境的上下文中进行描述。
图1示出其中能够实现用于USB驱动程序接口函数的扩展的各种实施例的示例系统100。系统100包括代表在各种设备实现中的一个或多个USB核心驱动程序栈的USB核心驱动程序栈102(例如,也被称作USB栈)。USB核心驱动程序栈102在计算机系统中、诸如在实现示例系统100的计算机设备中管理计算机指令和数据交换的输入/输出。在这个示例中,USB核心驱动程序栈102包括各种组件,诸如主控制器驱动程序(HCD)104、USB主控制器驱动程序库106和USB集线器驱动程序108。USB主控制器驱动程序库106被实现为对于所有的USB主控制器驱动程序而言可以是常见的代码来与其余的USB核心驱动程序栈接口。此外,USB主控制器驱动程序库106也可以被称作USB主控制器类扩展(UCX)。
示例系统100还包括USB客户端函数驱动程序110和在各种实施例中包括复合设备驱动程序112。USB客户端函数驱动程序110对应于一个或多个客户端USB设备,并代表利用API来与USB核心驱动程序栈102接口以便与相应的客户端USB设备交互的各种USB函数、类和/或客户端驱动程序之中的任何一个。USB核心驱动程序栈102实现被USB核心驱动程序栈暴露给USB客户端函数驱动程序110的一组USB驱动程序接口(API)114。USB驱动程序接口114也被称为DDI(Device Driver Interface)(设备驱动程序接口)。USB核心驱动程序栈102还暴露用于USB驱动程序接口函数的扩展116,并且这些扩展被暴露来与USB客户端函数驱动程序110接口。
在各种实施例中,复合设备驱动程序112可以被实现为USB CCGP(Common Class Generic Parent)(常见类通用父),其暴露客户端USB设备的独立函数,以致每一个独立函数本身能被视为独立设备。USB客户端函数驱动程序110与每个函数相关联来在客户端USB设备上驱动对应的函数(功能)。在一些实现中,复合设备驱动程序112对于USB客户端函数驱动程序110可以是透明的,和/或输入/输出通过复合设备驱动程序来路由传送(route)。作为选择,USB客户端函数驱动程序110能够经由USB驱动程序接口114和/或经由用于USB驱动程序接口函数的扩展116直接地与USB核心驱动程序栈102接口。
在各种实施例中,用于USB驱动程序接口函数的扩展116包括但不限于扩展,以便:注册复合函数驱动程序118,诸如复合USB客户端函数驱动程序;注销复合函数驱动程序120,诸如USB客户端函数驱动程序;诸如为包括多个函数的复合USB客户端函数驱动程序110设置 USB函数句柄数据122;诸如为了在USB客户端函数驱动程序110和USB核心驱动程序栈102之间新的、当前的和/或遗留的兼容性而协商USB接口版本124;检查USB栈能力实现126,诸如以便在利用USB驱动程序接口函数之前确定USB核驱动程序栈102的能力;支持用于存储在几乎不连续缓冲区中的缓冲数据的实现128;以及分配多个数据流队列给端点130,该端点提供批量端点和将与端点相关联的多个输入/输出队列。
诸如USB核心驱动程序栈102、USB客户端函数驱动程序110、复合设备驱动程序112、USB驱动程序接口114和用于USB驱动程序接口函数的扩展116之类的示例系统100的各种组件能够被实现为计算机可执行指令,并由一个或多个处理器来执行,以实现此处描述的各种实施例和/或特性。此外,示例系统100能够利用如参考图6所示的示例设备进一步描述的任何数量和组合的不同组件来实现。
在实施例中,生成函数句柄,以致USB核心驱动程序栈102能够识别从哪个USB客户端函数驱动程序110接收到特定请求,并实施和追踪对于USB客户端函数驱动程序而言特定的行为。复合设备驱动程序112被实现来区分客户端USB设备的单独函数,以致单独的USB客户端函数驱动程序110能够与每个单独函数相关联。函数句柄给USB核心驱动程序栈102提供每一个单独的USB客户端函数驱动程序110的标识,其在实现中利用存储器中的物理设备对象(PDO)来表示。函数句柄则代表设备对象,并且信息能够与函数句柄相关联,诸如驱动程序名称。在实现中,USB核心驱动程序栈102能够识别导致运行失败或其他系统崩溃的USB客户端函数驱动程序110。
在当前实现中,用于USB device handle(USB设备句柄)的参数在特定请求沿着USB栈进行发送之前由USB集线器来分配。这在从利用USB device handle识别的同一USB驱动程序接收输入/输出请求时提供单个功能设备的标识。然而,对于复合起作用设备,USB device handle随后与复合设备驱动程序112(例如,在一些实现中的USB CCGP)相关联,并且负责特定输入/输出请求的USB客户端函数驱动程序110对于USB核心驱动程序栈而言不是可识别的。
因此,实现用于USB function handle(函数句柄)的参数,并且为每个函数或函数的表示诸如在一种实现中利用复合设备驱动程序112创建的物理设备对象(PDO)生成句柄。对于接口和/或USB驱动程序接口函数的扩展之中的任何一个而言,这种注册机制也能够实现合同、版本控制、验证和其它特性。当复合设备驱动程序112确定许多驱动程序函数时,它对于每个函数请求函数句柄。这些句柄随后能够利用USB核心驱动程序栈102来生成,并且复合设备驱动程序112能够在沿着USB栈进行传送时利用相应的函数句柄来填充(populate)对于USB客户端函数驱动程序110的每一个输入/输出请求。
用于注册复合驱动程序的USB驱动程序接口函数的扩展是IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DRIVER。这个IOCTL(例如,一般被称为用于各种不同的操作系统实现的设备输入/输出控制)在作出有关复合驱动程序的驱动程序函数的数量的确定之后利用复合设备驱动程序112(例如,USB CCGP 或等效的驱动程序)来发送。这个IOCTL定义的示例是:
USB客户端函数驱动程序110为这个IOCTL传递两个参数,一个参数用于输入,以及一个参数用于输出。输入参数是调用者分配和初始化的USB_COMPOSITE_REGISTRATION结构。输出参数是调用者分配的USBD_FUNCTION_HANDLE的数组,其大小利用USB_COMPOSITE_REGISTRATION结构的FuncionCount字段来确定。USB_COMPOSITE_REGISTRATION结构的示例是:
Version(版本)字段是结构的版本并能够用于未来可扩展性。Size(大小)字段是以字节为单位的结构USB_COMPOSITE_REGISTRATION的大小并能够用于结构版本控制。CapabilityFlags(能力标志)字段用于复合驱动程序识别其支持的能力,诸如用于CompositeCapabilityFunctionSuspend的定义能力。FunctionCount(函数计数)字段识别驱动程序函数的数量,并且在一种实现中它与复合驱动程序将创建的PDO的数量相关。
如果客户端驱动程序结束这个IOCTL而没有首先确定支持USB接口版本支持它,IOCTL将以错误状态诸如STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它这样的表示错误的状态来结束。如果IOCTL成功完成,则在输出参数中返回的函数句柄全部是有效的。如果客户端驱动程序不止一次发送这个IOCTL,完成代码将是STATUS_INVALID_DEVICE_REQUEST或其它这样的表示错误的状态。如果Size字段大于USB栈所支持的任何大小,则该请求将以STATUS_LENGTH_INFO_MISMATCH结束并且Size字段将被更新到USB核心驱动程序栈所支持的最大大小。
下面是能够被利用来初始化USB_COMPOSITE_REGISTRATION结构的示例函数。
复合设备驱动程序112能够将这个IOCTL发送到USB核心驱动程序栈102,以便为这些函数或这些函数的表示诸如PDO之中的每一个检索函数句柄,。在执行版本交换和确定函数的数量之后,复合设备驱动程序沿着USB栈发送这个IOCTL。当复合设备驱动程序检索到函数句柄时,它能够随后将这些函数句柄添加到从相应的USB客户端函数驱动程序沿着USB栈行进的所有请求。
当USB集线器驱动程序108接收到这个IOCTL时,它能够首先执行参数确认,其包括确定客户端驱动程序是否已注册了它自己。假设IOCTL的输入缓冲区是良好的,USB集线器驱动程序能够登记或保存:复合驱动程序与特定函数相关以及能力是什么。它能够随后沿着USB栈转发该请求。当请求正在完成备份USB栈时,集线器驱动程序能够缓存函数句柄来保持与特定驱动程序的兼容性。在实现中,函数句柄可以是真正的指针,并且集线器驱动程序执行所有函数句柄的查找来确定哪个函数与哪个句柄相关联。然而,如果函数句柄是索引(或被转换成一个),则它能够使用那个来索引到数组,或可以被实现来与索引一起使用的其它结构,诸如虚拟地址,其中值是索引到该值的各种偏移形式的多个索引。
用于注销复合驱动程序的USB驱动程序接口函数的扩展是IOCTL_INTERNAL_USB_UNREGISTER_COMPOSITE_DRIVER。这个IOCTL是如上所述的IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DRIVER(注册IOCTL)的相反(opposite),并且被用来清除(clear-up)函数句柄。这个IOCTL定义的示例是:
没有利用USB客户端函数驱动程序110为这个IOCTL提供的参数。如果客户端驱动程序传送这个IOCTL而没有首先完成IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DRIVER请求,IOCTL将利用错误状态诸如STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它这样的表示错误的状态来结束。复合设备驱动程序112能够发送这个IOCTL来关闭以前打开的任何函数句柄,并且在实现中,这个操作能够在Release Hardware(释放硬件)中被执行。当USB集线器驱动程序108接收到这个IOCTL时,它能够首先执行参数确认,包括确定客户端驱动程序是否已注册了它自己。假设该IOCTL是良好的,USB集线器驱动程序能够登记或保存复合驱动程序已注销了它自己并将清除任何相关状态。它能够随后沿着USB栈转发该请求。USB集线器驱动程序也能够释放(free)表示这些函数的结构数组,如果实现了的话。
用于设置USB函数句柄数据的USB驱动程序接口函数的扩展是IOCTL_INTERNAL_USB_SET_FUNCTION_HANDLE_DATA。这个IOCTL在完成复合驱动程序注册之后利用复合设备驱动程序112来发送。这个IOCTL定义的示例是:
为了这个IOCTL而暴露给USB客户端函数驱动程序的输入参数是调用者分配和初始化的USB_FUNCTION_DATA结构。示例USB_FUNCTION_DATA结构是:
Version字段是结构的版本并能够用于未来可扩展性。Size字段是以字节为单位的结构USB_FUNCTION_DATA的大小并能够用于结构版本控制。UsbdFunctionHandle是在IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DRIVER请求中以前检索到的函数句柄。PhysicalDeviceObject是由复合设备驱动程序为与特定的函数句柄相关联的函数创建的物理设备对象。
如果客户端驱动程序发送这个IOCTL而没有首先成功检索函数句柄,IOCTL将以错误状态诸如STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它这样的表示错误的状态结束。如果Size字段大于USB栈所支持的任何大小,则该请求将利用STATUS_LENGTH_INFO_MISMATCH结束,并且Size字段将被更新到USB核心驱动程序栈所支持的最大值。
下面是能够被利用来初始化USB_FUNCTION_DATA结构的示例函数。
复合设备驱动程序112能够发送这个IOCTL,以便将与设备对象相关联的函数通知其余的USB核心驱动程序栈102。这能够被USB栈用于诊断目的。当USB集线器驱动程序108接收这个IOCTL时,它能够首先执行参数确认,包括确定客户端驱动程序是否已注册了它自己。假设针对这个IOCTL的输入参数是良好的,USB集线器驱动程序能够在结构中保存PDO并将它与函数句柄相关联。
在各种实施例中,USB核心驱动程序栈102被实现来经由USB驱动程序接口函数的扩展从USB客户端函数驱动程序110接收合同版本标识符。合同版本标识符指示USB客户端函数驱动程序利用来与USB核心驱动程序栈接口的一组操作规则,其中USB核心驱动程序栈使用合同版本标识符来保持与遗留的或以前版本的客户端驱动程序的兼容性。在实现中,客户端驱动程序能够确定在被装载到不支持用于USB驱动程序接口的扩展的USB栈上时如何运行。
USB客户端函数驱动程序110能够向USB核心驱动程序栈查询,以确定USB栈是否支持用于USB驱动程序接口(API)114的扩展116。IOCTL能够被实现来与USB核心驱动程序栈102协商特定的接口版本。这允许客户端驱动程序确定该栈支持什么特性,以及允许该栈实施特定的接口合同。此外,这些接口能够是向后兼容的,并且利用来建立和测试客户端驱动程序的API版本能够被确定。这允许接口升级,同时能够减轻遗留的兼容性问题。现有的USB版本信息能够经由GetUSBDIVersion函数调用来检索。能够添加标志符来针对给定操作系统区分遗留的USB栈和新的USB栈。
用于USB驱动程序接口函数的获得和/或协商USB接口版本的扩展的示例实现是IOCTL_INTERNAL_USB_NEGOTIATE_INTERFACE_VERSION。作为选择,不同的机制能够被实现用于USB客户端函数驱动程序来确定USB核心驱动程序栈是否支持新的接口。这在指定能够包括合同版本的客户端驱动程序的合适的接口结构时能够通过IRP_MN_QUERY_INTERFACE来实现。
USB客户端函数驱动程序110能够被要求来在沿着USB核心驱动程序栈发出任何URB或其它IOCTL之前但在将IRP_MN_START_DEVICE向下传递到其物理设备对象并且使得开始请求成功完成返回到客户端驱动程序之后发出IOCTL。在实现中,这个IOCTL是在客户端驱动程序的EvtDevicePrepareHardware例程(如果基于KMDF的话)或IRP_MN_START_DEVICE完成例程(如果基于WDM的话)内执行的第一操作。如果客户端没有在发出任何URB之前发出这个IOCTL,则能够假设它是与遗留的USB接口兼容的。如果客户端驱动程序的兼容接口版本是在引入新特性之前的较低版本,则客户端驱动程序访问新的USB接口特性的试图将失败。这能够被利用来要求(enforce):客户端驱动程序发送准确的版本信息。
这个IOCTL定义的示例是:
被暴露给客户端驱动程序的针对这个IOCTL的输入参数是利用客户端驱动程序分配和初始化的USB_EXTENDED_VERSION_INFORMATION结构。示例的USB_EXTENDED_VERSION_INFORMATION结构是:
Version字段是结构的版本并能够用于未来可扩展性。客户端驱动程序在沿着USB栈传送IOCTL之前提供该版本。注意:这与通过GetUSBDIVersion API返回的USBDIVersion是不同的。Size字段是以字节为单位的结构的大小并能够在将来用于扩展该结构。客户端驱动程序在沿着USB栈传送IOCTL之前提供该大小。USBInterfaceVersion是客户端驱动程序想要使用的接口合同的版本号。客户端驱动程序在沿着USB栈传送IOCTL之前提供这个版本。UsbdDeviceHandle被保留以便被核心栈(core stack)使用(并且不被客户端驱动程序使用)。
如果客户端驱动程序向遗留栈发送这个IOCTL,它将利用在IRP被发送时设置的相同状态来结束。客户端驱动程序能够在发送IRP之前初始化除了STATUS_SUCCESS以外的状态。如果IOCTL成功完成的话,则USB核心驱动程序栈曾支持请求的接口版本并且现在能够实施针对那个版本的合同。如果客户端驱动程序不止一次发送这个IOCTL,或在另一个IOCTL或URB之后发送它,则完成代码将是STATUS_INVALID_DEVICE_REQUEST或指示错误的其它这样的状态。
在实现中,如果遗留的复合设备驱动程序(例如,在实现中的USB CCGP)被装载到较新版本USB栈上,其中较新版本USB驱动程序被装载为其孩子,这种情景能够发生并且遗留兼容性被保持,在这种情况下,与那个行为一致的错误代码被返回。作为选择,如果对于USB客户端函数驱动程序使用不同的机制来诸如通过IRP_MN_QUERY_INTERFACE确定是否USB核心驱动程序栈支持新的接口,这可能不被实现。如果Size字段大于USB栈的任何支持大小,则该请求将以STATUS_LENGTH_INFO_MIMATCH结束,并且Size字段将被更新到USB核心驱动程序栈所支持的最大值。如果USBInterfaceVersion不被USB核心驱动程序栈支持,则IRP能够利用在发送它时在IRP中的相同状态来结束。
下面是能够被利用来初始化USB_EXTENDED_VERSION_INFORMATION结构的示例函数。
复合设备驱动程序112是用于复合设备的函数驱动程序,并因此具有两个针对这个IOCTL的职责。作为函数驱动程序,复合设备驱动程序传送IOCTL,而作为数据总线驱动程序,复合设备驱动程序处理IOCTL。在复合设备驱动程序沿着USB栈传递第一IRP_MN_START_DEVICE并且它已完成返回到驱动程序(如果它是WDM的话)之后或在EvtDevicePrepareHardware回调(callback)内(如果它是KMDF的话),第一操作将是发送这个版本IOCTL。
复合设备驱动程序112也能够被实现来确认USB核心驱动程序栈版本号与已利用来测试复合设备驱动程序的版本号相同,而否则的话,失败启动,因为这将指示栈内(intra-stack)二进制版本不匹配。作为数据总线驱动程序,复合设备驱动程序接收这个IOCTL并填充UsbdFunctionHandle,以致较低栈知道这个请求与哪个特定函数相关联。如果复合设备驱动程序在接收这个IOCTL之前接收任何其它URB,它能够假定客户端的接口版本是遗留版本。如果复合设备驱动程序在任何其它URB或IOCTL(除了不成功的接口协商IOCTL之外)之后接收这个IOCTL,它将使该IOCTL失败。如果客户端驱动程序支持的版本号大于USB栈所支持的版本号,复合设备驱动程序能够使该请求失败。如果该版本被复合设备驱动程序所支持,它能够沿着USB栈转发该请求,并且如果该请求成功完成的话,复合设备驱动程序能够保存该版本号并使用那个(版本号)来实施行为。
USB集线器驱动程序108也具有版本控制的职责。当集线器驱动程序接收这个IOCTL时,它能够填充USBDeviceHandle字段,以致较低USB栈知道这个版本信息是用于哪个设备的。如果USB集线器驱动程序在接收这个IOCTL之前接收任何其它URB,它能够假定客户端驱动程序的接口版本是遗留版本。如果集线器驱动程序在任何其它URB或IOCTL(除了不成功的接口协商IOCTL之外)之后接收这个IOCTL,它将使该IOCTL失败。如果该接口不被集线器驱动程序所支持,它将使该IOCTL失败。如果该接口被集线器驱动程序所支持,它能够转发该请求到根集线器PDO,以便USB主控制器驱动程序来处理。一旦完成,并且如果该请求是成功的话,集线器驱动程序能够保存客户端驱动程序的版本信息并使用它来实施行为。
类扩展能够在根集线器PDO上接收IOCTL。如果版本号为类扩展(和控制器驱动程序)所支持,它将在USB Device对象中保存客户端驱动程序的版本信息。它也将把该客户端驱动程序的版本信息通知主控制器驱动程序。类扩展随后能够填充该数据结构中的其余字段(和清除设备句柄、保留等字段)并完成该IOCTL。如果客户端驱动程序支持的版本号不为USB栈所支持,类扩展能够被实现来使IOCTL失败。能够利用类扩展将与设备句柄相关联的客户端驱动程序的接口版本通知USB主控制器驱动程序,并且客户端驱动程序能够保存这个数据并使用它来实施行为。
在各种实施例中,USB核心驱动程序栈102被实现来接收来自USB客户端函数驱动程序110的能力版本请求,并返回USB核心驱动程序栈支持用于USB驱动程序接口函数的扩展116的指示。在其它实施例中,USB核心驱动程序栈102被实现来接收来自USB客户端函数驱动程序110的请求以分配URB(USB请求块),并且USB核心驱动程序栈102能够为USB客户端函数驱动程序分配URB。USB核心驱动程序栈102还能够实施先检查协议,该先检查协议指导USB客户端函数驱动程序110在经由USB驱动程序接口与USB核心驱动程序栈接口之前检查USB驱动程序接口函数的可用性。在针对版本协商IOCTL的替代的实现中,版本数据随后能够在URB本身中进行传播,以提供驱动程序特定的兼容性。
可能具有一些只有某些类型的主控制器支持或仅利用特定的设备版本和/或速度支持的能力。这个的示例是批量流(Bulk Stream)端点。为了实现用于USB驱动程序接口函数的扩展的流特性,启用若干要求,诸如USB栈被实现来支持流概念,并且USB主控制器以及总线技术被实现来支持流特性。客户端驱动程序还确定所有的要求是否被满足来启用流。
能够定义通用机制来从USB核心驱动程序栈确定USB能力,以致不同的能力组合能够在不同的USB栈上被支持而不更新USBDInterfaceVersion。仅在客户端驱动程序请求合适的能力时,USB核心驱动程序栈才提供对某些特性的访问,而这规定:客户端驱动程序也将对其它USB栈起作用而不限于特定的USB栈版本和控制器。在实现中,验证器设置能够被实现来禁用能力,以致在能力不被支持时客户端驱动程序起作用。
用于USB驱动程序接口函数的确定USB能力或确定用于接口函数的扩展的特性是否被启用的扩展的示例实现是IOCTL_INTERNAL_USB_GET_USB_CAPABILITY。这个IOCTL由USB客户端函数驱动程序110发送,以确定USB核心驱动程序栈102的能力。如果客户端驱动程序没有验证USB栈支持它的话,则客户端驱动程序不被许可或允许来使用USB能力。
这个IOCTL定义的示例是:
USB客户端函数驱动程序110针对这个IOCTL传递两个参数,一个用于输入,以及一个用于输出。输入参数是调用者分配和初始化的USB_CAPABIILTY_REQUEST结构。输出参数是调用者分配的缓冲区,其以字节为单位的大小利用USB_CAPABILITY_REQUEST结构的OutputBufferLength字段来指定。输出缓冲区大小取决于能力类型。USB_CAPABILITY_REQUEST结构的示例是:
Version字段是结构的版本并能够用于未来可扩展性。Size字段是USB_CAPABILITY_REQUEST结构的大小并能够用于结构版本控制。Capability Type(能力类型)字段是代表客户端驱动程序在试图检索有关其信息的能力的GUID。
如果客户端驱动程序发送这个IOCTL而没有首先确定支持USB接口版本支持它的话,IOCTL将利用错误状态诸如STATUS_INVALID_PARAMETER、STATUS_INVALID_DEVICE_REQUEST或其它这样的表示错误的状态来结束。如果这个IOCTL被USB核心驱动程序栈所支持,但是能力类型不被USB栈了解或支持,IOCTL将完成为STATUS_NOT_IMPLEMENTED。如果输入参数的Size字段是无效的,则IOCTL将以STATUS_LENGTH_INFO_MISMATCH结束。如果该大小大于USB核心驱动程序栈所支持的任何大小,则Size字段能够被填充到USB栈所支持的最大值。如果输出缓冲区长度小于针对特殊能力类型所需要的,则IOCTL能够指示STATUS_BUFFER_TOO_SMALL。如果IOCTL成功完成,则能力类型被了解,并且输出缓冲区包含能力细节。
下表列出一些定义的能力类型以及根据如在此描述的用于USB驱动程序接口函数的扩展的实施例的各自输出内容:
能力名称 | 输出 | 描述 |
Usb能力链接的Mdl | 无 | 如果请求成功完成,则栈利用多个MDL支持URB。 |
Usb能力基本流 | ULONG | 如果请求成功完成,则输出将是每个端点支持的流的最大数量。 |
Usb能力函数暂停 | 无 | 如果请求成功完成,则栈支持对于那个设备的函数暂停。 |
Usb能力设备速度 | USBD_SPEED(enum of speeds)(速度的枚举) | 如果请求成功完成,则输出将是指示针对那个设备的当前操作总线速度的有效USBD_SPEED值之一。 |
Usb能力函数暂停 | 无 | 如果请求成功完成,则栈支持函数暂停。这个旨在仅被USBCCGP驱动程序使用。 |
Usb能力选择性暂停 | 无 | 如果这个请求成功完成,则栈支持选择性暂停。这个旨在仅被USBCCGP驱动程序使用。 |
以下是能够被利用来初始化USB_CAPABILITY_REQUEST结构的示例函数。
复合设备驱动程序112能够接收这个IOCTL并确定能力请求。复合设备驱动程序能够被实现来首先确认能力请求本身的完整性,并且如果必要的话,使该请求失败。如果能力类型在复合设备驱动程序内实现的话,则复合设备驱动程序能够执行动作来完成该请求。否则,复合设备驱动程序能够利用用于特定函数的UsbdFunctionHandle来填充Argument4。USB集线器驱动程序108能够执行与复合设备驱动程序112相同或类似的步骤,除了在沿着USB核心驱动程序栈转发它之前填充UsbdDeviceHandle字段之外。
对于主控制器类扩展处理,类扩展能够在根集线器PDO上接收这个IOCTL并执行与USB集线器驱动程序以及复合设备驱动程序类似的动作,而不是沿着USB栈转发IOCTL,调用USB主控制器驱动程序中的EvtHCDControllerGetCapability例程。如果EvtHCDControllerGetCapability调用以失败返回的话,类扩展将利用那个失败代码来结束IOCTL。如果调用以成功返回的话,则类扩展可以修改输出缓冲区的内容,并且随后利用STATUS_SUCCESS结束IOCTL。如果主控制器驱动程序不提供EvtHCDControllerGetCapability函数,则类扩展将利用STATUS_NOT_IMPLEMENTED以未知能力类型使IOCTL失败。
为了主控制器驱动程序处理,USB主控制器驱动程序能够利用对其EvtHCDControllerGetCapability调用的调用来接收能力请求的细节。如果USB主控制器驱动程序不支持该能力类型,它将返回STATUS_NOT_IMPLEMENTED。如果USB主控制器驱动程序能够确定该能力类型,它将确认输出缓冲区大小并且在该大小对于该能力类型是不足够的时候返回STATUS_BUFFER_TOO_SMALL。否则,USB主控制器驱动程序能够利用合适的能力信息来填充输出缓冲区。如同在每隔一层的USB核心驱动程序栈中一样,USB主控制器驱动程序可能需要要求:如果USB客户端函数驱动程序没有查询合适的能力,则它不暴露函数性(functionality)。
在各种实施例中,USB主控制器支持用于存储在几乎不连续缓冲区中的输入/输出处理的缓冲数据的特性。在一种实现中,USB主控制器支持用于存储在几乎不连续缓冲区中的缓冲数据的MDL(内存描述符列表)。一些当前的USB主控制器硬件接口设计在传送中对于缓冲区具有严格的要求并且要求缓冲区是几乎连续的。然而,具有若干类型的设备,其中对于这些设备而言,这个限制可能具有显著的性能影响。
在实施例中,USB主控制器能够被实现来规定:定义传送的缓冲区无需是几乎连续的。进一步,对于构成传送的缓冲区的数量、大小或对准(alignment),没有限制。为了USB客户端函数驱动程序110利用这个特性,客户端驱动程序检测USB核心驱动程序栈102和USB控制器是否支持它,并随后确定显示(如何)来发送单独的缓冲段。在客户端驱动程序能够在传送中使用多个缓冲段之前,客户端驱动程序首先确定USB栈是否支持这个特性。客户端驱动程序能够首先发送版本协商IOCTL(如上所述)。如果协商的接口版本小于特殊的版本标识符,则客户端驱动程序确定链接的缓冲段不被支持。否则,客户端驱动程序则确定这个特定能力是否被支持。为了进一步确认该特性被支持,客户端驱动程序能够发出IOCTL_INTERNAL_USB_GET_USB_CAPABILITY来确定USBCapabilityChainedMDL能力。如果这个请求失败,则客户端驱动程序确定缓冲区链接是不被支持的。如果IOCTL成功完成的话,则客户端驱动程序确定缓冲区链接被USB核心驱动程序栈和USB主控制器支持。
在操作系统的现有实现中缓冲区链接天然地利用MDL来支持。每个MDL具有指向另一MDL的Next(下一个)指针。设备驱动程序能够通过手动操纵这个Next指针字段以便以适当顺序建立MDL的列表来建立这个链。在网络适配器示例中,USB客户端函数驱动程序从NDIS(其可能已是MDL)接收网络分组。为了添加头部(header),客户端驱动程序创建另一个MDL并利用头部数据来填充缓冲区。它将随后把新的MDL的Next指针指向从NDIS接收的净荷MDL。例如,如果客户端驱动程序添加页脚,它能够改变该链,以致带有页脚内容的新的MDL是该链中的最后元素。当客户端驱动程序向下发送这个MDL链到USB栈时,它仅将URB的TransferBufferMDL字段指向该链中的第一MDL,并将TransferBufferLength字段设置为要传送的段的总和。
对于USB核心驱动程序栈102,如上所述处理版本协商。USBCapabilityChainedMDL利用USB主控制器驱动程序自身来处理,因为那是追踪USB控制器的DMA能力的USB核心驱动程序栈中的层。USB栈能够指示它支持这个能力。类扩展随后能够利用设备句柄来保存这个能力信息,以便进一步确认。当URB_BULK_OR_INTERRUPT_TRANSFER沿着USB栈发送时,它不被任何层处理,直至主控制器类扩展(除了填充函数句柄或设备句柄之外)。当类扩展在根集线器PDO上接收这个URB时,它可以确认客户端驱动程序已接收到成功的USBCapabilityChainedMDL能力请求。如果客户端驱动程序没有接收到的话,则类扩展能够确认MDL中的Next指针是NULL(空)。如果不是的话,类扩展将利用STATUS_INVALID_PARAMETER使请求失败。否则,它将仅仅转发该URB到合适的端点队列。
在各种实施例中,USB核心驱动程序栈102能够被实现来分配多个数据流队列给端点,用于输入/输出处理,并关联多个数据流队列的独特标识符来管理输入/输出。多个数据流队列的独特标识符可以包括句柄、指针、索引和/或任何独特标识符的数组。用于USB驱动程序接口函数的扩展支持提供批量端点的流特性,其允许多个输入/输出队列与该端点相关联。USB客户端函数驱动程序110随后能够控制在任何给定时间将数据移动到许多队列中的哪一个或从哪一个队列中移动数据。从软件的观点来看,这类似于具有许多带有相同特征的端点。不同流之间的输入/输出没有与单独的批量端点一样被串行化。为流调度输入/输出类似于为端点调度输入/输出。
在实施例中,端点能够支持高达16K流,并且为了支持此,许多流没有大于页面的常见缓冲区分配,XHCI规范通过二次流数组来实现间接层(a level of indirection)。单个主流数组在单个页面中能够支持高达二百五十五(255)个流(例如,每个流上下文是16字节,并且第一流上下文被保留)。在实现中,USB核心驱动程序栈102将所支持的流的数量限制到二百五十五(255)用于控制器可管理性,并且利用称为Basic Streams Interface(基本流接口)的简化有限的接口来表示。通过Basic Stream Interface,USB客户端函数驱动程序能够为每个流检索管道句柄,并重新使用现有URB和IOCTL,其使用用于流的管道句柄。这个包括URB_FUNCTION_ABORT_PIPE和URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER。针对URB_FUNCTION_RESET_PIPE的操作作为整体应用于端点而不是流,并且USB客户端函数驱动程序能够选择作为整体发送URB_FUNCTION_ABORT_PIPE给端点。
USB客户端函数驱动程序110能够最初发出URB_FUNCTION_SELECT_CONFIGURATION,其中具有返回的一组管道句柄,每个端点一个管道句柄。对于支持流的端点,返回的管道句柄将表示该端点。然而,随那个句柄一起发送的任何输入/输出(例如,直至流被初始化)将被调度用于第一流(即,流号1)。这规定:客户端驱动程序能够就像非流端点一样利用流端点,这将允许客户端USB设备向后兼容不是针对流实现的USB客户端函数驱动程序。然而,当端点使流打开时,至端点管道句柄的输入/输出将失败(除了URB_FUNCTION_ABORT_PIPE和URB_FUNCTION_RESET_PIPE之外)。
上述的机制能够用于确定是否USB客户端函数驱动程序110能够利用该能力。客户端驱动程序能够首先发送版本协商IOCTL(如上所述)。如果协商的接口版本小于特殊的版本标识符,该客户端驱动程序确定:流不被支持。否则,客户端驱动程序随后确定是否这个特定能力被支持。为了进一步确认该特性被支持,客户端驱动程序能够发出IOCTL_INTERNAL_USB_GET_USB_CAPABILITY来确定USBCapabilityBasicStreams能力。如果这个请求失败,则客户端驱动程序确定:流是不被支持的。如果IOCTL成功完成的话,则该能力值将是USB核心驱动程序栈和USB控制器能够支持的流的非零最大数目。
用于打开Basic Streams(基本流)的USB驱动程序接口函数的扩展是结构URB_FUNCTION_OPEN_BASIC_STREAMS,而用于关闭Basic Streams的USB驱动程序接口函数的扩展是结构URB_FUNCTION_CLOSE_BASIC_STREAMS。结构URB_FUNCTION_OPEN_BASIC_STREAMS针对USB客户端函数驱动程序110来实现,以便通过为这些流检索管道句柄来实现流。客户端驱动程序能够初始化对于支持流的端点传递Pipe Handle(管道句柄)的这个URB以及数组来接收流信息。示例URB_FUNCTION_OPEN_BASIC_STREAM结构是:
Hdrfield(Hdr字段)是指定URB头部信息的URB_HEADER结构。Hdr.Length是以字节为单位的整个URB的大小,而Hdr.Function是URB_FUNCTION_OPEN_BASIC_STREAMS。Pipe Handle(管道句柄)字段是在以前的URB_FUNCTION_SELECT_CONFIGURATION中返回的或在以前的URB_FUNCTION_SELECT_INTERFACE中返回的USBD_PIPE_HANDLE。Number Of Streams(流的数量)表示要配置的流的数量,并且也反映在流数组中的条目的数量。这个值大于零并小于或等于被USB栈或端点支持的流的最大数量(取较小值)。StreamInfoVersion是USBD_STEAM_INFORMATION版本的版本,并且这个字段用于结构版本控制。这个字段在URB中向下发送之前由调用者来初始化。StreamInfoSize是USBD_STREAM_INFORMATION结构的大小,并且这个字段用于结构版本控制。这个字段也由调用者在URB中向下发送它之前初始化。Streams(流)字段是指向调用者分配和初始化的数组来接收包括管道句柄的有关这些流的信息的指针。
USBD_STREAM_INFORMATION结构的示例是:
在这个结构中,Pipe Handle是能够在进一步URB中用于向特定流发送输入/输出的流的管道句柄。StreamID是将通过USB总线发送的针对与特定流相关的输入/输出的标识符。Maximum Transfer Size(最大传送大小)定义能够在单个URB中发送的最大传送大小。Pipe Flags(管道标志)被保留用于与流有关的未来信息。
如果USB客户端驱动程序在接收到针对USBCapabilityBasicStreams请求返回的非零值之前发送这个URB,则该URB将以USBD_STATUS_INVALID_URB_FUNCTION结束,并且IRP将利用STATUS_INVALID_PARAMETER来结束。如果URB的StreamInformationVersion字段与支持的结构版本不匹配,则IRP将以STATUS_INVALID_PARAMETER失败,并且URB将以USBD_STATUS_INVALID_PARAMETER失败。如果StreamInformationSize字段不是合法值,则IRP将以STATUS_INFO_LENGTH_MISMATCH结束,并且URB将以USBD_STATUS_INFO_LENGTH_MISMIATCH结束。如果StramInformationSize字段大于USB栈所支持的任何大小,则它将利用USB栈所支持的最大大小来填充,并且其余的字段将不被填充和/或被修改。
如果USB客户端函数驱动程序将这个URB发送给不支持流的端点,URB将以USBD_STATUS_INVALID_PIPE_HANDLE结束,并且IRP将以STATUS_INVALID_PARAMETER结束。如果NumberOfStreams字段超过控制器或端点所支持的最大数量,或如果NumberOfStreams字段是零,URB将以USBD_STATUS_INVALID_PARAMETER结束,并且IRP将以STATUS_INVALID_PARAMETER结束。如果NumberOfStreams字段是非零,并且流已被配置用于那个端点,则URB将以USBD_STATUS_INVALID_PARAMETER结束,并且IRP将以STATUS_INVALID_PARAMETER结束。如果URB要不然是畸形的(malformed),URB将利用USBD_STATUS_INVALID_PARAMETER结束,并且IRP将利用STATUS_INVALID_PARAMETER结束。如果URB成功完成的话,则URB状态将是USBD_STATUS_SUCCESS,并且IRP将以STATUS_SUCCESS结束。在这个情况下,所有的流信息结构将由USB核心驱动程序栈利用有效句柄和适当信息来填充。
下面是能够利用来建立Open Streams(开放流)URB的示例函数。
复合设备驱动程序112能够填充URB IOCTL的Argument4中的USBDFunctionHandle,并且USB集线器驱动程序108填充URB中的USBDDeviceHandle字段。在处理用于USBCapabilityBasicStreams(USB能力基本流)的IOCTL_INTERNAL_USB_GET_USB_CAPABILITY时,USB主控制器类扩展能够允许流被启用,并且它将调用EvtControllerGetCapability例程,以允许USB主控制器驱动程序处理该请求。类扩展将随后保存这个能力值并将它与设备句柄相关联。当接收URB_FUNCTION_OPEN_BASIC_STREAMS时,类扩展确认:已利用非零值返回了USBCapabilityBasicStreams。如果不是的话,它利用USBD_STATUS_INVALID_URB_FUNCTION使URB失败。如果URB中的NumberOfStreams大于在USBCapabilityBasicStreams中返回的,或如果它是零的话,则它利用USBD_STATUS_INVALID_PARAMETER使URB失败。类扩展能够针对附加的URB确认来实现,以验证:URB是良好的,并且流的数量对于那个特殊端点是有效的。如果流已针对指定端点被打开,则类扩展利用USBD_STATUS_INVALID_PIPE_HANDLE使URB失败。
假设URB是良好的,类扩展能够为每个流调用控制器驱动程序的EvtHCDEndpointCreateStream函数,其将返回管道句柄。如果这些Stream Create(流创建)调用之一失败的话,类扩展将释放所有已经分配的流并利用USBD_STATUS_INSUFFICENT_RESOURCES结束URB。如果所有的流被成功创建,则类扩展将调用驱动程序的EvtHCDEndpointOpenStreams函数来打开这些流。如果这个操作失败,则URB能够利用(如驱动程序所返回的)适当状态来结束。如果该操作成功,则类扩展能够在URB中填入(fill in)流信息并成功结束URB。
对于XHCI驱动程序处理,XHCI驱动程序的EvtHCDUSBDeviceConfigureEndpoints被调用,并且当它遇到支持流的端点时,它将分配初始流上下文数组来保持单个流。与为那个端点创建的WDFQUEUE相关联的端点代码将需要知道端点输入/输出实际上应该去与该流相关联的传送环(transfer ring)。当类扩展调用XHCI驱动程序的EvtHCDEndpointCreateStream时,类扩展将创建新的WDFQUEUE对象来表示流本身并且它将初始化队列的上下文来保存有关流的数据。当类扩展调用EvtHCDEndpointOpenStreams时,XHCI驱动程序分配较大的流上下文数组,并利用用于那个端点组的移除和添加标志来发送Configure Endpoint命令给控制器。这替代被配置用于该端点的上下文数组以及流的数目。此时,代表该端点的WDFQUEUE应该不再接受输入/输出,因为它不再代表有效的流。然而,它能够是中止管道或置位管道的目标。当类扩展调用EvtHCDEndpointCloseStreams时,XHCI驱动程序能够使用Configure Endpoint命令来交换(swap)流上下文数组,并重新配置端点的WDFQUEUE以便能够以第一流(即,流1)为目标。
结构URB_FUNCTION_CLOSE_BASIC_STREAMS被实现,以致已打开流的USB客户端函数驱动程序将能够关闭流句柄。客户端驱动程序能够初始化这个URB,为支持流的端点传递Pipe Handle。这个URB使用URB_PIPE_REQUEST结构。如果客户端驱动程序在接收针对USBCapabilityBasicStreams请求返回的非零值之前发送这个URB,该URB将以USBD_STATUS_INVALID_URB_FUNCTION结束,并且IRP将以STATUS_INVALID_PARAMETER结束。如果客户端驱动程序将这个URB发送给当前没有任何打开流的端点,则URB将以USBD_STATUS_INVALID_PIPE_HANDLE结束,并且IRP将以STATUS_INVALID_PARAMETER结束。如果URB要不然是畸形的,该URB将利用USBD_STATUS_INVALID_PARAMETER结束,并且IRP将利用STATUS_INVALID_PARAMETER结束。如果该URB成功完成,则URB状态将是USBD_STATUS_SUCCESS,并且IRP将利用STATUS_SUCCESS来结束。
复合设备驱动程序112能够填充URB IOCTL的Argument4中的USBDFunctionHandle。USB集线器填充URB中的USBDDeviceHandle字段。当接收URB_FUNCTION_CLOSE_BASIC_STREAMS时,USB主控制器类扩展确认:端点当前已使得流打开。如果不是的话,则该URB以错误结束。类扩展能够执行附加的URB确认来验证URB是良好的。假设URB是良好的,类扩展能够调用设备驱动程序的EvtHCDEndpointAbort来将所有的输入/输出涌(flush)到流(即,在停止流队列之后),并随后调用EvtHCDEndpointCloseStreams。它能够稍后解引用WDFQUEUE来导致流队列被清除。当类扩展调用EvtHCDEndpointCloseStreams时,XHCI驱动程序能够使用Configure Endpoint命令来交换流上下文数组,并且重新配置端点的WDFQUEUE以便能够以第一流(即,流1)为目标。
示例方法200、300、400和500根据用于USB驱动程序接口函数的扩展的一个或多个实施例参考各自附图2、3、4和5来描述。一般,此处描述的函数、方法、过程(procedure)、组件和模块之中的任何一个能够使用硬件、软件、固件、固定逻辑电路、人工处理或其任何组合来实现。软件实现表示当由计算机处理器执行时执行指定任务的程序代码。示例方法可以以计算机可执行指令的一般上下文来描述,其中指令能够包括软件、应用、例程、程序、对象、组件、数据结构、过程、模块、函数等。这些方法也可以在分布式计算环境中利用通过通信网络链接的处理设备来实践。在分布式计算环境中,计算机可执行指令可以位于本地和远程计算机存储媒体和/或设备中。进一步,此处描述的特性是独立于平台的,并且能够在具有各种处理器的各种计算平台上实现。
图2示出用于USB驱动程序接口函数的扩展的(一种或多种)示例方法200。其中描述方法块的顺序并不打算被解释为限制,并且任何数量的所描述的方法块能够以任何顺序进行结合来实现方法或替代方法。
在块202,实现被USB核心驱动程序栈暴露的一组USB驱动程序接口,并且USB驱动程序接口包括USB驱动程序接口函数。例如,USB驱动程序接口(API)114被USB核心驱动程序栈102暴露,并且USB驱动程序接口114包括USB驱动程序接口函数。API利用USB核心驱动程序栈来实现和暴露,以便由USB客户端函数驱动程序110和/或复合设备驱动程序112使用。USB核心驱动程序栈102为USB客户端函数驱动程序110管理计算机指令和数据交换的输入/输出。
在块204,用于USB驱动程序接口函数的扩展被USB核心驱动程序栈暴露来与USB客户端函数驱动程序接口。例如,用于USB驱动程序接口函数的扩展116被USB核心驱动程序栈102暴露来与USB客户端函数驱动程序110和/或复合设备驱动程序112接口。
在块206,能力版本请求从USB客户端函数驱动程序接收。例如,USB客户端函数驱动程序110经由USB驱动程序接口函数的扩展116从USB核心驱动程序栈请求能力版本请求。在块208,返回USB核心驱动程序栈支持用于USB驱动程序接口函数的扩展的指示。例如,USB核心驱动程序栈102和USB主控制器驱动程序库106支持用于USB驱动程序接口函数的扩展116的指示被返回到请求USB客户端函数设备110。
在块210,经由USB驱动程序接口函数的扩展从USB客户端函数驱动程序接收合同版本指示符。例如,USB核心驱动程序栈102从USB客户端函数驱动程序110接收合同版本标识符,并且该合同版本标识符指示USB客户端函数驱动程序利用来与USB核心驱动程序栈接口的一组操作规则。在实现中,具有交换的两个版本值。一个值用于USB客户端函数驱动程序110来确定USB栈是否支持扩展116(例如,扩展的API)。另一个值用于USB核心驱动程序栈102来确定如何运作来保证与较旧的USB客户端函数驱动程序的兼容性,同时仍然允许它对于较新的函数驱动程序更加优化的运作。
在块212,实施指导USB客户端函数驱动程序检查USB驱动程序接口函数的可用性的先检查协议。例如,USB核心驱动程序栈102实施指导USB客户端函数驱动程序110在经由USB驱动程序接口114与USB核心驱动程序栈接口之前检查USB驱动程序接口函数和/或扩展116的可用性的先检查协议。
图3示出用于USB驱动程序接口函数的扩展的(一种或多种)示例方法300。其中描述方法块的顺序并不打算被解释为限制,并且任何数量的所描述的方法块能够以任何顺序进行结合来实现方法或替代方法。
在块302,枚举(enumerate)USB客户端函数驱动程序。例如,USB核心驱动程序栈102枚举USB客户端函数驱动程序110。在块304,复合设备驱动程序对于客户端USB设备注册它自己并请求一组函数句柄。在块306,生成函数句柄,其中每一个函数句柄对应于客户端USB设备的个别函数。例如,复合设备驱动程序112注册一个或多个客户端USB设备的个别函数,并且USB核心驱动程序栈102生成其中每一个对应于客户端USB设备的个别函数的函数句柄。
在块308,USB核心驱动程序栈被通知复合设备驱动程序将控制暂停的客户端USB设备的个别函数。例如,复合设备驱动程序112将复合设备驱动程序112将控制暂停的各个客户端USB设备的个别函数通知USB核心驱动程序栈102。一旦客户端USB设备的所有函数被暂停,复合设备驱动程序112能够请求:客户端USB设备应被暂停。这个请求将(传送)至USB集线器驱动程序108,该USB集线器驱动程序108随后暂停客户端USB设备。客户端USB设备的个别函数能够独立地被通知暂停。
这是复合设备驱动程序112(例如,USB CCGP或等效驱动程序)利用来通知USB栈它将负责暂停函数(功能)的机制,因而免除USB集线器驱动程序108在设备层上这样做。利用函数暂停,只要客户端驱动程序发送被通知何时它能够断电的请求,复合设备驱动程序112就能够立即通知客户端驱动程序,而不是等待设备的所有函数来请求和协调断电。作为选择或附加地,函数(功能)恢复或唤醒特性能够被实现来从暂停状态中恢复函数,而不仅仅是作为整体针对该设备。利用函数恢复特性,个别函数能够被装备用于恢复,其中通过向设备上的函数发送命令来通知它“它被允许启动恢复”来完成恢复。复合设备驱动程序能够自己执行这个装备操作而不通过USB集线器驱动程序108(即,装备函数的这个职责在复合设备驱动程序112上实现)。
图4示出用于USB驱动程序接口函数的扩展的(一种或多种)示例方法400。其中描述方法块的顺序并不打算被解释为限制,并且任何数量的所描述的方法块能够以任何顺序进行结合来实现方法或替代方法。
在块402,多个数据流队列被分配给端点用于输入/输出处理,并且在块404,多个数据流队列的独特标识符被相关联来管理输入/输出处理。例如,用于USB驱动程序接口函数的扩展的实施例支持流来分配多个数据流队列给端点,其规定:多个输入/输出队列能够与批量端点相关联。多个数据流队列的独特标识符可以包括句柄、指针、索引和/或任何的独特标识符的数组。
图5示出用于USB驱动程序接口函数的扩展的(一种或多种)示例方法500。其中描述方法块的顺序并不打算被解释为限制,并且任何数量的所描述的方法块能够以任何顺序进行结合来实现方法或替代方法。
在块502,从USB客户端函数驱动程序接收分配URB的请求(USB请求块),并且在块504,URB被分配用于USB客户端函数驱动程序。例如,复合设备驱动程序112从USB客户端函数驱动程序110接收请求来分配URB,并且USB核心驱动程序栈102为USB客户端函数驱动程序分配URB。
在块506,分配与URB相关联的附加缓冲空间。例如,USB核心驱动程序栈102分配与URB相关联的附加缓冲空间。USB核心驱动程序栈102能够利用附加缓冲空间来管理与USB客户端函数驱动程序相关联的输入/输出,诸如用于追踪版本控制、验证,以实施合同、优化代码路径、将USB栈行为调谐到客户端驱动程序行为等等。
图6示出能够被实现来包括根据用于USB驱动程序接口函数的扩展的各种实施例和特性、参考图1描述的示例系统的示例设备600的各个组件。在实施例中,设备600能够被实现为有线和/或无线设备中的任何一个或其组合,被实现为任何形式的消费设备、计算机设备、服务器设备、便携式计算机设备、用户设备、通信设备、视频处理和/或再现设备、电器、游戏设备、电子设备和/或被实现为任何其它类型的设备。设备600还可以与用户(即,个人)和/或操作设备的实体相关联,以致设备描述包括用户、软件、固件和/或设备的组合的逻辑设备。
设备600包括启用设备数据604(例如,接收的数据、正被接收的数据、被调度用于广播的数据、数据的数据分组等)的有线和/或无线通信的通信设备602。设备数据604或其它设备内容能够包括设备的配置设置、存储在设备上的媒体内容和/或与设备的用户相关联的信息。存储在设备600上的媒体内容能够包括任何类型的音频、视频和/或图像数据。设备600包括一个或多个数据输入606,经由这些输入能够接收任何类型的数据、媒体内容和/或输入,诸如用户可选择的输入、消息、音乐、电视媒体内容、记录的视频内容以及从任何内容和/或数据源接收的任何其它类型的音频、视频和/或图像数据。
设备600也包括通信接口608,其能够被实现为串行和/或并行接口、无线接口、任何类型的网络接口、调制解调器之中的任何一个或多个,以及能够被实现为任何其它类型的通信接口。通信接口608提供在设备600和通信网络之间的连接和/或通信链路,其中其它的电子、计算和通信设备通过所述连接和/或通信链路与设备600传送数据。
设备600包括一个或多个处理器610(例如,微处理器、控制器等等之中的任何一个),其处理各种计算机可执行指令来控制设备600的操作和实现用于USB驱动程序接口函数的扩展的实施例。作为选择或附加地,设备600能够利用硬件、固件或固定逻辑电路之中的任何一个或组合来实现,其结合一般以612标识的处理和控制电路来实现。虽然没有示出,但是设备600能够包括系统总线或数据传送系统,其耦合设备内的各种组件。系统总线能够包括不同总线结构之中的任何一个或组合,诸如存储总线或存储控制器、外围总线、通用串行总线(USB)和/或利用各种总线结构中的任何一种的处理器或局部总线。
设备600还包括计算机可读媒体614,诸如一个或多个存储组件,其示例包括随机存取存储器(RAM)、非易失性存储器(例如,只读存储器(ROM)、闪存、EPROM、EEPROM等之中的一个或多个)以及磁盘存储设备。磁盘存储设备可以被实现为任何类型的磁或光存储设备,诸如硬盘驱动器、可记录和/或可重写光碟(CD)、任何类型的数字多功能光盘(DVD)等等。设备600也能够包括大容量存储媒体设备616。
计算机可读媒体614提供数据存储机制来存储设备数据604以及各种设备应用618和与设备600的操作方面有关的任何其它类型的信息和/或数据。例如,操作系统620(例如,包括USB核心驱动程序栈)能够利用计算机可读媒体614作为计算机应用来维护并在处理器610上被执行。设备应用618能够包括设备管理器(例如,控制应用、软件应用、信号处理和控制模块、对于特定设备是本机的代码、用于特定设备的硬件抽象层等)。
设备应用618也包括任何系统组件或模块来实现用于USB驱动程序接口函数的扩展的实施例。在这个示例中,设备应用618包括USB客户端函数驱动程序622、复合设备驱动程序624、USB驱动程序接口626和USB集线器驱动程序628。在这个示例中,USB客户端函数驱动程序622、复合设备驱动程序624、USB驱动程序接口626和USB集线器驱动程序628被显示为软件模块和/或计算机应用。作为选择或此外,USB客户端函数驱动程序622、复合设备驱动程序624、USB驱动程序接口626和USB集线器驱动程序628能够作为硬件、软件、固件或其任何组合来实现。
虽然用于USB驱动程序接口函数的扩展的实施例以特定于特性和/或方法的语言进行描述了,但是将明白所附的权利要求书的主题并不一定限于所描述的特定特性或方法。相反,特定特性和方法被披露为用于USB驱动程序接口函数的扩展的示例实现。
Claims (15)
1.一种计算机系统,包括:
USB核心驱动程序栈,其被配置用于计算机指令和数据交换的输入/输出;
由USB核心驱动程序栈暴露的一组USB驱动程序接口,所述USB驱动程序接口包括USB驱动程序接口函数,所述USB驱动程序接口函数被配置来与USB客户端函数驱动程序进行接口,所述USB客户端函数驱动程序对应于一个或多个客户端USB设备;和
用于USB驱动程序接口函数的扩展,所述扩展被USB核心驱动程序栈暴露来与USB客户端函数驱动程序进行接口。
2.如权利要求1所述的系统,其中用于USB驱动程序接口函数的扩展被进一步配置来将USB核心驱动程序栈与遗留的、新的和未来的USB版本的USB客户端函数驱动程序进行接口。
3.如权利要求1所述的系统,进一步包括被配置来注册一个或多个客户端USB设备的个别函数的复合设备驱动程序,并且其中USB核心驱动程序栈被进一步配置来枚举USB客户端函数驱动程序和生成函数句柄,其中每一个函数句柄对应于客户端USB设备的个别函数。
4.如权利要求3所述的系统,其中USB核心驱动程序栈被进一步配置来识别导致运行失败的USB客户端函数驱动程序,所述USB客户端函数驱动程序利用对应于与USB客户端函数驱动程序相关联的客户端USB设备的个别函数的函数句柄是可识别的。
5.如权利要求3所述的系统,其中复合设备驱动程序被进一步配置来将复合设备驱动程序将控制暂停的一个或多个客户端USB设备的个别函数通知USB核心驱动程序栈,所述复合设备驱动程序被配置来经由USB驱动程序接口函数的扩展来通知USB核心驱动程序栈。
6.如权利要求1所述的系统,其中USB核心驱动程序栈被进一步配置来实施先检查协议,所述先检查协议指导USB客户端函数驱动程序在经由USB驱动程序接口与USB核心驱动程序栈进行接口之前检查USB驱动程序接口函数的可用性。
7.如权利要求1所述的系统,其中USB核心驱动程序栈被进一步配置来经由USB驱动程序接口函数的扩展从USB客户端函数驱动程序接收合同版本标识符,所述合同版本标识符被配置来指示USB客户端函数驱动程序利用来与USB核心驱动程序栈进行接口的一组操作规则。
8.如权利要求1所述的系统,其中USB核心驱动程序栈被进一步配置来从USB客户端函数驱动程序接收能力版本请求,并返回USB核心驱动程序栈支持用于USB驱动程序接口函数的扩展的指示。
9.如权利要求1所述的系统,其中USB核心驱动程序栈被进一步配置来动态分配多个数据流队列给端点用于输入/输出,并将句柄数组与多个数据流队列相关联来管理输入/输出。
10.如权利要求1所述的系统,其中USB核心驱动程序栈包括USB主控制器,其被配置来支持用于存储在几乎不连续缓冲区中的缓冲数据的链接的MDL(内存描述符列表)。
11.一种计算机实现的方法,包括:
在USB核心驱动程序栈中管理计算机指令和数据交换的输入/输出;
实现由USB核心驱动程序栈暴露的一组USB驱动程序接口,所述USB驱动程序接口包括USB驱动程序接口函数,所述USB驱动程序接口函数被配置来与USB客户端函数驱动程序进行接口,所述USB客户端函数驱动程序对应于一个或多个客户端USB设备;和
暴露用于USB驱动程序接口函数的扩展,所述扩展被USB核心驱动程序栈暴露来与USB客户端函数驱动程序进行接口;
从USB客户端函数驱动程序接收能力版本请求;
返回USB核心驱动程序栈支持用于USB驱动程序接口函数的扩展的指示;和
经由USB驱动程序接口函数的扩展从USB客户端函数驱动程序接收合同版本标识符,所述合同版本标识符指示USB客户端函数驱动程序利用来与USB核心驱动程序栈进行接口的一组操作规则。
12.如权利要求11所述的计算机实现的方法,进一步包括将复合设备驱动程序将控制暂停的一个或多个客户端USB设备的个别函数通知USB核心驱动程序栈,所述复合设备驱动程序经由USB驱动程序接口函数的扩展通知USB核心驱动程序栈。
13.如权利要求11所述的计算机实现的方法,进一步包括:
枚举USB客户端函数驱动程序;
注册一个或多个客户端USB设备的个别函数;和
生成函数句柄,其中每一个函数句柄对应于客户端USB设备的个别函数。
14.如权利要求11所述的计算机实现的方法,进一步包括:
动态分配多个数据流队列给端点用于输入/输出;和
将句柄数组与多个数据流队列相关联来管理输入/输出。
15.如权利要求11所述的计算机实现的方法,进一步包括实施先检查协议,所述先检查协议指导USB客户端函数驱动程序在经由USB驱动程序接口与USB核心驱动程序栈进行接口之前检查USB驱动程序接口函数的可用性。
Applications Claiming Priority (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/687,775 US8200853B2 (en) | 2010-01-14 | 2010-01-14 | Extensions for USB driver interface functions |
US12/687775 | 2010-01-14 | ||
US12/687,775 | 2010-01-14 | ||
PCT/US2011/020101 WO2011087929A2 (en) | 2010-01-14 | 2011-01-04 | Extensions for usb driver interface functions |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102725744A CN102725744A (zh) | 2012-10-10 |
CN102725744B true CN102725744B (zh) | 2015-05-13 |
Family
ID=44259383
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201180006002.6A Active CN102725744B (zh) | 2010-01-14 | 2011-01-04 | 用于usb驱动程序接口函数的扩展的方法和系统 |
Country Status (3)
Country | Link |
---|---|
US (4) | US8200853B2 (zh) |
CN (1) | CN102725744B (zh) |
WO (1) | WO2011087929A2 (zh) |
Families Citing this family (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9208118B2 (en) * | 2008-06-10 | 2015-12-08 | Lg Electronics Inc. | Communication device, a method of processing signal in the communication device and a system having the communication device |
US8200853B2 (en) | 2010-01-14 | 2012-06-12 | Microsoft Corporation | Extensions for USB driver interface functions |
US8631255B2 (en) * | 2010-07-02 | 2014-01-14 | Intel Corporation | Method, system and apparatus for dynamic buffer management for power saving |
KR20120032102A (ko) * | 2010-09-28 | 2012-04-05 | 삼성전자주식회사 | 유에스비 장치의 전력 절감을 위한 장치 및 방법 |
US9378468B2 (en) * | 2010-12-27 | 2016-06-28 | Sap Se | Generic boxed components for multi-client systems |
JP2014523584A (ja) * | 2011-06-30 | 2014-09-11 | エムシーシーアイ コーポレイション | Usbデバイスのための電力管理モジュール |
WO2013028203A1 (en) | 2011-08-25 | 2013-02-28 | Intel Corporation | Determining, at least in part, one or more respective amounts of buffer memory field |
US8959534B2 (en) | 2012-05-29 | 2015-02-17 | Mcci Corporation | Enabling legacy applications to achieve end-to-end communication with corresponding legacy device services |
US9811319B2 (en) * | 2013-01-04 | 2017-11-07 | Microsoft Technology Licensing, Llc | Software interface for a hardware device |
US9323543B2 (en) | 2013-01-04 | 2016-04-26 | Microsoft Technology Licensing, Llc | Capability based device driver framework |
EP2997760B1 (en) * | 2013-05-16 | 2020-01-08 | Intel Corporation | Apparatus and method of supporting streaming over a protocol adaptation layer (pal) |
CN103778081A (zh) * | 2014-02-11 | 2014-05-07 | 成都卫士通信息安全技术有限公司 | 一种usb外设设备接入控制方法 |
US9063799B1 (en) * | 2014-03-19 | 2015-06-23 | Prophetstor Data Services, Inc. | Method for encapsulating functions for application programming interfaces in a cloud environment |
US9858224B2 (en) * | 2014-08-30 | 2018-01-02 | Microsoft Technology Licensing, Llc | Universal serial bus emulation layer |
CN106294237A (zh) * | 2015-05-12 | 2017-01-04 | 中兴通讯股份有限公司 | 一种通信接口的功能复用方法及装置 |
CN104933161B (zh) * | 2015-06-26 | 2018-03-09 | 飞天诚信科技股份有限公司 | 一种获取来自输入设备的输入数据的方法及装置 |
US9952992B2 (en) * | 2015-07-30 | 2018-04-24 | Dell Products L.P. | Transaction request optimization for redirected USB devices over a network |
CN105912958A (zh) * | 2016-04-01 | 2016-08-31 | 浪潮电子信息产业股份有限公司 | 一种控制外部设备接入的方法及装置 |
US10635816B2 (en) * | 2016-04-04 | 2020-04-28 | Wyse Technology L.L.C. | Restricting reprogramming of a redirected USB device |
US10877921B2 (en) * | 2016-06-01 | 2020-12-29 | Intel Corporation | Methods and apparatus to extend USB-C software support to non-USB-C devices |
US10684906B2 (en) | 2016-06-15 | 2020-06-16 | Microsoft Technology Licensing, Llc | Monitoring peripheral transactions |
US10678494B2 (en) | 2016-06-27 | 2020-06-09 | Qualcomm Incorporated | Controlling data streams in universal serial bus (USB) systems |
US10628172B2 (en) | 2016-06-27 | 2020-04-21 | Qualcomm Incorporated | Systems and methods for using distributed universal serial bus (USB) host drivers |
CN106547606B (zh) * | 2016-10-25 | 2019-07-02 | 交控科技股份有限公司 | 堆栈自检方法及装置 |
US10777201B2 (en) * | 2016-11-04 | 2020-09-15 | Microsoft Technology Licensing, Llc | Voice enabled bot platform |
JP2018081402A (ja) * | 2016-11-15 | 2018-05-24 | キヤノン株式会社 | 画像処理装置、画像処理方法、及びプログラム |
CN107643999A (zh) * | 2017-09-14 | 2018-01-30 | 航天信息股份有限公司 | 一种内置读写模块的通讯方法 |
WO2019172998A1 (en) * | 2018-02-21 | 2019-09-12 | Qualcomm Incorporated | Systems and methods for using distributed universal serial bus (usb) host drivers |
CN108388788B (zh) * | 2018-03-12 | 2019-11-26 | 山东渔翁信息技术股份有限公司 | 一种调用usb key底层库的方法及装置 |
US10742776B1 (en) * | 2019-02-04 | 2020-08-11 | Dell Products L.P. | Accelerating isochronous endpoints of redirected USB devices |
CN110377554B (zh) * | 2019-07-27 | 2021-02-02 | 北京永佳消防技术有限公司 | 一种基于串行通信的多协议数据集成通信装置及方法 |
CN111090427A (zh) * | 2019-12-31 | 2020-05-01 | 北京简约纳电子有限公司 | 一种嵌入式系统中运行时构建usb复合设备的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090006658A1 (en) * | 2007-06-28 | 2009-01-01 | Robert Gough | Deferring peripheral traffic with sideband control |
CN101383621A (zh) * | 2008-09-08 | 2009-03-11 | 北京航空航天大学 | 多射频接口无线接入装置及其频段调控方法 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5951667A (en) * | 1997-01-02 | 1999-09-14 | Intel Corporation | Method and apparatus for connecting expansion buses to a peripheral component interconnect bus |
US7290072B2 (en) * | 1999-10-06 | 2007-10-30 | Igt | Protocols and standards for USB peripheral communications |
US6832273B2 (en) * | 2000-12-21 | 2004-12-14 | Microsoft Corporation | System and method to specify extended configuration descriptor information in USB devices |
US20030184960A1 (en) * | 2002-03-28 | 2003-10-02 | Compaq Information Technologies Group, L.P. | Enumeration, manageability, and security of a KVM extension device |
US7086583B2 (en) * | 2004-01-20 | 2006-08-08 | Standard Microsystems Corporation | Systems and methods for power reduction in systems having removable media devices |
US7802022B2 (en) * | 2004-04-29 | 2010-09-21 | Microsoft Corporation | Generic USB drivers |
US7275118B2 (en) * | 2004-05-19 | 2007-09-25 | Sony Ericsson Mobile Communications Ab | Input/output (I/O) device driver loading method for data processing system of computer, involves communicating secondary I/O device driver to data processing system using primary I/O device driver |
US7912987B2 (en) * | 2005-01-14 | 2011-03-22 | Microsoft Corporation | USB devices in application server environments |
US20060161912A1 (en) * | 2005-01-18 | 2006-07-20 | Barrs John W | Infrastructure for device driver to monitor and trigger versioning for resources |
DE102005044483A1 (de) * | 2005-09-16 | 2007-03-29 | Electronic Thoma Gmbh | Transportierbarer, konfigurierbarer Informationsträger und Verfahren hierzu |
US7522659B2 (en) * | 2005-09-19 | 2009-04-21 | Synopsys, Inc. | Universal serial bus (USB) 2.0 legacy full speed and low speed (FS/LS) mode driver |
US8200853B2 (en) | 2010-01-14 | 2012-06-12 | Microsoft Corporation | Extensions for USB driver interface functions |
-
2010
- 2010-01-14 US US12/687,775 patent/US8200853B2/en active Active
-
2011
- 2011-01-04 CN CN201180006002.6A patent/CN102725744B/zh active Active
- 2011-01-04 WO PCT/US2011/020101 patent/WO2011087929A2/en active Application Filing
-
2012
- 2012-05-04 US US13/464,282 patent/US8504739B2/en active Active
-
2013
- 2013-08-05 US US13/959,482 patent/US9043497B2/en active Active
-
2015
- 2015-05-04 US US14/703,812 patent/US9424225B2/en active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090006658A1 (en) * | 2007-06-28 | 2009-01-01 | Robert Gough | Deferring peripheral traffic with sideband control |
CN101383621A (zh) * | 2008-09-08 | 2009-03-11 | 北京航空航天大学 | 多射频接口无线接入装置及其频段调控方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102725744A (zh) | 2012-10-10 |
US8504739B2 (en) | 2013-08-06 |
WO2011087929A2 (en) | 2011-07-21 |
US20120221751A1 (en) | 2012-08-30 |
US20110173351A1 (en) | 2011-07-14 |
US8200853B2 (en) | 2012-06-12 |
WO2011087929A3 (en) | 2011-11-03 |
US9043497B2 (en) | 2015-05-26 |
US9424225B2 (en) | 2016-08-23 |
US20150317278A1 (en) | 2015-11-05 |
US20130326543A1 (en) | 2013-12-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102725744B (zh) | 用于usb驱动程序接口函数的扩展的方法和系统 | |
US8010828B2 (en) | Method of providing interoperatibility of different network devices capable of error handling and network device using the same | |
EP2845114B1 (en) | Extensible wse hub to support a multi-hop tree of usb hubs or peripherals over a wireless link | |
US20130097339A1 (en) | Communication with input/output system devices | |
CN101937406B (zh) | 一种VxWorks操作系统中实现驱动1394设备的方法和系统 | |
US7827343B2 (en) | Method and apparatus for providing accelerator support in a bus protocol | |
US5454078A (en) | System for sharing name among network adapters by, dynamically linking adapters having same logical name and maintaining linked state of remaining adapters | |
CN101452430B (zh) | 多处理器之间的通信方法与包括多处理器的通信装置 | |
US9537940B2 (en) | Exchange of information between processing servers | |
KR100757229B1 (ko) | 리눅스 시스템상에서 usb 디바이스 드라이버 개발을지원하는 운영체제 자원 진단 장치 및 방법 | |
CN115080479B (zh) | 传输方法、服务器、设备、裸金属实例及基板管理控制器 | |
CN113535319A (zh) | 一种实现多rdma网卡虚拟化的方法、设备及存储介质 | |
CN116643854A (zh) | 一种服务编排方法、装置、流程控制器及任务处理器 | |
CN101411165B (zh) | 利用代理服务器控制嵌入式设备与外部的通信的方法和设备 | |
CN107357603A (zh) | 一种软件加载方法、设备及系统 | |
CN115480934A (zh) | 一种分布式数据处理的方法、装置、设备及储存介质 | |
US6792610B2 (en) | Attaching a device driver to multiple logical devices of one physical device | |
US7127601B2 (en) | System and method for delivering FPGA programming | |
JP2010117867A (ja) | 情報処理装置及びその方法、通信システム、プログラム、記憶媒体 | |
US20030027465A1 (en) | Connection device | |
KR101341885B1 (ko) | 소프트웨어 컴포넌트 합성 시스템 | |
KR102160014B1 (ko) | 혼합 네트워크상에서의 태스크 간 통신 방법 및 시스템 | |
CN111026505B (zh) | 网络设备虚拟化方法及装置 | |
CN115617450A (zh) | 基于Ivshmem的通讯方法、系统、设备及存储介质 | |
KR100810507B1 (ko) | 티브이 시스템의 제어방법 |
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 | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150611 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20150611 Address after: Washington State Patentee after: Micro soft technique license Co., Ltd Address before: Washington State Patentee before: Microsoft Corp. |