Udostępnij przez


Wake-Up niespodzianka

Niespodzianka budzi się jest nieoczekiwanym przejściem do D0. Po przejściu urządzenia do stanu D3cold może nastąpić niespodziewane wybudzenie jako efekt uboczny, gdy sterownik innego urządzenia na tej samej szynie zasilającej żąda przejścia z D3cold do D0. Sterownik pierwszego urządzenia musi otrzymywać powiadomienie o niespodziewanym wznawianiu, aby zapobiec pozostaniu urządzenia w stanie niezainicjowanym D0.

Gdy urządzenie przechodzi z D3hot do D3cold, prawdopodobnie robi to, ponieważ źródło zasilania, które dzieli z innymi urządzeniami, zostało wyłączone. Jakiś czas po przejściu tych urządzeń w stan D3cold sterownik dla jednego z urządzeń może zażądać przejścia do D0. W odpowiedzi na to żądanie sterownik magistrali nadrzędnej lub sterownik filtra ACPI włącza źródło zasilania, a wszystkie urządzenia, które współużytkują źródło zasilania, wchodzą w swoje domyślne, włączone stany sprzętowe.

Jedynym sterownikiem urządzenia, który oczekuje tej zmiany stanu zasilania, jest sterownik, który zażądał zmiany. Sterowniki innych urządzeń muszą otrzymywać powiadomienia o tej zmianie, aby mogły prawidłowo zainicjować swoje urządzenia do działania w D0. Tylko sterownik, który może odbierać to powiadomienie, powinien umożliwić wprowadzenie swojego urządzenia w tryb D3cold. W przeciwnym razie sterownik nie będzie wiedział, kiedy urządzenie przejdzie do D0.

Gdy urządzenie jest włączone, wprowadza domyślny, niezainicjowany stan sprzętu. Na przykład specyfikacja PCI Express Base 3.0 definiuje niezainicjowany stan D0, w który urządzenie wchodzi po pierwszym odebraniu zasilania. Definicja tego stanu jest specyficzna dla urządzeń PCI i PCI Express, ale urządzenia łączące się z innymi magistralami są przeznaczone do wprowadzania podobnych stanów sprzętowych po ich włączeniu.

W przypadku urządzenia PCI lub PCI Express, które implementuje wiele funkcji, te funkcje urządzenia prawdopodobnie korzystają z tej samej szyny zasilania. Jednak każda funkcja może mieć oddzielny sterownik, a sterowniki dla tych funkcji raczej nie będą się komunikować bezpośrednio ze sobą. Gdy sterownik dla jednej z tych funkcji żąda zmiany stanu zasilania z D3cold na D0, sterowniki dla innych funkcji nie oczekują tej zmiany. Gdy te inne funkcje odbierają moc, ich sterowniki muszą być powiadamiane, aby można było skonfigurować funkcje tak, aby działały prawidłowo w D0.

Sterownik magistrali wykrywa, kiedy urządzeniu podrzędnemu włączane jest zasilanie. Jeśli sterownik funkcji tego urządzenia nie zażądał przejścia do D0, sterownik magistrali prosi sterownik urządzenia o wysłanie IRP zasilania do siebie (żądanie IRP_MN_SET_POWER ze stanem docelowym = PowerDeviceD0), aby zainicjować urządzenie do działania w trybie D0. Z tego zainicjowanego stanu D0 sterownik urządzenia może następnie zainicjować przejście urządzenia do D3hot. Sterowniki urządzeń mogą otrzymywać powiadomienia o niespodziewanych przejściach do D0 od kierowców autobusów w następujący sposób:

  • Sterowniki urządzeń, które bezpośrednio lub pośrednio rejestrują się jako klienci platformy zarządzania energią w czasie wykonywania (PoFx), otrzymują wywołania zwrotne dotyczące powiadomień.
  • Sterowniki urządzeń, które przygotowały swoje urządzenia do wybudzenia, mają oczekujące żądania IRP_MN_WAIT_WAKE zakończone przez sterowniki magistrali.

Począwszy od systemu Windows 8, sterownik funkcji urządzenia, działający jako właściciel zasad zasilania, może zarejestrować się jako klient PoFx. Gdy kierowca autobusu powiadomi PoFx, że urządzenie doświadczyło niespodziewanego przejścia do D0, PoFx pomaga urządzeniu przejść do zainicjowanego stanu D0, a następnie do D3hot. Po pierwsze, PoFx wywołuje procedurę DevicePowerRequiredCallback sterownika, aby nakłonić sterownik urządzenia do wysłania IRP zasilania D0 w dół stosu urządzenia. Następnie funkcja PoFx wywołuje procedurę DevicePowerNotRequiredCallback sterownika, aby powiadomić sterownik urządzenia, że urządzenie nie musi pozostawać w stanie D0.

Począwszy od Kernel-Mode Driver Framework (KMDF) w wersji 1.11, sterownik KMDF dla urządzenia z jednym składnikiem może pośrednio zarejestrować się w narzędziu PoFx, wywołując metodę WdfDeviceWdmAssignPowerFrameworkSettings . W tym wywołaniu sterownik dostarcza wskaźniki do procedur wywołania zwrotnego, które powiadamiają sterownik o niespodziewanych przejściach do D0. Aby uzyskać więcej informacji, zobacz Obsługa stanów zasilania funkcjonalnego.

Sterownik, który nie rejestruje swojego urządzenia w ramach PoFx, nadal może zostać powiadomiony o niespodziewanym przejściu do D0, jeśli urządzenie jest przygotowane do wybudzania. Gdy kierowcy autobusu włączają zasilanie urządzenia, wypełniają żądanie IRP_MN_WAIT_WAKE kierowcy. W odpowiedzi sterownik inicjuje swoje urządzenie do działania w D0. Urządzenie prawdopodobnie będzie w stanie bezczynności, w takim przypadku sterownik po pewnym czasie przeniesie to urządzenie do D3hot.

Sterownik funkcji, który nie rejestruje się w PoFx i który nie uzbraja swojego urządzenia do wznawiania, nie otrzymuje powiadomienia o niespodziewanym przejściu z D3cold do D0. Urządzenie może spędzać duże ilości czasu w niezainicjowanym stanie D0. W tym stanie wszystkie składniki urządzenia są zwykle włączone. Aby zmniejszyć zużycie energii przez bezczynne urządzenia, sterowniki powinny umożliwić przejście do D3cold tylko wtedy, gdy mogą odbierać powiadomienia o niespodziewanych przejściach do D0.