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


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

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

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

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

Удаление сюрпризов устройств ACX

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

Последовательность обратных вызовов обратного вызова при удалении с помощью power down Dx и удаления удалится, WDF не вызывает следующие обратные вызовы на пути удаления сюрпризов:

Дополнительные сведения см. в разделе PnP и Последовательности обратных вызовов управления питанием и использование очередей ввода-вывода, управляемых питанием.

Питание и запуск канала ACX

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

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

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

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

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

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

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

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

  • 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(s). AcxCircuit(s) также можно удалить, когда диспетчер ACX сообщает фабрике каналов удалить определенный канал или когда диспетчер ACX закрывает его дескрипторы AcxFactoryCircuit - в этом сценарии ACX закрывает все каналы, связанные с этим дескриптором.

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

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

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

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

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

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

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

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

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

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

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

Драйверы ACX и управляемые очереди питания

WDF поддерживает очереди ввода-вывода, управляемые питанием. Этот тип очереди полностью интегрирован с управлением питанием WDF. WDF вызывает обратные вызовы очереди на различных шагах в последовательности WDF для управления питанием и выключением. Дополнительные сведения см. в разделе "Использование очередей ввода-вывода, управляемых power-managed I/O".

Драйверы 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. Драйвер передает эту структуру в качестве входных данных в WdfDeviceAssignS0Idle Параметры.

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

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

Управление питанием на уровне компонентов

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

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

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

См. также

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

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

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

Использование очередей ввода-вывода, управляемых питанием.

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