Freigeben über


SerCx2-PIO-Transmit-Transaktionen

SerCx2 erfordert, dass alle seriellen Controllertreiber Unterstützung für Übertragungstransaktionen implementieren, die programmierte E/A (PIO) verwenden. Um eine PIO-Übertragungstransaktion zu starten, ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioTransmitWriteBuffer des Treibers auf und stellt einen Schreibpuffer als Parameter bereit.

Während dieses Aufrufs überträgt die EvtSerCx2PioTransmitWriteBuffer-Funktion Daten aus dem Schreibpuffer an den übertragenden FIFO in der seriellen Controllerhardware. Diese Datenübertragung wird fortgesetzt, bis entweder der Schreibpuffer leer ist oder die Übertragungs-FIFO nicht sofort weitere Daten akzeptieren kann. Wenn die Übertragung endet, gibt die Funktion die Anzahl der Bytes zurück, die erfolgreich aus dem Schreibpuffer in das FIFO übertragen wurden.

Erstellen des PIO-Übertragungsobjekts

Bevor SerCx2 die EvtSerCx2PioTransmitXxx**-Funktionen des seriellen Controllertreibers aufrufen kann, muss der Treiber die SerCx2PioTransmitCreate-Methode aufrufen, um diese Funktionen bei SerCx2 zu registrieren. Diese Methode akzeptiert als Eingabeparameter einen Zeiger auf eine SERCX2_PIO_TRANSMIT_CONFIG-Struktur , die Zeiger auf die EvtSerCx2PioTransmit-Xxx**-Funktionen des Treibers enthält.

Der Treiber ist erforderlich, um alle drei der folgenden Funktionen zu implementieren:

Optional kann der Treiber eine oder beide der folgenden Funktionen implementieren:

Optional kann der Treiber die folgenden drei Funktionen implementieren:

Wenn der Treiber eine Funktion in der vorherigen Liste implementiert, muss er alle drei implementieren.

Die SerCx2PioTransmitCreate-Methode erstellt ein PIO-Übertragungsobjekt und stellt dem aufrufenden Treiber ein SERCX2PIOTRANSMIT-Handle für dieses Objekt bereit. Die EvtSerCx2PioTransmitXxx**-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 PIO-Übertragungstransaktion initialisieren oder den Hardwarestatus des seriellen Controllers am Ende der Transaktion sauber.

Wenn ein Treiber eine EvtSerCx2PioTransmitInitializeTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den seriellen Controller vor dem EvtSerCx2PioTransmitWriteBuffer-Aufruf zu initialisieren, der die Transaktion startet. Bei Implementierung muss die EvtSerCx2PioTransmitInitializeTransaction-Funktion die SerCx2PioTransmitInitializeTransactionComplete-Methode aufrufen, um SerCx2 darüber zu informieren, wann der Treiber die Initialisierung des seriellen Controllers abgeschlossen hat.

Wenn der Treiber eine EvtSerCx2PioTransmitCleanupTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den Hardwarezustand nach dem endgültigen EvtSerCx2PioTransmitWriteBuffer-Aufruf in der Transaktion zu sauber. Falls implementiert, muss die EvtSerCx2PioTransmitInitializeTransaction-Funktion die SerCx2PioTransmitCleanupTransactionComplete-Methode aufrufen, um SerCx2 darüber zu informieren, wann der Treiber die Bereinigung des seriellen Controllers abgeschlossen hat.

Entleeren und Bereinigen des Übertragungs-FIFO

Ein serieller Controllertreiber sollte eine EvtSerCx2PioTransmitDrainFifo-Ereignisrückruffunktion implementieren, wenn der Treiber erkennen kann, wann die Übertragungs-FIFO leert. Falls implementiert, ruft SerCx2 diese Funktion auf, nachdem das letzte Byte von Daten in einer PIO-Übertragungstransaktion in die Übertragungs-FIFO geschrieben wurde. Während dieses Aufrufs ermöglicht die EvtSerCx2PioTransmitDrainFifo-Funktion in der Regel, dass ein Interrupt ausgelöst wird, wenn die Übertragungs-FIFO geleert wird und dann ohne Wartezeit zurückgegeben wird. Wenn das FIFO geleert wird, ruft der Treiber die SerCx2PioTransmitDrainFifoComplete-Methode auf, um SerCx2 zu benachrichtigen. Erst nach Erhalt dieser Benachrichtigung führt SerCx2 die ausstehende Schreibanforderung (IRP_MJ_WRITE) aus, die der PIO-Übertragungstransaktion zugeordnet ist.

Wenn der serielle Controllertreiber keine EvtSerCx2PioTransmitDrainFifo-Funktion implementiert, muss SerCx2 die ausstehende Schreibanforderung abschließen, ohne vorher zu überprüfen, ob die Übertragungs-FIFO geleert wurde. Es kann nicht garantiert werden, dass an die FIFO geschriebene Daten ohne erhebliche Verzögerung übermittelt werden. Alle Daten, die nach Abschluss einer Schreibanforderung im FIFO verbleiben, gehen möglicherweise verloren, bevor sie übertragen werden können. Dieser unerwartete Datenverlust in einer erfolgreich abgeschlossenen Schreibanforderung kann zu Zuverlässigkeitsproblemen für den Peripherietreiber führen, der die Anforderung gesendet hat.

Ein Treiber, der eine EvtSerCx2PioTransmitDrainFifo-Funktion implementiert, muss auch evtSerCx2PioTransmitCancelDrainFifo und EvtSerCx2PioTransmitPurgeFifo-Ereignisrückruffunktionen implementieren.

Mit der Funktion EvtSerCx2PioTransmitCancelDrainFifo kann SerCx2 einen laufenden FIFO-Abflussvorgang abbrechen, bevor er abgeschlossen ist. SerCx2 kann diesen Vorgang abbrechen, wenn für die Schreibanforderung ein Zeitüberschreitung auftritt oder abgebrochen wird. Wenn die Funktion EvtSerCx2PioTransmitCancelDrainFifo den FIFO-Abflussvorgang erfolgreich abbricht, gibt diese Funktion TRUE zurück. Der Rückgabewert TRUE garantiert, dass der serielle Controllertreiber nicht aufgerufen hat und SerCx2PioTransmitDrainFifoComplete nicht aufruft. Der Rückgabewert FALSE gibt an, dass die EvtSerCx2PioTransmitDrainFifo-FunktionSerCx2PioTransmitDrainFifoComplete aufgerufen hat oder in Kürze aufrufen wird.

Wenn die Schreibanforderung, die einer PIO-Übertragungstransaktion zugeordnet ist, abgebrochen wird oder ein Timeout vor Abschluss erfolgt, ruft SerCx2 die EvtSerCx2PioTransmitPurgeFifo-Funktion auf, wenn sie implementiert ist, um nicht gesendete Daten zu verwerfen, die möglicherweise die übertragene FIFO bleiben. SerCx2 verwendet die Informationen, die er von dieser Funktion erhält, um dem Peripherietreiber genau mitzuteilen, wie viele Bytes daten erfolgreich durch die Schreibanforderung an das Peripheriegerät übertragen wurden.

Bereite Benachrichtigungen

Wenn ein EvtSerCx2PioTransmitWriteBuffer-Aufruf endet, weil die Übertragungs-FIFO nicht sofort weitere Daten akzeptieren kann, muss SerCx2 warten, bis die PIO-Empfangstransaktion abgeschlossen ist, bis die FIFO zu einem späteren Zeitpunkt bereit ist, weitere Daten zu akzeptieren. In diesem Fall ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioTransmitEnableReadyNotification auf, damit der serielle Controllertreiber eine bereite Benachrichtigung senden kann. Wenn diese Benachrichtigung aktiviert ist, ruft der serielle Controllertreiber die SerCx2PioTransmitReady-Methode auf, um SerCx2 zu benachrichtigen, wenn der Treiber erkennt, dass die Übertragungs-FIFO bereit ist, weitere Daten zu akzeptieren. Als Reaktion auf diese Benachrichtigung ruft SerCx2 die EvtSerCx2PioTransmitWriteBuffer-Funktion auf, um weitere Daten in den FIFO zu schreiben.

Wenn die bereite Benachrichtigung aktiviert ist, wenn das Timeout der Schreibanforderung überschritten oder abgebrochen wird, ruft SerCx2 die Ereignisrückruffunktion EvtSerCx2PioTransmitCancelReadyNotification auf, um die ausstehende Benachrichtigung abzubrechen. Wenn diese Funktion die ausstehende Benachrichtigung erfolgreich abbricht, wird TRUE zurückgegeben. Der Rückgabewert TRUE garantiert, dass der serielle Controllertreiber SerCx2PioTransmitReady nicht aufruft. Der Rückgabewert FALSE gibt an, dass die EvtSerCx2PioTransmitDrainFifo-FunktionSerCx2PioTransmitReady aufgerufen hat oder aufruft.