Как получить дескриптор строки с устройства USB, которое находится в состоянии низкого энергопотребления?

Я пытаюсь написать приложение на C ++, которое перечисляет информацию, полученную с USB-устройства. Я слежу за USBView (Github) код утилиты для него.

Когда устройство находится в D0 Состояние питания (полностью питание), я могу получить строковые дескрипторы, но когда устройство переходит в состояние низкого энергопотребления (D2), Не я.

IOCTL IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION возвращается с ошибкой «Устройство, подключенное к системе, не работает». Утилита USBView показывает, что строковые дескрипторы недоступны, когда устройство находится в состоянии низкого энергопотребления.

введите описание изображения здесь

Это странное поведение, и нигде в спецификации USB я не нашел ссылку на него.
Я проверил с 2 устройствами, и я получаю такое же поведение. Я могу получить другие дескрипторы, такие как дескриптор устройства, дескриптор BOS и т. Д. Даже в D2 государство.

Есть ли способ получить строковые дескрипторы, когда устройство USB находится в состоянии низкого энергопотребления?
Если нет, есть ли способ на мгновение перевести его в состояние питания D0?
Возможно, ACPI является ответом, но это API очень низкого уровня, который я нахожу подавляющим, чтобы понять. Предоставляет ли Windows какой-либо API высокого уровня для установки состояний питания?

3

Решение

Спецификация USB 2.0 определяет режим ожидания, состояние, когда на шине нет трафика, и устройства переходят в спящий режим для экономии энергии. Поскольку трафика нет, вы не можете запрашивать строковые дескрипторы с устройства в режиме ожидания. Тебе придется разбудить его специальной сигнализацией, прежде чем ты сможешь это сделать.

Единственное, о чем я могу подумать, это может помочь вам — отключить «Выборочную приостановку USB», функцию Windows, которая обычно переводит устройства в режим ожидания, когда они не используются. Это довольно глубоко в части настроек электропитания панели управления, поэтому дайте мне знать, если у вас возникли проблемы с его поиском.

Мне кажется, что вы должны быть в состоянии разбудить устройство, даже если оно находится в режиме выборочной приостановки, чтобы вы могли получить от него информацию, но я не уверен, как именно это сделать, и это, вероятно, зависит от того, какие драйверы вашего устройства использует.

0

Другие решения

Других решений пока нет …