| Zeile 5: | Zeile 5: | ||
{{ExtImg|Link=http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Usb-svg.svg/200px-Usb-svg.svg.png|Text=USB-Symbol|Toplink=http://de.wikipedia.org/wiki/Datei:Usb-svg.svg}} | {{ExtImg|Link=http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Usb-svg.svg/200px-Usb-svg.svg.png|Text=USB-Symbol|Toplink=http://de.wikipedia.org/wiki/Datei:Usb-svg.svg}} | ||
| − | 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 langsame 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 langsame USB-1.0-Geräte an den schnelleren USB 2.0 oder 3.0 anschließen kann und umgekehrt. |
== Einsatzgebiete == | == Einsatzgebiete == | ||
| Zeile 381: | Zeile 381: | ||
{{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}} | {{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}} | ||
|} | |} | ||
| + | |||
| + | === SPLIT-Transfers === | ||
| + | Mit der neuen Geschwindigkeit High-Speed kam ein relativ großes Problem auf: Wie werden Geräte behandelt, die mit Full- oder Low-Speed arbeiten? Man könnte High-Speed-Geräte vollkommen inkompatibel mit diesen machen, sodass das Problem nicht auftritt, aber das wird den Benutzer nicht sehr freuen (vor allem bei HID-Geräten, die fast grundsätzlich Low-Speed verwenden). Kurzzeitig die Busgeschwindigkeit absenken würde die Performance sehr negativ beeinflussen und außerdem alle High-Speed-Geräte sehr kompliziert machen, die darauf reagieren müssten. | ||
| + | |||
| + | Die Lösung bestand letztendlich in den SPLIT-Token: Solch ein Token wird einem Low- oder Full-Speed-Transfer vorgeschaltet und mit High-Speed zum Hub geschickt, an dem das Gerät hängt. Dieser Hub muss den Transfer dann in Low- oder Full-Speed zum entsprechenden Gerät senden und dem Host später das Handshake übermitteln. Dies macht zwar High-Speed-Hubs ziemlich kompliziert, lässt aber High-Speed-Geräte unberührt und wirkt sich nicht negativ auf die Leistung des High-Speed-Busses aus. | ||
| + | |||
| + | ==== SSPLIT ==== | ||
| + | Es gibt zwei Typen von SPLIT-Token, der erste nennt sich SSPLIT für ''Start split''. Wie sich aus dem Namen ergibt, leitet er eine SPLIT-Transaktion ein. Das Adressfeld dieses Tokens enthält nicht etwa die Adresse des USB-Geräts, sondern die Adresse des Hubs, an dem es hängt. Insgesamt ist der Aufbau wie folgt: | ||
| + | |||
| + | {| {{Prettytable}} cellpadding="5" | ||
| + | ! Größe in Bit !! Name !! Inhalt | ||
| + | |- | ||
| + | | 8 || PID || Paket-ID (0x78) | ||
| + | |- | ||
| + | | 7 || Hub Addr || USB-Adresse des Hubs, an dem das Low-/Full-Speed-Gerät hängt. | ||
| + | |- | ||
| + | | 1 || SC || 0 (kennzeichnet dieses Token als SSPLIT) | ||
| + | |- | ||
| + | | 7 || Port || Port des Hubs, an dem das Low-/Full-Speed-Gerät hängt. | ||
| + | |- | ||
| + | | 1 || S || Ist bei Low-Speed-Geräten gesetzt und bei Full-Speed-Geräten gelöscht. | ||
| + | |- | ||
| + | | 1 || E || Nur für Isochronous-OUT-Transfers relevant (wer sich dafür interessiert, möge es in der USB-2.0-Spezifikation Abschnitt 8.4.2.2 nachschlagen und die Bedeutung wenn möglich hier eintragen). | ||
| + | |- | ||
| + | | 2 || ET || Typ des Endpunkts: | ||
| + | * 00b: Control | ||
| + | * 01b: Isochronous | ||
| + | * 10b: Bulk | ||
| + | * 11b: Interrupt | ||
| + | |- | ||
| + | | 5 || CRC5 || Zum Schluss dann noch der CRC-Wert über ''Hub Addr'', ''SC'', ''Port'', ''S'', ''E'' und ''ET''. | ||
| + | |} | ||
| + | |||
| + | Wie das SSPLIT-Token verwendet wird, zeigt das folgende Schema: | ||
| + | [[Bild:SSPLIT.png|center]] | ||
| + | |||
| + | Der ganze Transfer beginnt mit dem SSPLIT-Token an sich, das den SPLIT-Transfer anzeigt und zweitens auch den Zielhub und den dortigen Zielport anzeigt. Danach beginnt mit dem Low- oder Full-Speed-Token (das aber in High-Speed gesendet wird) die eigentliche SPLIT-Transaktion. Bei OUT- oder SETUP-Transfers folgen anschließend noch die zu verschickenden Daten und ein Handshakepaket des Hubs, dass er diese Daten akzeptiert hat. | ||
| + | |||
| + | ==== CSPLIT ==== | ||
| + | Nun zur zweiten Art, den CSPLIT-Token. Dieser Name kommt von ''Complete split'', mit einem CSPLIT beendet man also eine SPLIT-Transaktion. Zuerst könnte man sich fragen, warum es überhaupt zwei Transaktionen gibt. Der Host könnte doch per SPLIT einen solchen Transfer einleiten, die Daten mit dem Hub austauschen und fertig. Das Problem ist aber, dass dies wieder den High-Speed-Bus ausbremsen würde. So würde es natürlich relativ lange dauern, bis das Low-/Full-Speed-Gerät überhaupt den Request übermittelt bekommen hat, da könnte man auch gleich den gesamten High-Speed-Bus in die entsprechende Geschwindigkeit umschalten. Also passiert das ganze gewissermaßen asynchron: Der Hub bekommt den Auftrag zur Transaktion und später fragt der Host per CSPLIT nach, wie diese denn ausgegangen ist. | ||
| + | |||
| + | Solch ein CSPLIT-Token sieht so aus: | ||
| + | |||
| + | {| {{Prettytable}} cellpadding="5" | ||
| + | ! Größe in Bit !! Name !! Inhalt | ||
| + | |- | ||
| + | | 8 || PID || Paket-ID (0x78) | ||
| + | |- | ||
| + | | 7 || Hub Addr || USB-Adresse des Hubs, an dem das Low-/Full-Speed-Gerät hängt. | ||
| + | |- | ||
| + | | 1 || SC || 1 (kennzeichnet dieses Token als CSPLIT) | ||
| + | |- | ||
| + | | 7 || Port || Port des Hubs, an dem das Low-/Full-Speed-Gerät hängt. | ||
| + | |- | ||
| + | | 1 || S || Ist bei Low-Speed-Geräten gesetzt und bei Full-Speed-Geräten gelöscht. | ||
| + | |- | ||
| + | | 1 || U || Reserviert, muss auf 0 gesetzt werden. | ||
| + | |- | ||
| + | | 2 || ET || Typ des Endpunkts (s. bei SSPLIT) | ||
| + | |- | ||
| + | | 5 || CRC5 || Und zum Schluss wieder CRC. | ||
| + | |} | ||
| + | |||
| + | Folgendermaßen wird es verwendet: | ||
| + | [[Bild:CSPLIT.png|center]] | ||
| + | |||
| + | Zuerst kommt also wieder das SPLIT-Token, in diesem Fall CSPLIT. Anschließend wiederholt der Host sein Low-/Full-Speed-Token (war es beim ersten Mal OUT, so ist es jetzt wieder OUT). Der Hub reagiert darauf, indem er die Antwort des Geräts weiterleitet, also ein Handshake oder ein Datenpaket, je nachdem, was das Gerät gesendet hat. Ein Datenpaket würde letztendlich dann natürlich noch vom Host mit einem Handshake quittiert. | ||
| + | |||
| + | ==== Zusammenfassung ==== | ||
| + | Insgesamt gibt es also immer drei Transaktionen: | ||
| + | # Einleitung des Transfers per SSPLIT durch den Host. Hier werden Token und evtl. auch Daten an den Hub geschickt. | ||
| + | # Kommunikation des Hubs mit dem nicht-High-Speed-Gerät. Der Hub sendet nun das Token und, soweit empfangen, auch Daten an dieses Gerät. Dabei speichert er sowohl die vom Gerät gesendeten Daten als auch das Handshake (es sei denn, es gab kein Handshake, dann wird die Transaktion normal wiederholt, s. auch [[#Fehlerbehandlung|Fehlerbehandlung]]). | ||
| + | # Zuletzt dann das Ende und die Auswertung des Transfers per CSPLIT. Jetzt kommuniziert der Host mit dem Hub, als wäre er selbst das Gerät, nimmt also evtl. gesendete Daten in Empfang und quittiert sie mit einem Handshake oder empfängt direkt das vom Gerät gesendete Handshake. | ||
| + | |||
| + | Hier sieht man, wie komplex High-Speed-Hubs sein müssen. Sie bilden gewissermaßen zwei hermetisch voneinander abgeriegelte Bussysteme: Der High-Speed-Bus zum Host auf der einen und der nicht-High-Speed-Bus zum Gerät auf der anderen Seite. Kein Bit gelangt hindurch, der Hub übernimmt im Grunde für das Low-/Full-Speed-Gerät die Rolle des Hosts (da er die SOFs selbst initiiert und auch alle Transfers nicht vom Host durchleitet, sondern zwischenspeichert und dann komplett selbstständig ausführt). | ||
=== Fehlerbehandlung === | === Fehlerbehandlung === | ||
| − | Während der Übertragung eines | + | Während der Übertragung eines Datenpaketes können verschiedenste Fehler auftreten, die mit dem Handshake erkannt werden können. |
==== Daten korrekt empfangen und akzeptiert ==== | ==== Daten korrekt empfangen und akzeptiert ==== | ||