Freigeben über


Übersicht über SerCx2-E/A-Transaktionen

SerCx2 verarbeitet eine Lese- oder Schreibanforderung von einem Client, indem eine oder mehrere E/A-Transaktionen an den seriellen Controllertreiber ausgegeben werden. Dieser Treiber behandelt jede Transaktion als eigenständige E/A-Vorgänge, die Daten zwischen dem seriellen Controller und dem Datenpuffer in der Anforderung übertragen.

Integrierte SoC-Leitungen (System-on-a-Chip) enthalten häufig serielle Controller (oder UARTs), um die serielle Hochgeschwindigkeitskommunikation mit anderen integrierten Leitungen zu ermöglichen, die mit derselben Leiterplatte gelöt werden. Die Prozessoren auf diesen SoCs können programmierte E/A (PIO) verwenden, um Daten direkt an oder aus den speicherbasierten Datenregistern in diesen seriellen Controllern zu übertragen. Darüber hinaus bieten diese SoCs in der Regel erweiterte DMA-Hardware zum Verschieben von Daten zwischen den seriellen Controllern und dem Arbeitsspeicher.

PIO kann für kurze Datenübertragungen ausreichen, aber die Verwendung von PIO für längere Übertragungen bei hohen Datenraten stellt eine zu große Belastung für den Prozessor dar. DMA wird benötigt, um solche Übertragungen vom Prozessor auszulagern.

Arten von E/A-Transaktionen

SerCx2 definiert die folgenden drei allgemeinen Arten von E/A-Transaktionen:

  • PIO
  • System-DMA
  • Benutzerdefiniert

Alle seriellen Controllertreiber müssen E/A-Transaktionen unterstützen, die PIO zum Übertragen von Daten verwenden. Ein serieller Controllertreiber kann auch E/A-Transaktionen unterstützen, die System-DMA oder einen benutzerdefinierten Datenübertragungsmechanismus verwenden, je nach den Funktionen des seriellen Controllers und der zugehörigen Hardware. Der Treiber kann entweder System-DMA-Transaktionen oder benutzerdefinierte Transaktionen unterstützen, aber nicht beide.

Für jeden Typ von E/A-Transaktionen, die von der Hardware des seriellen Controllers unterstützt werden, registriert der serielle Controllertreiber ein Supportpaket bei SerCx2. Dieses Paket beschreibt die relevanten Hardwarefunktionen und enthält eine Reihe von vom Treiber implementierten Ereignisrückruffunktionen, die SerCx2 aufruft, um diese Art von E/A-Transaktionen zu initiieren und zu steuern.

Wenn ein serieller Controller einen System-DMA-Controller verwenden kann, der möglicherweise für andere Geräte freigegeben wird, unterstützt der serielle Controllertreiber möglicherweise DMA-Systemtransaktionen. Für diese Transaktionen richtet SerCx2 den System-DMA-Controller ein und initiiert die DMA-Übertragungen. Der serielle Controllertreiber leistet bei DMA-Systemtransaktionen relativ wenig Arbeit.

Wenn ein serieller Controller über einen benutzerdefinierten Hardwaremechanismus zum Übertragen von Daten verfügt, unterstützt der serielle Controllertreiber möglicherweise benutzerdefinierte Transaktionen, die diesen Mechanismus verwenden. Wenn die Hardware des seriellen Controllers beispielsweise über eine integrierte Bus-master DMA-Funktion verfügt, kann der serielle Controllertreiber benutzerdefinierte Transaktionen unterstützen, um diese Funktion für SerCx2 verfügbar zu machen.

Benutzerdefinierte Transaktionen sind flexibel in Bezug auf die Arten von Datenübertragungsmechanismen, die sie unterstützen können. Diese Transaktionen sind jedoch schwieriger zu implementieren als PIO-Transaktionen oder System-DMA-Transaktionen. Um benutzerdefinierte Transaktionen zu unterstützen, muss der Treiber für serielle Controller in der Regel die Hardware einrichten und initialisieren, die zum Übertragen von Daten verwendet wird. Außerdem muss der Treiber die Transaktion beenden und die Anforderung abschließen, wenn eine ausstehende Lese- oder Schreibanforderung abgebrochen wird, bevor die zugeordnete Transaktion für den benutzerdefinierten Empfang oder die benutzerdefinierte Übertragung abgeschlossen wird.

Jede E/A-Transaktion ist ein relativ einfacher Vorgang. Eine E/A-Transaktion liest entweder Daten aus dem seriellen Controller oder schreibt Daten in den Controller und kombiniert nie Lese- und Schreibvorgänge. Eine E/A-Transaktion verwendet einen einzelnen Übertragungsmodus – PIO, System-DMA oder benutzerdefinierte – und kombiniert niemals Übertragungsmodi.

SerCx2 kann intelligent entscheiden, ob PIO oder DMA zum Erfüllen einer Lese- oder Schreibanforderung verwendet werden soll. Beispielsweise kann SerCx2 eine sehr kurze Lese- oder Schreibanforderung für den seriellen Controllertreiber als PIO-Transaktion präsentieren. Oder SerCx2 stellt eine längere Lese- oder Schreibanforderung an den seriellen Controller als DMA-Transaktion dar.

Aufteilen einer Lese- oder Schreibanforderung in mehrere Transaktionen

Einige System-DMA-Controller weisen möglicherweise Einschränkungen auf, die erfordern, dass SerCx2 eine längere Lese- oder Schreibanforderung in zwei oder mehr E/A-Transaktionen unterbricht. Wenn beispielsweise ein System-DMA-Controller DMA-Übertragungen erfordert, um gerade Bytegrenzen im Arbeitsspeicher zu starten und zu enden, der Datenpuffer in einer Leseanforderung jedoch mit ungeraden Bytegrenzen beginnt und endet, kann SerCx2 PIO verwenden, um die ersten und letzten Bytes an den Puffer zu übertragen, und das System-DMA zum Übertragen aller Daten zwischen dem ersten und dem letzten Bytes. In diesem Beispiel stellt SerCx2 die folgenden drei E/A-Transaktionen an den seriellen Controllertreiber in der angegebenen Reihenfolge aus:

  1. Eine PIO-Receive-Transaktion für das erste Byte.
  2. Eine System-DMA-receive-Transaktion für die Zwischenbytes.
  3. Eine PIO-Receive-Transaktion für das letzte Byte.

Wenn ein benutzerdefinierter Datenübertragungsmechanismus eine benutzerdefinierte Übertragungstransaktion auf einer beliebigen Bytegrenze im Arbeitsspeicher starten und beenden kann, die Puffergröße in einer Schreibanforderung jedoch die maximale Übertragungslänge einer benutzerdefinierten Übertragungstransaktion überschreitet, partitioniert SerCx2 die Schreibanforderung in zwei (oder mehr) benutzerdefinierte Übertragungstransaktionen, von denen jede die maximale Übertragungslänge nicht überschreitet.

Wenn SerCx2 eine Lese- oder Schreibanforderung in zwei oder mehr E/A-Transaktionen aufteilen muss, kann der serielle Controllertreiber die Beziehung dieser Transaktionen zueinander und zur Anforderung sicher ignorieren. SerCx2 serialisiert die Transaktionen, um sicherzustellen, dass die Daten in der richtigen Reihenfolge empfangen oder übertragen werden.

Wenn der serielle Controllertreiber eine Reihe von Rückruffunktionen registriert, um System-DMA-Transaktionen oder benutzerdefinierte Transaktionen zu unterstützen, stellt der Treiber Parameterwerte bereit, die die Funktionen der Hardware beschreiben, die diese Transaktionen ausführt. Für System-DMA-Transaktionen umfassen die Parameter beispielsweise die Ausrichtungsanforderungen sowie die mindesten und maximalen Übertragungslängen, die der System-DMA-Controller unterstützt. SerCx2 verwendet diese Parameter, um zu entscheiden, ob eine Lese- oder Schreibanforderung als PIO-Transaktion oder eine System-DMA-Transaktion verarbeitet werden soll und ob die Anforderung in zwei oder mehr E/A-Transaktionen aufgeteilt werden soll.

Ein serieller Controller kann jedoch über spezielle Hardwarefunktionen verfügen, die nicht durch die Parameter beschrieben werden können, die der serielle Controllertreiber für SerCx2 bereitstellt. Daher hat der Treiber möglicherweise Zugriff auf hardwareabhängige Informationen, die es dem Treiber ermöglichen, bessere Entscheidungen als SerCx2 über die Partitionierung einer Lese- oder Schreibanforderung in eine oder mehrere E/A-Transaktionen zu treffen. Optional kann ein solcher Treiber Die Rückruffunktionen EvtSerCx2SelectNextReceiveTransactionType und EvtSerCx2SelectNextTransactionType implementieren. SerCx2 ruft diese Funktionen auf, wenn sie implementiert sind, damit der Treiber entscheiden kann, welche E/A-Transaktionen zum Erfüllen einer Lese- oder Schreibanforderung verwendet werden sollen.