Драйверы USB на стороне устройства в Windows

Описывает архитектуру стека функций USB.

На USB-устройстве стек функций USB относится к группе драйверов, которые перечисляются диспетчером Plug and Play, когда ACPI создает объект физического устройства USB-устройства (PDO).

В одном устройстве конфигурации USB-устройство может определить один или несколько интерфейсов. Например, протокол MTP для передачи файлов на устройство и с устройства. Составное USB-устройство может поддерживать несколько интерфейсов в одной конфигурации. Стек функций USB создает PDO для каждого интерфейса, а диспетчер PnP загружает драйвер класса, который создает объект устройства-функции (FDO) для этого интерфейса.

Стек функций USB концептуально реализован на следующем изображении:

стек функций USB.

Приложения и службы

  • Все запросы в пользовательском режиме отправляются в предоставленный Корпорацией Майкрософт драйвер класса режима ядра GenericUSBFn.sys. Вы можете создать службу пользовательского режима, которая взаимодействует с GenericUSBFn.sys, отправляя коды управления ввода-вывода (IOCTL), как определено в genericusbfnioctl.h. Дополнительные сведения об этих ioCTL см. в статье Взаимодействие с GenericUSBFn.sys из службы пользовательского режима.

Драйвер класса функций USB

Драйвер класса функций USB реализует функциональные возможности определенного интерфейса (или группы интерфейсов) на USB-устройстве. MTP и IpOverUsb — это примеры драйверов, предоставляемых системой. Драйвер класса может быть реализован исключительно как драйвер в режиме ядра или служба пользовательского режима, связанная с системным драйвером класса GenericUSBFn.sys.

Драйвер класса функций отправляет запросы к контроллеру с помощью драйвера класса функций USB в программные интерфейсы UFX.

Расширение класса функции USB (UFX)

Расширение класса функций USB (UFX) — это системное расширение для платформы драйвера режима ядра (KMDF). USB является стандартной шиной и имеет некоторые необходимые функции и возможности. UFX отвечает за реализацию логики функции USB, которая является общей для всех контроллеров функций USB, а также за обработку и (или) отправку запросов от драйверов класса функций USB. В частности, UFX обрабатывает процесс перечисления устройства и передачи стандартных элементов управления. Чтобы выполнить некоторые из этих операций, UFX необходимо знать о возможностях шины. Эти возможности передаются в UFX при установке интерфейса расширения класса.

UFX предоставляет стандартные ioCTL, которые верхние уровни (драйвер функций USB и службы пользовательского режима) могут использовать для отправки запросов к контроллеру. Кроме того, UFX уведомляет верхние уровни о стандартных запросах, полученных от узла.

Драйвер клиента функции USB

UFX предоставляет абстрактный интерфейс, который согласованно работает на разных контроллерах. Однако контроллеры имеют разные возможности с такими ограничениями, как количество конечных точек, типы конечных точек, низкое энергопотребление, удаленное пробуждение. Например, некоторые контроллеры поддерживают DMA, а другие — нет. Некоторые контроллеры реализуют потоки на оборудовании, в то время как другие контроллеры ожидают, что драйвер будет обрабатывать потоки. По этим причинам в UFX обрабатываются только общие функциональные возможности. Клиентский драйвер обрабатывает передачу данных, управление питанием, поддержку потоков и другие функции, которые зависят от контроллера к контроллеру.

Драйвер клиента функции USB отвечает за реализацию операций, относящихся к контроллеру. К ним относятся реализация передачи данных конечных точек, изменение состояния USB-устройства (сброс, приостановка, возобновление), обнаружение подключения и отсоединения, обнаружение портов и зарядных устройств. Драйвер клиента также отвечает за обработку управления питанием и событий PnP.

Драйвер клиента-функции записывается как драйвер KMDF( Kernel-Mode Driver Framework ) с помощью драйвера класса функций USB для программных интерфейсов UFX.

Корпорация Майкрософт предоставляет встроенные клиентские драйверы функций (UfxChipidea.sys, Ufxsynopsys.sys) для контроллеров ChipIdea и Synopsys.

Драйвер нижнего фильтра USB

Драйвер нижнего фильтра USB поддерживает обнаружение зарядных устройств, если контроллер функции использует встроенные драйверы Synopsys и ChipIdea. Драйвер фильтра управляет зарядкой USB, начиная с обнаружения USB-порта. t должен опубликовать GUID для каждого типа зарядного устройства, который он поддерживает, и список свойств этого зарядного устройства. Если настраивается определенное зарядное устройство, драйвер нижнего фильтра USB определяет список поддерживаемых идентификаторов PropertyID и их соответствующих типов значений, которые могут быть отправлены ему для настройки зарядного устройства. Драйвер также уведомляет стек батареи, когда он может начать зарядку и максимальный объем тока, который может нарисовать устройство. Для клиентских драйверов, отличных от драйверов Synopsys и ChipIdea, логика зарядки может быть реализована в драйвере клиента.

Драйвер класса функций отправляет запрос в UFX с помощью программных интерфейсов для поддержки собственных зарядных устройств.