Partager via


Interruptions des périphériques connectés par SPB

Contrairement à un bus tel que PCI, un bus de périphérique simple (SPB), tel que I2C ou SPI, ne fournit aucun moyen standardisé et spécifique au bus de transmettre les demandes d’interruption des périphériques au processeur. Au lieu de cela, un périphérique connecté à SPB signale une interruption via un chemin matériel distinct qui se trouve en dehors du contrôleur SPB et du contrôleur SPB. Les détails de ce chemin d’interruption ont tendance à varier d’une plateforme matérielle à l’autre, mais Windows masque ces détails au pilote pour un périphérique connecté À SPB afin de permettre au pilote de fonctionner sur diverses plateformes matérielles.

En règle générale, la ligne de demande d’interruption d’un périphérique connecté à SPB est connectée à une broche sur un contrôleur d’E/S à usage général (GPIO), et le contrôleur GPIO transmet les interruptions de l’appareil au processeur. Pour plus d’informations, consultez Interruptions GPIO.

Le pilote de périphérique acquiert cette interruption GPIO en tant que ressource d’interruption Windows abstraite (CmResourceTypeInterrupt) et connecte l’interruption à la routine de service d’interruption (ISR) du pilote. L’abstraction de ressource d’interruption masque les détails spécifiques à la plateforme de l’interruption du pilote. Par exemple, le pilote peut ignorer des détails tels que la réception de l’interruption à partir d’une broche GPIO ou d’une autre source. Pour conserver cette abstraction, le gestionnaire d’interruptions du noyau, qui s’exécute sur DIRQL, peut avoir besoin de faire taire une demande d’interruption active en effaçant ou en masquant temporairement l’interruption au niveau de la broche GPIO. Les registres matériels du contrôleur GPIO sont généralement mappés en mémoire et sont accessibles à l’adresse DIRQL.

En revanche, un périphérique connecté à SPB n’est pas mappé en mémoire, et l’ISR de cet appareil doit généralement s’exécuter à IRQL = PASSIVE_LEVEL. Pour accéder aux registres matériels dans l’appareil, l’ISR envoie des demandes d’E/S pour effectuer des transferts en série sur le SPB. Ces transferts sont relativement lents et ne peuvent pas être effectués dans un ISR qui s’exécute au niveau de DIRQL. Toutefois, un ISR de niveau passif peut envoyer une requête d’E/S de manière synchrone, puis bloquer jusqu’à ce que la requête soit terminée.

Pour une interruption déclenchée en périphérie, le gestionnaire d’interruption du noyau efface automatiquement la demande d’interruption au niveau de la broche GPIO, puis planifie l’exécution de l’ISR de l’appareil au niveau passif. Le gestionnaire d’interruptions doit effacer l’interruption pour empêcher la même interruption de se produire à nouveau après le retour du gestionnaire d’interruptions.

Pour une interruption déclenchée par un niveau, le gestionnaire d’interruptions du noyau masque automatiquement la demande d’interruption au niveau de la broche GPIO, puis planifie l’ISR de l’appareil pour qu’il s’exécute au niveau passif. L’ISR doit effacer la demande d’interruption de l’appareil. Une fois l’ISR retourné, le noyau démasque la demande d’interruption au niveau de la broche GPIO.

L’ISR de niveau passif de l’appareil doit effectuer uniquement la maintenance initiale de l’interruption, puis revenir pour éviter de retarder les ISR de niveau passif pour d’autres appareils. En règle générale, le pilote doit différer le traitement supplémentaire lié aux interruptions vers le thread de travail d’interruption, qui s’exécute à une priorité inférieure à l’ISR.

À compter de Windows 8, l’infrastructure de pilote en mode utilisateur (UMDF) prend en charge les ISR pour les pilotes UMDF. Le pilote UMDF pour un périphérique SPB appelle la méthode IWDFDevice3 ::CreateInterrupt pour connecter un ISR à l’interruption de l’appareil. Lorsque l’appareil signale une demande d’interruption, le gestionnaire d’interruptions du noyau planifie l’exécution de l’ISR au niveau passif. Pour plus d’informations, consultez Accès au matériel et gestion des interruptions.

À compter de Windows 8, l’infrastructure de pilote en mode noyau (KMDF) prend en charge les ISR passifs. Le pilote KMDF pour un périphérique SPB appelle la méthode WdfInterruptCreate pour connecter un ISR de niveau passif à l’interruption de l’appareil. L’un des paramètres d’entrée de cette méthode est un pointeur vers une structure WDF_INTERRUPT_CONFIG qui contient des informations de configuration pour l’interruption. Pour configurer l’ISR pour qu’il s’exécute au niveau passif, définissez le membre PassiveHandling de cette structure sur TRUE. Pour plus d’informations, consultez Prise en charge des interruptions Passive-Level.