Unterbrechen der Synchronisierung für GPIO-Controllertreiber
GPIO-Controllertreiber können die methoden GPIO_CLX_AcquireInterruptLock und GPIO_CLX_ReleaseInterruptLock aufrufen, um Unterbrechungssperren abzurufen und zu freigeben, die intern von der GPIO-Frameworkerweiterung (GpioClx) implementiert werden. Treibercode, der unter IRQL = PASSIVE_LEVEL ausgeführt wird, kann diese Methoden aufrufen, um mit der Interruptdienstroutine (ISR) in GpioClx zu synchronisieren. GpioClx widmet jeder Pinbank im GPIO-Controller eine separate Interruptsperre.
Wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind, ruft der ISR in GpioClx bestimmte vom Treiber implementierte Ereignisrückruffunktionen bei DIRQL auf. GpioClx ruft die restlichen Rückruffunktionen bei PASSIVE_LEVEL auf. Eine Rückruffunktion auf passiver Ebene, die auf eine Registerbank zugreift, muss möglicherweise eine Interruptsperre verwenden, um mit Rückruffunktionen zu synchronisieren, die mit DIRQL ausgeführt werden und auf dieselben Register zugreifen.
Beispielsweise ändern die CLIENT_EnableInterrupt - und CLIENT_DisableInterrupt Rückruffunktionen auf passiver Ebene Hardwareeinstellungen, die sich auf den Betrieb anderer rückrufbezogener Rückrufroutinen auswirken, die bei DIRQL ausgeführt werden. Die funktionen CLIENT_EnableInterrupt und CLIENT_DisableInterrupt verwenden in der Regel die Unterbrechungssperren der Bank, um ihre Registerzugriffe zu synchronisieren.
GpioClx serialisiert automatisch Interrupt- und E/A-bezogene Rückrufe, die bei DIRQL auftreten. GpioClx ruft die Interruptsperre für die Zielbank ab, bevor eine Rückruffunktion bei DIRQL aufgerufen wird, und gibt die Sperre frei, nachdem die Funktion zurückgegeben wird. Es ist ein Fehler für eine Rückruffunktion, die bei DIRQL aufgerufen wird, um die Bankunterbrechungssperre durch Aufrufen GPIO_CLX_AcquireInterruptLock erneut abzurufen.
In ähnlicher Weise serialisiert GpioClx automatisch Rückrufe, die bei PASSIVE_LEVEL auftreten. GpioClx implementiert intern eine Wartesperre pro Bank. GpioClx ruft die Wartesperre für die Zielbank ab, bevor eine Rückruffunktion bei PASSIVE_LEVEL aufgerufen wird, und gibt die Sperre auf, wenn die Funktion zurückgegeben wird. Bei einem speicherseitig zugeordneten GPIO-Controller verwaltet GpioClx die Wartesperren der Bank im Namen des Treibers, ermöglicht es dem Treiber jedoch nicht, die Sperren explizit abzurufen und freizugeben.
Für einen GPIO-Controller ohne Speicherzuordnung GPIO_CLX_AcquireInterruptLock und GPIO_CLX_ReleaseInterruptLock anstelle einer Interruptsperre jedoch eine Wartesperre abrufen und freigeben. GpioClx implementiert eine separate Wartesperre für jede Pinbank im GPIO-Controller. Da die Register nicht arbeitsspeicherbezogen sind, werden alle Interrupt- und E/A-bezogenen Rückruffunktionen bei PASSIVE_LEVEL aufgerufen, sodass sie E/A-Anforderungen verwenden können, um über einen seriellen Bus, z. B. I²C, auf die Register zuzugreifen. GpioClx ruft die Wartesperre für die Zielbank ab, bevor eine dieser Rückruffunktionen aufgerufen wird, und gibt die Sperre frei, nachdem die Funktion zurückgegeben wird.
Es ist ein Fehler, wenn eine Rückruffunktion für einen Nicht-Speicher zugeordneten Controller versucht, die Wartesperre der Bank erneut abzurufen, indem GPIO_CLX_AcquireInterruptLock aufgerufen wird. Treibercode auf passiver Ebene außerhalb der Rückruffunktionen kann jedoch die GPIO_CLX_XxxInterruptLock-Methoden aufrufen, um mit den Rückruffunktionen zu synchronisieren. Da GpioClx alle Interrupt- und E/A-bezogenen Rückruffunktionen auf PASSIVE_LEVEL aufruft, ersetzen die Wartesperren der Bank effektiv die Unterbrechungssperren der Bank für Controller, die nicht dem Speicher zugeordnet sind.
Eine weitere Option für einen Nicht-Speicher-zugeordneten Controller besteht darin, dass der Controllertreiber eine Reihe von Wartesperren implementiert. Diese Wartesperren können es den Rückrufroutinen ermöglichen, eine präzisere Sperrung und Entsperrung freigegebener Ressourcen durchzuführen, als dies mit den von GpioClx implementierten Wartesperren möglich ist.
Während des Aufrufs der CLIENT_QueryControllerBasicInformation Rückrufroutine meldet ein GPIO-Controllertreiber GpioClx, ob die Controllerregister speicherseitig zugeordnet sind. Weitere Informationen finden Sie in der Beschreibung des MemoryMappedController-Flags in CLIENT_CONTROLLER_BASIC_INFORMATION.
Weitere Informationen zu Interrupt- und Wartesperren finden Sie unter Verwenden von Frameworksperren.
Die folgenden Tabellen enthalten ausführlichere Informationen dazu, welche Rückruffunktionen bei DIRQL statt bei PASSIVE_LEVEL aufgerufen werden, wenn die Register arbeitsspeicherseitig zugeordnet sind. In den folgenden Tabellen wird erläutert, wann Rückruffunktionen auf passiver Ebene Interruptsperren verwenden sollten.
- Interruptbezogene Rückruffunktionen
- E/A-bezogene Rückruffunktionen
- GPIO-Initialisierungs- und Setup-bezogene Rückruffunktionen
- Rückruffunktionen im Zusammenhang mit der GPIO-Energieverwaltung
- Andere Rückruffunktionen
Um GPIO-Pins zu unterstützen, die als Interrupteingaben konfiguriert sind, implementiert ein GPIO-Controllertreiber eine Reihe von Ereignisrückruffunktionen, um Interruptanforderungen über diese Pins zu verwalten. In der folgenden Tabelle gibt die mittlere Spalte den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind. Die spalte rechts gibt den IRQL an, bei dem die Funktionen aufgerufen werden, wenn die Register nicht speicherseitig zugeordnet sind und über einen seriellen Bus auf sie zugegriffen werden muss.
Rückruffunktion | IRQL, wenn Arbeitsspeicher zugeordnet ist (MemoryMappedController = 1) | IRQL bei seriellem Zugriff (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Siehe Hinweis 1.) |
PASSIVE_LEVEL (Siehe Hinweis 2.) |
|
DIRQL (Siehe Hinweis 3.) |
PASSIVE_LEVEL (Siehe Hinweis 4.) |
|
DIRQL (Siehe Hinweis 5.) |
DIRQL (Siehe Hinweis 6.) |
Hinweise
GpioClx ruft die Bankunterbrechungssperre nicht ab, bevor diese Rückruffunktion aufgerufen wird. Die Rückruffunktion kann bei Bedarf die Unterbrechungssperre der Bank abrufen, um Zugriffe auf Register zu synchronisieren, die mit Rückruffunktionen freigegeben werden, die unter DIRQL ausgeführt werden.
GpioClx serialisiert den Aufruf dieser Rückruffunktion mit anderen Interrupt- und E/A-bezogenen Rückruffunktionen, die bei PASSIVE_LEVEL aufgerufen werden. Daher sollte die Rückruffunktion nicht versuchen, die Wartesperre der Bank zu erhalten.
GpioClx ruft die Bankunterbrechungssperre ab, bevor diese Rückruffunktion aufgerufen wird, und gibt die Sperre frei, nachdem die Funktion zurückgegeben wird. Daher sollte die Rückruffunktion nicht versuchen, die Unterbrechungssperre der Bank abzurufen.
GpioClx serialisiert den Aufruf dieser Rückruffunktion mit anderen Interrupt- und E/A-bezogenen Rückruffunktionen, die bei PASSIVE_LEVEL aufgerufen werden. Daher sollte die Rückruffunktion nicht versuchen, die Wartesperre der Bank zu erhalten.
GpioClx ruft die Bankunterbrechungssperre ab, bevor diese Rückruffunktion aufgerufen wird, und gibt die Sperre frei, nachdem die Funktion zurückgegeben wird. Daher sollte die Rückruffunktion nicht versuchen, die Unterbrechungssperre der Bank abzurufen.
GpioClx ruft die Bankunterbrechungssperre nicht ab, bevor diese Rückruffunktion aufgerufen wird. Der GPIO-Controllertreiber ist für die Bereitstellung eventuell erforderlicher Synchronisierungen verantwortlich.
Um GPIO-Pins zu unterstützen, die als Daten-E/A-Pins konfiguriert sind, implementiert ein GPIO-Controllertreiber eine Reihe von Ereignisrückruffunktionen, um E/A-Vorgänge über diese Pins zu verwalten. In der folgenden Tabelle gibt die mittlere Spalte den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind. Die spalte rechts gibt den IRQL an, bei dem die Funktionen aufgerufen werden, wenn die Register nicht speicherseitig zugeordnet sind und über einen seriellen Bus auf sie zugegriffen werden muss.
Rückruffunktion | IRQL, wenn Arbeitsspeicher zugeordnet ist (MemoryMappedController = 1) | IRQL bei seriellem Zugriff (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Siehe Hinweis 1.) |
PASSIVE_LEVEL (Siehe Hinweis 2.) |
|
DIRQL (Siehe Hinweis 3.) |
PASSIVE_LEVEL (Siehe Hinweis 4.) |
Hinweise
GpioClx ruft die Bankunterbrechungssperre nicht ab, bevor diese Rückruffunktion aufgerufen wird. Die Rückruffunktion kann bei Bedarf die Interruptsperre abrufen, um Zugriffe auf Register zu synchronisieren, die mit Rückruffunktionen gemeinsam genutzt werden, die unter DIRQL ausgeführt werden.
GpioClx serialisiert den Aufruf dieser Rückruffunktion mit anderen Interrupt- und E/A-bezogenen Rückruffunktionen, die bei PASSIVE_LEVEL aufgerufen werden. Daher sollte die Rückruffunktion nicht versuchen, die Bankwartesperre zu erwerben.
GpioClx ruft die Unterbrechungssperre der Bank ab, bevor diese Rückruffunktion aufgerufen wird, und gibt die Sperre frei, nachdem die Funktion zurückgegeben wurde. Daher sollte die Rückruffunktion nicht versuchen, die Unterbrechungssperre der Bank zu erwerben.
GpioClx serialisiert den Aufruf dieser Rückruffunktion mit anderen Interrupt- und E/A-bezogenen Rückruffunktionen, die bei PASSIVE_LEVEL aufgerufen werden. Daher sollte die Rückruffunktion nicht versuchen, die Bankwartesperre zu erwerben.
Um einen GPIO-Controller für E/A- und Unterbrechungsvorgänge einzurichten, implementiert ein GPIO-Controllertreiber eine Reihe von Ereignisrückruffunktionen, um den Controller zu initialisieren. In der folgenden Tabelle gibt die mittlere Spalte den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind. Die Spalte ganz rechts gibt den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Register nicht im Arbeitsspeicher zugeordnet sind und über einen seriellen Bus darauf zugegriffen werden muss.
Rückruffunktion | IRQL bei Speicherzuordnung (MemoryMappedController = 1) | IRQL bei seriellem Zugriff (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Siehe Hinweis 1.) |
PASSIVE_LEVEL (Siehe Hinweis 2.) |
Hinweise
Wenn GpioClx eine dieser Rückruffunktionen aufruft, sind keine Unterbrechungssperren für Banken verfügbar. Daher sollten diese Rückruffunktionen nicht versuchen, die Unterbrechungssperre der Bank zu erwerben.
Die Wartesperren der GpioClx-Bank sind nicht verfügbar, wenn diese Rückruffunktionen aufgerufen werden. Daher sollte der Treiber nicht versuchen, eine Wartesperre für die Synchronisierung mit diesen Rückruffunktionen zu erhalten.
Damit ein GPIO-Controller den Energiezustand des Geräts ändern kann, implementiert ein GPIO-Controllertreiber eine Reihe von Ereignisrückruffunktionen, um die Hardwareeinstellungen während dieser Änderungen zu speichern und wiederherzustellen. In der folgenden Tabelle gibt die mittlere Spalte den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind. Die Spalte ganz rechts gibt den IRQL an, an dem die Funktionen aufgerufen werden, wenn die Register nicht im Arbeitsspeicher zugeordnet sind und über einen seriellen Bus darauf zugegriffen werden muss.
Rückruffunktion | IRQL bei Speicherzuordnung (MemoryMappedController = 1) | IRQL bei seriellem Zugriff (MemoryMappedController = 0) |
---|---|---|
DIRQL oder HIGH_LEVEL (Siehe Hinweise.) |
Wird nicht unterstützt. |
Hinweise
- Für reguläre F-Zustandsübergänge: Die Rückruffunktionen zum Speichern/Wiederherstellen werden mit der Von GpioClx bei DIRQL gehaltenen Bankunterbrechungssperre aufgerufen. Daher sollte keine Rückruffunktion versuchen, die Unterbrechungssperre der Bank zu erhalten.
- Für kritische F-Zustandsübergänge: Die Rückrufe zum Speichern/Wiederherstellen werden aufgerufen, wenn das Power Engine-Plug-In (PEP) aufgerufen wird, um den GPIO-Zustand zu speichern und wiederherzustellen. Die Rückruffunktionen zum Speichern/Wiederherstellen werden bei HIGH_LEVEL im Kontext des letzten Prozessors aufgerufen, der in den Leerlauf wechselt, was später in der Übergangssequenz der Plattform im tiefen Leerlauf auftritt. Daher sollte keine Rückruffunktion versuchen, die Unterbrechungssperre der Bank zu erhalten.
Weitere Informationen zu F-Status finden Sie unter Energieverwaltung auf Komponentenebene. Weitere Informationen zum PEP finden Sie unter PoFxPowerControl.
Um einem GPIO-Controller die Unterstützung controllerspezifischer Vorgänge zu ermöglichen, implementiert ein GPIO-Controllertreiber eine CLIENT_ControllerSpecificFunction Ereignisrückruffunktion. In der folgenden Tabelle gibt die mittlere Spalte den IRQL an, an dem die Funktion aufgerufen wird, wenn die Hardwareregister des GPIO-Controllers arbeitsspeicherseitig zugeordnet sind. Die Spalte ganz rechts gibt den IRQL an, an dem die Funktion aufgerufen wird, wenn die Register nicht im Arbeitsspeicher zugeordnet sind und über einen seriellen Bus darauf zugegriffen werden muss.
Rückruffunktion | IRQL bei Speicherzuordnung (MemoryMappedController = 1) | IRQL bei seriellem Zugriff (MemoryMappedController = 0) |
---|---|---|
PASSIVE_LEVEL (Siehe Hinweis 1.) |
PASSIVE_LEVEL (Siehe Hinweis 2.) |
Hinweise
GpioClx ruft die Unterbrechungssperre der Bank nicht ab, bevor diese Rückruffunktion aufgerufen wird. Die Rückruffunktion kann bei Bedarf die Unterbrechungssperre der Bank abrufen, um Zugriffe auf Register zu synchronisieren, die mit Rückruffunktionen gemeinsam genutzt werden, die bei DIRQL ausgeführt werden.
GpioClx serialisiert den Aufruf dieser Rückruffunktion mit anderen Interrupt- und E/A-bezogenen Rückruffunktionen, die bei PASSIVE_LEVEL aufgerufen werden. Daher sollte die Rückruffunktion nicht versuchen, die Bankwartesperre zu erwerben.