Behandeln Client-Implemented Sequenzen

Die optionalen Ereignisrückruffunktionen EvtSpbControllerLock und EvtSpbControllerUnlock führen ergänzende Vorgänge aus. Die EvtSpbControllerLock-Funktion ist ein Handler für IOCTL_SPB_LOCK_CONTROLLER Anforderungen. Die EvtSpbControllerUnlock-Funktion ist ein Handler für IOCTL_SPB_UNLOCK_CONTROLLER Anforderungen. Ein Client (d. h. der Treiber für ein Peripheriegerät auf dem Bus) sendet diese Anforderungen zum Starten und Beenden von E/A-Übertragungssequenzen. Die meisten SPB-Controllertreiber unterstützen IOCTL_SPB_LOCK_CONTROLLER - und IOCTL_SPB_UNLOCK_CONTROLLER-Anforderungen nicht und implementieren daher keine EvtSpbControllerLock - und EvtSpbControllerUnlock-Funktionen .

Ein Client kann eine E/A-Übertragungssequenz als eine Reihe einfacher Übertragungsanforderungen (d. h. IRP_MJ_READ - und IRP_MJ_WRITE-Anforderungen ) ausführen. Der ersten Übertragung in der Sequenz muss eine IOCTL_SPB_LOCK_CONTROLLER Anforderung vorangestellt werden. Diese Anforderung weist den SPB-Controllertreiber an, den Bus für die Dauer der E/A-Übertragungssequenz zu sperren. Auf die letzte Übertragung muss eine IOCTL_SPB_UNLOCK_CONTROLLER Anforderung folgen, die den Fahrer angibt, den Bus zu entsperren. Diese Art von E/A-Übertragungssequenz wird als vom Client implementierte Sequenz bezeichnet, um sie von einer Einzelanforderungssequenz zu unterscheiden, die eine IOCTL_SPB_EXECUTE_SEQUENCE Anforderung anstelle von IOCTL_SPB_LOCK_CONTROLLER - und IOCTL_SPB_UNLOCK_CONTROLLER-Anforderungen verwendet.

Während der Treiber für ein Peripheriegerät eine Sperre im Bus hält, ermöglicht der Buscontroller den Zugriff auf keine anderen Peripheriegeräte im Bus. Die Details des Vorgangs zum Sperren des Busses hängen vom Bustyp ab. Bei einem I2C-Controller erfordert eine Änderung der Übertragungsrichtung (lesefolgend gefolgt von einem Schreibvorgang oder umgekehrt) einen I2C-Neustartvorgang. Bei einem SPI-Controller muss die Chipauswahl für das Zielgerät behauptet bleiben, während die Controllersperre wirksam bleibt. Weitere Informationen finden Sie unter Atomic Bus-Vorgänge.

Die Unterstützung für vom Client implementierte Übertragungssequenzen ist optional. Ihr SPB-Controllertreiber sollte nur dann behaupten, sie zu unterstützen, wenn der Controller die folgenden Aktionen ausführen kann:

  • Sperren Sie den Bus für die Dauer der vom Client implementierten Sequenz.
  • Entsperren Sie den Bus jederzeit. Wenn beispielsweise eine Entsperranforderung zwischen Byteübertragungen auftritt, sollte der Controller in der Lage sein, den Bus zu entsperren, ohne auf die nächste Byteübertragung über den Bus zu warten.

Während der Bus gesperrt ist, kann der Client eine beliebige Sequenz einfacher Übertragungsanforderungen senden. Das heißt, die Sequenz kann von beliebiger Länge sein und eine beliebige Kombination aus Lese- und Schreibvorgängen sein.

Um die Unterstützung für vom Client implementierte Sequenzen anzugeben, implementiert ein SPB-Controllertreiber eine EvtSpbControllerUnlock-Funktion . Wenn Ihr Treiber diese Funktion implementiert, akzeptiert die SPB-Frameworkerweiterung (SpbCx) IOCTL_SPB_LOCK_CONTROLLER und IOCTL_SPB_UNLOCK_CONTROLLER Anforderungen von Clients. Andernfalls schlägt SpbCx diese Anforderungen fehl, indem sie mit dem STATUS_NOT_SUPPORTED Statuscode abgeschlossen werden.

Ein SPB-Controllertreiber, der eine EvtSpbControllerUnlock-Funktion implementiert, ist nicht erforderlich, um eine EvtSpbControllerLock-Funktion zu implementieren. Ein SPB-Controllertreiber, der eine EvtSpbControllerLock-Funktion implementiert, muss jedoch auch eine EvtSpbControllerUnlock-Funktion implementieren.

Wenn Ihr Treiber eine EvtSpbControllerUnlock-Funktion , aber keine EvtSpbControllerLock-Funktion implementiert, ruft SpbCx die EvtSpbControllerUnlock-Funktion auf, um IOCTL_SPB_UNLOCK_CONTROLLER Anforderungen zu verarbeiten, schließt aber einfach IOCTL_SPB_LOCK_CONTROLLER Anforderungen mit STATUS_SUCCESS Statuscodes ab.

Ihr Treiber hat zwei Möglichkeiten, den Start einer vom Client implementierten Sequenz zu erkennen. Wenn Ihr Treiber eine EvtSpbControllerLock-Funktion implementiert, ruft SpbCx diese Funktion auf, um eine IOCTL_SPB_LOCK_CONTROLLER Anforderungen von einem Client zu verarbeiten. Der Treiber kann sich darauf verlassen, dass dieser Aufruf vor der ersten Übertragungsanforderung in einer Sequenz erfolgt. Wenn Ihr Treiber keine EvtSpbControllerLock-Funktion implementiert, kann der Treiber die SpbRequestGetParameters-Methode aufrufen, wenn der Treiber eine einfache Übertragungsanforderung vom Client verarbeitet. Um anzugeben, dass die angeforderte Übertragung die erste Übertragung in einer Sequenz ist, legt diese Methode das Element Position in der Ausgabestruktur der Methode auf SpbRequestSequencePositionFirst fest.

Der EvtSpbControllerUnlock-Rückruf ist die einzige Möglichkeit, mit der ein Treiber bestimmen kann, wann eine Sequenz endet. Ein Treiber, der keine EvtSpbControllerUnlock-Funktion implementiert, kann vom Client implementierte Sequenzen nicht unterstützen.