Utilisation d’une interruption pour réveiller un appareil

Lorsqu’un appareil passe à un état de faible consommation d’énergie, l’infrastructure se déconnecte (ou signale comme inactifs) les interruptions utilisées pour la gestion des E/S. À compter de KMDF 1.13 et UMDF 2.0 exécutés sur Windows 8.1, un pilote WDF peut créer un objet d’interruption de framework qui reste actif lorsque l’appareil passe à un état de faible consommation, puis peut être utilisé pour réveiller l’appareil et le restaurer à son état complet sur D0.

Si vous développez un pilote WDF pour une plateforme Système sur puce (SoC), vous pouvez utiliser une telle interruption pour réveiller un appareil qui ne fournit pas de mécanisme de signalisation d’éveil traditionnel. Pour utiliser cette fonctionnalité, l’appareil doit disposer d’une prise en charge matérielle des interruptions de veille, telles qu’exposées via ACPI. Le pilote qui crée l’interruption doit être le propriétaire de la stratégie d’alimentation de l’appareil.

Lorsque l’appareil passe à un état de faible consommation d’énergie, l’infrastructure ne déconnecte pas une interruption qui a été identifiée comme étant compatible avec la veille. Lorsque l’appareil s’interrompt, l’infrastructure appelle les routines de rappel EvtDeviceD0Entry et EvtInterruptIsr du pilote à IRQL = PASSIVE_LEVEL.

Si votre pilote crée déjà un objet d’interruption de niveau passif pour la gestion des E/S, nous vous recommandons de partager ce même objet d’interruption pour la fonctionnalité de veille. Dans ce scénario, la routine de rappel EvtInterruptIsr du pilote implémente une logique conditionnelle pour effectuer la gestion des interruptions liées aux E/S, ainsi que la gestion du réveil.

Toutefois, si votre pilote utilise une interruption qui nécessite une gestion au niveau de l’IRQL (DIRQL) de l’appareil, nous vous recommandons de créer un objet d’interruption d’infrastructure supplémentaire pour fournir des fonctionnalités de veille.

Procédez comme suit pour créer un objet d’interruption compatible avec la veille dans votre pilote KMDF ou UMDF :

  1. Appelez WdfDeviceAssignS0IdleSettings, généralement à partir d’EvtDriverDeviceAdd, en spécifiant IdleCanWakeFromS0 dans le paramètre IdleCaps .

  2. Si vous le souhaitez, appelez WdfDeviceInitSetPowerPolicyEventCallbacks pour inscrire les fonctions de rappel d’événements décrites dans Prise en charge de l’éveil du système.

  3. Appelez WDF_INTERRUPT_CONFIG_INIT pour initialiser une structure WDF_INTERRUPT_CONFIG . Fournissez une fonction de rappel EvtInterruptIsr , à appeler au niveau passif. Dans la structure de configuration, définissez PassiveHandling et CanWakeDevice sur TRUE. Appelez ensuite WdfInterruptCreate à partir de la fonction de rappel EvtDevicePrepareHardware de votre pilote pour créer l’objet d’interruption du framework.

  4. Appelez WdfDeviceAssignSxWakeSettings pour configurer l’appareil pour sortir le système d’un état de faible consommation.

    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. Lorsque l’appareil passe à un état de faible consommation d’énergie, l’infrastructure n’appelle pas EvtInterruptDisable pour l’interruption de veille. L’infrastructure appelle EvtDeviceArmWakeFromS0 si le pilote en a fourni un.

  6. Lorsque l’appareil signale l’interruption de veille, l’infrastructure appelle la routine de rappel EvtDeviceD0Entry du pilote.

  7. Si le rappel EvtDeviceD0Entry du pilote retourne la réussite, l’infrastructure appelle le rappel EvtInterruptIsr du pilote au niveau passif. Avant que le gestionnaire d’interruptions ne retourne, il doit faire taire l’interruption dans le contrôleur d’interruption. Si le pilote retourne un code d’échec à partir d’EvtDeviceD0Entry, l’infrastructure déconnecte l’interruption et appelle le rappel EvtInterruptDisable du pilote, si le pilote en a fourni un.

  8. L’infrastructure appelle les routines de rappel d’événements de veille suivantes, si le pilote en a fourni :

  9. L’infrastructure continue avec la séquence de rappel de mise sous tension normale, comme décrit dans Séquence de mise sous tension pour une fonction ou un pilote de filtre.

Vous pouvez utiliser l’extension de débogueur !wdfkd.wdfinterrupt pour indiquer si une interruption spécifique a été configurée pour être compatible avec la veille.

La fonctionnalité d’interruption de veille ne peut pas être utilisée conjointement avec la suspension sélective USB.