Freigeben über


SerCx2-System-DMA-Receive-Transaktionen

Einige serielle Controllertreiber implementieren Unterstützung für Empfangstransaktionen, 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-Receive-Transaktion durch, indem der DMA-Systemcontroller eingerichtet und die erforderlichen DMA-Übertragungen im Namen des seriellen Controllertreibers initiiert werden.

Wenn der serielle Controllertreiber ein System-DMA-receive-Objekt erstellt, stellt der Treiber die Parameter bereit, die SerCx2 zum Einrichten des DMA-Systemadapters für System-DMA-Receive-Transaktionen verwendet.

Vor dem Start einer System-DMA-Receive-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 kann der Treiber bei Bedarf eine sauber des Hardwarezustands des seriellen Controllers ausführen, der möglicherweise erforderlich ist.

Erstellen des system-DMA-receive-Objekts

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

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

Optional kann der Treiber die folgenden beiden Funktionen implementieren:

Ein Treiber, der eine der beiden Funktionen in der vorherigen Liste implementiert, muss beide implementieren.

Die SerCx2SystemDmaReceiveCreate-Methode erstellt ein System-DMA-receive-Objekt und stellt dem aufrufenden Treiber ein SERCX2SYSTEMDMARECEIVE-Handle für dieses Objekt bereit. Die EvtSerCx2SystemDmaReceiveXxx**-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-Empfangstransaktion initialisieren oder den Hardwarestatus des seriellen Controllers am Ende der Transaktion sauber.

Wenn ein Treiber eine EvtSerCx2SystemDmaReceiveInitializeTransaction-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 EvtSerCx2SystemDmaReceiveInitializeTransaction-Funktion die SerCx2SystemDmaReceiveInitializeTransactionComplete-Methode aufrufen, um SerCx2 zu informieren, wenn der Treiber die Initialisierung des seriellen Controllers abgeschlossen hat.

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

Ein serieller Controllertreiber, der zu Beginn einer System-DMA-Empfangstransaktion eine spezielle Konfiguration des DMA-Systemcontrollers durchführen muss, sollte eine EvtSerCx2SystemDmaReceiveConfigureDmaChannel-Ereignisrückruffunktion implementieren. Diese Funktion kann die SerCx2SystemDmaReceiveGetDmaEnabler-Methode aufrufen, um den DMA-Enabler 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.

New-Data-Benachrichtigungen

Optional kann der Serielle Controllertreiber eine EvtSerCx2SystemDmaReceiveEnableNewDataNotification-Ereignisrückruffunktion implementieren. Falls implementiert, verwendet SerCx2 diese Funktion, um Intervalltimeouts während der Verarbeitung von Leseanforderungen, die als System-DMA-Receive-Transaktionen verarbeitet werden, effizient zu verwalten.

Ein Intervalltimeout tritt auf, wenn das Intervall zwischen zwei aufeinander folgenden Bytes, die vom seriellen Controller empfangen werden, eine vom Client angegebene maximale Zeit überschreitet. Nachdem ein Peripherietreiber eine Leseanforderung an SerCx2 gesendet hat, kann ein Intervalltimeout erst auftreten, nachdem mindestens ein Byte von Daten vom seriellen Peripheriegerät empfangen wurde. Die Zeit zwischen dem Eingang einer Leseanforderung und dem Empfang des ersten Bytes von Daten vom Peripheriegerät kann erheblich länger sein als die Zeit, die erforderlich ist, um die restlichen Daten für die Leseanforderung zu empfangen, nachdem das erste Byte empfangen wurde. Weitere Informationen finden Sie unter SERIAL_TIMEOUTS.

SerCx2 ruft die EvtSerCx2SystemDmaReceiveEnableNewDataNotification-Funktion auf, wenn sie implementiert ist, um eine new-data-Benachrichtigung zu aktivieren. Wenn diese Benachrichtigung aktiviert ist und der serielle Controller ein oder mehrere Bytes neuer Daten vom Peripheriegerät empfängt oder bereits Daten im Empfangs-FIFO enthält, muss der serielle Controllertreiber die SerCx2SystemDmaReceiveNewDataNotification-Methode aufrufen, um SerCx2 zu benachrichtigen.

Um ein mögliches Intervalltimeout zu erkennen, ruft SerCx2 regelmäßig die ReadDmaCounter-Routine des DMA-Systemadapters auf, um zu überprüfen, ob während des vorherigen Intervalls Daten empfangen wurden. Wie SerCx2 den Empfang des ersten Datenbytes erkennt, hängt davon ab, ob der Treiber des seriellen Controllers eine EvtSerCx2SystemDmaReceiveEnableNewDataNotification-Funktion implementiert. Wenn diese Funktion implementiert ist, ruft SerCx2 die Funktion auf, um eine New-Data-Benachrichtigung zu aktivieren, und wird vom Treiber benachrichtigt, wenn das erste Byte der Daten empfangen wird. Andernfalls ruft SerCx2 in regelmäßigen Abständen ReadDmaCounter auf, um den Empfang des ersten Byte zu erkennen, und muss möglicherweise den Prozessor regelmäßig reaktivieren, um diese Aufrufe auszuführen. Daher kann ein Treiber, der eine EvtSerCx2SystemDmaReceiveEnableNewDataNotification-Funktion implementiert, den Energieverbrauch reduzieren, da der Prozessor nicht so oft reaktiviert werden muss.

Hinweis SerCx2 basiert auf der ReadDmaCounter-Routine des System-DMA-Adapters, um Timeouts bei System-DMA-Empfangstransaktionen und System-DMA-Übertragungstransaktionen zu überwachen. Die Hardware abstraction Layer (HAL) muss eine voll funktionsfähige ReadDmaCounter-Routine für den DMA-Systemcontroller implementieren, der zum Übertragen von Daten zum und vom seriellen Controller verwendet wird.

Ein serieller Controllertreiber, der Benachrichtigungen über neue Daten für System-DMA-Empfangstransaktionen unterstützt, muss eine EvtSerCx2SystemDmaReceiveCancelNewDataNotification-Ereignisrückruffunktion implementieren, damit SerCx2 eine aktivierte new-data-Benachrichtigung abbrechen kann, bevor sie auftritt. Wenn eine Benachrichtigung über neue Daten aktiviert ist, wenn die ausstehende Leseanforderung abgebrochen wird oder ein Timeout auftritt, ruft SerCx2 die Funktion EvtSerCx2SystemDmaReceiveCancelNewDataNotification auf, um die Benachrichtigung abzubrechen. Wenn diese Funktion die ausstehende Benachrichtigung erfolgreich abbricht, wird TRUE zurückgegeben. Der Rückgabewert TRUE garantiert, dass der Serielle Controllertreiber SerCx2SystemDmaReceiveNewDataNotification nicht aufruft. Der Rückgabewert FALSE gibt an, dass der Treiber SerCx2SystemDmaReceiveNewDataNotification aufgerufen hat oder in Kürze aufrufen wird. Weitere Informationen zu Timeouts insgesamt finden Sie unter SERIAL_TIMEOUTS.