Поддержка устройств Single-Component с одним или несколькими функциональными состояниями питания

Драйвер KMDF для однокомпонентного устройства может определять одно или несколько функциональных состояний питания для компонента и регистрировать функции обратного вызова, которые вызывает платформа управления питанием (PoFx) при изменении состояния Fx компонента или изменении его активного или простоя. Начиная с версии UMDF 2.0 драйвер UMDF для однокомпонентного устройства может определять одно функциональное состояние питания (F0).

Дополнительные сведения о PoFx см. в статье Обзор платформы управления питанием.

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

  1. Этот шаг предназначен только для драйверов KMDF. Вызовите WdfDeviceWdmAssignPowerFrameworkSettings , чтобы указать параметры power framework, которые WDF использует при регистрации с помощью PoFx. В структуре WDF_POWER_FRAMEWORK_SETTINGS , предоставляемой драйвером при вызове WdfDeviceWdmAssignPowerFrameworkSettings, драйвер может предоставлять указатели на несколько функций обратного вызова. Если драйвер поддерживает только одно функциональное состояние питания (F0), этот шаг является необязательным.

  2. Этот шаг применяется к драйверам KMDF и драйверам UMDF. Вызовите WdfDeviceAssignS0IdleSettings и задайте для поля IdleTimeoutType структуры WDF_DEVICE_POWER_POLICY_IDLE_SETTINGSзначение SystemManagedIdleTimeout или SystemManagedIdleTimeoutWithHint. Это приведет к тому, что WDF будет зарегистрирован в PoFx.

    Для драйверов KMDF при регистрации с помощью PoFx платформа использует сведения, предоставленные драйвером в WDF_POWER_FRAMEWORK_SETTINGS при вызове WdfDeviceWdmAssignPowerFrameworkSettings.

Так как устройство может запускаться несколько раз, например в случае перебалансировки ресурсов, драйвер может выполнить предыдущие действия в функции обратного вызова EvtDeviceSelfManagedIoInit . Если драйвер зарегистрировал функцию обратного вызова EvtDeviceSelfManagedIoInit , платформа вызывает ее один раз для каждого устройства после того, как платформа впервые вызовет функцию обратного вызова EvtDeviceD0Entry драйвера.

Остальная часть сведений в этом разделе относится только к драйверам KMDF.

Включения

Когда драйвер вызывает WdfDeviceWdmAssignPowerFrameworkSettings, он может предоставить указатель на функцию обратного вызова EvtDeviceWdmPostPoFxRegisterDevice .

Платформа вызывает функцию обратного вызова EvtDeviceWdmPostPoFxRegisterDevice драйвера после того, как платформа зарегистрирована в PoFx. Ниже приведен пример типичной последовательности включения питания:

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. EvtDeviceWdmPostPoFxRegisterDevice // Доступен дескриптор PoFx

Драйвер предоставляет обратный вызов EvtDeviceWdmPostPoFxRegisterDevice , если ему необходимо выполнить какие-либо дополнительные операции с помощью POHANDLE для регистрации power Framework. Например, можно указать требования к задержке, месту расположения и пробуждению. Дополнительные сведения о подпрограммах, использующих POHANDLE, см. в разделе Процедуры управления питанием устройств.

Драйвер также может использовать POHANDLE для обмена запросами управления питанием с PoFx:

Выключение питания

WDF вызывает функцию обратного вызова EvtDeviceWdmPrePoFxUnregisterDevice перед удалением указанной регистрации с помощью PoFx.

Драйвер может предоставить указатель на подпрограмму ComponentIdleStateCallback в структуре WDF_POWER_FRAMEWORK_SETTINGS , которую он предоставляет для WdfDeviceWdmAssignPowerFrameworkSettings. PoFx вызывает эту подпрограмму, чтобы уведомить драйвер об ожидающих изменениях состояния питания Fx указанного компонента. В этой процедуре обратного вызова драйвер может выполнять аппаратные операции, связанные с изменением функционального состояния.

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

Драйвер также может предоставить указатель на подпрограмму ComponentIdleConditionCallback в своей WDF_POWER_FRAMEWORK_SETTINGS структуре. PoFx вызывает эту подпрограмму, чтобы уведомить драйвер о том, что компонент неактивный. В этой процедуре драйвер начинает процесс остановки очередей, управляемых питанием, и самостоятельно управляемых операций ввода-вывода:

  1. Вызовите WdfIoQueueStop один раз для каждой из управляемых питанием очередей устройства. В каждом вызове WdfIoQueueStop укажите обратный вызов EvtIoQueueState . Как правило, драйвер вызывает WdfIoQueueStop из компонента ComponentIdleConditionCallback.

  2. Убедитесь, что запросы, отправляемые драйверу из каждой из очередей, управляемых питанием, выполняются быстро. В зависимости от драйвера это может включать в себя некоторые или все из перечисленных ниже действий.

    • Если драйвер не хранит запросы в течение длительного времени и не пересылает их в целевой объект ввода-вывода, который делает это, перейдите к шагу 3.
    • Если драйвер хранит определенные запросы в течение длительного времени, повторно введите эти запросы в очередь вручную. В подпрограмме ComponentActiveConditionCallback драйвер может получить запросы.
    • Если драйвер перенаправляет определенные запросы в целевой объект ввода-вывода, который хранит их в течение длительного времени, отмените эти запросы. Повторно отправьте запросы в ComponentActiveConditionCallback.
  3. После остановки каждой очереди платформа вызывает EvtIoQueueState. Если драйвер останавливает несколько очередей, управляемых питанием, платформа вызывает EvtIoQueueState несколько раз, по одному для каждой очереди.

    Драйвер должен вызывать PoFxCompleteIdleCondition после последнего вызова функции EvtIoQueueState . Например, драйвер может выполнить этот вызов из последнего evtIoQueueState.

    Чтобы определить, какой вызов является последним, драйвер может использовать счетчик для отслеживания количества вызовов EvtIoQueueState платформой. Пример Singlecomp иллюстрирует этот метод. Этот пример доступен начиная с Windows 8 WDK.

Ниже приведен пример типичной последовательности отключения питания:

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

Перезапустите управляемые питанием очереди и самоуправляемые операции ввода-вывода в ComponentActiveConditionCallback.

Если драйвер ранее назывался WdfInterruptReportInactive, повторно включите неактивные прерывания, вызвав WdfInterruptReportActive из componentActiveConditionCallback или ComponentIdleStateCallback.