如何从处于低功耗状态的USB设备获取字符串描述符?

时间:2018-06-25 14:28:40

标签: c++ windows usb ioctl acpi

我试图用C ++编写一个应用程序,其中列出了从USB设备获得的信息。我正在遵循USBView(Github)实用程序的代码。

当设备处于D0功耗状态(完全供电)时,我可以获取字符串描述符,但是当设备进入低功耗状态(D2)时,我不是。

IOCTL IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION返回,错误为“连接到系统的设备不起作用。” USBView实用程序显示,当设备处于低功耗状态时,字符串描述符不可用。

enter image description here

这种行为很奇怪,在USB规范中没有找到任何引用。 我已经检查了2种设备,并且得到了相同的行为。即使处于D2状态,我也可以获取其他描述符,例如设备描述符,BOS描述符等。

当USB设备处于低功耗状态时,是否可以获取字符串描述符? 如果不是,是否有办法暂时将其切换为D0电源状态? 可能的答案是ACPI,但这是一个非常低级的API,我觉得不知所措。 Windows是否提供任何高级API来设置电源状态?

1 个答案:

答案 0 :(得分:1)

USB 2.0规范定义了挂起模式,即总线上没有流量且设备进入睡眠状态以节省功率的状态。由于没有流量,因此无法在挂起模式下向设备请求字符串描述符。在执行此操作之前,您必须先用特殊的信号将其唤醒。

我唯一想到的可能是帮助您禁用“ USB选择性挂起设置”,该功能是Windows的一项功能,通常在不使用设备时将其置于挂起模式。它在“控制面板”的电源设置部分中很深,因此如果您找不到它,请告诉我。

在我看来,即使设备处于选择性挂起状态,您也应该应该能够将其唤醒,以便可以从中获取信息,但是我不确定该怎么做,这可能取决于具体情况设备使用的驱动程序。