Usando uma interrupção para ativar um dispositivo

Quando um dispositivo faz a transição para um estado de baixa potência, a estrutura desconecta (ou relata como inativa) interrupções que são usadas para tratamento de E/S. A partir do KMDF 1.13 e UMDF 2.0 em execução no Windows 8.1, um driver WDF pode criar um objeto de interrupção de estrutura que permanece ativo quando o dispositivo faz a transição para um estado de baixa potência e, em seguida, pode ser usado para despertar o dispositivo e restaurá-lo para seu estado totalmente em D0.

Se você estiver desenvolvendo um driver WDF para uma plataforma SoC (System on a Chip), poderá usar essa interrupção para despertar um dispositivo que não fornece um mecanismo tradicional de sinalização de ativação. Para usar essa funcionalidade, o dispositivo deve ter suporte de hardware para interrupções de ativação, conforme exposto por meio de ACPI. O driver que cria a interrupção deve ser o proprietário da política de energia do dispositivo.

Quando o dispositivo faz a transição para um estado de baixa potência, a estrutura não desconecta uma interrupção que foi identificada como capaz de ativar. Quando o dispositivo interrompe, a estrutura chama as rotinas de retorno de chamada EvtDeviceD0Entry e EvtInterruptIsr do driver em IRQL = PASSIVE_LEVEL.

Se o driver já criar um objeto de interrupção de nível passivo para tratamento de E/S, recomendamos compartilhar esse mesmo objeto de interrupção para a funcionalidade de ativação. Nesse cenário, a rotina de retorno de chamada EvtInterruptIsr do driver implementa a lógica condicional para executar o tratamento de interrupções relacionadas à E/S, bem como o tratamento de ativação.

No entanto, se o driver usar uma interrupção que exija tratamento no IRQL (DIRQL) do dispositivo, recomendamos criar um objeto de interrupção de estrutura adicional para fornecer a funcionalidade de ativação.

Siga estas etapas para criar um objeto de interrupção com capacidade de ativação no driver KMDF ou UMDF:

  1. Chame WdfDeviceAssignS0IdleSettings, normalmente de EvtDriverDeviceAdd, especificando IdleCanWakeFromS0 no parâmetro IdleCaps .

  2. Opcionalmente, chame WdfDeviceInitSetPowerPolicyEventCallbacks para registrar funções de retorno de chamada de evento descritas em Suporte ao Wake-Up do Sistema.

  3. Chame WDF_INTERRUPT_CONFIG_INIT para inicializar uma estrutura WDF_INTERRUPT_CONFIG . Forneça uma função de retorno de chamada EvtInterruptIsr , a ser chamada no nível passivo. Na estrutura de configuração, defina PassiveHandling e CanWakeDevice como TRUE. Em seguida, chame WdfInterruptCreate da função de retorno de chamada EvtDevicePrepareHardware do driver para criar o objeto de interrupção da estrutura.

  4. Chame WdfDeviceAssignSxWakeSettings para configurar o dispositivo para ativar o sistema de um estado de baixa potência.

    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;
    }
    
  5. Quando o dispositivo faz a transição para um estado de baixa potência, a estrutura não chama EvtInterruptDisable para a interrupção com capacidade de ativação. A estrutura chamará EvtDeviceArmWakeFromS0 se o driver tiver fornecido um.

  6. Quando o dispositivo sinaliza a interrupção de ativação, a estrutura chama a rotina de retorno de chamada EvtDeviceD0Entry do driver.

  7. Se o retorno de chamada EvtDeviceD0Entry do driver retornar êxito, 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 desconectará a interrupção e chamará o retorno de chamada EvtInterruptDisable do driver, se o driver tiver fornecido um.

  8. A estrutura chamará as seguintes rotinas de retorno de chamada de evento de ativação, se o driver tiver fornecido alguma:

  9. A estrutura continua com a sequência normal de retorno de chamada de ativação, conforme descrito em Sequência de Power-Up para um Driver de Função ou Filtro.

Você pode usar a extensão de depurador !wdfkd.wdfinterrupt para mostrar se uma interrupção específica foi configurada para ser compatível com a ativação.

A funcionalidade de interrupção de ativação não pode ser usada em conjunto com a suspensão seletiva de USB.