SerCx2-Custom-Transmit-Transaktionen
Einige serielle Controllerhardware kann einen anderen Datenübertragungsmechanismus als PIO oder System-DMA zum Schreiben von Daten in einen seriellen Controller implementieren. Ein serieller Controllertreiber kann transaktionen mit benutzerdefinierter Übertragung unterstützen, um diesen Datenübertragungsmechanismus für die Verwendung von SerCx2 zur Verfügung zu stellen.
Um eine benutzerdefinierte Übertragungstransaktion zu starten, ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2CustomTransmitTransactionStart des Treibers auf und stellt als Parameter die Schreibanforderung (IRP_MJ_WRITE) und eine Beschreibung des Schreibpuffers für die Transaktion bereit. In diesem Aufruf initiiert die Funktion die Transaktion und gibt zurück. Der Treiber ist dann für den Abschluss der Transaktion und das Abschließen der Schreibanforderung verantwortlich.
Erstellen des benutzerdefinierten Übertragungsobjekts
Bevor SerCx2 die EvtSerCx2CustomTransmitTransactionXxx**-Funktionen des seriellen Controllertreibers aufrufen kann, muss der Treiber die SerCx2CustomTransmitTransactionCreate-Methode aufrufen, um diese Funktionen bei SerCx2 zu registrieren. Diese Methode akzeptiert als Eingabeparameter einen Zeiger auf eine SERCX2_CUSTOM_TRANSMIT_TRANSACTION_CONFIG-Struktur , die Zeiger auf die EvtSerCx2CustomTransactionXxx**-Funktionen des Treibers enthält.
Der Treiber muss die folgende Funktion implementieren:
Optional kann der Treiber eine oder beide der folgenden Funktionen implementieren:
Die SerCx2CustomTransmitTransactionCreate-Methode erstellt ein benutzerdefiniertes Übertragungsobjekt und stellt dem aufrufenden Treiber ein SERCX2CUSTOMTRANSMITTRANSACTION-Handle für dieses Objekt bereit. Die EvtSerCx2CustomTransmitTransactionXxx**-Funktionen des Treibers verwenden dieses Handle als ersten Parameter. Die folgenden SerCx2-Methoden verwenden dieses Handle als ersten Parameter:
Hardwareinitialisierung und sauber
Einige serielle Controllertreiber müssen möglicherweise die Hardware des seriellen Controllers zu Beginn einer transaktion mit benutzerdefinierter Übertragung initialisieren oder den Hardwarestatus des seriellen Controllers am Ende der Transaktion sauber.
Wenn ein Treiber eine EvtSerCx2CustomTransmitTransactionInitialize-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den seriellen Controller zu initialisieren, bevor die Transaktion gestartet wird. Falls implementiert, muss die EvtSerCx2CustomTransmitTransactionInitialize-Funktion die SerCx2CustomTransmitTransactionInitializeComplete-Methode aufrufen, um SerCx2 darüber zu informieren, wann der Treiber die Initialisierung des seriellen Controllers abgeschlossen hat.
Wenn der Treiber eine EvtSerCx2CustomTransmitTransactionCleanup-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den Hardwarezustand nach Abschluss der Transaktion zu sauber. Bei Implementierung muss die EvtSerCx2CustomTransmitTransactionInitialize-Funktion die SerCx2CustomTransmitTransactionCleanupComplete-Methode aufrufen, um SerCx2 zu informieren, wenn der Treiber die Bereinigung des seriellen Controllers abgeschlossen hat.
Zugreifen auf das Anforderungsobjekt
Um eine benutzerdefinierte Übertragungstransaktion zu starten, ruft SerCx2 die EvtSerCx2CustomTransmitTransactionStart-Funktion des Treibers auf und übergibt die zugeordnete Schreibanforderung (gekapselt in einem WDFREQUEST-Objekthandle) als Parameter an diese Funktion. Der Treiber ist für den Aufruf einer Methode wie WdfRequestComplete verantwortlich, um diese Anforderung nach Abschluss der Transaktion abzuschließen. Es sei denn, die Anforderung kann sofort abgeschlossen werden, bevor die EvtSerCx2CustomTransmitTransactionStart-Funktion zurückgegeben wird, muss der Treiber eine Methode wie WdfRequestMarkCancelableEx aufrufen, um die Anforderung als abbruchfähig zu markieren.
Der Treiber des seriellen Controllers darf keine Methode wie WdfRequestRetrieveInputBuffer verwenden, um auf den Datenpuffer in der Schreibanforderung zuzugreifen. Stattdessen sollte der Treiber die Parameterwerte Mdl, Offset und Length verwenden, die an die EvtSerCx2CustomTransmitTransactionStart-Funktion übergeben werden, um auf diesen Puffer zuzugreifen.
Während einer benutzerdefinierten Übertragungstransaktion muss der Treiber möglicherweise Informationen zur Transaktion in einem Kontext speichern, der an das Anforderungsobjekt angefügt ist. Wenn dies der Fall ist, kann die EvtDriverDeviceAdd-Ereignisrückruffunktion des Treibers die WdfDeviceInitSetRequestAttributes-Methode aufrufen, um die Attribute festzulegen, die für Anforderungsobjekte verwendet werden sollen. Diese Attribute umfassen den Namen und die Zuordnungsgröße, die für Anforderungskontexte verwendet werden sollen. Die in diesem Aufruf angegebenen Anforderungsattribute müssen mit den Anforderungsattributen übereinstimmen, die der Treiber im Aufruf der SerCx2InitializeDevice-Methode angibt. Diese Attribute werden im RequestAttributes-Member der SERCX2_CONFIG-Struktur angegeben, die der Treiber an SerCx2InitializeDevice übergibt. Weitere Informationen finden Sie unter SERCX2_CONFIG.
Bei einer Schreibanforderung, die der serielle Controllertreiber zu Beginn einer benutzerdefinierten Übertragungstransaktion empfängt, wird der vom Treiberframework zugeordnete Anforderungskontext nicht initialisiert. Der Treiber sollte als bewährte Methode die RtlZeroMemory-Routine aufrufen, um diesen Anforderungskontext mit allen Nullen zu initialisieren.