Vue d’ensemble de la prise en charge du pilote GPIO

À compter de Windows 8, l’extension d’infrastructure GPIO (GpioClx) simplifie la tâche d’écriture d’un pilote pour un périphérique de contrôleur GPIO. En outre, GpioClx fournit la prise en charge des pilotes pour les périphériques qui se connectent à des broches GPIO. GpioClx, qui est une extension fournie par le système pour l’infrastructure de pilote en mode noyau (KMDF), effectue des tâches de traitement communes aux membres de la classe de périphérique GPIO.

Cette vue d’ensemble aborde les sujets suivants :

Pilotes du contrôleur GPIO

Les fournisseurs de matériel fournissent des pilotes pour contrôler leurs contrôleurs GPIO. Un pilote de contrôleur GPIO est un pilote KMDF qui gère toutes les opérations spécifiques au matériel pour un contrôleur GPIO. Le pilote du contrôleur GPIO coopère avec GpioClx pour gérer les demandes d’E/S pour les groupes de broches GPIO qui sont configurés en tant qu’entrées de données et sorties de données. En outre, ce pilote coopère avec GpioClx pour gérer les demandes d’interruption provenant de broches GPIO configurées en tant qu’entrées d’interruption.

Un périphérique de contrôleur GPIO a un certain nombre de broches GPIO. Ces broches peuvent être physiquement connectées à des périphériques. Les broches GPIO peuvent être configurées en tant qu’entrées de données, sorties de données ou entrées de demande d’interruption. En règle générale, une broche GPIO est dédiée à un périphérique et n’est pas partagée par au moins deux appareils. Les connexions entre les broches GPIO et les périphériques sont fixes et ne peuvent pas être modifiées par l’utilisateur (par exemple, en supprimant un périphérique et en le remplaçant par un autre appareil). Ainsi, l’affectation de broches GPIO aux périphériques peut être décrite dans le microprogramme de la plateforme.

Le diagramme suivant montre le pilote du contrôleur GPIO et GpioClx.

diagramme de blocs des composants gpio.

Le pilote du contrôleur GPIO et GpioClx communiquent entre eux via l’interface de pilote de périphérique GpioClx (DDI). Le pilote du contrôleur GPIO appelle les méthodes de prise en charge du pilote implémentées par GpioClx. GpioClx appelle des fonctions de rappel d’événement implémentées par le pilote du contrôleur GPIO.

Le pilote du contrôleur GPIO accède directement aux registres matériels du périphérique de contrôleur GPIO.

GpioClx gère les demandes d’E/S des pilotes pour les périphériques qui se connectent physiquement aux broches GPIO. GpioClx traduit ces demandes d’E/S en opérations matérielles simples, qu’il effectue en appelant les fonctions de rappel d’événements implémentées par le pilote du contrôleur GPIO. Par exemple, pour lire ou écrire des données dans un ensemble de broches GPIO, GpioClx appelle des fonctions de rappel d’événement telles que CLIENT_ReadGpioPins et CLIENT_WriteGpioPins. GpioClx gère les files d’attente d’E/S pour le contrôleur GPIO et soulage ainsi le pilote du contrôleur GPIO de cette tâche.

En outre, GpioClx gère les interruptions principales à partir du périphérique de contrôleur GPIO et mappe ces interruptions aux interruptions secondaires, qui sont gérées par les pilotes de périphériques. Les interruptions principales sont des interruptions générées par des appareils matériels. Les interruptions secondaires sont générées par le système d’exploitation en réponse à certaines interruptions principales. Les interruptions primaires et secondaires sont identifiées par des interruptions système globales (GSI). Le microprogramme ACPI de la plateforme matérielle affecte des GSI aux interruptions principales et, au moment de l’exécution, le système d’exploitation affecte des GSI aux interruptions secondaires.

Par exemple, le microprogramme affecte une GSI à l’interruption matérielle à partir du contrôleur GPIO, et le système d’exploitation affecte une GSI à une broche GPIO configurée en tant qu’entrée d’interruption.

GpioClx implémente un ISR qui gère les interruptions principales générées par le matériel à partir de l’appareil de contrôleur GPIO. Lorsqu’un périphérique déclare une interruption sur une broche GPIO et que les interruptions sur cette broche sont activées et non masquées, le contrôleur GPIO interrompt le processeur. En réponse, le gestionnaire d’interruption du noyau planifie l’exécution de GpioClx ISR. Pour identifier la broche GPIO à l’origine de l’interruption, l’ISR GpioClx appelle la fonction de rappel d’événement CLIENT_QueryActiveInterrupts , qui est implémentée par le pilote du contrôleur GPIO. L’ISR GpioClx recherche ensuite la GSI affectée à cette broche et la transmet à la couche d’abstraction matérielle (HAL). Hal génère une interruption secondaire en appelant l’ISR inscrit pour cette GSI. Cet ISR appartient au pilote du périphérique qui a initialement déclaré l’interruption.

Pour plus d’informations sur les interruptions principales et secondaires, consultez Interruptions GPIO.

Pilotes pour les périphériques qui utilisent des broches GPIO

Au démarrage, le gestionnaire Plug-and-Play (PnP) énumère les appareils PnP et les appareils non PnP. Pour les appareils non PnP qui ont des connexions fixes aux broches GPIO, le gestionnaire PnP interroge le microprogramme de plateforme pour déterminer les broches GPIO qui sont affectées en tant que ressources matérielles gérées par le système à ces appareils.

Le pilote KMDF d’un périphérique reçoit ses ressources matérielles affectées lors d’un rappel EvtDevicePrepareHardware . Ces ressources peuvent inclure des broches GPIO configurées en tant que sorties de données, entrées de données ou entrées de demande d’interruption.

Une ressource d’E/S GPIO est un nouveau type de ressource Windows dans Windows 8. Cette ressource se compose d’un ensemble d’une ou plusieurs broches GPIO qui peuvent être utilisées comme entrées de données ou sorties de données. Si un pilote de périphérique ouvre une ressource d’E/S GPIO pour les lectures, le pilote utilise toutes les broches de la ressource comme entrées de données. Si un pilote ouvre une ressource d’E/S GPIO pour les écritures, il utilise toutes les broches de la ressource comme sorties de données. Pour obtenir des exemples de code qui montrent comment un pilote de périphérique ouvre une connexion logique à un ensemble de broches d’E/S GPIO, consultez les rubriques suivantes :

Connexion d’un pilote KMDF à des broches d’E/S GPIO

Une broche GPIO configurée en tant qu’entrée d’interruption est affectée à un pilote en tant que ressource d’interruption Windows ordinaire. L’abstraction de la ressource d’interruption masque le fait qu’une interruption peut être implémentée par une broche GPIO au lieu, par exemple, d’un contrôleur d’interruption programmable. Ainsi, le pilote peut traiter une ressource d’interruption basée sur GPIO de la même façon que toute autre ressource d’interruption.

Pour accéder aux broches GPIO dans une ressource d’E/S GPIO, un pilote de périphérique doit ouvrir une connexion logique aux broches. Un pilote KMDF appelle la méthode WdfIoTargetOpen pour ouvrir la connexion. Grâce à cette connexion, le pilote peut envoyer des demandes d’E/S aux broches GPIO. Le pilote envoie IOCTL_GPIO_READ_PINS demandes de lecture de données à partir de ces broches (s’il s’agit de broches d’entrée) ou IOCTL_GPIO_WRITE_PINS demandes d’écriture de données dans celles-ci (s’il s’agit de broches de sortie).

Pour recevoir des interruptions de la broche GPIO dans une ressource d’interruption, un pilote de périphérique doit inscrire sa routine de service d’interruption (ISR) pour recevoir des interruptions de la ressource d’interruption implémentée par cette broche. Un pilote KMDF appelle la méthode WdfInterruptCreate pour connecter un ISR à l’interruption.