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


Управление питанием ACX

В этом разделе рассматривается управление питанием ACX. Сведения о перечислении устройств ACX, запуске и завершении работы и перебалансе устройств см. в разделе перечисление устройств ACX. Общие сведения об ACX см. в расширениях аудиоклассов ACX.

ACX использует поведение питания WDF KMDF PnP. Дополнительные сведения о последовательностях KMDF управления питанием см. в разделе PnP и последовательности обратного вызова управления питанием.

Рекомендуется, чтобы драйверы ACX полностью реализовали управление питанием WDF, например путем реализации структуры WDF_PNPPOWER_EVENT_CALLBACKS. Дополнительные сведения см. в статье о поддержке PnP и управления питанием в драйвере.

Неожиданное отключение устройства ACX

Платформа WDF может вызывать EvtDeviceSurpriseRemoval в любое время, т. е. этот обратный вызов не сериализуется с последовательностью отключения питания. Драйвер WDF не должен предпринимать никаких действий при получении этого обратного вызова, за исключением того, что следует отметить, что устройство было неожиданно удалено.

Последовательность обратных вызовов при неожиданном отключении питания аналогична последовательности для отключения Dx и удаления; WDF не вызывает следующие обратные вызовы на пути неожиданного удаления.

Дополнительные сведения см. в статье о последовательностях обратного вызова PnP и Power Management и использовании очередей ввода-вывода Power-Managed.

Питание схемы ACX и запуск

В любое время можно добавить «динамический» AcxCircuit. Драйвер создает новое дочернее устройство PDO и ассоциирует с ним новый AcxCircuit при обработке обратного вызова WDF PrepareHardware для этого устройства PDO. Время существования «динамической» схемы не связано с временем существования FDO.

Функцию "статический" AcxCircuit можно добавить только при обработке обратного вызова WDF PrepareHardware для конкретного устройства FDO. Время существования "статического" канала привязано к времени существования FDO.

Драйвер ACX также может создавать объекты AcxFactoryCircuit (поставщики каналов) во время последовательности включения питания с помощью функции AcxFactoryCircuitCreate. Объект AcxFactoryCircuit использует динамическое создание цепи для добавления ACXCIRCUITS при запросе ACX. Эта функция очень полезна при создании составных конечных точек, т. е. аудиоконечной точки, состоящей из двух или нескольких acXCIRCUITs, связанных вместе.

Контур ACX определяет следующие обратные вызовы, которые вызываются во время инициализации AcxCircuit/Audio Endpoint.

  • EvtAcxCircuitPrepareHardware: ACX вызывает этот обратный вызов сразу после того, как WDF инициирует свой обратный вызов подготовки оборудования. Это дает драйверу возможность проводить любую «подготовку оборудования», относящуюся к схеме. Этот вызов последовательно обрабатывается ACX. Устройство не находится в состоянии D0 во время этого вызова.

  • EvtAcxCircuitPowerUp: ACX вызывает этот обратный вызов сразу после возвращения из Dx. Этот вызов сериализуется ACX. Устройство находится в D0.

Для составных конечных точек AcxCircuits может дополнительно регистрировать эти коллбеки:

  • EvtAcxCircuitCompositeCircuitInitialize, вызывается в первый раз, когда ACX обнаруживает, что эта ACXCIRCUIT видима, т. е. связанное устройство перешло в состояние D0 и сделало эту цепь видимой для сущностей, внешних по отношению к его собственному стеку. Звуковые интерфейсы схемы по-прежнему находятся в выключенном состоянии.

  • EvtAcxCircuitCompositeInitialize, вызывается каждый раз, когда ACX завершает инициализацию составной конечной точки. После вызова функции обратного вызова ACX включает звуковые интерфейсы этой цепи.

  • EvtAcxCircuitCompositeDeinitialize, вызываемый каждый раз, когда ACX демонтирует составную конечную точку. Драйверы могут не получать этот обратный вызов, если их собственный стек был неожиданно удален или они не могут обрабатывать операции ввода-вывода.

Если они присутствуют, экземпляры потоков восстанавливаются до состояния, в котором они находились до отключения питания.

Отключение питания и удаление схемы ACX

"Dynamic" AcxCircuit можно удалить в любое время, аннулировав и удалив объект устройства, связанный с цепью. Связанный канал можно удалить или отсоединить от удаленного устройства, когда драйвер обрабатывает обратные вызовы WDF PrepareHardware/ReleaseHardware для этого устройства PDO. Как упоминалось выше, время существования "динамического" канала не привязано к времени существования FDO.

"Статическую" AcxCircuit можно удалить только в том случае, если драйвер обрабатывает обратные вызовы WDF PrepareHardware/ReleaseHardware для своего устройства FDO. Время существования "статического" канала привязано к времени существования FDO.

Драйвер может удалить AcxFactoryCircuit (поставщик цепи) в обратных вызовах WDF PrepareHardware/ReleaseHardware. Удаление AcxFactoryCircuit приводит к удалению всех связанных с ним "динамических" AcxCircuit. AcxCircuit(s) также можно удалить, когда менеджер ACX сообщает фабрике цепей удалить определенную цепь, или когда менеджер ACX закрывает свои дескрипторы AcxFactoryCircuit - в этом сценарии ACX закрывает все цепи, связанные с этим дескриптором.

Структура ACX_CIRCUIT_PNPPOWER_CALLBACKS описывает следующие обратные вызовы, которые можно использовать драйвером ACX.

  • EvtAcxCircuitPowerDown: ACX вызывает этот обратный вызов непосредственно перед переходом в состояния Sx/Dx/Stop/Removal/SurpriseRemoval и когда драйвер удаляет цепь. Этот вызов сериализуется посредством ACX. Устройство находится в D0, хотя имейте в виду, что устройство может быть неожиданно удалено в любое время (это означает, что связанное оборудование исчезнет).

  • EvtAcxCircuitReleaseHardware: ACX вызывает этот обратный вызов непосредственно перед тем, как WDF выполняет свой обратный вызов на освобождение аппаратного обеспечения. Это дает водителю возможность сделать любую очистку, пока цепь по-прежнему жива. Этот вызов сериализуется ACX. Устройство не находится в D0, когда этот вызов происходит.

  • EvtWdfObjectContextCleanup: WDF вызывает этот обратный вызов при удалении объекта WDF/ACX. Этот вызов осуществляется синхронно с удалением объекта WDF. Устройство может не находиться в D0 при вызове. Обратный вызов выполняется на пассивном уровне.

  • EvtWdfObjectContextDestroy: WDF вызывает этот обратный вызов после того, как исчезнет последняя ссылка на этот объект. Этот вызов асинхронен с удалением вызова объекта WDF. Устройство может не находиться в D0, когда выполняется данный вызов. Этот обратный вызов вызывается только после того, как последняя ссылка на объект исчезает. Обратный вызов выполняется на <уровне DPC. Точный IRQL зависит от IRQL потока, выпускающего последний ссылочный код.

Управление простоем устройства ACX

ACX использует инфраструктуру управления бездействием WDF. Драйверы ACX используют следующие DDIS WDF для включения управления бездействием:

  • WdfDeviceAssignS0IdleSettings: этот вызов указывает тип времени ожидания простоя и управления простоем. Драйвер ACX может использовать соответствующий параметр для своего устройства.

  • WdfDeviceStopIdle: этот вызов предотвращает переход устройства в режим ожидания. Обратите внимание, что его звонок не блокирует запросы Sx. То есть устройство переходит в Dx независимо от количества активных ссылок на питание, когда система переходит в более низкое состояние питания.

  • WdfDeviceResumeIdle: этот вызов позволяет устройству перезапустить время ожидания простоя.

В сценарии с несколькими стеками и каналами разные стеки могут иметь разные время ожидания простоя. Это связано с различными параметрами питания и требованиями каждого стека, поэтому для них могут быть подходящими разные времена ожидания простоя. Более подробную информацию о технологии multi-stack см. в статье ACX multi stack cross driver communications.

Драйвер ACX и очереди с управлением энергопотребления

WDF поддерживает очереди ввода-вывода, управляемые энергопотреблением. Этот тип очереди полностью интегрирован с управлением питанием WDF. WDF вызывает обратные вызовы очереди на различных этапах последовательности WDF по включению и выключению питания. Дополнительные сведения см. в разделе "Использование очередей ввода-вывода Power-Managed".

Драйверы ACX могут использовать этот тип очереди только в том случае, если драйвер не использует многостадийную функцию (Fx) для одного/нескольких компонентов.

Состояние драйвера ACX и D3Hot / D3Cold (D3)

Звуковые драйверы знают, когда следует переходить в D3Hot или D3Cold на основе информации, доступной в перечислении ACX_DX_EXIT_LATENCY.

typedef enum _ACX_DX_EXIT_LATENCY { 
  AcxDxExitLatencyInstant     = 0,
  AcxDxExitLatencyFast,
  AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;

AcxDxExitLatencyFast соответствует D3Hot (DSP on) и AcxDxExitLatencyResponsive соответствует D3Cold (DSP off).

Звуковые драйверы могут получить значение ACX_DX_EXIT_LATENCY путем вызова функции AcxDeviceGetCurrentDxExitLatency.

WDF знает о возможностях D3Cold драйвера с помощью поля excludeD3Cold WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. Драйвер передает эту структуру в качестве входных данных для WdfDeviceAssignS0IdleSettings.

Драйверы WDF могут вызывать WdfDeviceAssignS0IdleSettings несколько раз, чтобы включить или отключить D3Cold в зависимости от системной среды, т. е. в ответ на ACX. Дополнительные сведения см. в структуре WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS.

Среда управления питанием (PoFx) и время ожидания простоя, управляемого драйвером

управление питанием Component-Level

Обратите внимание, что WDF не поддерживает непосредственно состояния устройства или компонента Fx. Чтобы использовать эти состояния, драйвер должен использовать время простоя, управляемое драйвером. Дополнительные сведения об использовании состояний компонентов устройства Fx и времени ожидания простоя, управляемого драйвером, можно найти в следующих разделах.

Платформа управления питанием (PoFx)

Windows предоставляет платформу управления питанием во время выполнения (PoFx), которая добавляет поддержку управления питанием на уровне компонентов. Компонент или subdevice — это функциональная единица оборудования на устройстве, которое можно включить или переключить на состояние низкой мощности независимо от других компонентов на том же устройстве. Дополнительные сведения см. в разделе "Обзор платформы управления питанием".

См. также

Перечисление устройств ACX

Справочная документация по ACX

Общие сведения о расширениях аудиоклассов ACX

Использование очередей ввода-вывода Power-Managed.

последовательности вызовов PnP и управления питанием