Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер KMDF для устройства с одним компонентом может определять одно или несколько функциональных состояний питания для компонента и регистрировать функции обратного вызова, которые вызываются платформой управления питанием (PoFx), когда изменяется состояние Fx компонента или его активное/пассивное состояние. Начиная с версии 2.0 UMDF драйвер UMDF для устройства с одним компонентом может определить одно функциональное состояние питания (F0).
For more information about PoFx, see Overview of the Power Management Framework.
Чтобы реализовать поддержку состояния Fx для устройства с одним компонентом, вы должны выполнить указанные ниже действия до или во время первого запуска устройства.
Этот шаг предназначен только для драйверов KMDF. Call WdfDeviceWdmAssignPowerFrameworkSettings to specify the power framework settings that WDF uses when registering with PoFx. In the WDF_POWER_FRAMEWORK_SETTINGS structure that the driver provides when it calls WdfDeviceWdmAssignPowerFrameworkSettings, the driver can provide pointers to several callback functions. Если драйвер поддерживает только одно функциональное состояние питания (F0), этот шаг является необязательным.
Этот шаг применяется к драйверам KMDF и драйверам UMDF. Call WdfDeviceAssignS0IdleSettings and set the IdleTimeoutType field of the WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS structure to SystemManagedIdleTimeout or SystemManagedIdleTimeoutWithHint. Doing so causes WDF to register with PoFx.
For KMDF drivers, when registering with PoFx, the framework uses the information that the driver provided in WDF_POWER_FRAMEWORK_SETTINGS when it called WdfDeviceWdmAssignPowerFrameworkSettings.
Так как устройство может запускаться несколько раз, например в случае перераспределения ресурсов, драйвер может выполнить предыдущие действия в функции обратного вызова EvtDeviceSelfManagedIoInit. If the driver has registered an EvtDeviceSelfManagedIoInit callback function, the framework calls it once for each device, after the framework has called the driver's EvtDeviceD0Entry callback function for the first time.
Оставшаяся часть информации в этом разделе относится только к драйверам KMDF.
Powering Up
When the driver calls WdfDeviceWdmAssignPowerFrameworkSettings, it can provide a pointer to a EvtDeviceWdmPostPoFxRegisterDevice callback function.
The framework calls the driver's EvtDeviceWdmPostPoFxRegisterDevice callback function after the framework has registered with PoFx. Ниже приведен пример типичной последовательности включения:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- EvtDeviceWdmPostPoFxRegisterDevice // PoFx handle is available
The driver provides the EvtDeviceWdmPostPoFxRegisterDevice callback if it must perform any additional operations using the POHANDLE for the power framework registration. For example, it could specify latency, residency, and wake requirements. Дополнительные сведения о процедурах, использующих POHANDLE, см. в процедуры управления энергопитанием устройств.
Драйвер также может использовать POHANDLE для обмена запросами управления питанием с помощью PoFx:
- To send a power control request to PoFx, the driver provides a EvtDeviceWdmPostPoFxRegisterDevice callback function, and then uses the resulting POHANDLE to call PoFxPowerControl.
- To perform power control operations requested by PoFx, the driver provides a PowerControlCallback callback routine in its WDF_POWER_FRAMEWORK_SETTINGS structure.
Powering Down
WDF calls the EvtDeviceWdmPrePoFxUnregisterDevice callback function before deleting a specified registration with PoFx.
The driver can provide a pointer to a ComponentIdleStateCallback routine in the WDF_POWER_FRAMEWORK_SETTINGS structure that it provides to WdfDeviceWdmAssignPowerFrameworkSettings. PoFx вызывает эту подпрограмму, чтобы уведомить драйвер о предстоящем изменении состояния питания Fx указанного компонента. В этой процедуре обратного вызова драйвер может выполнять аппаратно-специфичные операции, связанные с изменением функционального состояния.
Например, перед переходом компонента в состояние Fx с низкой мощностью драйвер может сохранить состояние оборудования и отключить прерывания и DMA. Драйвер вызывает WdfInterruptReportInactive, чтобы сообщить системе о том, что прерывание больше не активно. Отключение прерываний во время переходов состояния F может снизить общее потребление электроэнергии системы.
The driver can also provide a pointer to a ComponentIdleConditionCallback routine in its WDF_POWER_FRAMEWORK_SETTINGS structure. PoFx вызывает эту подпрограмму, чтобы уведомить драйвер о том, что компонент стал бездействующим. В этой процедуре драйвер начинает процесс остановки очередей, управляемых питанием, и самостоятельного управления операциями ввода-вывода.
Call WdfIoQueueStop once for each of the device’s power-managed queues. In each call to WdfIoQueueStop, supply a EvtIoQueueState callback. Typically, the driver calls WdfIoQueueStop from within ComponentIdleConditionCallback.
Убедитесь, что запросы, которые отправлены драйверу из каждой из очередей с управлением энергопотреблением, выполняются быстро. В зависимости от драйвера это может включать некоторые или все из следующих компонентов:
- Если драйвер не удерживает запросы на длительное время и не перенаправляет их в целевой объект ввода-вывода, который делает это, перейдите к шагу 3.
- Если драйвер удерживает определенные запросы в течение длительного времени, перенесите эти запросы в ручную очередь. In its ComponentActiveConditionCallback routine, the driver can then retrieve the requests.
- Если драйвер перенаправит определенные запросы в целевой объект ввода-вывода, содержащий их в течение длительного времени, отмените эти запросы. Resubmit the requests in ComponentActiveConditionCallback.
При остановке каждой очереди платформа вызывает EvtIoQueueState. If the driver is stopping multiple power-managed queues, the framework calls EvtIoQueueState multiple times, once for each queue.
Драйвер должен вызвать PoFxCompleteIdleCondition после того, как была вызвана последняя функция EvtIoQueueState. For example, the driver could make this call from within the last EvtIoQueueState.
Чтобы определить, какой вызов был последним, драйвер может использовать счетчик, чтобы отслеживать, сколько раз платформа вызвала EvtIoQueueState. Пример Singlecomp иллюстрирует этот метод. Этот пример доступен начиная с Windows 8 WDK.
Ниже приведен пример типичной последовательности выключения питания:
Restart power-managed queues and self-managed I/O operations in ComponentActiveConditionCallback.
If the driver previously called WdfInterruptReportInactive, re-enable inactive interrupts by calling WdfInterruptReportActive from either ComponentActiveConditionCallback or ComponentIdleStateCallback.