Usb ContainerIDs в Windows
В этой статье содержатся сведения о USB ContainerIDдля операционной системы Windows. В ней содержатся рекомендации для производителей устройств для программирования многофункционных USB-устройств, чтобы они были правильно обнаружены Windows.
Пользователи могут воспользоваться всеми возможностями устройств, подключенных к своим компьютерам. Сюда входят многофункционные устройства, такие как сочетание принтера, сканера и устройства копирования. Windows включает поддержку консолидации всех функциональных возможностей одного физического устройства в контейнер устройств. Контейнер устройства — это виртуальное представление физического устройства. Эта консолидация достигается путем назначения свойства ContainerID каждой функции устройства, перечисленной для физического устройства. Назначив одно и то же значение ContainerID каждой функции устройства, Windows распознает, что все функции устройства принадлежат одному физическому устройству.
Все типы устройств, которые подключаются к компьютеру с помощью разных типов шин, могут поддерживать контейнеры устройств. Однако не все типы шины используют один и тот же механизм для создания ContainerID. Для USB-устройств поставщики устройств могут использовать дескриптор ContainerID для описания ContainerID для физического устройства. Дескриптор ContainerID — это дескриптор компонента Microsoft OS, который может храниться в встроенном ПО USB-устройства. Производители USB-устройств должны правильно реализовать эти дескрипторы ContainerID на своих устройствах, чтобы воспользоваться новыми возможностями устройств, доступными в Windows. Производители USB-устройств должны реализовать только один контейнерный идентификатор для каждого физического устройства независимо от того, сколько функций устройства поддерживает устройство.
Дополнительные сведения о консолидации всех функциональных возможностей одного устройства в контейнер устройства см. в разделе "Создание идентификаторов контейнеров".
Дополнительные сведения о дескрипторах ОС Майкрософт для USB-устройств см. в разделе "Дескрипторы ОС Майкрософт" для USB-устройств.
Как создается USB ContainerID
Ниже приведены два способа создания containerID для USB-устройства:
- Производитель USB-устройства указывает ContainerID в встроенном ПО устройства с помощью дескриптора Microsoft OS ContainerID .
- Драйвер USB-концентратора Майкрософт автоматически создает containerID для устройства из сочетания идентификатора продукта устройства (PID), идентификатор поставщика (VID), номер редакции и серийный номер. В этом случае драйвер Microsoft USB Hub создает ContainerID с минимальными функциональными возможностями. Этот метод применяется только к устройствам с уникальным серийным номером.
Содержимое USB ContainerID
USB ContainerID представлен операционной системе в виде универсальной уникальной строки идентификатора (UUID). Идентификатор UUID containerID содержится в дескрипторе ContainerID. Дескриптор ContainerID — это дескриптор компонента Microsoft OS на уровне устройства. Таким образом, если операционная система запрашивает USB ContainerID, поле wValue запроса дескриптора всегда должно быть равно нулю. Дополнительные сведения о дескрипторах функций и дескрипторах компонентов Майкрософт см . в спецификации дескрипторов Microsoft OS 1.0.
Дескриптор ContainerID состоит из раздела заголовка.
Смещение | Поле | Размер | Тип | Описание |
---|---|---|---|---|
0 | dwLength | 4 | Неподписанный DWord | Длина дескриптора ContainerID в байтах. Это поле всегда должно иметь значение 0x18. |
4 | bcdVersion | 2 | BCD | Номер версии дескриптора ContainerID в двоично закодированном десятичном формате (BCD), где каждый из них соответствует цифре. Наиболее значимый байт (MSB) содержит две цифры до десятичной запятой, а наименьший байт (LSB) содержит две цифры после десятичной запятой. Например, версия 1.00 представлена как 0x0100. Это поле всегда должно иметь значение 0x0100. |
6 | wIndex | 2 | Word | Это поле всегда имеет значение 6 для дескрипторов USB ContainerID . |
Дескриптор ContainerID состоит из раздела ContainerID.
Смещение | Поле | Размер | Тип | Описание |
---|---|---|---|---|
0 | bContainerID | 16 | Неподписанный DWord | Данные ContainerID . |
Производители устройств отвечают за обеспечение того, что каждый экземпляр устройства имеет универсально уникальное 16-байтовое значение для ContainerID. Кроме того, устройство должно сообщать одно и то же значение ContainerID при каждом включении. Существует несколько установленных алгоритмов для создания UUID с почти нулевой вероятностью дублирования. Производители устройств могут выбрать алгоритм создания UUID, который лучше всего подходит для своих потребностей. Не имеет значения, какой алгоритм создания UUID используется до тех пор, пока результат является уникальным.
Синтаксис USB ContainerID
Идентификатор контейнера сообщается в стандартном строковом формате UUID {xxxx-xxxx-xxxx-xxxx}. Ниже приведен пример представления встроенного ПО для 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, который форматируется как строка UUID {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID.
UCHAR ExampleContainerIDDescriptor[24] =
{
0x18, 0x00, 0x00, 0x00, // dwLength - 24 bytes
0x00, 0x01, // bcdVersion - 1.00
0x06, 0x00, // wIndex – 6 for a ContainerID
0x0C, 0xB4, 0xA7, 0x2C, // bContainerID -
0xD1, 0x7B, 0x25, 0x4F, // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
0xB5, 0x73, 0xA1, 0x3A, // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
0x97, 0x5D, 0xDC, 0x07 //
}
Обратите внимание на изменение порядка байтов первого 8 байтов при форматировании в виде строки UUID.
Изменения дескриптора ОС Майкрософт
Чтобы сохранить устаревшие функции ContainerID , дескриптор строки ОС Майкрософт содержит поле флагов, которое можно использовать для указания поддержки дескриптора ContainerID .
Текущее определение дескриптора строки ОС Майкрософт включает поле 1-байтовой панели bPad в конце дескриптора, который обычно имеет значение нулю. Для USB-устройств, поддерживающих новый ContainerID, поле bPad переопределено как поле флагов, bFlags. Бит 1 этого поля используется для указания поддержки дескриптора ContainerID . В таблице 3 описаны поля дескриптора строки ОС Майкрософт для USB-устройств.
Поле | Длина (байты) | значение | Описание |
---|---|---|---|
bLength | 1 | 0x12 | Длина дескриптора. |
bDescriptorType | 1 | 0x03 | Тип дескриптора. Значение 0x03 указывает дескриптор строки ОС Майкрософт. |
qwSignature | 14 | "MSFT100" | Поле подписи. |
bMS_VendorCode | 1 | Код поставщика | Код поставщика. |
bFlags | 1 | 0x02 | Бит 0: зарезервирован Бит 1. Поддержка containerID 0. Не поддерживает ContainerID 1. Поддержка ContainerID Биты 2–7: зарезервированы |
В настоящее время доставка USB-устройств, поддерживающих дескриптор ОС Майкрософт, но не поддерживает дескриптор ContainerID , имеет поле bPad для 0x00. Драйвер USB-концентратора не запрашивает такие устройства для дескриптора USB ContainerID .
Представление контейнера мультифункционного устройства USB
ContainerID предоставляет сведения для консолидации устройств с многофункциональными USB-устройствами. На рисунке 1 показано, как все устройства в многофункционном принтере объединяются в один контейнер устройств, когда все отдельные устройства в продукте используют один и тот же Контейнер.
Требования к USB ContainerID HCK
Производители устройств должны убедиться, что каждый экземпляр устройства, который они создают, имеет глобально уникальное значение ContainerID , чтобы Windows успешно консолидировал функциональные возможности каждого многофункционного устройства USB. Комплект сертификации оборудования Windows HardwareWindows включает требование DEVFUND-0034 для USB ContainerID , если он реализован на устройстве. Если устройство реализует USB ContainerID, сертификация оборудования Windows проверяет Идентификатор контейнера в рамках тестов дескриптора ОС Майкрософт и проверяет, является ли значение ContainerID глобально уникальным. Дополнительные сведения об этих требованиях к сертификации оборудования Windows см. на веб-сайте сертификации оборудования Windows.
Рекомендации по реализации USB ContainerID : ниже приведены рекомендации для поставщиков устройств, которые разрабатывают, производят и отправляют USB-устройства:
Узнайте, как Windows улучшает поддержку многофункционных и нескольких транспортных USB-устройств с помощью ContainerID. Мы рекомендуем начать с чтения статьи "Поддержка многофункционных устройств и группирование контейнеров устройств в Windows".
Убедитесь, что серийный номер на каждом USB-устройстве является уникальным. Требование сертификации оборудования Windows указывает, что если устройство содержит серийный номер, серийный номер должен быть уникальным для каждого экземпляра устройства.
Не предоставляйте идентификатор контейнера для USB-устройства, внедренного в систему. Встроенные USB-устройства должны полагаться на параметры BIOS ACPI или дескриптор устройства USB Концентратора для порта.
Убедитесь, что все USB-устройства, подключенные к системе, имеют уникальные значения ContainerID . Не делитесь значениями ContainerID или USB-серийными номерами в строках продуктов.
Убедитесь, что для устройства правильно задана возможность съемных устройств.
Примечание.
Поставщики устройств, добавляющие дескриптор USB ContainerID на ранее предоставленное USB-устройство, должны увеличить номер выпуска устройства (bcdDevice) в дескриптор устройства. Это необходимо, так как драйвер USB-концентратора кэширует дескриптор строки ОС Майкрософт (или отсутствие одного) на основе идентификатора поставщика устройства, идентификатора продукта и номера выпуска устройства. Если номер выпуска устройства не увеличивается, драйвер концентратора не запрашивает USB ContainerID нового устройства, если он ранее перечислил экземпляр устройства с тем же идентификатором поставщика, идентификатором продукта и номером выпуска устройства, который не поддерживал дескриптор USB ContainerID .