Einrichten der isochronen Übertragung für IEEE 1394-Geräte

Bevor Treiber ihr Gerät starten können, müssen sie die folgenden Schritte ausführen:

Schritt 1: Wählen Sie die Übertragungsgeschwindigkeit aus.

Der IEEE 1394-Bus kann mehrere unterschiedliche Geschwindigkeiten unterstützen, die durch die Hardware begrenzt sind. Auch wenn ein bestimmtes Gerät eine bestimmte Geschwindigkeit unterstützt, kann es an ein anderes Gerät angeschlossen werden, das nur niedrigere Geschwindigkeiten unterstützt. Treiber müssen zur Laufzeit die Übertragungsgeschwindigkeit zwischen dem Gerät und dem Computer bestimmen. Sie fragen den Bustreiber mit der REQUEST_GET_SPEED_BETWEEN_DEVICES Anforderung ab, um die maximal mögliche Geschwindigkeit zwischen zwei Geräten im Bus oder dem Gerät und dem Hostcomputer zu bestimmen.

Schritt 2. Zuordnen von Bandbreite.

Bevor eine isochrone Datenübertragung stattfinden kann, muss der Fahrer die Bandbreite auf dem Bus reservieren. Der Bus verfolgt die Menge der zugewiesenen Bandbreite nach, bis er einen festen Betrag erreicht (gemäß der IEEEE 1394-1995-Spezifikation beträgt die maximale Bandbreite, die gesendet werden kann, 80% eines Buszyklus, was 125 Nanosekunden beträgt); Es erlaubt dann keinem anderen Gerät, Bandbreite zu erfassen, bis ein Teil der derzeit zugewiesenen Bandbreite freigegeben ist. Der Treiber sendet die REQUEST_ISOCH_ALLOCATE_BANDWIDTH Anforderung an den Bustreiber, um Bandbreite zu reservieren.

Wenn die Anforderung erfolgreich ist, gibt der Bustreiber ein Bandbreitenhandle zurück. Der Treiber verwendet dieses Handle in zukünftigen bandbreitenbezogenen Anforderungen an den Bustreiber. Der Treiber kann beispielsweise REQUEST_ISOCH_SET_CHANNEL_BANDWIDTH auf dem Handle verwenden, um die zugewiesene Bandbreite anzupassen. Wenn der Treiber mit der zugewiesenen Bandbreite fertig ist, muss er REQUEST_ISOCH_FREE_BANDWIDTH verwenden, um die Bandbreite freizugeben, damit sie von anderen Geräten im Bus verwendet werden kann.

Wenn die Anforderung fehlschlägt, darf der Treiber keine Datenübertragung versuchen. Treiber, die die Bandbreite nicht zuordnen können, können sie möglicherweise bei nachfolgenden Versuchen zuordnen, sodass sie sich in einem Zustand befinden, in dem sie später versuchen können, Die Bandbreite bei Bedarf zuzuweisen. Versuche, nach einer Buszusetzung Bandbreite zuzuweisen, sind wahrscheinlich erfolgreich, da das System nach einer Buszurücksetzung automatisch alle zuvor zugewiesenen Bandbreiten und Kanäle freigibt.

Treiber, denen die Zuweisung von Bandbreite erfolgreich ist, müssen ihre Bandbreite und Kanäle nach einer Buszurücksetzung aus den soeben genannten Gründen neu zuordnen. Darüber hinaus werden Bandbreitenhandles nach einem Zurücksetzen veraltet und müssen durch einen Aufruf an REQUEST_ISOCH_FREE_BANDWIDTH freigegeben werden, es sei denn, die Bandbreite wurde mit dem IRB_FLAG_ALLOW_REMOTE_FREE-Flag zugewiesen.

Schritt 3. Ordnen Sie einen Kanal zu.

Nachdem eine Anforderung zur Bandbreitenzuordnung erfolgreich war, fordert der Treiber einen isochronen Kanal an, in dem Daten geschrieben werden sollen. Mehrere Geräte können Pakete auf einem isochronen Kanal lesen, aber nur ein Gerät kann in einen Kanal schreiben. Geräte, die isochrone Pakete empfangen, senden keine Bestätigungspakete im Gegenzug.

Treiber fordern einen Kanal an, indem sie die REQUEST_ISOCH_ALLOCATE_CHANNEL-Anforderung an den Bustreiber senden. Der Treiber kann einen bestimmten Kanal anfordern oder ISOCH_ANY_CHANNEL, einen beliebigen freien Kanal zuzuweisen. Bei Erfolg gibt der Bustreiber den zugeordneten Kanal zurück. Wenn der Bustreiber einen Fehlercode zurückgibt, dürfen die Treiber keine Datenübertragung versuchen, und sie müssen die in Schritt 2 zugewiesene Bandbreite zuordnen.

Treiber sollten nicht davon ausgehen, dass ein Kanal nie verfügbar ist, da er derzeit nicht verfügbar ist. Kanäle können jederzeit frei werden, daher sollten sich Die Treiber in einem Zustand befinden, in dem sie später versuchen können, einen Kanal zuzuweisen, wenn dies angebracht ist.

Schritt 4. Ordnen Sie ein Ressourcenhandle zu.

Sobald der Treiber einen Kanal zuweist, weist er ein Ressourcenhandle für diesen Kanal zu. In allen nachfolgenden Schritten verwendet der Treiber das Ressourcenhandle, um den Kanal anzugeben.

Treiber weisen ein Ressourcenhandle für den Kanal zu, indem sie die REQUEST_ISOCH_ALLOCATE_RESOURCES Anforderung an den Bustreiber übermitteln.

Wenn der Treiber ein Ressourcenhandle zuordnet, gibt er auch Flags an, die angeben, wie die Puffer verwendet werden, die dem Handle angefügt sind:

  • Wenn der Treiber den Kanal verwendet, um Daten von einem Gerät zu lesen (ein REQUEST_ISOCH_LISTEN Vorgang), legt er das RESOURCE_USED_IN_LISTENING-Flag fest. Wenn der Treiber den Kanal verwendet, um Daten auf das Gerät zu schreiben (ein REQUEST_ISOCH_TALK Vorgang), legt er das RESOURCE_USED_IN_TALKING-Flag fest.

  • Der Treiber verwendet das Handle, um Datenpuffer für die Transaktion bereitzustellen. (Ausführliche Informationen finden Sie unter Schritt 5.) Der Bustreiber verwendet die Puffer so lange, bis er ausläuft, und hält den Vorgang an, bis der Gerätetreiber weitere Puffer anfügt. Weitere Informationen finden Sie unter Puffern isochroner DMA-Übertragungen für IEEE 1394-Geräte .

  • Der Treiber kann angeben, dass der Vorgang mit einem bestimmten Wert der isochronen Zyklusuhr synchronisiert wird. Weitere Informationen finden Sie unter Isochrone Synchronisierungsoptionen für IEEE 1394-Geräte .

  • Der Treiber kann Optionen für isochrone Lauschvorgänge festlegen. Der Treiber kann angeben, ob die isochronen Paketheader aus den Datenpaketen entfernt werden. Der Treiber kann auch angeben, ob ein Paket pro Puffer eingehende Daten in die wartenden Datenpuffer kopiert werden sollen oder ob jeder Puffer mit Daten gefüllt werden soll. Weitere Informationen finden Sie unter Isochronous Listen-Optionen für IEEE 1394-Geräte .

Wenn diese Anforderung fehlschlägt, sollten Treiber alle isochronen Ressourcen, die sie in den vorherigen Schritten zugewiesen haben, behandeln.

Schritt 5. Fügen Sie Puffer an das Ressourcenhandle an.

Sobald der Treiber ein Ressourcenhandle zuordnet, fügt er Puffer an das Handle an. Der Host-DMA-Controller liest Daten aus oder schreibt Daten in die angefügten Puffer.

Bei jedem Puffer übergibt der Treiber eine ISOCH_DESCRIPTOR-Struktur , die beschreibt, wie der Puffer verwendet wird. In der ISOCH_DESCRIPTOR Struktur des Puffers kann der Treiber die folgenden Informationen angeben:

  • Die maximale Anzahl von Bytes pro Frame. Beim Übertragen von Daten teilt der Hostcontroller den Datenpuffer in Pakete dieser Größe auf.

  • Eine optionale Rückrufroutine. Der Bustreiber ruft diese Routine auf, wenn er die Verarbeitung abgeschlossen hat.

  • Synchronisierungsoptionen. Eine Beschreibung der Synchronisierungsoptionen finden Sie unter Isochrone Synchronisierungsoptionen für IEEE 1394-Geräte .

  • Bei isochronen Gesprächsvorgängen kann der Treiber diesen Puffer als Liste von Headern festlegen, die den nächsten Datenpaketen vorangestellt werden sollen. Weitere Informationen finden Sie unter Isochronous Talk-Optionen für IEEE 1394-Geräte .

Sobald der Vorgang begonnen hat, kann der Treiber Puffer trennen, die er nicht mehr benötigt, und zusätzliche Puffer anfügen. Der Treiber kann die in ISOCH_DESCRIPTOR identifizierte Rückrufroutine verwenden, um sich selbst zu signalisieren, wenn der Bustreiber die Verarbeitung des letzten angefügten Puffers abgeschlossen hat. Eine Beschreibung der DMA-Pufferung für IEEE 1394-Geräte finden Sie unter Puffern isochroner DMA-Übertragungen für IEEE 1394-Geräte.

Schritt 6: Beginnen der Datenübertragung

Um vom Gerät zu lesen, gibt der Treiber die REQUEST_ISOCH_LISTEN-Anforderung aus. Um auf das Gerät zu schreiben, gibt der Treiber die REQUEST_ISOCH_TALK Anforderung aus. Der Treiber kann das Gerät dann gerätespezifisch zum Lesen oder Schreiben aktivieren.