Admitir Power-Down inactivos en dispositivos Multiple-Component
[Solo se aplica a KMDF]
Un controlador KMDF para un dispositivo de varios componentes puede admitir estados de alimentación inactivos y funcionales. Dado que en este caso el controlador se registra directamente con el marco de administración de energía (PoFx), el controlador debe coordinar los cambios de estado Dx resultantes con PoFx.
Proporcionar la configuración de inactividad de la directiva de energía del dispositivo
Cuando llama a WdfDeviceAssignS0IdleSettings, el controlador debe establecer IdleTimeoutType en DriverManagedIdleTimeout en la estructura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . Además, el controlador debe establecer PowerUpIdleDeviceOnSystemWake en WdfTrue y IdleCaps en IdleCannotWakeFromS0, como se muestra en el ejemplo siguiente.
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS s0IdleSettings;
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&s0IdleSettings,
IdleCannotWakeFromS0);
s0IdleSettings.IdleTimeoutType = DriverManagedIdleTimeout;
s0IdleSettings.PowerUpIdleDeviceOnSystemWake = WdfTrue;
s0IdleSettings.IdleTimeout = 1;
status = WdfDeviceAssignS0IdleSettings(device, &s0IdleSettings);
Transición del estado de trabajo (D0) a Low-Power (Dx)
En EvtDeviceSelfManagedIoInit, el controlador llama a WdfDeviceStopIdle para tomar una referencia de energía, lo que impide que WDF coloque el dispositivo en un estado de baja potencia.
El controlador libera la referencia de energía llamando a WdfDeviceResumeIdle desde su rutina de devolución de llamada DevicePowerRequiredCallback .
Normalmente, el controlador especifica un tiempo de espera de inactividad muy corto para que WDF coloque el dispositivo en un estado de bajo consumo poco después de que se liberen todas las referencias de energía.
Transición de Low-Power (Dx) al estado de trabajo (D0)
En DevicePowerRequiredCallback, el controlador debe llevar el dispositivo al estado de funcionamiento (D0). Para ello, debe aplazar a un subproceso de trabajo una llamada a WdfDeviceStopIdle con el parámetro WaitForD0 establecido en TRUE. Esta llamada de bloqueo a WdfDeviceStopIdleno debe realizarse desde DevicePowerRequiredCallback.
En su lugar, el controlador debe aplazar la llamada de bloqueo a un subproceso de trabajo que se ejecuta en el nivel pasivo y se garantiza que no realice la llamada WdfDeviceStopIdle en el contexto de una rutina de distribución de E/S de una cola administrada por energía.
Si el controlador ha llamado previamente a WdfDeviceInitSetPowerPageable (lo que significa que puede acceder a datos paginables durante las transiciones de energía), el controlador puede llamar a WdfWorkItemCreate para crear un elemento de trabajo de marco. Si el controlador no ha establecido power-pageable, el controlador debe crear su propio subproceso del sistema. Para obtener más información, vea PsCreateSystemThread.
Después de que WdfDeviceStopIdle devuelva, incluso si el método devuelve un error, el controlador debe llamar a PoFxReportDevicePoweredOn.