USB 硬件验证程序(USB3HWVerifierAnalyzer.exe)

本文介绍用于测试和调试特定硬件事件的 USB 硬件验证程序工具(USB3HWVerifierAnalyzer.exe)。

大多数硬件问题以导致最终用户体验不佳的方式出现,并且通常很难确定确切的故障。 USB 硬件验证程序旨在捕获设备、端口、集线器、控制器或它们的组合中发生的硬件故障。

USB 硬件验证程序可以执行以下任务:

  • 实时捕获硬件事件并显示信息。
  • 生成包含所有事件信息的跟踪文件。
  • 分析现有跟踪文件以获取事件信息。

本文包含以下各节:

获取 USB 硬件验证器分析器工具

USB 硬件验证程序工具包含在 MUTT 软件包的“工具”中,可供下载。

这些工具包包含多个执行压力和传输测试(包括电源转换)和超速测试的工具。 该软件包还包含一个说明文档(可以单独下载)。 本文档简要概述了 MUTT 硬件的类型。 它提供有关应运行的各种测试的分步指南,并建议控制器、中心、设备和 BIOS/UEFI 测试的拓扑。

如何使用 USB 硬件验证程序捕获事件

若要使用硬件验证程序捕获事件,请执行以下步骤:

  1. 通过在提升的命令提示符处运行此命令来启动会话。

    USB3HWVerifierAnalyzer.exe
    

    该工具支持以下选项:

    选项 DESCRIPTION
    -v <VendorID> 记录指定 VendorID 的所有硬件验证程序事件。
    -p <ProductID> 记录指定 ProductID 的所有硬件验证程序事件。
    -f <ETL 文件> 分析指定的 ETL 文件。 不支持实时分析。 使用此选项,该工具将脱机分析文件。
    /v 输出 向控制台显示所有事件。
  2. 运行要为其捕获硬件事件的测试方案。

    在会话期间,USB 硬件验证程序在发生硬件事件时捕获有关硬件事件的信息。 如果要筛选特定硬件的事件,请指定硬件的 VendorId 和 ProductId。 该工具可能无法捕获设备完全枚举之前发生的一些事件信息(如 VID/PID)。 在会话结束时生成的详细报告中提供了缺少的信息(下一步讨论)。

    注释

    AllEvents ETL 文件将始终包含所有设备的所有 ETW 事件。 它不受 -v-p 开关的影响。

    下面是按 VendorId 和 ProductId 进行筛选的命令行:

    USB3HWVerifierAnalyzer.exe -v 0781 -p 5595
    

    下面是硬件验证程序工具的示例输出:

    Session Name : TraceSessionFriJan271351112023
    
    Attempting to start session TraceSessionFriJan271351112023...
    Trace Session created...Status : 0
    
    Provider Enable Success, Status : 0
    
    Provider Enable Success, Status : 0
    
    Provider Enable Success, Status : 0
    
    Provider Enable Success, Status : 0
    
    Provider Enable Success, Status : 0
    
    Provider Enable Success, Status : 0
    13319329877.425596: (UsbHub3/179)
            Event Message: Client Initiated Recovery Action
            VendorID/ProductID: 0x5e3/0x612
            DeviceInterfacePath: \??\USB#VID_05E3&PID_0612#6&130491ac&0&4#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
            DeviceDescription: Generic SuperSpeed USB Hub
            PortPath:  0x12, 0x4, 0x0, 0x0, 0x0, 0x0
    
    Provider disable Success, Status : 0
    
    Provider disable Success, Status : 0
    
    Provider disable Success, Status : 0
    
    Provider disable Success, Status : 0
    
    Provider disable Success, Status : 0
    
    Provider disable Success, Status : 0
    
    Session Stopped...Status : 0
    
  3. 按 Ctrl+C 停止会话。

    会话结束时,当前目录中会添加一个名为 AllEvents.etl 的文件。 此文件包含有关会话期间捕获的所有事件的跟踪信息。

    除了 AllEvents.etl,命令窗口还显示报表。 报告包含实时输出中错过的某些信息。 以下输出显示了上述会话的示例测试报告。 报告显示 USB 硬件验证程序遇到的所有事件。

    Record #1 (Key = 0x57ff0de4858)
      VendorID/ProductID: 0x451/0x2077
      DeviceInterfacePath: \??\USB#VID_0451&PID_2077#6&c4be011&0&2#{f18a0e88-c30c-11d0-8815-00a0c906bed8}
      DeviceDescription: Generic USB Hub
      PortPath:  0x2, 0x0, 0x0, 0x0, 0x0, 0x0
      All errors encountered:
    #1: (UsbHub3/176): DescriptorValidationError20HubPortPwrCtrlMaskZero
    #2: (UsbHub3/179): Client Initiated Recovery Action
    #3: (UsbHub3/179): Client Initiated Recovery Action
    #4: (UsbHub3/179): Client Initiated Recovery Action
    #5: (UsbHub3/179): Client Initiated Recovery Action
    #6: (UsbHub3/179): Client Initiated Recovery Action
    #7: (UsbHub3/179): Client Initiated Recovery Action
    #8: (UsbHub3/179): Client Initiated Recovery Action
    #9: (UsbHub3/179): Client Initiated Recovery Action
    #10: (UsbHub3/179): Client Initiated Recovery Action
    #11: (UsbHub3/179): Client Initiated Recovery Action
    #12: (UsbHub3/179): Client Initiated Recovery Action
    #13: (UsbHub3/179): Client Initiated Recovery Action
    #14: (UsbHub3/179): Client Initiated Recovery Action
    
    Record #2 (Key = 0x57ff62a36a8)
      VendorID/ProductID: 0x1058/0x740
      DeviceInterfacePath: \??\USB#VID_1058&PID_0740#57583931453631414E5A3331#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
      DeviceDescription: USB Mass Storage Device
      PortPath:  0x2, 0x4, 0x0, 0x0, 0x0, 0x0
      All errors encountered:
    #1: (UsbHub3/173): SuperSpeed Device is Connected on the 2.0 Bus
    
    Record #3 (Key = 0x57ff79fd4e8)
      VendorID/ProductID: 0x1edb/0xbd3b
      PortPath:  0x3, 0x0, 0x0, 0x0, 0x0, 0x0
      All errors encountered:
    #1: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #2: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #3: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #4: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #5: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #6: (UsbHub3/176): DescriptorValidationErrorCompanionIsochEndpointWBytesPerIntervalTooLarge
    #7: (UsbHub3/176): DescriptorValidationErrorStringMismatchBetweenBlengthAndBufferLength
    #8: (UsbHub3/176): DescriptorValidationErrorStringMismatchBetweenBlengthAndBufferLength
    
    

    在前面的示例报告中,记下每个记录的 字段值。 报表按这些 值对信息进行分类,以便更易于阅读。 AllEvents.etl 中捕获的事件使用相同的 值。

  4. 运行以下命令,将 AllEvents.etl 转换为文本格式:

    USB3HWVerifierAnalyzer.exe -f AllEvents.etl /v > Output.txt 
    

    在输出文件中,搜索前面记录的 值。 这些值与以下字段之一相关联: fid_UcxControllerfid_HubDevicefid_UsbDevice

  5. 在 Netmon 中打开 AllEvents.etl,然后选择“ 添加 <field_name> 以显示筛选器 ,按控制器、中心和设备筛选事件。 有关详细信息,请参阅 如何安装 Netmon 和 USB ETW 分析程序

USB 硬件验证程序标志

表明...
DeviceHwVerifierClientInitiatedResetPipe 客户端驱动程序通过重置特定管道来响应 I/O 故障并启动恢复操作。 某些客户端驱动程序在其他情况下可能会执行错误恢复。
设备硬件验证器客户端发起重置端口 客户端驱动程序通过重置设备来响应 I/O 故障,启动恢复操作。 某些客户端驱动程序在其他情况下可能会执行错误恢复。
设备硬件验证器客户启动循环端口 客户端驱动程序通过端口循环启动了恢复操作。 此标志会导致即插即用管理器重新枚举设备。
设备硬件验证器设置等时性延迟故障 USB 3.0 设备的“SET_ISOCH_DELAY”请求失败。 设备可能会失败请求,因为驱动程序不需要请求信息或发生暂时性错误。 但是,驱动程序无法区分这些原因。 报表中未捕获此错误。
设备硬件验证器设置选择失败 USB 3.0 设备未能执行“SET_SEL”请求。 设备将请求信息用于链接电源管理(LPM)。 设备可能无法完成请求,因为驱动程序不需要请求信息或出现暂时性错误。 但是,驱动程序无法区分这些原因。 报告中未捕获此错误。
设备硬件验证器枚举时的序列号不匹配 设备在重新枚举期间报告了不同的序列号,而不是在初始枚举期间报告的序列号。 由于重置端口或系统恢复操作,可能会发生重新枚举。
超高速设备在较低速度下工作 USB 3.0 设备运行的总线速度低于 SuperSpeed。
设备硬件验证程序控制传输失败 无法将控制传输到设备的默认终结点。 由于设备或控制器错误,传输可能会失败。 中心日志指示传输失败的 USBD 状态代码。 此标志不包括 SET_SEL 和 SET_ISOCH_DELAY 控制传输中的故障。 这些类型的请求由 DeviceHwVerifierSetIsochDelayFailure 和 DeviceHwVerifierSetSelFailure 标志涵盖。
设备硬件验证程序描述符验证失败 设备返回的描述符不符合 USB 规范。 集线器日志标识了具体的错误。
设备硬件验证接口唤醒能力不匹配 RemoteWake 位在设备中未正确设置。 支持远程唤醒的 USB 3.0 设备还必须支持功能唤醒。 设备通过两种方式指示其对功能唤醒的支持。 第一种方法是通过配置描述符的 bmAttributes 字段,第二种方法是响应针对接口的GET_STATUS请求。 对于非复合设备,RemoteWake 位值必须与目标为接口 0 的GET_STATUS请求返回的值匹配。 对于复合设备,RemoteWake 位必须在至少一个功能中设置为 1。 否则,此标志指示设备在此处报告了相互矛盾的值。
设备硬件验证器总线重新编号 在总线上重新枚举设备。 由于重置端口或系统恢复操作,可能会导致重新枚举的发生。 当设备处于禁用/启用或停止/启动状态时,也会发生重新枚举。
集线器硬件验证器重置次数过多 中心在短时间内经历了过多的重置操作。 即使这些重置成功,中心也不会处理请求,并且会发生重复错误。
HubHwVerifierControlTransferFailure 向集线器默认端点的控制传输失败。 由于设备或控制器错误,传输可能会失败。 集线器日志显示失败的 USBD 状态代码。
集线器硬件验证器中断传输失败 针对中心的中断终结点的数据传输失败。 由于设备或控制器错误,传输可能会失败。 中心日志指示失败的 USBD 状态代码。 如果传输因请求被取消而失败,则不会捕获失败。
HubHwVerifierNoSelectiveSuspendSupport RemoteWake 位未在集线器的配置描述符中设置为 1。
Hub硬件验证器端口重置超时 枚举或重新枚举设备时,端口重置作将超时。未收到端口更改通知,指示端口重置已完成。
HubHwVerifierInvalidPortStatus 根据 USB 规范,目标端口的端口状态无效。 某些设备可能导致中心报告无效状态。
HubHwVerifierPortLinkStateSSInactive 目标端口和下游设备之间的链接处于错误状态。
HubHwVerifierPortLinkStateCompliance 目标端口和下游设备之间的链接处于符合性模式。 在某些涉及系统睡眠恢复的情况下,符合性模式错误是预期的,在这些情况下,不会捕获失败。
HubHwVerifierPortDeviceDisconnected 目标端口上的下游设备不再连接到总线。
HubHwVerifierPortOverCurrent 下游端口报告过流状态。
转接器硬件验证控制器操作失败 连接到目标端口的设备(例如启用设备、配置终结点)的控制器作失败。 不会捕获来自SET_ADDRESS和重置终结点请求的故障。