Запись драйвера клиента диспетчера политик USB Type-C

Предоставленный корпорацией Майкрософт диспетчер политик USB Type-C отслеживает действия соединителей 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 диспетчер POlicy получает уведомление и отслеживает все дескрипторы концентратора, а также свойства и состояния всех соединителей в каждом концентраторе.
  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 обратного вызова.

См. также: