Запись драйвера клиента диспетчера политик USB Type-C
Предоставленный корпорацией Майкрософт диспетчер политик USB Type-C отслеживает действия соединителей USB Type-C. В Windows версии 1809 представлен набор программных интерфейсов, которые можно использовать для записи драйвера клиента в диспетчер политик (в этом разделе называется драйвером клиента PM ). Драйвер клиента может принимать участие в принятии решений политики для соединителей USB Type-C. С помощью этого набора можно написать драйвер экспорта в режиме ядра или драйвер пользовательского режима.
Диспетчер политик получает и координирует сведения из диспетчера соединителей USB (UCM), хост-контроллера USB и функции USB, а также драйвера клиента PM. Если требуется уведомление пользовательского интерфейса, диспетчер политик отправляет запрос в системную оболочку.
Полное представление о драйверах см. в статье Архитектура: проектирование USB Type-C для системы Windows.
Важные API
API PM объявляются в заголовке Usbpmapi.h .
1. Регистрация клиента
- Драйвер клиента вызывает UsbPm_Register для регистрации функций обратного вызова драйвера.
- Драйвер клиента ожидает события из диспетчера политик.
Успешный вызов UsbPm_Register не гарантирует, что драйвер клиента запросил доступ. Когда диспетчер политик будет готов, EVT_USBPM_EVENT_CALLBACK драйвера вызывается с PolicyManagerArrival в качестве данных события, которые указывают на фактически предоставленный доступ.
- Вызов UsbPm_Register возвращает дескриптор регистрации.
Драйвер клиента может получить EVT_USBPM_EVENT_CALLBACK еще до возврата UsbPm_Register .
2. Прибытие концентратора
- При поступлении устройства UCMCX диспетчер POlicy получает уведомление и отслеживает все дескрипторы концентратора, а также свойства и состояния всех соединителей в каждом концентраторе.
- EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с помощью HubArrivalRemoval в качестве данных события. Вызов также содержит дескрипторы концентратора.
- В реализации EVT_USBPM_EVENT_CALLBACK драйвера клиента драйвер вызывает UsbPm_RetrieveHubProperties для получения количества соединителей в концентраторе, а затем вызывает UsbPm_RetrieveConnectorProperties и UsbPm_RetrieveConnectorState для получения дополнительных сведений о каждом соединителе.
3. Изменение состояния соединителя
- Из-за изменения состояния соединителя, например подключения и отсоединения Type-C, согласования контракта PD, диспетчер политик обновляет сведения о состоянии соединителя.
- EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с помощью ConnectorStateChange в качестве данных события. Вызов также содержит дескрипторы соединителя.
- Также вызывается подпрограмма завершения драйвера клиента и выполняет соответствующие действия.
- В реализации EVT_USBPM_EVENT_CALLBACK драйвера клиента драйвер вызывает UsbPm_RetrieveConnectorProperties. С помощью заданного дескриптора соединителя драйвер получает последнее состояние соединителя, проверяет его и может решить обновить локальную копию.
4. Изменение, инициированное драйвером клиента
Чтобы запросить изменение, драйвер клиента вызывает UsbPm_AssignConnectorPowerLevel.
Драйвер клиента может вызывать эту функцию в EVT_USBPM_EVENT_CALLBACK обратного вызова, зарегистрированного с помощью UsbPm_Register.
Диспетчер политик перенаправит запрос в диспетчер соединителей USB (UCM). Драйвер клиента для UcmCx выполняет соответствующее действие, чтобы изменить запрошенное состояние.
EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с помощью ConnectorStateChange в качестве данных события. Вызов также содержит дескриптор соединителя.
Также вызывается подпрограмма завершения драйвера клиента и выполняет соответствующие действия.
В рамках обратного вызова драйвер клиента вызывает UsbPm_RetrieveConnectorState с заданным дескриптором соединителя, чтобы получить последнее состояние соединителя, проверяет его и может обновить локальную копию.
5. Удаление концентратора
- UCM уведомляет диспетчер политик при удалении устройства UcmCx (не отдельного соединителя на устройстве UcmCx). Диспетчер политик удаляет концентратор из коллекции концентраторов.
- Реализация EVT_USBPM_EVENT_CALLBACK драйвера клиента вызывается с hubRemoval в качестве данных события. Вызов также содержит дескриптор концентратора.
- В реализации EVT_USBPM_EVENT_CALLBACK драйвера клиента драйвер клиента выполняет задачи очистки для удаляемого концентратора и соединителей. Драйвер может вызывать UsbPm_RetrieveHubProperties и UsbPm_RetrieveConnectorProperties , чтобы получить свойства концентратора и соединителей.
6. Отмена регистрации клиента
- Драйвер клиента вызывает UsbPm_Deregister , когда драйвер больше не нуждается в уведомлениях.
- Диспетчер политик помечает регистрацию дескриптора клиента как отмененную и не вызывает EVT_USBPM_EVENT_CALLBACK обратного вызова.