Partilhar via


Surpresa Wake-Up

Um despertar inesperado é uma transição inesperada para D0. Depois que um dispositivo entra no D3cold, ele pode ter um despertar inesperado como um efeito colateral quando o driver de outro dispositivo na mesma barra de alimentação solicita uma transição de D3cold para D0. O driver do primeiro dispositivo deve receber uma notificação do despertar surpresa para evitar que o dispositivo permaneça em um estado D0 não inicializado.

Quando um dispositivo passa de D3hot para D3cold, provavelmente o faz porque a fonte de alimentação que partilha com algum número de outros dispositivos foi desligada. Algum tempo depois que esses dispositivos entram em D3cold, o driver de um dos dispositivos pode solicitar uma transição para D0. Em resposta a essa solicitação, o driver de barramento pai ou o driver de filtro ACPI liga a fonte de alimentação e todos os dispositivos que compartilham a fonte de alimentação inserem seus estados de hardware padrão de ativação.

O único driver de dispositivo que espera essa alteração de estado de energia é o driver que solicitou a alteração. Os drivers para os outros dispositivos devem receber notificação dessa alteração para que eles possam inicializar corretamente seus dispositivos para operar em D0. Somente um driver que pode receber esta notificação deve permitir que o seu dispositivo entre no D3cold. Caso contrário, o driver não saberá quando o dispositivo entra em D0.

Quando um dispositivo é ligado, ele entra em um estado de hardware padrão não inicializado. Por exemplo, a especificação PCI Express Base 3.0 define um estado não inicializado D0 que um dispositivo entra quando recebe energia pela primeira vez. A definição desse estado é específica para dispositivos PCI e PCI Express, mas os dispositivos que se conectam a outros barramentos são projetados para entrar em estados de hardware semelhantes quando estão ligados.

No caso de um dispositivo PCI ou PCI Express que implementa várias funções, essas funções do dispositivo provavelmente compartilham o mesmo trilho de alimentação. No entanto, cada função pode ter um driver separado e é improvável que os drivers para essas funções se comuniquem diretamente entre si. Quando o driver para uma dessas funções solicita uma mudança de estado de energia de D3cold para D0, os drivers para as outras funções não esperam essa alteração. Quando essas outras funções recebem energia, seus drivers devem ser notificados para que possam configurar as funções para funcionar corretamente em D0.

Um controlador de barramento deteta quando a alimentação de um dispositivo filho está a ser ligada. Se o driver de função deste dispositivo não solicitou uma transição para D0, o driver de barramento incitará o driver de dispositivo a enviar a si mesmo um IRP de energia D0 (uma solicitação IRP_MN_SET_POWER com estado de destino = PowerDeviceD0) para inicializar o dispositivo para operar em D0. A partir desse estado D0 inicializado, o driver de dispositivo pode iniciar a transição do dispositivo para D3hot. Os drivers de dispositivo podem receber notificações de transições surpresa para D0 de motoristas de ônibus das seguintes maneiras:

A partir do Windows 8, o driver de função de um dispositivo, agindo como o responsável pela política de energia, pode registar-se como um cliente do PoFx. Quando o driver de barramento notifica o PoFx de que o dispositivo sofreu uma transição surpresa para D0, o PoFx ajuda o dispositivo a passar para um estado D0 inicializado e, em seguida, para D3hot. Primeiro, o PoFx chama a rotina DevicePowerRequiredCallback do driver para solicitar que o driver de dispositivo envie um IRP de energia D0 para baixo da pilha de dispositivos. Em seguida, o PoFx chama a rotina DevicePowerNotRequiredCallback do driver para notificar o driver de dispositivo de que o dispositivo não precisa permanecer no estado D0.

A partir do Kernel-Mode Driver Framework (KMDF) versão 1.11, o driver KMDF para um dispositivo de um só componente pode registar-se indiretamente no PoFx chamando o método WdfDeviceWdmAssignPowerFrameworkSettings. Nesta chamada, o driver fornece ponteiros para rotinas de chamada de retorno que notificam o driver sobre transições surpresa para D0. Para obter mais informações, consulte Suportar Estados Funcionais de Energia.

Um driver que não registra seu dispositivo com PoFx ainda pode ser notificado de uma transição surpresa para D0 se o dispositivo estiver armado para despertar. Quando os motoristas de ônibus ligam a energia do dispositivo, eles completam a solicitação de IRP_MN_WAIT_WAKE do motorista. Em resposta, o driver inicializa seu dispositivo para operar em D0. É provável que o dispositivo esteja ocioso, caso em que o driver, depois de algum tempo, moverá este dispositivo para D3hot.

Um driver de função que não se registra com PoFx e que não arma seu dispositivo para despertar não recebe nenhuma notificação de uma transição surpresa de D3cold para D0. O dispositivo pode passar grandes quantidades de tempo em um estado D0 não inicializado. Nesse estado, todos os componentes do dispositivo normalmente são ligados. Para reduzir o consumo de energia por dispositivos ociosos, os drivers devem habilitar a entrada no D3cold somente se puderem receber notificações de transições surpresa para D0.