Поделиться через


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

В этой статье представлен обзор архитектуры стека драйверов универсальной последовательной шины (USB).

На следующем рисунке показана блок-схема архитектуры стека драйверов USB для Windows. На схеме показаны отдельные стеки драйверов USB для USB 2.0 и USB 3.0. Windows загружает стек драйверов USB 3.0, когда устройство подключено к контроллеру xHCI.

Блок-схема архитектуры для стеков драйверов USB 2.0 и 3.0.

Windows загружает стек драйверов USB 2.0 для устройств, подключенных к контроллерам eHCI, oHCI или uHCI. Стек драйверов USB 2.0 поставляется в Windows XP с пакетом обновления 1 (SP1) и более поздними версиями операционной системы Windows.

Стек драйверов USB 3.0

Корпорация Майкрософт создала драйверы USB 3.0 с помощью интерфейсов KMDF. Модель драйвера KMDF снижает сложность и повышает стабильность.

Драйвер хост-контроллера USB 3.0 (Usbxhci.sys)

Драйвер xHCI — это драйвер хост-контроллера USB 3.0. В обязанности драйвера xHCI входят инициализация регистров MMIO и размещение структур данных на основе памяти для оборудования контроллера xHCI, сопоставление запросов на передачу от драйверов верхнего уровня с блоками запросов на передачу и отправка запросов на оборудование. После завершения передачи драйвер обрабатывает события завершения передачи с оборудования и распространяет события в стек драйверов. Он также управляет слотами устройств контроллера xHCI и контекстами конечных точек.

Windows загружает драйвер xHCI в качестве объекта устройства-функции (FDO) в стеке устройств для хост-контроллера.

Расширение хост-контроллера USB (Ucx01000.sys)

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

  • Предоставляет для драйвера xHCI объекты, относящиеся к USB.
  • Предоставляет подпрограммы обратного вызова событий KMDF для драйвера xHCI.
  • Управляет операциями корневого концентратора, связанного с контроллером узла, и управляет ими.
  • Реализует функции, настраиваемые драйвером клиента, такие как связанные многомерные списки, потоки и т. д.

Драйвер USB-концентратора (Usbhub3.sys)

Новый драйвер концентратора в стеке драйверов USB для устройств версии 3.0 использует модель драйвера KMDF. Драйвер концентратора в основном выполняет следующие задачи:

  • Управляет USB-концентраторами и их портами.
  • Перечисляет устройства и другие концентраторы, подключенные к их подчиненным портам.
  • Создает физические объекты устройств (PDO) для перечисленных устройств и концентраторов.

Windows загружает драйвер концентратора в качестве FDO в стеке устройств концентратора. Перечисление устройств и управление концентратором в новом драйвере реализуются с помощью набора конечных машин. Драйвер концентратора использует KMDF для управления питанием и функций PnP. Помимо управления концентратором драйвер концентратора также выполняет предварительные проверки и обработку определенных запросов, отправляемых уровнем драйвера USB-клиента. Например, драйвер концентратора анализирует запрос на выборку конфигурации, чтобы определить, какие конечные точки будут настроены запросом. После анализа информации драйвер концентратора отправляет запрос в расширение USB-контроллера узла или дальнейшую обработку.

Стек драйверов USB 2.0

Windows загружает стек драйверов USB 2.0 для устройств, подключенных к контроллерам eHCI, oHCI или uHCI. Драйверы в стеке драйверов USB 2.0 поставляются в Windows XP с пакетом обновления 1 (SP1) и более поздних версий операционной системы Windows. Стек драйверов USB 2.0 предназначен для упрощения высокоскоростных USB-устройств, как определено в спецификации USB 2.0.

В нижней части стека драйверов USB находится драйвер хост-контроллера. Он состоит из драйвера порта, Usbport.sys и одного или нескольких из трех драйверов miniport, которые работают одновременно. Когда система обнаруживает оборудование контроллера узла, она загружает один из этих драйверов мини-порта. После загрузки драйвер мини-порта загружает драйвер порта, Usbport.sys. Драйвер порта обрабатывает те аспекты обязанностей драйвера контроллера узла, которые не зависят от конкретного протокола.

Драйвер минипорта Usbuhci.sys (интерфейс универсального хост-контроллера) заменяет драйвер мини-класса Uhcd.sys, поставляемый с Windows 2000. Драйвер минипорта Usbohci.sys (открытый интерфейс хост-контроллера) заменяет Openhci.sys. Драйвер Usbehci.sys минипорта поддерживает высокоскоростные USB-устройства и был представлен в Windows XP с пакетом обновления 1 (SP1) и более поздних версий, а также Windows Server 2003 и более поздних версий операционных систем.

Во всех версиях Windows, поддерживающих USB 2.0, операционная система может одновременно управлять хост-контроллерами USB 1.1 и USB 2.0. Всякий раз, когда операционная система обнаруживает наличие контроллера обоих типов, она создает два отдельных узла устройства, по одному для каждого контроллера узла. Windows впоследствии загружает драйвер мини-порта Usbehci.sys для оборудования хост-контроллера, совместимого с USB 2.0, а также Usbohci.sys или Openhci.sys для оборудования, совместимого с USB 1.1, в зависимости от конфигурации системы.

Над драйвером порта находится драйвер шины USB, Usbhub.sys, также известный как драйвер концентратора. Это драйвер устройства для каждого концентратора в системе.

Универсальный родительский драйвер USB общего класса (Usbccgp.sys)

Универсальный родительский драйвер общего класса USB — это предоставленный корпорацией Майкрософт родительский драйвер для составных устройств. Драйвер концентратора перечисляет и загружает родительский составной драйвер, если deviceClass имеет значение 0 или 0xef а numInterfaces больше 1 в дескрипторе устройства. Драйвер концентратора создает совместимый идентификатор для родительского составного драйвера как USB\COMPOSITE. Usbccgp.sys использует подпрограммы модели драйвера Windows (WDM).

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

Usbccgp.sys входит в состав Windows XP с пакетом обновления 1 (SP1) и более поздних версий операционной системы Windows. В Windows 8 драйвер был обновлен для реализации функций приостановки функций и удаленного пробуждения, как определено в спецификации USB 3.0.

Дополнительные сведения см. в разделе Универсальный родительский драйвер USB (Usbccgp.sys).

WinUSB (Winusb.sys)

Windows USB (WinUSB) — это универсальный драйвер, предоставляемый корпорацией Майкрософт для USB-устройств. Архитектура WinUSB состоит из драйвера в режиме ядра (Winusb.sys) и библиотеки динамической компоновки в пользовательском режиме (Winusb.dll). Для устройств, для которых не требуется настраиваемый драйвер функции, Winusb.sys можно установить в стеке устройства в режиме ядра в качестве драйвера функции. Затем процессы в пользовательском режиме могут взаимодействовать с Winusb.sys с помощью набора запросов управления вводом-выводом устройства или путем вызова WinUsb_Xxx функций. Дополнительные сведения см. в разделе WinUSB.

В Windows 8 предоставленный Корпорацией Майкрософт файл сведений (INF) для WinUSB, Winusb.inf, содержит USB-MS_COMP_WINUSB в качестве строки идентификатора устройства. Это позволяет Winusb.sys автоматически загружаться в качестве драйвера функции для тех устройств, которые имеют соответствующий идентификатор, совместимый с WinUSB, в дескрипторе ОС MS. Такие устройства называются устройствами WinUSB. Производители оборудования не обязаны распространять INF-файл для своего устройства WinUSB, что упрощает процесс установки драйвера для конечного пользователя. Дополнительные сведения см. в разделе Устройство WinUSB.

Драйвер USB-клиента

Каждое USB-устройство, составное или не составное, управляется драйвером клиента. Драйвер USB-клиента — это драйвер класса или устройства, который является клиентом стека драйверов USB. К таким драйверам относятся драйверы, относящиеся к классам и устройствам, от корпорации Майкрософт или стороннего поставщика. Список драйверов классов, предоставляемых корпорацией Майкрософт, см. в статье Драйверы для поддерживаемых классов USB-устройств. Драйвер клиента создает запросы для взаимодействия с устройством, вызывая общедоступные интерфейсы, предоставляемые стеком драйверов USB.

Драйвер клиента для составного устройства ничем не отличается от драйвера клиента для несоверстного устройства, за исключением его расположения в стеке драйверов.

Драйвер клиента для не составного устройства расположен непосредственно над драйвером концентратора.

Для составного USB-устройства, которое предоставляет несколько функций и не имеет драйвера родительского класса, Windows загружает универсальный родительский драйвер USB (Usbccgp.sys) между драйвером концентратора и уровнем драйвера клиента. Родительский драйвер создает отдельное PDO для каждой функции составного устройства. Клиентские драйверы (FDO для функций) загружаются над универсальным родительским драйвером. Поставщики могут предоставить отдельный драйвер клиента для каждой функции.

Драйвер USB-клиента может работать в пользовательском режиме или режиме ядра в зависимости от требований драйвера. Драйверы USB-клиента можно записать с помощью процедур KMDF, UMDF или WDM.

Вспомогательные библиотеки для клиентских драйверов

Корпорация Майкрософт предоставляет следующие вспомогательные библиотеки, помогающие драйверам и приложениям в режиме ядра взаимодействовать со стеком драйверов USB:

  • Usbd.sys

    Корпорация Майкрософт предоставляет библиотеку Usbd.sys, которая экспортирует подпрограммы для драйверов USB-клиента. Вспомогательные процедуры упрощают рабочие задачи драйвера клиента. Например, с помощью вспомогательных процедур драйвер КЛИЕНТА USB может создавать блоки запросов USB (URB) для определенных операций, таких как выбор конфигурации, и отправлять их в стек драйверов USB.

  • Usbdex.lib

    Эта вспомогательская библиотека является новой для Windows 8. Библиотека экспортирует подпрограммы в основном для выделения и создания URI. Эти подпрограммы заменяют некоторые устаревшие подпрограммы, экспортированные Usbd.sys. Новые подпрограммы требуют, чтобы драйвер клиента зарегистрировал его в стеке драйверов USB, который поддерживает дескриптор регистрации. Этот дескриптор используется для вызовов других подпрограмм Usbdex.lib. Некоторые urb, выделенные новыми подпрограммами, имеют контекст URB, который USB-драйвер использует для улучшения отслеживания и обработки. Дополнительные сведения см. в разделе Выделение и создание URI.

  • Winusb.dll

    Winusb.dll — это библиотека DLL в пользовательском режиме, которая предоставляет функции WinUSB для взаимодействия с Winusb.sys, которая загружается в качестве драйвера функций устройства в режиме ядра. Приложения используют эти функции для настройки устройства, получения сведений об устройстве и выполнения операций ввода-вывода. Сведения об использовании этих функций см. в статье Как получить доступ к USB-устройству с помощью функций WinUSB.