c++ - 如何从处于低功耗状态的 USB 设备获取字符串描述符?
问题描述
我正在尝试用 C++ 编写一个应用程序,其中列出了从 USB 设备获得的信息。我正在关注 USBView ( Github ) 实用程序的代码。
当设备处于D0
电源状态(完全供电)时,我可以获得字符串描述符,但是当设备进入低功耗状态(D2)
时,我不是。
IOCTLIOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION
返回错误“连接到系统的设备未运行”。USBView 实用程序显示当设备处于低功耗状态时字符串描述符不可用。
这种行为很奇怪,我在 USB 规范中没有找到对它的引用。我已经检查了 2 台设备,我得到了相同的行为。D2
即使在状态下,我也能够获得其他描述符,例如设备描述符、BOS 描述符等。
当 USB 设备处于低功耗状态时,有没有办法获取字符串描述符?如果没有,有没有办法暂时将其变为 D0 电源状态?可能 ACPI 是答案,但它是一个非常低级的 API,我发现它难以理解。Windows 是否提供任何高级 API 来设置电源状态?
解决方案
USB 2.0 规范定义了挂起模式,即总线上没有流量并且设备进入睡眠以节省电力的状态。由于没有流量,您无法从处于挂起模式的设备请求字符串描述符。你必须先用特殊的信号唤醒它,然后才能这样做。
我能想到的唯一可能对您有所帮助的是禁用“USB 选择性挂起设置”,这是 Windows 的一项功能,通常在设备不使用时将其置于挂起模式。它在控制面板的电源设置部分非常深入,所以如果您找不到它,请告诉我。
在我看来,即使设备处于选择性挂起状态,您也应该能够唤醒设备,以便您可以从中获取信息,但我不确定如何做到这一点,这可能取决于您设备的驱动程序用途。
推荐阅读
- php - 如何在 Wordpress 中覆盖 PHP 文件?
- python-3.x - 滑动窗口和识别列表中的特定字符
- java - 使用基于枚举值的 AtrributeConverter 转换变量的值
- linux - 不筛选标准输出和标准错误是否占用资源?
- c++ - __VA_ARGS__ 的现代 C++ 替代方案?
- css - 如何使用 ionic 和 sass 检查样式
- android - TileService 不工作,瓷砖变得无响应
- python-3.x - Python 3 中的线程
- multithreading - Taurus 在 Windows 上执行 apachebenchmark 失败
- node.js - 为什么 Puppeteer 需要 --no-sandbox 在 Cloud Functions 中启动 Chrome