Как определить тип скорости USB-концентратора?

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

Есть ли способ в Windows определить разные скорости USB? Я в основном прошу место, чтобы начать. Заранее спасибо.

Пожалуйста, уточните свой вопрос дальше. "Разные скорости USB" чего? Вы хотите определить скорость передачи данных различных портов USB на данном компьютере?
Хочу уточнить по USB нормальная/полная/высокая/суперскорость (упомянутая в спецификации)
Для получения дополнительной информации вы можете проверить нормальную/полную скорость, используя настройки питания USB-концентраторов/устройств.

Ответы (1)

Поскольку вы используете Windows, вам следует изучить использование Windows Driver Frameworks(WDF). Это эквивалент Windows на libusbPOSIX-совместимых компьютерах.

Справочник по WDF

Просмотрите пример кода (там есть пример драйвера тостера/светлячка) о том, как настроить WDFIOTARGETзаданный идентификатор устройства. Используйте эту реализацию с вашим концентратором, перечислив ее при вставке устройства.

Затем вы захотите отправить IOCTL IOCTL_USB_GET_NODE_INFORMATIONв концентратор, представленный a, WDFIOTARGETчтобы получить USB_NODE_INFORMATIONструктуру.

                                      
(источник: sgi.com )

Справочник IOCTL

USB_NODE_INFORMATION Справочник

Затем выполните извлечение с помощью следующего шаблона доступа:

PUSB_NODE_INFORMATION UsbNodeInfo = NULL;
// retrieve UsbNodeInfo here with your USB_GET_NODE_INFORMATION signal
UCHAR DescriptorType;
DescriptorType = UsbNodeInfo->u.HubInformation.HubDescriptor.bDescriptorType

Справочник по HubInformation

Справочник по дескриптору Hub

Это позволит получить тип дескриптора 0x2A(3.0) или 0x29(2.0 или ниже). Используя эту информацию, вы можете отправить нужное IOCTLустройство на устройство, чтобы потребовать большее количество тока от концентратора, например:

if (DescriptorType == 0x2A) {
    // handle USB 3.0 current specification here
} else {
    // handle USB 2.0 current specification here
}

Надеюсь, этого вам достаточно для начала.

Небольшое исправление - окна, эквивалентные libusb, - это libusb - это уровень абстракции на любой платформе, на которой он работает, а не собственный способ ведения дел.