Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
En option, le pilote pour un contrôleur d’E/S à usage général (GPIO) peut prendre en charge les interruptions GPIO. Pour prendre en charge les interruptions GPIO, un pilote de contrôleur GPIO implémente un ensemble de fonctions de rappel pour gérer ces interruptions. Le pilote inclut des pointeurs vers ces fonctions de rappel dans le paquet d’inscription que le pilote fournit lorsqu’il s’inscrit en tant que client de l’extension de framework GPIO (GpioClx). Pour plus d’informations sur ce paquet d’inscription, consultez GPIO_CLIENT_REGISTRATION_PACKET.
En règle générale, un contrôleur GPIO qui est une partie intégrée d’une puce de puce (SoC) possède des registres matériels mappés en mémoire qui sont directement accessibles par le processeur dans la puce SoC. Toutefois, un périphérique de contrôleur GPIO distinct peut être connecté en externe à la puce SoC par le biais d’un bus série, comme illustré dans le diagramme suivant.
Dans ce diagramme, le contrôleur GPIO externe est connecté à un bus I²C. Ce bus est contrôlé par un contrôleur de bus I²C qui est une partie intégrée de la puce SoC. La ligne de demande d’interruption du contrôleur GPIO externe est connectée à une broche sur le contrôleur GPIO intégré. Le DDI GpioClx peut prendre en charge le contrôleur GPIO intégré et le contrôleur GPIO externe dans cet exemple.
Si un périphérique de contrôleur GPIO est mappé en mémoire, le pilote du contrôleur GPIO peut accéder directement aux registres matériels du contrôleur sur DIRQL. Toutefois, si le contrôleur GPIO est connecté en série, le pilote du contrôleur GPIO peut accéder aux registres matériels uniquement à IRQL = PASSIVE_LEVEL, comme indiqué dans Passive-Level ISR.
Le pilote d’un contrôleur GPIO disposant de registres matériels mappés en mémoire doit définir le bit d’indicateur MemoryMappedController dans les informations de périphérique fournies par le pilote à GpioClx. Dans le cas contraire, GpioClx suppose que les registres matériels ne sont pas mappés en mémoire et que le pilote peut accéder à ces registres uniquement à IRQL = PASSIVE_LEVEL. Pour plus d’informations sur ce bit d’indicateur, consultez CONTROLLER_ATTRIBUTE_FLAGS.
GpioClx implémente une routine de service d’interruption (ISR) pour traiter les demandes d’interruption du contrôleur GPIO. Cet ISR appelle les fonctions de rappel suivantes liées aux interruptions :
CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt Ces fonctions sont appelées à DIRQL ou à PASSIVE_LEVEL, selon que l'ISR dans GpioClx fonctionne à DIRQL ou à PASSIVE_LEVEL. L’ISR appelle ces fonctions au niveau DIRQL si MemoryMappedController = 1 et à PASSIVE_LEVEL si MemoryMappedController = 0. Dans les deux cas, l’ISR sérialise automatiquement ses rappels afin qu’un appel à l’une de ces fonctions ne se produise pas au milieu d’un appel à une autre de ces fonctions.
L'extension du framework GPIO appelle les fonctions de rappel liées aux interruptions suivantes exclusivement au niveau PASSIVE_LEVEL, que l’indicateur MemoryMappedController soit défini :
CLIENT_DisableInterruptCLIENT_EnableInterrupt Si l’indicateur MemoryMappedController n’est pas défini, toutes les fonctions de rappel liées à l’interruption sont appelées à PASSIVE_LEVEL. GpioClx sérialise automatiquement les appels à ces fonctions afin qu’un appel à l’une de ces fonctions ne se produise pas au milieu d’un appel à une autre de ces fonctions.
Toutefois, si l’indicateur MemoryMappedController est défini, les fonctions CLIENT_EnableInterrupt et CLIENT_DisableInterrupt doivent synchroniser explicitement leur interruption et désactiver les opérations avec l’ISR GpioClx, qui appelle les quatre autres fonctions de rappel liées à l’interruption au niveau de DIRQL.
En règle générale, les autres fonctions de rappel CLIENT_Xxx (dont les noms ne contiennent pas « Interruption ») n’effectuent pas de traitement lié à l’interruption et, par conséquent, n’ont pas besoin de se synchroniser avec l’ISR GpioClx. Toutefois, si l’une de ces fonctions est appelée à PASSIVE_LEVEL et contient du code qui accède aux paramètres d’interruption accessibles par les fonctions liées aux interruptions au niveau de DIRQL, ce code doit être synchronisé avec l’ISR.
Pour prendre en charge la synchronisation des interruptions, GpioClx implémente un ensemble de verrous d’interruption. Une fonction de rappel qui s’exécute à PASSIVE_LEVEL peut appeler la méthode GPIO_CLX_AcquireInterruptLock pour acquérir un verrou d’interruption et appeler la méthode GPIO_CLX_ReleaseInterruptLock pour libérer le verrou. Lorsque la fonction contient le verrou d’interruption, l’ISR GpioClx ne peut pas s’exécuter, et cet ISR ne peut pas appeler une fonction de rappel liée à l’interruption. Pour permettre aux interruptions GPIO d’être gérées en temps opportun, le pilote doit conserver le verrou d’interruption pas plus longtemps que nécessaire.
Pour plus d’informations, consultez synchronisation des interruptions pour les pilotes de contrôleur GPIO.