Partager via


Méthodes de prise en charge des pilotes dans gpioClx DDI

L’extension d’infrastructure GPIO (GpioClx) est disponible à partir de Windows 8. Les méthodes fournies par le système dans gpioClx DDI sont implémentées dans le pilote en mode noyau GpioClx, Msgpioclx.sys. Ce pilote exporte les points d’entrée pour les méthodes de prise en charge des pilotes GpioClx. À compter de Windows 8, Msgpioclx.sys est un composant standard du système d’exploitation.

Au moment de la génération, les pilotes de contrôleur GPIO se lient statiquement aux points d’entrée DDI dans la bibliothèque de stub GpioClx, Msgpioclxstub.lib. Au moment de l’exécution, cette bibliothèque effectue la négociation de version de pilote nécessaire pour établir un lien dynamique avec les points d’entrée correspondants dans Msgpioclx.sys.

Un pilote de contrôleur GPIO qui nécessite une version particulière de Msgpioclx.sys peut être lié en toute sécurité à une version de Msgpioclx.sys qui a un numéro de version supérieur. Toutefois, ce pilote ne peut pas être lié à une version de Msgpioclx.sys dont le numéro de version est inférieur.

Inscription du pilote

Pour s’inscrire en tant que client de GpioClx, un pilote de contrôleur GPIO appelle la méthode GPIO_CLX_RegisterClient . En règle générale, le pilote appelle cette méthode à partir de sa routine DriverEntry . Pendant cet appel, le pilote transmet un paquet d’inscription à la méthode . Ce paquet contient des pointeurs vers un ensemble de fonctions de rappel d’événements implémentées par le pilote. Ces fonctions accèdent aux registres matériels dans l’appareil du contrôleur GPIO. GpioClx appelle ces fonctions pour gérer les demandes d’E/S et gérer les interruptions.

Un pilote de contrôleur GPIO appelle la méthode GPIO_CLX_UnregisterClient pour annuler son inscription auprès de GpioClx. En règle générale, le pilote appelle cette méthode à partir de sa fonction de rappel d’événement EvtDriverUnload .

Initialisation des objets d’appareil

Pour initialiser GpioClx, le pilote du contrôleur GPIO doit appeler deux méthodes GpioClx à partir de sa fonction de rappel EvtDriverDeviceAdd . La première méthode, GPIO_CLX_ProcessAddDevicePreDeviceCreate, doit être appelée avant l’appel à la méthode WdfDeviceCreate , qui crée l’objet d’appareil. La deuxième méthode, GPIO_CLX_ProcessAddDevicePostDeviceCreate, doit être appelée après l’appel WdfDeviceCreate .

Verrouillage d’interruption

La majorité des fonctions de rappel d’événements implémentées par le pilote sont appelées uniquement dans IRQL = PASSIVE_LEVEL par GpioClx. Toutefois, les fonctions de rappel de la liste suivante sont appelées à PASSIVE_LEVEL ou DIRQL, en fonction des informations de l’appareil fournies par la fonction de rappel CLIENT_QueryControllerBasicInformation à GpioClx :

Ces fonctions sont appelées à partir de la routine de service d’interruption (ISR) dans GpioClx, qui s’exécute au niveau DIRQL ou PASSIVE_LEVEL, selon que les registres matériels du contrôleur GPIO sont mappés à la mémoire.

La fonction CLIENT_QueryControllerBasicInformation fournit des informations sur l’appareil sous la forme d’une structure de CLIENT_CONTROLLER_BASIC_INFORMATION . Si le bit d’indicateur MemoryMappedController est défini dans le membre Flags de cette structure, l’ISR GpioClx appelle les fonctions de rappel de la liste précédente dans DIRQL. Sinon, l’ISR appelle toutes les fonctions de rappel implémentées par le pilote à PASSIVE_LEVEL. Pour plus d’informations sur ce bit d’indicateur, consultez Rappels liés aux interruptions.

GpioClx synchronise automatiquement les appels aux fonctions de rappel implémentées par le pilote qui s’exécutent à PASSIVE_LEVEL et ne sont pas appelées à partir de l’ISR GpioClx. Ainsi, une seule de ces fonctions peut s’exécuter à la fois. Toutefois, GpioClx ne synchronise pas automatiquement ces rappels PASSIVE_LEVEL avec les rappels que GpioClx effectue à partir de son ISR. Le pilote du contrôleur GPIO doit fournir explicitement cette synchronisation, si nécessaire.

Pour éviter les erreurs de synchronisation potentielles, GpioClx implémente un verrou d’interruption que le pilote du contrôleur GPIO peut acquérir et libérer. Le verrou d’interruption est principalement utilisé par les fonctions de rappel CLIENT_EnableInterrupt et CLIENT_DisableInterrupt du pilote. Le pilote appelle la méthode GPIO_CLX_AcquireInterruptLock pour acquérir le verrou et appelle la méthode GPIO_CLX_ReleaseInterruptLock pour libérer le verrou. Le pilote appelle ces méthodes à partir d’une fonction de rappel appelée à PASSIVE_LEVEL et qui n’est pas appelée à partir de l’ISR dans GpioClx. Tant que le pilote conserve le verrou, l’ISR GpioClx ne peut pas s’exécuter. Le pilote ne doit tenir le verrou que brièvement et uniquement pendant les opérations critiques qui doivent être synchronisées avec l’ISR.

Si l’ISR GpioClx appelle une fonction de rappel implémentée par le pilote, cette fonction n’a pas besoin d’acquérir (ou de libérer) le verrou d’interruption, car l’ISR contient déjà le verrou (et le libère). Les appels aux méthodes GPIO_CLX_AcquireInterruptLock et GPIO_CLX_ReleaseInterruptLock par cette fonction n’ont aucun effet, mais ne sont pas traités comme des erreurs.