Создание клиентского драйвера диспетчера политик USB Type-C

Диспетчер политик USB Type-C от Microsoft отслеживает действия соединителей USB Type-C. Windows версии 1809 представляет набор интерфейсов программирования, которые можно использовать для записи драйвера клиента в Диспетчер политик (называемый драйвером клиента PM в этом разделе). Драйвер клиента может участвовать в принятии решений политики для соединителей USB-Type-C. С помощью этого набора можно написать драйвер экспорта в режиме ядра или драйвер пользовательского режима.

Диспетчер политик получает и координирует сведения от диспетчера соединителей USB (UCM), контроллера USB-хоста, функции USB и вашего клиентского драйвера PM. Если требуется уведомление пользовательского интерфейса, менеджер политик отправляет запрос в системную оболочку.

Архитектурная блочная схема для диспетчера политик USB.

Для полного обзора драйверов см. раздел "Архитектура: проектирование USB Type-C для системы Windows".

Важные API

API-интерфейсы PM объявляются в заголовке Usbpmapi.h.

1. Регистрация клиента

  1. Драйвер клиента вызывает UsbPm_Register для регистрации функций обратного вызова драйвера.
  2. Драйвер клиента ожидает события из диспетчера политик.

    Успешный вызов UsbPm_Register не гарантирует, что драйвер клиента запросил доступ. Когда диспетчер политик готов, EVT_USBPM_EVENT_CALLBACK драйвера вызывается с помощью PolicyManagerArrival в качестве данных события, указывающих на фактический доступ.

  3. Вызов UsbPm_Register возвращает дескриптор регистрации.

    Драйвер клиента может получать EVT_USBPM_EVENT_CALLBACK даже до того, как вернётся UsbPm_Register.

2. Прибытие концентратора

  1. При поступлении устройства UCMCX менеджер политики получает уведомление и отслеживает все обработчики концентратора вместе со свойствами и состояниями всех разъемов на каждом концентраторе.
  2. Драйвер клиента EVT_USBPM_EVENT_CALLBACK вызывается с HubArrivalRemoval в качестве данных события. Вызов также содержит дескриптор концентратора.
  3. В реализации драйвера клиента EVT_USBPM_EVENT_CALLBACKдрайвер вызывает UsbPm_RetrieveHubProperties получить количество соединителей в концентраторе, а затем вызывает UsbPm_RetrieveConnectorProperties и UsbPm_RetrieveConnectorState, чтобы получить дополнительные сведения о каждом соединителе.

3. Изменение состояния соединителя

  1. В связи с изменением состояния соединителя, например, Type-C присоединение или отсоединение, согласование контракта PD, менеджер политик обновляет информацию о состоянии соединителя.
  2. EVT_USBPM_EVENT_CALLBACK вызывается в драйвере клиента с данными события ConnectorStateChange. Вызов также содержит дескриптор соединителя.
  3. Подпрограмма завершения драйвера клиента также вызывается и принимает соответствующие меры.
  4. В реализации драйвера клиента EVT_USBPM_EVENT_CALLBACKдрайвер вызывает UsbPm_RetrieveConnectorProperties. Используя заданный дескриптор соединителя, драйвер получает последнее состояние соединителя, проверяет его и может решить обновить локальную копию.

4. Изменение, инициированное драйвером клиента

  1. Чтобы запросить изменение, драйвер клиента вызывает UsbPm_AssignConnectorPowerLevel.

    Драйвер клиента может вызвать эту функцию в обратном вызове EVT_USBPM_EVENT_CALLBACK, зарегистрированном с помощью UsbPm_Register.

  2. Диспетчер политик перенаправит запрос в диспетчер соединителей USB (UCM). Драйвер клиента для UcmCx принимает соответствующее действие, чтобы изменить запрошенное состояние.

  3. EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с помощью ConnectorStateChange в качестве данных события. Вызов также содержит дескриптор соединительного элемента.

  4. Завершающая подпрограмма клиентского драйвера также вызывается и предпринимает соответствующие действия.

  5. В обратном вызове драйвер клиента вызывает UsbPm_RetrieveConnectorState с заданным дескриптором разъема для получения последнего состояния разъема, проверяет его и может принять решение обновить локальную копию.

5. Удаление концентратора

  1. UCM уведомляет диспетчер политик при удалении устройства UcmCx (а не отдельного соединителя на устройстве UcmCx). Диспетчер политик удаляет хаб из своей коллекции хабов.
  2. Реализация EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с данными события HubRemoval. Вызов также содержит хэндл хаба.
  3. В реализации драйвера клиента EVT_USBPM_EVENT_CALLBACKдрайвер клиента выполняет задачи по очистке для концентраторов и соединителей, которые удаляются. Драйвер может вызывать UsbPm_RetrieveHubProperties и UsbPm_RetrieveConnectorProperties, чтобы получить свойства концентратора и соединителей.

6. Отмена регистрации клиента

  1. Драйвер клиента вызывает UsbPm_Deregister, когда драйвер больше не нуждается в уведомлениях.
  2. Менеджер политики помечает регистрацию клиента как снятую с учёта и не вызывает обратный вызов EVT_USBPM_EVENT_CALLBACK.

См. также