本文介绍用于测试和调试特定硬件事件的 USB 硬件验证程序工具(USB3HWVerifierAnalyzer.exe)。
大多数硬件问题以导致最终用户体验不佳的方式出现,并且通常很难确定确切的故障。 USB 硬件验证程序旨在捕获设备、端口、集线器、控制器或它们的组合中发生的硬件故障。
USB 硬件验证程序可以执行以下任务:
- 实时捕获硬件事件并显示信息。
- 生成包含所有事件信息的跟踪文件。
- 分析现有跟踪文件以获取事件信息。
本文包含以下各节:
获取 USB 硬件验证器分析器工具
USB 硬件验证程序工具包含在 MUTT 软件包的“工具”中,可供下载。
这些工具包包含多个执行压力和传输测试(包括电源转换)和超速测试的工具。 该软件包还包含一个说明文档(可以单独下载)。 本文档简要概述了 MUTT 硬件的类型。 它提供有关应运行的各种测试的分步指南,并建议控制器、中心、设备和 BIOS/UEFI 测试的拓扑。
如何使用 USB 硬件验证程序捕获事件
若要使用硬件验证程序捕获事件,请执行以下步骤:
通过在提升的命令提示符处运行此命令来启动会话。
USB3HWVerifierAnalyzer.exe
该工具支持以下选项:
选项 DESCRIPTION -v <VendorID> 记录指定 VendorID 的所有硬件验证程序事件。 -p <ProductID> 记录指定 ProductID 的所有硬件验证程序事件。 -f <ETL 文件> 分析指定的 ETL 文件。 不支持实时分析。 使用此选项,该工具将脱机分析文件。 /v 输出 向控制台显示所有事件。 运行要为其捕获硬件事件的测试方案。
在会话期间,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
按 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 中捕获的事件使用相同的 键 值。
运行以下命令,将 AllEvents.etl 转换为文本格式:
USB3HWVerifierAnalyzer.exe -f AllEvents.etl /v > Output.txt
在输出文件中,搜索前面记录的 键 值。 这些值与以下字段之一相关联: fid_UcxController、 fid_HubDevice和 fid_UsbDevice。
在 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和重置终结点请求的故障。 |