Требования к устройству для единиц расширения класса ВИДЕО USB
В этом разделе описываются некоторые конкретные требования для реализации модуля расширения на устройстве. Если эти требования не выполняются, драйвер класса USB Video Может неправильно работать с модулем расширения.
Дескриптор
Дескриптор единиц расширения должен содержать допустимый уникальный ИДЕНТИФИКАТОР GUID. Этот GUID используется Usbvideo.sys для предоставления свойства, заданного на соответствующем узле расширения. Необходимо создать уникальный GUID для модуля расширения с помощью средства с именем Guidgen.exe, входящего в состав Microsoft Windows SDK.
Идентификаторы свойств в наборе свойств extension Unit (KSPROPERTY_EXTENSION_UNIT) соответствуют аналогичным нумерованным идентификаторам элементов управления единицами расширения, предоставляемым встроенным ПО класса ВИДЕО USB. Доступ к элементам управления модулями расширения можно получить с помощью стандартных запросов KSPROPERTY через интерфейс IKsControl.
Элементы управления в единице расширения, известные как идентификаторы элементов управления единицами расширения, должны непрерывно нумероваться от 1 до некоторого максимального значения n. Если есть пробелы, драйвер класса USB Video не предоставляет элементы управления, которые находятся за пределами пробела. Текущая реализация драйвера видеокласса USB ограничивает количество элементов управления в модуле расширения до 31.
Используйте Property ID=0 (KSPROPERTY_EXTENSION_UNIT_INFO), чтобы получить часть дескриптора единиц расширения, синтаксис которого определяется в спецификации Универсального определения класса устройств последовательной шины для видеоустройств. Эта спецификация доступна на веб-сайте ФОРУМА по реализации USB .
Используйте свойство с идентификатором 1 и выше для отправки запросов к соответствующему элементу управления модуля расширения.
Имейте в виду, что KSPROPERTY_EXTENSION_UNIT_CONTROL (идентификатор свойства = 1) не является реальным свойством. Вместо этого он указывает, что идентификаторы 1 и выше относятся к фактическим идентификаторам элементов управления единицами расширения.
KSPROPERTY_EXTENSION_UNIT_PASS_THROUGH (Property ID=0xffff) не реализован.
В следующем примере кода, взятом из полного примера, показанного в библиотеке DLL-библиотеки модуля расширения, показано, как выполнить запрос KSPROPERTY_EXTENSION_UNIT_INFO:
ExtensionProp.Property.Set = PROPSETID_VIDCAP_EXTENSION_UNIT;
ExtensionProp.Property.Id = KSPROPERTY_EXTENSION_UNIT_INFO;
ExtensionProp.Property.Flags = KSPROPERTY_TYPE_GET |
KSPROPERTY_TYPE_TOPOLOGY;
ExtensionProp.NodeId = m_dwNodeId;
hr = m_pKsControl->KsProperty(
(PKSPROPERTY) &ExtensionProp,
sizeof(ExtensionProp),
(PVOID) pInfo,
ulSize,
&ulBytesReturned);
return hr;
}
Запросы на управление
Устройство должно поддерживать запросы GET_CUR, GET_INFO, GET_LEN, GET_LEN, GET_MIN, GET_MAX, GET_DEF и GET_RES для всех элементов управления Extension Unit в соответствии со спецификацией класса ВИДЕО USB. Если устройство не реализует эти функции, соответствующие свойства не будут доступны в пользовательском режиме.
Во время инициализации устройства драйвер отправляет к устройству следующие запросы управления: GET_INFO, GET_LEN, GET_MIN и GET_MAX. Если какой-либо из этих начальных запросов завершается сбоем, Usbvideo.sys отключает конкретный элемент управления.
Значение, возвращаемое GET_INFO, сообщает драйверу, какие запросы GET и SET допустимы для данного элемента управления. Кроме того, GET_INFO сообщает драйверу, является ли элемент управления асинхронным. Асинхронные запросы поддерживаются конечными точками прерывания состояния.