Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Quando um dispositivo transita para um estado de baixo consumo de energia, a estrutura desconecta (ou relata como inativas) interrupções que são usadas para manipulação de E/S. A partir do KMDF 1.13 e do UMDF 2.0 em execução no Windows 8.1, um driver WDF pode criar um objeto de interrupção do framework que permanece ativo quando o dispositivo entra num estado de baixo consumo de energia, e pode então ser usado para reativar o dispositivo e restaurá-lo para o estado D0 totalmente ligado.
Se você estiver desenvolvendo um driver WDF para uma plataforma System on a Chip (SoC), poderá usar essa interrupção para despertar um dispositivo que não fornece um mecanismo de sinalização de despertar tradicional. Para usar essa funcionalidade, o dispositivo deve ter suporte de hardware para interrupções de despertar, conforme exposto através da ACPI. O driver que cria a interrupção deve ser o proprietário da política de energia do dispositivo.
Quando o dispositivo transita para um estado de baixo consumo de energia, a estrutura não desconecta uma interrupção que foi identificada como compatível com despertar. Quando o dispositivo interrompe, a estrutura chama as rotinas de retorno de chamada do driver, EvtDeviceD0Entry, e EvtInterruptIsr, em IRQL = PASSIVE_LEVEL.
Se o driver já criar um objeto de interrupção de nível passivo para manipulação de E/S, recomendamos compartilhar esse mesmo objeto de interrupção para a funcionalidade de despertar. Nesse cenário, a rotina de retorno de chamada do EvtInterruptIsr implementa lógica condicional para gerir o tratamento de interrupções relacionadas a E/S, bem como a gestão de despertar.
No entanto, se o driver usar uma interrupção que exija manipulação no IRQL (DIRQL) associado ao dispositivo, recomendamos a criação de um objeto de interrupção de framework adicional para fornecer a funcionalidade de despertar.
Siga estas etapas para criar um objeto de interrupção com capacidade de despertar no driver KMDF ou UMDF:
Chame WdfDeviceAssignS0IdleSettings, normalmente a partir de EvtDriverDeviceAdd, especificando IdleCanWakeFromS0 no parâmetro IdleCaps .
Opcionalmente, chame WdfDeviceInitSetPowerPolicyEventCallbacks para registrar as funções de retorno de chamada de eventos descritas em Supporting System Wake-Up.
Chame WDF_INTERRUPT_CONFIG_INIT para inicializar uma estrutura de WDF_INTERRUPT_CONFIG. Forneça uma função de retorno de chamada EvtInterruptIsr para ser chamada ao nível passivo. Na estrutura de configuração, configure PassiveHandling e CanWakeDevice para TRUE. Em seguida, chame WdfInterruptCreate a partir da função de retorno de chamada EvtDevicePrepareHardwaredo driverpara criar o objeto de interrupção da estrutura.
Chame WdfDeviceAssignSxWakeSettings para configurar o dispositivo para despertar o sistema de um estado de baixo consumo de energia.
WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); wakeSettings.DxState = PowerDeviceD3; wakeSettings.UserControlOfWakeSettings = WakeDoNotAllowUserControl; wakeSettings.Enabled = WdfTrue; status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if (!NT_SUCCESS(status)) { Trace(TRACE_LEVEL_ERROR,"WdfDeviceAssignSxWakeSettings failed %x\n", status); return status; }Quando o dispositivo transita para um estado de baixo consumo de energia, a estrutura não chama EvtInterruptDisable para a interrupção com capacidade de despertar. O framework chama EvtDeviceArmWakeFromS0 se o driver tiver implementado um.
Quando o dispositivo sinaliza a interrupção de despertar, a estrutura chama o do motorista EvtDeviceD0Entry rotina de retorno de chamada.
Se o retorno de chamada EvtDeviceD0Entry do driver retornar sucesso, a estrutura chamará o retorno de chamada EvtInterruptIsr do driver no nível passivo. Antes que o manipulador de interrupção retorne, ele deve silenciar a interrupção no controlador de interrupção. Se o driver retornar um código de falha de EvtDeviceD0Entry, a estrutura desconecta a interrupção e chama o do driver EvtInterruptDisable retorno de chamada, se o driver tiver fornecido um.
O framework chama as seguintes rotinas de retorno de chamada para eventos de despertar, se o driver tiver fornecido alguma:
- EvtDeviceDisarmWakeFromS0
- EvtDeviceDisarmWakeFromSx
- EvtDeviceWakeFromS0Triggered
- EvtDeviceWakeFromSxTriggered
A estrutura continua com a sequência de retorno de chamada de ativação normal, conforme descrito na Sequência Power-Up para um Driver de Função ou Filtro.
Você pode usar a extensão do depurador !wdfkd.wdfinterrupt para mostrar se uma interrupção específica foi configurada para ser compatível com ativação.
A funcionalidade de interrupção de despertar não pode ser usada em conjunto com a suspensão seletiva USB.