Suporte a Power-Down ociosos em dispositivos Multiple-Component
[Aplica-se somente ao KMDF]
Um driver KMDF para um dispositivo de vários componentes pode dar suporte a estados de energia ociosos e funcionais. Como nesse caso, o driver se registra diretamente com a PoFx (estrutura de gerenciamento de energia), o driver deve coordenar as alterações de estado Dx resultantes com PoFx.
Fornecendo configurações ociosas da política de energia do dispositivo
Quando ele chama WdfDeviceAssignS0IdleSettings, o driver deve definir IdleTimeoutType como DriverManagedIdleTimeout na estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . Além disso, o driver deve definir PowerUpIdleDeviceOnSystemWake como WdfTrue e IdleCaps como IdleCannotWakeFromS0, conforme mostrado no exemplo a seguir.
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);
Transição do trabalho (D0) para o estado de Low-Power (Dx)
Em EvtDeviceSelfManagedIoInit, o driver chama WdfDeviceStopIdle para fazer uma referência de energia, o que impede o WDF de colocar o dispositivo em um estado de baixa potência.
O driver libera a referência de energia chamando WdfDeviceResumeIdle de sua rotina de retorno de chamada DevicePowerRequiredCallback .
O driver normalmente especifica um tempo limite ocioso muito curto para que o WDF coloque o dispositivo em um estado de baixa potência logo após todas as referências de energia serem lançadas.
Transição do estado de Low-Power (Dx) para Trabalho (D0)
Em DevicePowerRequiredCallback, o driver deve trazer o dispositivo para o estado de trabalho (D0). Para fazer isso, ele deve adiar para um thread de trabalho uma chamada para WdfDeviceStopIdle com o parâmetro WaitForD0 definido como TRUE. Essa chamada de bloqueio para WdfDeviceStopIdlenão deve ser feita de dentro de DevicePowerRequiredCallback.
Em vez disso, o driver deve adiar a chamada de bloqueio para um thread de trabalho que está em execução no nível passivo e tem a garantia de não fazer a chamada WdfDeviceStopIdle no contexto da rotina de expedição de E/S de uma fila gerenciada por energia.
Se o driver tiver chamado anteriormente WdfDeviceInitSetPowerPageable (o que significa que ele pode acessar dados pagináveis durante transições de energia), o driver poderá chamar WdfWorkItemCreate para criar um item de trabalho de estrutura. Se o driver não tiver definido o power pageable, o driver deverá criar seu próprio thread do sistema. Para obter mais informações, consulte PsCreateSystemThread.
Depois que WdfDeviceStopIdle retornar, mesmo que o método retorne um erro, o driver deverá chamar PoFxReportDevicePoweredOn.