Compartilhar via


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.