Universal Serial Bus — Änderungen 7306 → 7308

Zeile 2: Zeile 2:
 
{{Achtung|Text=An diesem Artikel wird derzeit vor allem von [[Benutzer:XanClic|XanClic]] aktiv gearbeitet. Melde dich daher entweder im [[IRC]] oder auf der [[Diskussion:Universal Serial Bus|Diskussionsseite]], bevor du ihn veränderst (wenn ich nicht im IRC bin, dann kannst du ihn auch verändern, weil ich dann sehr wahrscheinlich gar nicht online bin).}}
 
{{Achtung|Text=An diesem Artikel wird derzeit vor allem von [[Benutzer:XanClic|XanClic]] aktiv gearbeitet. Melde dich daher entweder im [[IRC]] oder auf der [[Diskussion:Universal Serial Bus|Diskussionsseite]], bevor du ihn veränderst (wenn ich nicht im IRC bin, dann kannst du ihn auch verändern, weil ich dann sehr wahrscheinlich gar nicht online bin).}}
  
−
Der '''Universal Serial Bus''' (kurz '''USB''') ist ein [[:Kategorie:Bus | Bus]] zur Verbindung von Geräten mit einem PC und wird von praktisch jedem modernen Computer unterstützt. USB ist abwärtskompatibel, d. h., dass man lagsame USB-1.0-Geräte an den schnelleren USB 2.0 oder 3.0 anschließen kann und umgekehrt.
+
Der '''Universal Serial Bus''' (kurz '''USB''') ist ein [[:Kategorie:Bus | Bus]] zur Verbindung von Geräten mit einem PC und wird von praktisch jedem modernen Computer unterstützt. USB ist abwärtskompatibel, d. h., dass man lagsame USB 1.0-Geräte an den schnelleren USB 2.0 oder 3.0 anschließen kann und umgekehrt.
  
 
== Einsatzgebiete ==
 
== Einsatzgebiete ==
Zeile 250: Zeile 250:
 
| DATA1 || 0x4B || Ein Datenpaket mit dem Data-Toggle-Bit 1.
 
| DATA1 || 0x4B || Ein Datenpaket mit dem Data-Toggle-Bit 1.
 
|-
 
|-
−
| DATA2 || 0x87 || Ein Datenpaket für High-Speed-Isochronoustransfers, die eine hohe Bandbreite benötigen.
+
| DATA2 || 0x87 || Ein Datenpaket für High-Speed-IN-Isochronoustransfers, die eine hohe Bandbreite benötigen.
 
|-
 
|-
−
| MDATA || 0x0F || Ein Datenpaket für High-Speed-SPLIT-Isochronoustransfers, die eine hohe Bandbreite benötigen.
+
| MDATA || 0x0F || Ein Datenpaket für High-Speed-OUT-Isochronoustransfers, die eine hohe Bandbreite benötigen.
 
|-
 
|-
 
| rowspan="4" | Handshake || ACK || 0xD2 || Bestätigung eines fehlerfrei empfangenen Pakets.
 
| rowspan="4" | Handshake || ACK || 0xD2 || Bestätigung eines fehlerfrei empfangenen Pakets.
Zeile 433: Zeile 433:
  
 
Hinweis: Man könnte sich fragen, warum der Host nach dem nicht angekommenen ACK ein IN sendet, wenn er doch alle Daten hat. Wir nehmen hier an, dass er eben noch nicht alle Daten hat und ein weiteres Paket erwartet. Wenn er allerdings bereits alle Daten empfangen hätte, würde er die Übertragung einfach beenden und das Gerät würde anhand der verstreichenden Zeitspanne bemerken, dass etwas nicht stimmt und somit seine Daten verwerfen.
 
Hinweis: Man könnte sich fragen, warum der Host nach dem nicht angekommenen ACK ein IN sendet, wenn er doch alle Daten hat. Wir nehmen hier an, dass er eben noch nicht alle Daten hat und ein weiteres Paket erwartet. Wenn er allerdings bereits alle Daten empfangen hätte, würde er die Übertragung einfach beenden und das Gerät würde anhand der verstreichenden Zeitspanne bemerken, dass etwas nicht stimmt und somit seine Daten verwerfen.
 +
 +
Es gibt für die verschiedenen Transferarten verschiedene Regeln, wann das Toggle-Bit auf einen definierten Zustand gesetzt wird. Bei Controltransfers wird das SETUP-Paket mit DATA0 versendet, danach gelten die normalen Regeln, bis zum Handshake, das immer mit DATA1 versehen wird. Das Toggle-Bit von Bulkendpunkten wird auf 0 gesetzt, sobald die aktuelle Konfiguration gewechselt wird, gleiches gilt für Interruptendpunkte.
 +
 +
====== Isochronous ======
 +
Bei Isochronoustransfers wird das Toggle-Bit nicht wie hier beschrieben verwendet, stattdessen wird bei normalen Isochronoustransfers immer DATA0 verwenden und bei solche mit hoher Bandbreite, also mehreren Paketen pro Microframe (bei Full-Speed-Isochronous wird nur DATA0 verwendet), wird das Bit bei Beginn jedes Microframes gewissermaßen zurückgesetzt.
 +
 +
Bei IN-Transfers wird bei einem Paket pro Microframe nur DATA0 verwendet, bei zweiem kommt zuerst DATA1, dann DATA0 und bei dreien sendet das Gerät am zuerst DATA2, dann DATA1 und zuletzt DATA0.
 +
 +
Bei OUT-Transfers zeigt ein MDATA-Paket an, dass im aktuellen Microframe noch ein Paket folgt und der Typ des letzten DATA-Pakets gibt dann an, wie viele MDATA-Pakete gesendet wurden. So wird bei einem Paket pro Microframe nur DATA0 verwendet, bei zweien ergibt sich zuerst MDATA, dann DATA1 und bei dreien gibt es zuerst zwei MDATA-Pakete und zuletzt ein DATA2-Paket.
  
 
==== False EOPs ====
 
==== False EOPs ====
Zeile 481: Zeile 490:
 
|-
 
|-
 
| Handshake || OUT/IN || Umgekehrt zur in der Datenphase verwendeten Richtung (oder der Richtung, die verwendet worden wäre, wenn es keine Datenphase gab) wird nun ein IN- bzw. OUT-Paket gesendet. Dies dient als nochmalige Versicherung, dass das Gerät die Anfrage auch verstanden und verarbeitet hat.
 
| Handshake || OUT/IN || Umgekehrt zur in der Datenphase verwendeten Richtung (oder der Richtung, die verwendet worden wäre, wenn es keine Datenphase gab) wird nun ein IN- bzw. OUT-Paket gesendet. Dies dient als nochmalige Versicherung, dass das Gerät die Anfrage auch verstanden und verarbeitet hat.
 +
|}
 +
 +
=== Bulktransfers ===
 +
Ein Bulktransfer besitzt keine besondere Struktur. Das Data-Toggle-Bit wird bei jeder Änderung der Gerätekonfiguration auf 0 zurückgesetzt und ansonsten werden einfache IN- und OUT-Pakete verwendet. Hier könnte das „Lowlevel?“-Paket als Beispiel dienen:
 +
 +
{| {{Prettytable}} cellpadding="5"
 +
{{USB-Transferliste}}
 +
{{USB-Transfer|dir=out|type=OUT|addr=42|endp=1|crc=0x1C}}
 +
{{USB-Transfer|dir=out|type=DATA0|data=0x4C 0x6F 0x77 0x6C 0x65 0x76 0x65 0x6C 0x3F|crc=0x80F2}}
 +
{{USB-Transfer|dir=in|type=ACK}}
 +
|}
 +
 +
=== Interrupttransfers ===
 +
Interrupttransfers sind im Grunde einfache Bulk-IN-Transfers, die periodisch (also regelmäßig) ausgeführt werden. Wenn das Gerät keine neuen Daten besitzt, sendet es ein NAK, sind Daten vorhanden, sendet es diese und wartet auf ein ACK des Hosts (oder auf einen anderen Handshake, wobei es pro Frame nur drei Versuche gibt, danach wird die Übertragung abgebrochen). Hier ein Beispiel für das periodische Abfragen des Interrupt-Endpoints eines Hubs, bei dem sich schließlich eine nicht näher spezifizierte Änderung am Port 2 ergibt:
 +
 +
{| {{Prettytable}} cellpadding="5"
 +
{{USB-Transferliste}}
 +
{{USB-Transfer|dir=out|type=IN|addr=3|endp=9|crc=0x08}}
 +
{{USB-Transfer|dir=in|type=NAK}}
 +
{{USB-Transfer|dir=out|type=SOF}}
 +
{{USB-Transfer|dir=out|type=IN|addr=3|endp=9|crc=0x08}}
 +
{{USB-Transfer|dir=in|type=NAK}}
 +
{{USB-Transfer|dir=out|type=SOF}}
 +
{{USB-Transfer|dir=out|type=IN|addr=3|endp=9|crc=0x08}}
 +
{{USB-Transfer|dir=in|type=DATA0|data=0x04|crc=0x7C41}}
 +
{{USB-Transfer|dir=out|type=ACK}}
 +
{{USB-Transfer|dir=out|type=SOF}}
 +
{{USB-Transfer|dir=out|type=IN|addr=3|endp=9|crc=0x08}}
 +
{{USB-Transfer|dir=in|type=NAK}}
 +
|}
 +
 +
=== Isochronoustransfers ===
 +
Das Toggle-Bit-Verhalten von Isochronoustransfers [[#Data-Toggle|wurde bereits besprochen]]. Ebenso [[#Nicht-Handshake-Datentransfers|wurde bereits gezeigt]], dass Übertragungen von und zu Isochronousendpunkten kein Handshake besitzen. Und mehr ist dazu auch nicht zu sagen, man könnte hier nur das bereits gezeigte Beispiel nochmals zeigen:
 +
 +
{| {{Prettytable}} cellpadding="5"
 +
{{USB-Transferliste}}
 +
{{USB-Transfer|dir=out|type=IN|addr=42|endp=7|crc=0x13}}
 +
{{USB-Transfer|dir=in|type=DATA0|data=0x4D 0x6F 0x69 0x6E 0x2C 0x20 0x6D 0x6F 0x69 0x6E 0x2C 0x20 0x47 0x65 0x6E 0x6F 0x73 0x73 0x65 0x6E 0x5C 0x21|crc=0x04A9}}
 
|}
 
|}