Freigeben über


SerCx2 System-DMA-Transmit-Transaktionen

Einige serielle Controllertreiber implementieren Unterstützung für Übertragungstransaktionen, die den DMA-Controller des Systems verwenden. Diese Unterstützung ist optional, kann jedoch die Leistung verbessern, indem der Standard Prozessor von der Notwendigkeit entfällt, programmierte E/A (PIO) für lange Datenübertragungen zu verwenden. SerCx2 führt eine System-DMA-Übertragungstransaktion durch, indem der System-DMA-Controller eingerichtet und die erforderlichen DMA-Übertragungen im Namen des seriellen Controllertreibers initiiert werden.

Wenn der serielle Controllertreiber ein DMA-Übertragungsobjekt erstellt, stellt der Treiber die Parameter bereit, die SerCx2 zum Einrichten des DMA-Systemadapters für System-DMA-Übertragungstransaktionen verwendet.

Vor dem Start der Transaktion hat der Serielle Controllertreiber die Möglichkeit, eine spezielle Einrichtung der seriellen Controllerhardware oder des DMA-Adapters auszuführen, die möglicherweise für die Transaktion erforderlich ist. Nach Abschluss der Transaktion hat der Treiber die Möglichkeit, die Übertragungs-FIFO zu leeren und bei Bedarf den Hardwarestatus des seriellen Controllers zu sauber.

Erstellen des system-DMA-transmit-Objekts

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

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

Optional kann der Treiber die folgenden Funktionen implementieren:

Ein Treiber, der eine der Funktionen in der vorherigen Liste implementiert, muss alle drei implementieren.

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

Wenn ein Treiber eine EvtSerCx2SystemDmaTransmitInitializeTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den seriellen Controller zu initialisieren, bevor die erste DMA-Übertragung in der Transaktion gestartet wird. Bei Implementierung muss die EvtSerCx2SystemDmaTransmitInitializeTransaction-Funktion die SerCx2SystemDmaTransmitInitializeTransactionComplete-Methode aufrufen, um SerCx2 darüber zu informieren, wann der Treiber die Initialisierung des seriellen Controllers abgeschlossen hat.

Wenn der Treiber eine EvtSerCx2SystemDmaTransmitCleanupTransaction-Ereignisrückruffunktion implementiert, ruft SerCx2 diese Funktion auf, um den Hardwarezustand nach dem Ende der endgültigen DMA-Übertragung in der Transaktion zu sauber. Bei Implementierung muss die EvtSerCx2SystemDmaTransmitInitializeTransaction-Funktion die SerCx2SystemDmaTransmitCleanupTransactionComplete-Methode aufrufen, um SerCx2 zu informieren, wenn der Treiber die Bereinigung des seriellen Controllers abgeschlossen hat.

Ein serieller Controllertreiber, der eine spezielle Konfiguration des DMA-Systemcontrollers zu Beginn einer System-DMA-Übertragungstransaktion durchführen muss, sollte eine EvtSerCx2SystemDmaTransmitConfigureDmaChannel-Ereignisrückruffunktion implementieren. Diese Funktion kann die SerCx2SystemDmaTransmitGetDmaEnabler-Methode aufrufen, um die DMA-Aktivierung für den für die Transaktion verwendeten System-DMA-Adapter abzurufen. SerCx2 ruft diese Funktion auf, bevor die erste DMA-Übertragung in der Transaktion gestartet wird. Weitere Informationen zu DMA-Aktivierungen finden Sie unter Aktivieren von DMA-Transaktionen.

Entleeren und Bereinigen des Übertragungs-FIFO

Ein serieller Controllertreiber, der System-DMA-Übertragungstransaktionen unterstützt, sollte eine EvtSerCx2SystemDmaTransmitDrainFifo-Ereignisrückruffunktion implementieren, wenn der Treiber erkennen kann, wann die Übertragungs-FIFO geleert. Falls implementiert, ruft SerCx2 diese Funktion auf, nachdem das letzte Byte von Daten in einer System-DMA-Übertragungstransaktion in die Übertragungs-FIFO geschrieben wurde. Während dieses Aufrufs aktiviert die EvtSerCx2SystemDmaTransmitDrainFifo-Funktion in der Regel einen Interrupt, der ausgelöst wird, wenn die Übertragungs-FIFO geleert wird, und gibt dann zurück, ohne auf den Interrupt zu warten. Wenn das FIFO geleert wird, ruft der Treiber die SerCx2SystemDmaTransmitDrainFifoComplete-Methode auf, um SerCx2 zu benachrichtigen. Erst nach Erhalt dieser Benachrichtigung führt SerCx2 die ausstehende Schreibanforderung (IRP_MJ_WRITE) aus, die der System-DMA-Übertragungstransaktion zugeordnet ist.

Wenn der Serielle Controllertreiber keine EvtSerCx2SystemDmaTransmitDrainFifo-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 EvtSerCx2SystemDmaTransmitDrainFifo-Funktion implementiert, muss auch evtSerCx2SystemDmaTransmitCancelDrainFifo und EvtSerCx2SystemDmaTransmitPurgeFifo-Ereignisrückruffunktionen implementieren.

Mit der EvtSerCx2SystemDmaTransmitCancelDrainFifo-Funktion kann SerCx2 einen laufenden FIFO-Entleerungsvorgang abbrechen, bevor er abgeschlossen ist. SerCx2 kann diesen Vorgang abbrechen, wenn die Schreibanforderung abgebrochen wird oder wenn der serielle Controller den D0-Gerätestromzustand verlässt, um in einen Energiesparzustand zu wechseln. Wenn die EvtSerCx2SystemDmaTransmitCancelDrainFifo-Funktion den FIFO-Abflussvorgang erfolgreich abbricht, gibt diese Funktion TRUE zurück. Der Rückgabewert TRUE garantiert, dass die EvtSerCx2SystemDmaTransmitDrainFifo-Funktion ohne ersten Aufruf von SerCx2SystemDmaTransmitDrainFifoComplete zurückgegeben wird. Der Rückgabewert FALSE gibt an, dass die EvtSerCx2SystemDmaTransmitDrainFifo-FunktionSerCx2SystemDmaTransmitDrainFifoComplete aufgerufen hat oder aufruft.

Wenn die Schreibanforderung, die einer System-DMA-Übertragungstransaktion zugeordnet ist, abgebrochen wird oder ein Timeout erfolgt, bevor sie abgeschlossen wird, ruft SerCx2 die EvtSerCx2SystemDmaTransmitPurgeFifo-Funktion auf, um alle nicht gesendeten Daten zu verwerfen, die möglicherweise die übertragene FIFO bleiben. Wenn das FIFO gelöscht wird, ruft die EvtSerCx2SystemDmaTransmitPurgeFifo-Funktion die SerCx2SystemDmaTransmitPurgeFifoComplete-Methode auf, um SerCx2 zu benachrichtigen. Erst nach Erhalt dieser Benachrichtigung startet SerCx2 eine neue E/A-Transaktion.