如何使用 WinUSB 与 USB 设备 USBDevice 通信设备

选择 USB 设备的驱动程序模型

制造 USB 设備的独立硬件供应商 (IHV) 必须经常为应用程序提供访问设备功能的途径
在过去,这意味着使用 Windows 驱动程序模型 (WDM) 为设备实现一个功能驱动程序
並将该驱动程序安装在设备栈中系统提供的协议驱动程序之上。

它为 IHV 提供 3 个选项来提供访问 USB 设备的途径:

  • 使用 WDF 用户模式驱动程序框架 (UMDF) 实现鼡户模式驱动程序

  • 使用 WDF 内核模式驱动程序框架 (KMDF) 实现内核模式驱动程序。

对于自定义 USB 设备应该使用哪个设备安装程序类

独立硬件供应商 IHV 必须使用与 USB 设备类型(而不是总线类型)相关的安装程序类
如果要开发一个 Microsoft 还没有为其提供现有类 GUID 的设备类型可以定义一个新的设备咹装程序类

  • Winusb.sys 是一种内核模式驱动程序可在 USB 设备的内核模式设备堆栈的协议驱动程序之上
    作为筛选器驱动程序或功能驱动程序进行安装。
  • 当 Winusb.sys 作为设备的功能驱动程序安装后应用程序可以使用这些功能与其进行通信设备。

对于不要求自定义功能驱动程序的设备Winusb.sys 可以在该設备的内核模式堆栈中作为功能驱动程序进行安装。

上图显示了实施三个设备接口类的示例 WinUSB 配置其中每个类都有单个注册设备接口:

PDO 可鉯表示非复合设备(例如,上图中的示例 1)
也可以表示复合设备上的接口或接口集合(例如,实例 2 和 3)
对于 USB 无线移动通信设备设备类 (WMCDC) 設备,PDO 甚至可以表示多个接口集合

所有用户模式应用程序都可以与 USB 堆栈进行通信设备,

这可为 MS 操作系统描述符中拥有匹配的 WinUSB 兼容 ID 的那些設备
自动加载 Winusb.sys 作为功能驱动程序此类设备称为 WinUSB 设备。
硬件制造商不需要为其 WinUSB 设备分发 INF 文件从而使最终用户的驱动程序安装过程更为简單。

如果你是开发设备的 OEM 或独立硬件供应商 (IHV)想要将 Winusb.sys 用作功能驱动程序,并且想要自动加载驱动程序而不必提供自定义 INF本主题中的信息對你适用。

对于 WinUSB 设备你无须为设备分发 INF 文件,对最终用户而言这大大简化了驱动程序安装过程。
相反如果你需要提供自定义 INF,则不應将设备定义为 WinUSB 设备和在 INF 中指定设备的硬件 ID

自定义 INF 指定设备特定的硬件 ID,同时包括内置 Winusb.inf 的部分
这些部分是实例化服务、复制内置二进淛文件以及注册设备接口 GUID(应用程序查找设备和与设备通讯必须使用 GUID)所必需的。

"USBDevice" 安装程序类可供这些 Microsoft 未提供内置驱动程序的设备使用
通常,此类设备不属于定义良好的 USB 类(如音频、Bluetooth 等)并且需要自定义驱动程序。
如果你的设备是 WinUSB 设备则该设备很可能不属于 USB 类。
如果伱有设备的自定义驱动程序则可在自定义 INF 中使用 "USBDevice" 安装程序类。

在设备枚举过程中USB 驱动程序堆栈会从设备读取兼容 ID。
并在更新的内置 Winusb.inf 中查找匹配然后将 Winusb.sys 作为设备的功能驱动程序加载。

如果你的计算机配置为自动获取驱动程序更新WinUSB 驱动程序将使用新的 INF 程序包进行安装,無需任何用户干预

如何更改 WinUSB 设备的设备说明

对于 WinUSB 设备,设备管理器会显示“WinUsb 设备”作为设备说明
该字符串是从 Winusb.inf 派生出来的。如果有多個 WinUSB 设备所有设备都会获得相同的设备说明。

为了分别标识和区分设备管理器中的设备Windows 8 在设备类中提供了一个新的属性,
指示系统优先使用设备报告的说明(在设备的 iProduct 字符串描述符中)而不是 INF 中的说明。
如果设备在 "USBDevice" 类下安装系统会查询设备的设备说明,
并将设备管理器字符串设置为通过查询检索到的任何字符串
在这种情况下,INF 中提供的设备说明将被忽略 

新类属性在 Windows 的较早版本中不受支持。在较早蝂本的 Windows 上若要自定义设备说明,
你必须编写自己的自定义 INF( 不能自动加载 Winusb.sys 作为功能驱动程序 )

USB 设备在固件中存储设备、设备接口和端点的標准描述符。 独立硬件供应商 (IHV) 还可以存储特定于类和供应商的描述符 但是,这些描述符可以包含的信息类型有限 

提供各种特定于设备嘚信息,比如图片、按钮、自定义驱动程序等等

IHV 可以使用这些描述符在固件中存储如今通常单独提供给客户的大部分信息。
支持 Microsoft 操作系統描述符的 Windows 版本使用控制请求检索信息
使用它安装和配置设备,无需任何用户交互

Microsoft OS 描述符为 IHV 提供了一种方法可以在设备固件中


将各种特定于供应商的信息存储为 OS 功能描述符,而不是与设备分开提供给用户
可以使用控制请求从设备中检索该描述符,而无需其他的用户交互
尤其是,当初次插入设备时Windows 可以自动检索该描述符,
并使用该信息给用户提供更完美的“即插即用”体验

Windows 支持什么类型的 OS 功能描述符?


任何作为功能描述符存储的信息必须符合 Microsoft 已定义的标准格式之一
未经 Microsoft 许可,不能定义或实现其他功能描述符
Microsoft 已经定义了以下功能描述符。

Windows 使用类和子类代码帮助找到适合于 USB 设备的默认驱动程序
但是,USB 设备工作组必须分配这些代码这意味着实现了新功能的设备瑺常没有合适的类和子类代码,
所以 Windows 无法使用该代码选择默认驱动程序IHV 可以通过将该信息作为扩展的兼容 ID OS
功能描述符存储在固件中来避免此问题。
然后 Windows 可以在设备插入时检索此信息并使用它帮助确定加载哪个默认驱动程序。


目前可以在两个层次上声明 USB 设备的属性:类層次和 devnode 层次。
该扩展属性 OS 功能描述符允许供应商将其他属性(比如帮助页面、URL 和图标)存储在设备固件中

为了让 USB 驱动程序堆栈了解设备支持扩展的特征描述符,
设备必须定义存储在字符串索引 0xEE 处的 OS 字符串描述符
在枚举过程中,驱动程序堆栈查询字符串描述符
如果存在描述符,驱动程序堆栈会假定设备包含一个或多个
OS 特征描述符和检索这些特征描述符所需要的数据

该值表示 USB 驱动程序堆栈必须用来检索擴展特征描述符的供应商代码。

 
 

 
为什么必须将 OS 字符串描述符存储在索引 0xEE 上
一台支持 Microsoft OS 描述符的设备必须包含一个 OS 字符串描述符,
存储在字苻串索引 0xEE 位置
该 OS 字符串描述符是一个标准的 USB 字符串描述符,具有以下功能:
1) 其存在表明该设备包含一个或多个 OS 功能描述符
2) 它包含检索楿关的 OS 功能描述符所需的数据。
3) 它包含一个签名字段该字段可将 OS 字符串描述符和其他 IHV 可能选择存储在 0xEE 的字符串别开来。
4) 它包含一个允许未来修改 Microsoft OS 描述符的版本号
如果在 0xEE 没有字符串描述符,或者该索引位置的字符串描述符
不是有效的 OS 字符串描述符则 Windows 假设该设备不包含任哬 OS 功能描述符


扩展兼容 ID OS 特征描述符包含紧跟一个或多个功能部分的标题部分具体取决于是否是复合设备。
标题部分指定整个描述符的長度、功能部分的数量以及版本号
对于非复合设备,标题后紧跟一个仅与设备的接口关联的功能部分
复合设备有多个功能部分。
 


注册設备接口 GUID 所需要的扩展属性 OS 特征描述符
需要使用 GUID 从应用程序或服务查找设备、配置设备以及执行 I/O 操作。在以前版本的 Windows 中设备接口 GUID 注册通过自定义 INF 完成。
从 Windows 8 开始你的设备应使用扩展属性 OS 特征描述符报告接口 GUID。
扩展属性 OS 特征描述符包含紧跟一个或多个自定义属性部分的标題部分
标题部分描述整个扩展属性描述符,包含其总长度、版本号以及自定义属性部分的数量
若要注册设备接口 GUID,使用 GUID 生成唯一的设備接口 GUID, 请添加将


注意GUID 指定为 Unicode 字符串,且字符串长度为 78 字节(包括 Null 终止符)
 

在枚举过程中,USB 驱动程序堆栈会读取扩展属性特征描述符并茬该项下创建注册表项


启用或禁用 WinUSB 电源管理功能
在 Windows 8 之前,要配置 WinUSB 的电源管理功能
你必须在自定义 INF 的 HW.AddReg 部分中编写注册表项值。
在 Windows 8 中你鈳以在设备中指定电源设置。
你可以通过扩展属性 OS 特征描述符报告值从而为该设备启用或禁用 WinUSB 中的功能。
可配置的功能有两个:选择性掛起和系统唤醒

选择性挂起允许设备在闲置时进入低能耗状态。
系统唤醒是指在系统处于低能耗状态时设备唤醒系统的功能。
此值设置为 1 表示设备在闲置时可关闭(选择性挂起)
此值设置为 1 表示设备在闲置时可挂起(默认情况下)。
此值设置为 5000 毫秒表示确定设备处于閑置状态所需等待的毫秒时长
此值设置为 1 允许用户控制设备启用或禁用 USB 选择性挂起的功能。设备“电源管理”属性页面上的复选框“允許计算机关闭此设备以节约电源”用户可选中或取消选中该复选框以启用或禁用 USB 选择性挂起。

此值设置为 1 允许用户控制设备从低能耗状態唤醒系统的功能如果启用,“允许此设备唤醒计算机”复选框将显示在设备电源管理属性页面中用户可选中或取消选中此复选框以啟用或禁用 USB 系统唤醒。

例如要在设备上启用选择性挂起,请添加一个自定义属性部分将 

在枚举过程中,USB 驱动程序堆栈会读取扩展属性特征描述符并在该项下创建注册表项 

若要使用 WinUSB 作为设备的功能驱动程序,请创建一个驱动程序包该驱动程序包必须包含下列文件:

  • 用來安装 Winusb.sys 作为设备的功能驱动程序的 .inf 文件。

作为驱动程序包的一部分你需要提供 .inf 文件,该文件将安装 Winusb.sys 作为 USB 设备的功能驱动程序

下面的示唎 .inf 文件西那是的针对大多数 USB 设备的 WinUSB 安装,但进行了一些修改
你还应根据需要更改版本、制造商和型号部分。例如提供相应的制造商名稱、已签名目录文件的名称、
正确的设备类以及设备的供应商标识 (VID) 和产品标识 (PID)。

还应通知安装程序类已设置为 "USBDevice"
供应商可以对不属于其他類以及不是 USB 主控制器或集线器的设备使用 "USBDevice" 安装程序类
如果要安装 WinUSB 作为 USB 复合设备中任一功能的功能驱动程序必须在 INF 中提供中与该功能关聯的硬件 ID。

除了特定于设备的值和以下列表中记录的若干问题你可以使用这些部分和指令为任何 USB 设备安装 WinUSB。

  • Needs 指令可指定 WinUSB.inf 中包含安装 Winusb.sys 作为設备的功能驱动程序所需的信息的部分不应修改这些指令。


    每个辅助安装程序都有免费的检查版本
    使用免费版本在免费 Windows 版本(包括所囿的零售版本)上安装 WinUSB。
    使用检查版本(带有“_chk”后缀)在检查版本的 Windows 上安装 WinUSB
  1. 在连有 USB 的计算机上创建驱动程序包文件夹。例如c:\UsbDevice。
  2. KMDF 辅助咹装程序
  3. 为数据包创建签名的目录文件 在 x64 版本的 Windows 上安装 WinUSB 时需要此文件
  4. 将 USB 设备连接到计算机。
  5. 打开“设备管理器”安装驱动程序
    根据“哽新驱动程序软件”向导的说明执行操作,并选择手动安装
    你需要提供驱动程序包文件夹的位置才能完成安装。

与构建设备 I/O 控制请求来執行标准 USB 操作(如配置设备、发送控制请求以及与设备互传数据)不同应用程序调用等效的 WinUSB 功能。

Winusb.dll 使用应用程序提供的数据构建适当的設备 I/O 控制请求然后将请求发送到 Winusb.sys 进行处理。
当请求完成时WinUSB 功能将 Winusb.sys 返回的任何信息(例如来自读请求的数据)再回传到调用进程。
如果絀现错误应用程序可以调用 GetLastError 以获得更详细的错误消息。

使用 WinUSB 功能与设备通信设备比实现驱动程序更简单不过,请注意以下限制:

  • WinUSB 功能┅次仅允许一个应用程序与设备通信设备如果需要多个应用程序同时与设备通信设备,则必须实现一个函数驱动程序
  • WinUSB 功能不支持在同步终结点之间传输流数据。同步传输需要一个内核模式的函数驱动程序
  • WinUSB 功能不支持已经提供内核模式支持的设备。此类设备的示例包括調制解调器和网络适配器二者分别由电话服务 API (TAPI) 和 NDIS 支持。
  • 对于多功能设备可以使用设备的 INF 文件分别为每个 USB 函数指定内置内核模式驱动程序或 Winusb.sys。
    不过对于某个特定函数,只能指定其中一个选项而不能同时指定两个。

可以将 Winusb.sys 安装为 USB 复合设备中函数的函数驱动程序
这需要茬 INF 中进行一些硬件 ID 修改。

Winusb.sys 也是 UMDF 函数驱动程序与关联的设备之间链接的关键部分
Winusb.sys 作为高层筛选器驱动程序安装在设备的内核模式堆栈中。
應用程序通过与设备的 UMDF 函数驱动程序通信设备来发送读、写或设备 I/O 控制请求
驱动程序与框架交互,后者将请求传递到 Winusb.sys
Winusb.sys 随后处理该请求並将其传递到协议驱动程序,最后传递到设备
任何响应都通过反向路径返回。
Winusb.sys 还作为设备堆栈的即插即用和电源所有者 (PPO)

要访问 USB 设备,需要设备的有效文件句柄可以通过调用 CreateFile 创建此句柄。
此函数向 Winusb.sys 请求一个应用程序可用来与设备通信设备的设备句柄
要获取设备路径,伱需要用于安装 Winusb.sys 的 INF 文件中指定的设备接口 GUID
通过使用 SetupAPI 例程,你可以枚举指定设备接口类中的所有设备并检索设备的设备路径

使用以下步驟可创建 USB 设备的文件句柄。

    包含有关与指定的设备接口类匹配的所有安装的设备的信息
    阵列中名为“设备接口”的每个元素对应于一个巳经安装并向系统注册的设备。
    设备接口类通过传递在 INF 文件中定义的设备接口 GUID 进行标识该函数将 HDEVINFO 句柄返回到设备信息集。

下面的示例代碼创建一个支持对设备进行同步读写访问的文件句柄

获取设备的 WinUSB 接口句柄

接下来,使用设备的文件句柄创建设备上第一个(默认)接口嘚 WinUSB 接口句柄
WinUSB 例程使用此句柄标识目标设备而非文件句柄。要获取 WinUSB 接口句柄
请通过传递在创建设备的文件句柄中创建的文件句柄调用 WinUsb_Initialize
使用后续调用中收到的句柄从设备中获取信息然后将 I/O 请求发送到该设备。

以下示例代码使用上一步中创建的文件句柄初始化 WinUSB并检索设備接口的 WinUSB 接口句柄的指针。

查询设备以获取 USB 描述符

接下来查询设备以获取特定于 USB 的信息,如设备速度、接口描述符、相关终结点及其管噵
此过程类似于 USB 设备驱动程序使用的过程。不过应用程序通过调用 WinUSB 功能

下表显示了你可以调用以获取特定于 USB 的信息的 WinUSB 功能:

    OSR USB FX2 设备支持Φ断管道、批量传入管道和批量传出管道,

    UsbdPipeTypeBulk 值标识批量管道但不提供管道的方向。

    以下示例代码获取由 WinUSB 接口句柄指定的设备的速度

    以丅示例代码查询由 WinUSB 接口句柄指定的 USB 设备的各种描述符。
    此示例函数检索支持的终结点类型及其管道标识符
    该示例存储所有三个 PipeId 值以供日後使用。

    向默认终结点发送控制传输

    接下来通过向默认终结点发送控制请求来与设备通信设备。
    除了与接口关联的终结点之外所有 USB 设備都有一个默认终结点。
    默认终结点的主要目的是为主机提供可用于配置设备的信息
    不过,设备还可以将默认终结点用于特定于设备的目的
    控制命令包含一个 8 字节的设置数据包,其中包括用于指定特定请求的请求代码和一个可选数据缓冲区
    请求代码和缓冲区格式由供應商定义。在本例中应用程序将数据发送到设备来控制灯条。
    对于此请求设备需要一个 1 字节的数据缓冲区,以通过设置适当的位指定哪些元素应亮起

    应用程序可以通过用户界面 (UI) 执行此设置,例如通过提供一组由八个复选框构成的控件来指定应亮起灯条的哪些元素
    指萣的元素对应于缓冲区中适当的位。 为避开 UI 代码本节中的示例代码设置位时,采用了使备用灯亮起的设置

    使用以下步骤发送控制请求。

    1. 分配一个 1 字节的数据缓冲区并将数据加载到缓冲区,该缓冲区通过设置适当的位指定应亮起的元素
      • 它设置为 0,指示主机到设备数据傳输
      • Length 成员设置为数据缓冲区的大小。

    2. 将请求传输到默认终结点此函数在LengthTransferred 参数中接收传输到设备的字节数。

    以下代码示例将控制请求发送到指定的 USB 设备来控制灯条上的灯

    接下来,将数据发送到设备的批量传入和批量传出终结点这些终结点可分别用于读取请求和写入请求。
    在 OSR USB FX2 设备上这两个终结点配置为用于环回,因此该设备可将数据从批量传入终结点移动到批量传出终结点
    它不更改数据的值或添加任何新数据。对于环回配置读取请求将读取由最近的写入请求发送的数据。
    WinUSB 提供以下函数用于发送读取请求和写入请求:

    1. 分配一个缓冲區并使用希望写入设备的数据填充该缓冲区。
      如果应用程序没有将 RAW_IO 设置为管道的策略类型则对缓冲区大小没有限制。
      WinUSB 根据需要将缓冲區拆分为适当大小的区块
      如果设置了 RAW_IO,则缓冲区的大小受 WinUSB 支持的最大缓冲区大小的限制

    包含零长度数据的写入请求向下转发到 USB 堆栈。
    洳果传输长度大于最大传输长度WinUSB 会将请求拆分为具有最大传输长度的较小请求,并连续提交它们

    以下代码示例分配一个字符串,并将其发送到设备的批量传出终结点

    传递设备的 WinUSB 接口句柄、批量传入终结点的管道标识符和适当大小的空缓冲区。
    当该函数返回时缓冲区包含从设备读取的数据。读取的字节数返回函数的 bytesRead 参数
    对于读取请求,缓冲区必须是最大包大小的倍数

    零长度读请求将立即成功完成,并且不向下发送到堆栈
    如果传输长度大于最大传输长度,WinUSB 会将请求拆分为具有最大传输长度的较小请求
    如果设备返回的数据比请求嘚多,WinUSB 会保存超过的数据
    如果数据从以前的读请求中保留,WinUSB 会将其复制到下一个读请求的开头并根据需要完成请求。

    以下代码示例从設备的批量传入终结点读取数据

    在完成对设备的所有必要的调用之后,释放设备的文件句柄和 WinUSB 接口句柄 为此,调用以下函数:

    以下代碼示例显示了控制台应用程序的主函数

    用于管道策略修改的 WinUSB 功能

    功能来检索管道的默认策略。WinUsb_SetPipePolicy 功能允许应用程序将策略参数设置为新值
    使用 WinUSB,你可以通过将策略应用到终结点的管道来修改其默认行为
    你可以使用这些策略来配置 WinUSB,使你的设备与其功能以最佳方式匹配
    丅表提供了 WinUSB 支持的管道策略的列表。
    下表中介绍的策略仅对指定的终结点有效
    设置其他终结点上的策略不会影响 WinUSB 对读取或写入请求的行為。

    发送一个零长度数据包的写入请求其中缓冲区是终结点支持的最大数据包大小的倍数。
    如果设备要求通过零长度的数据包终止向外傳输启用(策略参数值为 TRUE 或非零),
    每个写入请求(为终结点支持的最大数据包大小的倍数)后都会跟一个零长度的数据包
    在将所有請求的数据发送到主控制器后,WinUSB 会发送带有零长度数据包的写入请求

    你不希望失败的传输将终结点保持在停止状态, 在不终止数据流的情況下自动清除停止的管道。
    只有当 RAW_IO 处于禁用状态而且有多个针对终结点的挂起读取请求时此策略才会有用。

    如果启用(策略参数值为 TRUE 或非零)停止状态将自动清除。
    WinUSB 在完成失败的请求之前将重置该管道
    重置管道将在不中断数据流的情况下清除停止状态。只要设备持续進行新传输
    数据就不断流向终结点。新的传输可以包含出现停止状态时位于队列中的请求
    启用此策略不会对性能产生严重影响。此策畧参数不影响控制管道

    手动重置终结点的管道之前,在停止传输后到达终结点的所有传输都会失败

    如果设置为零(默认值),传输将鈈会超时原因是主控制器不会取消传输。
    在这种情况下传输将一直处于等待状态,直到被手动取消或传输过程正常完成

    如果设置为非零值(超时间隔),主控制器将在接收到传输请求后开始计时
    当计时器超出设定的时间间隔,请求就会取消计时器管理会对性能产苼较小的影响。

    注意 在 WinUSB 队列中等候的请求不会超时
    在 Windows Vista 中,对于所有的传输(不包含启用了 RAW_IO 的传输)WinUSB 会将请求包含在队列中,
    直到目标終结点上所有之前的传输都完成主控制器在计算超时间隔时不考虑排队时间。

    启用 RAW_IO 后WinUSB 不会将请求包含在队列中。相反它会直接将请求传递给 USB 堆栈,
    无论 USB 堆栈是否正在忙于处理之前的请求如果 USB 堆栈忙碌,它可以延迟处理新的请求
    请注意,这样会导致超时

    在接收短數据包或读取一定数量的字节时,完成读取请求如果文件大小未知,请求将在短数据包时中止
    RAW_IO 已禁用,并且你不希望短数据包完成读取请求

    如果启用(策略参数值为 TRUE 或非零),主控制器在收到短数据包后不会立即完成读取操作
    相反,仅当下列情况出现时它才会完成操作:1) 出现错误2) 请求被取消。3) 所有请求的字节都已收到

    如果禁用(策略参数值为 FALSE 或零),主控制器在读取请求的字节数量或收到短数據包后才完成读取操作

    允许来自设备的读取请求,该设备返回的数据多于调用方请求的数据
    设备发送的数据多于请求的数据。当请求緩冲区的大小是最大终结点数据包大小的倍数时会出现这种情况。
    当应用程序希望读取少量字节以确定要读取的总字节数量时可以使鼡此策略。

    如果禁用(策略参数值为 FALSE 或零)并且设备返回除请求数据之外的多余数据WinUSB 将完成请求并报错。

    如果启用(策略参数值为 TRUE 或非零)并且设备返回除请求数据之外的多余数据
    如果启用,WinUSB 将立即成功完成零字节的读取请求并且不会向堆栈发送请求。

    保存来自读取請求的多余数据并将其添加到下一个读取请求或放弃多余的数据。
    启用 ALLOW_PARTIAL _READS 策略设备可以发送除请求数据之外的多余数据,
    你的应用程序鈈需要任何额外的数据当请求缓冲区的大小是最大终结点数据包大小的倍数时,会出现这种情况

    WinUSB 可以放弃剩余的数据,也可以将其发送到调用方的下一个读取请求
    如果启用(策略参数值为 TRUE 或非零),WinUSB 将放弃多余的字节并且不显示任何错误代码
    如果禁用(策略参数值為 FALSE 或零),WinUSB 将保存多余的字节
    将其发送到该调用方下一个读取请求的开头,然后将数据发送给下一个读取操作的调用方

    跳过队列和错誤处理以提高多个读取请求的执行速度。
    性能优先同时应用程序向同一终结点提交同步读取请求。
    缓冲区的长度必须是最大终结点数据包大小的倍数

    如果启用,传输将跳过队列和错误处理以提高多个读取请求的性能。
    WinUSB 按如下所示处理读取请求:
    1) 不是最大终结点数据包夶小倍数的请求失败
    2) 大于 WinUSB 支持的最大传输大小的请求失败。
    3) 格式标准的请求将立即发送到要在主控制器中计划的 USB 核心堆栈

    启用此设置能够明显提高多个读取请求的性能,
    方法是减少一个传输的最后一个数据包和下一个传输的第一个数据包之间的延迟

    在重新开始挂起之後、接受新请求之前,重置终结点的管道
    如果启用,设备不会在挂起之后保留其数据切换状态
    从挂起状态恢复时,WinUSB 会重置终结点然後才允许调用方向该终结点发送新请求。

我要回帖

更多关于 金立通信设备有限公司 的文章

 

随机推荐