Delen via


Interrupt-Related Callbacks

Als optie kan het stuurprogramma voor een GPIO-controller (general-purpose I/O) ondersteuning bieden voor GPIO-interrupts. Ter ondersteuning van GPIO-interrupts implementeert een GPIO-controllerstuurprogramma een set callbackfuncties om deze interrupts te beheren. Het stuurprogramma bevat verwijzingen naar deze callbackfuncties in het registratiepakket dat het stuurprogramma levert wanneer zich registreert als een client van de GPIO frameworkuitbreiding (GpioClx). Zie GPIO_CLIENT_REGISTRATION_PACKET voor meer informatie over dit registratiepakket.

In de regel heeft een GPIO-controller die een geïntegreerd onderdeel is van een systeem op een chip (SoC) geheugen-geadresseerde hardwareregisters die rechtstreeks kunnen worden geopend door de processor van de SoC. Een afzonderlijk GPIO-controllerapparaat kan echter extern met de SoC-chip worden verbonden via een seriële bus, zoals wordt weergegeven in het volgende diagram.

een geïntegreerde gpio-controller en een externe gpio-controller.

In dit diagram is de externe GPIO-controller verbonden met een I²C-bus. Deze bus wordt beheerd door een I²C-buscontroller die een geïntegreerd deel van de SoC-chip is. De interruptaanvraaglijn van de externe GPIO-controller is verbonden met een pin op de geïntegreerde GPIO-controller. De GpioClx DDI kan plaats bieden aan zowel de geïntegreerde GPIO-controller als de externe GPIO-controller in dit voorbeeld.

Als een GPIO-controllerapparaat geheugen-geadresseerd is, kan de driver van de GPIO-controller rechtstreeks toegang krijgen tot de hardwareregisters van de controller op DIRQL. Als de GPIO-controller echter serieel is verbonden, heeft het GPIO-controllerstuurprogramma alleen toegang tot de hardwareregisters bij IRQL = PASSIVE_LEVEL, zoals besproken in Passive-Level ISR's.

Het stuurprogramma voor een GPIO-controller die geheugen-toegewezen hardwareregisters heeft, moet het vlagbit MemoryMappedController instellen in de apparaatgegevens die het stuurprogramma aan GpioClx levert. Anders gaat GpioClx ervan uit dat de hardwareregisters niet geheugen-gemapt zijn en dat het stuurprogramma alleen toegang heeft tot deze registers op IRQL = PASSIVE_LEVEL. Zie CONTROLLER_ATTRIBUTE_FLAGS voor meer informatie over deze vlagbit.

GpioClx implementeert een interrupt-serviceroutine (ISR) om onderbrekingsaanvragen van de GPIO-controller te verwerken. Deze ISR roept de volgende interrupt-gerelateerde callbackfuncties aan:

CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt Deze functies worden aangeroepen op DIRQL of PASSIVE_LEVEL, afhankelijk van of de ISR in GpioClx wordt uitgevoerd op DIRQL- of PASSIVE_LEVEL-niveau. De ISR roept deze functies aan bij DIRQL als MemoryMappedController = 1 en op PASSIVE_LEVEL als MemoryMappedController = 0. In beide gevallen serialiseert de ISR automatisch de callbacks, zodat een aanroep naar een van deze functies niet in het midden van een aanroep naar een andere van deze functies plaatsvindt.

De GPIO-frameworkextensie roept de volgende interrupt-gerelateerde callback-functies alleen aan op PASSIVE_LEVEL, ongeacht of de vlag MemoryMappedController is ingesteld:

CLIENT_DisableInterruptCLIENT_EnableInterrupt Als de vlag MemoryMappedController niet is ingesteld, worden alle aan interrupt gerelateerde callbackfuncties aangeroepen op PASSIVE_LEVEL. GpioClx serialiseert automatisch aanroepen naar deze functies, zodat een aanroep naar een van deze functies niet in het midden van een aanroep naar een andere van deze functies plaatsvindt.

Als de vlag MemoryMappedController echter is ingesteld, moeten de CLIENT_EnableInterrupt - en CLIENT_DisableInterrupt-functies hun interrupt-in- en uitschakelen expliciet synchroniseren met de GpioClx ISR, die de andere vier interrupt-gerelateerde callback-functies aanroept bij DIRQL.

Normaal gesproken voeren de andere CLIENT_Xxx callback-functies (waarvan de namen geen 'Interrupt' bevatten) geen interruptgerelateerde verwerking uit en hoeven ze daarom niet te synchroniseren met de GpioClx ISR. Als een van deze functies echter wordt aangeroepen op PASSIVE_LEVEL en code bevat die toegang heeft tot interruptinstellingen die worden geopend door interrupt-gerelateerde functies bij DIRQL, moet deze code worden gesynchroniseerd met de ISR.

Ter ondersteuning van interruptsynchronisatie implementeert GpioClx een set interruptvergrendelingen. Een callback-functie die wordt uitgevoerd op PASSIVE_LEVEL kan de methode GPIO_CLX_AcquireInterruptLock aanroepen om een interruptvergrendeling te verkrijgen en de GPIO_CLX_ReleaseInterruptLock methode aanroepen om de vergrendeling vrij te geven. Wanneer de functie de interruptvergrendeling bevat, kan de GpioClx ISR niet worden uitgevoerd en kan deze ISR geen interrupt-gerelateerde callback-functie aanroepen. Om GPIO-interrupts tijdig te laten verwerken, moet het stuurprogramma de interruptvergrendeling niet langer vasthouden dan nodig is.

Zie Synchronisatie onderbreken voor GPIO-controllerstuurprogramma's voor meer informatie.