GPIO-Treiberunterstützung – Übersicht
Ab Windows 8 vereinfacht die GPIO-Framework-Erweiterung (GpioClx) das Schreiben eines Treibers für ein GPIO-Controllergerät. Darüber hinaus bietet GpioClx Treiberunterstützung für Peripheriegeräte, die eine Verbindung mit GPIO-Pins herstellen. GpioClx, eine vom System bereitgestellte Erweiterung für das Kernel-Mode-Treiberframework (KMDF), führt Verarbeitungsaufgaben aus, die für Mitglieder der GPIO-Geräteklasse gemeinsam sind.
In dieser Übersicht werden die folgenden Artikel erläutert:
GPIO-Controller-Treiber
Hardwareanbieter liefern Treiber, um ihre GPIO-Controller zu steuern. Ein GPIO-Controllertreiber ist ein KMDF-Treiber, der alle hardwarespezifischen Vorgänge für einen GPIO-Controller verwaltet. Der GPIO-Controllertreiber arbeitet mit GpioClx zusammen, um E/A-Anforderungen für Gruppen von GPIO-Pins zu verarbeiten, die als Dateneingaben und Datenausgabe konfiguriert sind. Darüber hinaus arbeitet dieser Treiber mit GpioClx zusammen, um Interruptanforderungen von GPIO-Pins zu verarbeiten, die als Interrupteingaben konfiguriert sind.
Ein GPIO-Controllergerät verfügt über eine Reihe von GPIO-Pins. Diese Pins können physisch an Peripheriegeräte angeschlossen werden. GPIO-Pins können als Dateneingabe, Datenausgaben oder Interrupt-Anforderungseingaben konfiguriert werden. In der Regel ist ein GPIO-Pin für ein Peripheriegerät vorgesehen und nicht von zwei oder mehr Geräten gemeinsam genutzt. Verbindungen zwischen GPIO-Pins und Peripheriegeräten sind behoben und können vom Benutzer nicht geändert werden (z. B. durch Entfernen eines Peripheriegeräts und Ersetzen durch ein anderes Gerät). Daher kann die Zuordnung von GPIO-Pins an Peripheriegeräte in der Plattformfirmware beschrieben werden.
Das folgende Diagramm zeigt den GPIO-Controllertreiber und GpioClx.
Der GPIO-Controllertreiber und GpioClx kommunizieren über die GpioClx-Gerätetreiberschnittstelle (GpioClx Device-Driver Interface, DDI) miteinander. Der GPIO-Controller-Treiber ruft Methoden der Treiberunterstützung die von GpioClx implementiert werden. GpioClx-Aufrufe Ereignis-Callback-Funktionen die durch den GPIO-Controller-Treiber implementiert werden.
Der GPIO-Controllertreiber greift direkt auf die Hardwareregister des GPIO-Controllergeräts zu.
GpioClx verarbeitet E/A-Anforderungen von den Treibern für Peripheriegeräte, die physisch an GPIO-Pins angeschlossen sind. GpioClx übersetzt diese E/A-Anforderungen in einfache Hardwarevorgänge, die durch Aufrufen der Ereignisrückruffunktionen ausgeführt werden, die vom GPIO-Controllertreiber implementiert werden. Um z. B. Daten aus einer Gruppe von GPIO-Pins zu lesen oder zu schreiben, ruft GpioClx Ereignisrückruffunktionen wie CLIENT_ReadGpioPins und CLIENT_WriteGpioPinsauf. GpioClx verwaltet die I/O-Warteschlangen für den GPIO-Controller und entlastet dadurch den GPIO-Controllertreiber von dieser Aufgabe.
Darüber hinaus verarbeitet GpioClx primäre Interrupts vom GPIO-Controller und ordnet diese Interrupts sekundären Interrupts zu, die von Peripheriegerätetreibern verarbeitet werden. Primäre Unterbrechungen sind Unterbrechungen, die von Hardwaregeräten generiert werden. Sekundäre Unterbrechungen werden vom Betriebssystem als Reaktion auf bestimmte primäre Unterbrechungen generiert. Sowohl primäre als auch sekundäre Unterbrechungen werden durch globale Systemunterbrechungen (GSIs) identifiziert. Die ACPI-Firmware für die Hardwareplattform weist den primären Interrupts GSIs zu, und zur Laufzeit weist das Betriebssystem den sekundären Interrupts GSIs zu.
Beispielsweise weist die Firmware dem Hardware-Interrupt vom GPIO-Controller einen GSI zu, und das Betriebssystem weist einem GPIO-Pin, der als Interrupteingabe konfiguriert ist, einen GSI zu.
GpioClx implementiert eine ISR, die die von der Hardware erzeugten, primären Interrupts des GPIO-Controller-Geräts verarbeitet. Wenn ein Peripheriegerät einen Interrupt an einem GPIO-Pin auslöst und die Interrupts an diesem Pin aktiviert und unmaskiert sind, unterbricht der GPIO-Controller den Prozessor. In response, the kernel trap handler plans the execution of the GpioClx ISR. Um den GPIO-Pin zu identifizieren, der den Interrupt verursacht hat, ruft die GpioClx ISR die CLIENT_QueryActiveInterrupts Ereignisrückruffunktion auf, die vom GPIO-Controllertreiber implementiert wird. Der GpioClx ISR sucht dann nach der GSI, die diesem Pin zugewiesen ist, und gibt diese GSI an die Hardware-Abstraktionsschicht (HAL) weiter. Die HAL generiert einen sekundären Interrupt, indem sie die ISR aufruft, die für diese GSI registriert ist. Dieser ISR gehört zu dem Treiber für das Peripheriegerät, das den Interrupt ursprünglich ausgelöst hat.
Weitere Informationen zu primären und sekundären Unterbrechungen finden Sie unter GPIO Interrupts.
Treiber für Peripheriegeräte, die GPIO-Pins verwenden
Beim Start listet der Plug and Play -Manager (PnP) sowohl PnP-Geräte als auch Nicht-PnP-Geräte auf. Bei Nicht-PnP-Geräten mit festen Verbindungen mit GPIO-Pins fragt der PnP-Manager die Plattformfirmware ab, um zu ermitteln, welche GPIO-Pins diesen Geräten als vom System verwaltete Hardwareressourcen zugewiesen werden.
Der KMDF-Treiber für ein Peripheriegerät erhält die ihm zugewiesenen Hardware-Ressourcen während einer EvtDevicePrepareHardware Rückruf. Diese Ressourcen können GPIO-Pins enthalten, die als Datenausgabe, Dateneingaben oder Unterbrechungsanforderungseingaben konfiguriert sind.
Eine GPIO-E/A-Ressource ist ein neuer Windows-Ressourcentyp in Windows 8. Diese Ressource besteht aus einer Gruppe von einem oder mehreren GPIO-Pins, die entweder als Dateneingaben oder Datenausgaben verwendet werden können. Wenn ein Peripheriegerätetreiber eine GPIO-E/A-Ressource für Lesevorgänge öffnet, verwendet der Treiber alle Pins in der Ressource als Dateneingaben. Wenn ein Treiber eine GPIO-E/A-Ressource für Schreibvorgänge öffnet, verwendet der Treiber alle Pins in der Ressource als Datenausgabe. Codebeispiele, die zeigen, wie ein Peripheriegerätetreiber eine logische Verbindung zu einer Reihe von GPIO-I/O-Pins öffnet, finden Sie in den folgenden Themen:
Anschluss eines KMDF-Treibers an GPIO-E/A-Pins
Ein GPIO-Pin, der als Interrupteingabe konfiguriert ist, wird einem Treiber als normale Windows-Interruptressource zugewiesen. Die Abstraktion der Interruptressource blendet die Tatsache aus, dass ein Interrupt möglicherweise durch einen GPIO-Pin implementiert wird, anstatt z. B. einen programmierbaren Interruptcontroller. Daher kann der Treiber eine GPIO-basierte Interruptressource genauso behandeln wie jede andere Interruptressource.
Um auf die GPIO-Pins in einer GPIO-I/O-Ressource zugreifen zu können, muss ein Peripheriegerätetreiber eine logische Verbindung zu den Pins herstellen. Ein KMDF-Treiber ruft die WdfIoTargetOpen Methode auf, um die Verbindung zu öffnen. Über diese Verbindung kann der Treiber E/A-Anforderungen an die GPIO-Pins senden. Der Treiber sendet IOCTL_GPIO_READ_PINS Anforderungen zum Lesen von Daten aus diesen Pins (wenn sie Eingabe-Pins sind) oder IOCTL_GPIO_WRITE_PINS Anforderungen zum Schreiben von Daten in sie (wenn sie Ausgabe-Pins sind).
Um Interrupts vom GPIO-Pin in einer Interrupt-Ressource zu empfangen, muss ein Peripheriegerätetreiber seine Interrupt-Service-Routine (ISR) registrieren, um Interrupts von der Interrupt-Ressource zu empfangen, die durch diesen Pin implementiert ist. Ein KMDF-Treiber ruft den WdfInterruptCreate Method for connecting an ISR to the interrup