Ressources matérielles GPIO-Based
À compter de Windows 8, les broches d’E/S à usage général (GPIO) contrôlées par un pilote de contrôleur GPIO sont disponibles pour d’autres pilotes en tant que ressources matérielles gérées par le système. Les broches d’E/S GPIO, qui sont des broches configurées en tant qu’entrées de données ou sorties de données, sont disponibles en tant que nouveau type de ressource Windows, ressources d’E/S GPIO. En outre, les broches d’interruption GPIO, qui sont des broches configurées en tant qu’entrées de demande d’interruption, sont disponibles en tant que ressources d’interruption Windows ordinaires.
Une ressource d’E/S GPIO représente un ensemble d’une ou plusieurs broches GPIO que le pilote d’un périphérique peut lire ou écrire. Windows masque des détails sur l’implémentation sous-jacente des broches d’E/S GPIO afin que les pilotes de périphériques puissent être écrits pour manipuler des ressources d’E/S GPIO abstraites. Les pilotes de périphériques qui utilisent ces ressources abstraites peuvent fonctionner sur plusieurs plateformes, quel que soit le matériel du contrôleur GPIO qui implémente les ressources. Une ressource d’E/S GPIO est représentée par un handle WDFIOTARGET qui associe cette ressource au pilote de contrôleur GPIO spécifique qui possède la ou les broches GPIO sous-jacentes.
En règle générale, une broche d’E/S sur un contrôleur GPIO peut être configurée pour l’entrée ou pour la sortie, en fonction des fonctionnalités du matériel du contrôleur et de l’appareil physiquement connecté à la broche. Ainsi, un pilote peut ouvrir une connexion logique à cette broche pour les opérations d’écriture ou de lecture, mais pas les deux. Toutefois, cette contrainte est imposée par le matériel, et non par l’extension d’infrastructure GPIO (GpioClx). Si le matériel permet de configurer une broche d’E/S pour l’entrée et la sortie, GpioClx permet à un pilote d’ouvrir une connexion logique à la broche pour les opérations de lecture et d’écriture.
Pour les broches GPIO configurées en tant qu’entrées de demande d’interruption, le fait qu’une demande d’interruption soit implémentée par une broche GPIO au lieu d’un contrôleur d’interruption ou une ligne de demande d’interruption dédiée est complètement abstrait par le système d’exploitation. Les interruptions GPIO sont présentées aux pilotes de périphérique en tant que ressources d’interruption abstraites. L’abstraction de ces ressources est prise en charge par la pile de pilotes GPIO et par la couche d’abstraction matérielle (HAL). Ainsi, les pilotes de périphériques qui utilisent des ressources d’interruption peuvent largement ignorer les détails de l’implémentation sous-jacente de ces ressources. Pour plus d’informations, consultez Interruptions GPIO.
Le diagramme suivant montre un exemple d’affectation de ressources basées sur GPIO à deux pilotes de périphériques :
Dans le diagramme précédent, le pilote de périphérique A est affecté aux trois ressources basées sur GPIO suivantes :
- Deux broches d’entrée de données
- Broche de sortie de données
- Broche d’entrée d’interruption
Les deux ressources GPIO suivantes sont affectées au pilote de périphérique B :
- Une broche d’entrée de données
- Broche d’entrée d’interruption
Les pilotes A et B reçoivent leurs ressources affectées dans leurs fonctions de rappel EvtDevicePrepareHardware . Si un pilote reçoit, en tant que ressource, un ensemble d’une ou plusieurs broches d’E/S GPIO, il peut ouvrir une connexion à ces broches pour y accéder. Le pilote obtient un handle WDFIOTARGET pour identifier la connexion et envoie des demandes d’E/S à ce handle pour lire ou écrire dans ces broches.
Pour obtenir des exemples de code qui montrent comment se connecter à un ensemble de broches d’E/S GPIO et envoyer des demandes d’E/S à ces broches, consultez les rubriques suivantes :
Connexion d’un pilote KMDF à des broches d’E/S GPIO
Dans les deux rubriques, la IoRoutine
fonction dans l’exemple de code ouvre une ressource de broche d’E/S GPIO pour les lectures ou pour les écritures, en fonction de la valeur du ReadOperation
paramètre. Si la ressource est ouverte pour des lectures (DesiredAccess
= GENERIC_READ), les broches dans la ressource sont configurées en tant qu’entrées et une requête IOCTL_GPIO_READ_PINS envoyée à la ressource pin lit les valeurs d’entrée à ces broches. GpioClx n’autorise pas l’envoi d’un ensemble de broches d’entrée à une demande de IOCTL_GPIO_WRITE_PINS et termine une telle requête avec une erreur STATUS_GPIO_OPERATION_DENIED status. De même, si la ressource de broche est ouverte pour les écritures (DesiredAccess
= GENERIC_WRITE), les broches de la ressource sont configurées en tant que sorties, et une demande de IOCTL_GPIO_WRITE_PINS envoyée à la ressource de broche définit les valeurs dans les verrous de sortie qui pilotent ces broches. En règle générale, l’envoi d’une demande de IOCTL_GPIO_READ_PINS à un ensemble de broches de sortie lit simplement les dernières valeurs écrites dans les verrous de sortie.
Pour utiliser une ressource d’interruption pour recevoir des interruptions, un pilote client doit connecter une routine de service d’interruption (ISR) à l’interruption. En règle générale, le pilote établit cette connexion en appelant la méthode WdfInterruptCreate (ou, éventuellement, la routine IoConnectInterruptEx ). Pour plus d’informations sur les interruptions KMDF, consultez Création d’un objet d’interruption.
Contrairement aux appareils Plug-and-Play qui peuvent être connectés et déconnectés dynamiquement d’une plateforme matérielle, un appareil contrôleur GPIO est attaché en permanence. En outre, les connexions entre les broches GPIO et un périphérique sont supposées être permanentes. (Ou, si le périphérique peut être débranché d’un emplacement, l’emplacement est dédié à cet appareil.) Par conséquent, les ressources GPIO disponibles sont fixes et peuvent être spécifiées dans le microprogramme de la plateforme. De même, les pilotes de périphériques qui utilisent des ressources GPIO sont supposés utiliser des ensembles dédiés de ressources GPIO. Ainsi, les exigences en ressources pour ces pilotes de périphérique peuvent être spécifiées dans le microprogramme de la plateforme.
Lorsque le microprogramme de plateforme désigne un ensemble de broches GPIO en tant que ressource d’E/S GPIO, le microprogramme indique si les broches de cette ressource peuvent être ouvertes pour les lectures, les écritures ou pour les lectures et les écritures.
Si un pilote de périphérique utilise plusieurs ressources d’E/S GPIO, ce pilote doit connaître l’ordre dans lequel ces ressources sont énumérées par le gestionnaire PnP. Par exemple, si un pilote utilise deux broches d’E/S GPIO, mais que ces broches doivent être accessibles indépendamment et à des moments distincts, le microprogramme de la plateforme doit décrire chaque broche en tant que ressource d’E/S GPIO distincte. Le gestionnaire PnP énumère ces ressources dans l’ordre dans lequel elles sont décrites dans le microprogramme de la plateforme, qui doit correspondre à l’ordre attendu par le pilote.
Une fois qu’un pilote de périphérique a ouvert une connexion à une ressource d’E/S GPIO, une IOCTL_GPIO_READ_PINS ou IOCTL_GPIO_WRITE_PINS demande que ce pilote envoie à cette connexion accède à toutes les broches de la ressource. Si le pilote doit parfois accéder uniquement à un sous-ensemble de ces broches, ce sous-ensemble doit être affecté au pilote en tant que ressource distincte.
Pour plus d’informations sur les requêtes IOCTL_GPIO_READ_PINS , y compris le mappage des broches d’entrée de données aux bits de la mémoire tampon de sortie de la requête, consultez IOCTL_GPIO_READ_PINS. Pour plus d’informations sur les requêtes IOCTL_GPIO_WRITE_PINS , y compris le mappage des bits de la mémoire tampon d’entrée de requête aux broches de sortie de données, consultez IOCTL_GPIO_WRITE_PINS.