 |
Linux, PC und Hardware
Prof. Jürgen Plate |
Standard-Schnittstellen
Universal Serial Bus
USB steht für "Universal Serial Bus" (Universeller Serieller Bus) und ist ein
Industrie-Standard, um periphere Geräte an den Computer anzuschließen.
Die Entwicklung hat bereits Anfang der 90er Jahre begonnen, dümpelte
jedoch einige Jahre vor sich hin. Es dauert noch bis 1996, bis sich USB auf dem Markt
meldete, und erst 1998 mit der Version 1.1 begann sich USB langsam durchzusetzen.
Mehr und mehr Computer haben USB-Schnittstellen und mit Windows 98 kam das erste
Windows, das USB voll unterstützt. Beteiligt an der Entwicklung sind
Firmen wie Intel, Apple, Compaq oder Microsoft. Inzwischen ist USB
mit den Versionen 1.1 und 2.0 ein Standard mit hoher Marktdurchdringung.
USB-Grundlagen
Warum verwendet man USB? Gründe gibt es viele: Neben der inzwischen großen
Marktverbreitung spricht vor allem die einfache Installation und Handhabung
auf Benutzerseite dafür. Zwar sind die Steckverbinder nicht der Weisheit
letzter Schluss und auch die Datenübertragungsrate wesentlich geringer als beim
Netzwerk, aber die Vorteile überwiegen in vielen Anwendungsfällen: Hot plugging,
Plug-and-Play sowie der Verzicht auf weitere I/O-Ports, DMA- und Interrupt-Kanäle.
Die Installation ist zumindest auf USB-tauglichen Windows-Plattformen idiotensicher.
USB-Geräte steckt man einfach während des Betriebs ein. Sofortiger Einsatz ist
möglich, ein nerviger Reboot entfällt, und es lassen sich bis zu 127 Geräte anschließen.
Zudem vermeiden USB-Geräte Ressourcenkonflikte. Der Controller im PC benutzt zwar
generell einen Interrupt und 32 I/O-Ports, doch die angeschlossenen USB-Geräte belegen
keine weiteren System-Ressourcen. Die Stromversorgung von bis zu 500 mA je USB-Port
wird auch gleich mitgeliefert und erlaubt somit eine Vielfalt an Funktionen und
Anwendungsmöglichkeiten zur Erweiterung von Schnittstellen. Durch die Kaskadierung
von USB-Hubs lässt sich, wie bei Netzwerken, eine baumartige Struktur erzielen.
Die maximale Länge eines Kabelsegmentes beträgt fünf Meter. Die Daten werden als
Differenz-Signal mit einer Geschwindigkeit von 12 Mbit/s oder 1,5 Mbit/s
übertragen. Bei USB 2.0 ist ausserdem eine Highspeed-Übertragung mit 480Mbit/s spezifiziert.
Da USB-2.0 zu USB-1.1-Geräten abwärtskompatibel ist, gibt es an neueren Rechnern keine
USB-1.1-Schnittstellen mehr.
Die Vorteile von USB:
USB ist einfach: Es gibt nur eine Sorte Kabel.
Der USB kennt zwei verschiedene Steckertypen, "Typ A" und "Typ B" genannt.
Das System ist so konzipiert, dass man sie auch nicht verkehrt herum einstecken kann.
Kabel sind immer 1:1 verbunden, und die Belegung ist immer gleich, wie die Tabelle unten zeigt.
An der Rückseite eines modernen PCs findet man zwei oder mehr Buchsen vom Typ A. Kleinere,
langsame Geräte wie beispielsweise Mäuse verwenden ein dünnes, fest angebrachtes Kabel
mit einem Stecker vom Typ A. In anderen Fällen besitzt das Gerät selbst eine USB-Buchse
vom Typ B. Die Verbindung erfolgt dann mit einem Kabel vom Typ A-B.
Die Kabel gibt es nur fertig konfektioniert und vergossen zu kaufen. Einzelne USB-Stecker sind
nicht erhältlich - man muss gegebenenfalls ein Kabel "schlachten". Länge, Kabelquerschnitt,
Abschirmung usw. sind genau vorgeschrieben. Auch der Unterschied zwischen Highspeed, Fullspeed und
Lowspeed spielt hier eine Rolle. Das System der vorgeschriebenen Kabel verhindert zuverlässig,
dass ein Lowspeed-Kabel für eine Fullspeed-Verbindung eingesetzt wird. Alle Verbindungskabel
sind Fullspeed-Kabel, während Lowspeed-Kabel nur fest angebaut vorkommen. Für den Fall einer
notwendigen Kabelverlängerung gibt es Verlängerungskabel vom Typ A-A.
- USB-Geräte lassen sich bei eingeschaltetem Rechner an- und abstecken. Das Betriebssystem
erkennt das Gerät und lädt den entsprechenden Treiber. Falls Sie das Gerät zum ersten Mal
einstecken, müssen Sie gegebenenfalls noch den Treiber installieren. Bei manchen Geräten
ist es notwendig, zuerst den Treiber zu installieren und danach das Gerät erstmalig
anzuschließen.
- USB ist erweiterbar. Theoretisch sind bis zu 127 Geräte anschließbar.
- USB ist schneller als die serielle Schnittstelle. Mit 12 MBit/s ist USB 2.0 etwa so schnell wie
früher die Netzwerkverbindungen. Im Highspeed-Modus ist auch die Übertragung von Videodaten
möglich.
- Es gibt massenhaft USB-Geräte: Scanner, Drucker, Kameras, externe Plattenlaufwerke,
CD-ROM-Laufwerke, Modems oder Soundkarten.
- Auf dem USB-Kabel liegen 5 Volt Spannung mit maximal 500 mA. Das genügt, um Geräte mit
geringem Energieverbrauch zu betreiben (Mäuse, Tastaturen etc.). Geräte mit höherem Energiebedarf
brauchen aber eine eigene Versorgung.
| Standardstecker |
 |
| Pin | Name | Farbe | Beschreibung |
| 1 | VCC | Rot | +5 V |
| 2 | D- | Weiß | Data - |
| 3 | D+ | Grün | Data + |
| 4 | GND | Schwarz | Masse |
| Mini- und Microstecker |
 |
| Pin | Name | Farbe | Beschreibung |
| 1 | VCC | Rot | +5 V |
| 2 | D- | Weiß | Data - |
| 3 | D+ | Grün | Data + |
| 4 | ID | keine | Unterscheidung von
Micro-A- und Micro-B-Stecker:
Typ A: Masse, Typ B: nicht verbunden |
| 5 | GND | Schwarz | Masse |
USB besitzt aber auch Nachteile:
- An den meisten Computern finden sich zwei bis vier USB-Stecker auf der Rückseite und ebensoviele
auf der Vorderseite des Rechners. Will man mehr Geräte anschließen, muss man einen USB-Hub kaufen.
- Die Hersteller liefern meist nur Treiber für Windows mit, andere Betriebssysteme können daher manche
Geräte nicht oder nur teilweise ansteuern.
- Sind viele Geräte gleichzeitig angeschlossen, treten Geschwindigkeitsprobleme auf. Denn alle
Geräte am Bus müssen sich die 12 MBit/s teilen. Das kann zu Problemen und Fehlern führen.
Eigenschaften von USB 1.1:
- LowSpeed Modus mit 1,5 MBit/s für z.B. Maus und Tastatur
- FullSpeed Modus mit 12 MBit/s für Geräte mit mittleren Übertragungsraten, wie Audio oder ISDN
- integrierte Stromversorgung bis 500mA je Port
- Geräte können bei laufendem Betrieb angeschlossen werden ("hot-plug") und werden automatisch erkannt.
- Durch USB-Hubs und entsprechende Kaskadierung können bis zu 127 Geräte angeschlossen werden.
- Energiemanagement unterstützt Suspend und Resume (Stand-By)
- Protokolle zur Fehlererkennung und Fehlerbehandlung
- synchrone und asynchrone Übertragungsarten
- maximale Kabellänge 5 Meter (mit Repeatern lassen sich bis zu 25 Meter überbrücken)
- Datenübertragung von PC zu PC mit einem sogenannten USB-Link-Kabeln möglich
- Vernetzung via USB mit sogenannten USB-Netlink-Kabeln möglich
Eigenschaften von USB 2.0:
- HighSpeed Modus mit 480 MBit/s
- Architektur und Programmiermodell von USB 2.0 entsprechen dem von USB 1.1
- Isochronous- und Bulk-Transfer
- z. B. ideal für Video, externe Festplatten und CD-Brenner
USB-Signale
Die Signale auf den beiden Leitungen, D+ und D-, sind Differenzsignale mit Spannungspegeln
von 0 und 3,3 Volt. Die Versorgungsspannung am USB kann bis zu 5,25 V betragen und bei starker
Belastung bis auf 4,2 V abfallen. Man unterscheidet zwischen Geräten mit eigenem Netzteil und
solchen, die über den USB versorgt werden. In vielen Fällen können beide Betriebsarten gewählt
werden. Viele Geräte besitzen eine Netzteilbuchse, die zur Schonung des versorgenden PC mit
einem externen Netzteil verbunden werden kann. Nach den USB-Spezifikationen ist die
Stromaufnahme aus dem Bus automatisch begrenzt.
Man unterscheidet - wie schon erwähnt - zwischen Lowspeed-, Fullspeed und Highspeed-Signalen.
Bei einer Lowspeed-Verbindung beträgt die Datenübertragungsrate 1,5 MBit/s, bei einer Fullspeed-Verbindung
12 MBit/s. Die Geschwindigkeit wird vom Master vorgegeben, die angeschlossenen Geräte
synchronisieren sich darauf. Die Datencodierung und
-decodierung erfolgt durch die USB-Hardware. Die Datenübertragung ist differentiell (D+, D-).
J-Pegel: Differenz zwischen D+ und D- ist positiv (differentielle "1")
K-Pegel: Differenz zwischen D+ und D- ist negativ (differentielle "0")
Es gibt weder Handshake-Signale noch eine eingestellte Baudrate oder eine separate Taktleitung.
Der Takt für die Abtastung des übertragenen Datenstroms und das Synchronisiersignal für den Takt werden aus
einem Synchronisier-Bitmuster und aus dem Datenstrom selbst generiert. Jede "0" im Bitstrom
liefert einen Pegelwechsel und damit ein Signal für die Taktgewinnung.
Nach einer Folge von sechs
Einsen ("1") wird automatisch in den Datenstrom eine "0" eingefügt (Bit Stuffing). Damit kommt
spätestens nach der sechsten Taktperiode ein Signal für die Takt-Synchronisierung. Jedes Gerät hat
spätestens nach sieben Taktperioden Gelegenheit, seinen internen Takt mit dem Bustakt zu
synchronisieren. Jedes Datenpaket wird zum Zweck der Synchronisation von einem Sync-Byte angeführt.
Der Host muss das Anstecken eines Geräts bemerken und gleichzeitig die
Geschwindigkeitsklasse identifizieren können (Hot Plug-and-Play). Bei Low- und Full-Speed-
Geräten ist dies einfach; das Gerät zieht entweder den D- -Pegel oder den D+ -Pegel mit einem Widerstand
auf high:
High- oder Full-Speed-Gerät
Low-Speed-Gerät
Für High-Speed-Geräte steht keine weitere Datenleitung zur Verfügung, ausserdem muss sich ein
High-Speed-Gerät an einem USB-1.1-Controller wie ein Full-Speed-Gerät
verhalten (High-Speed-Geräte sollen auch an einen Full-Speed-Controller anschließbar sein).
Deswegen wurde für High-Speed-Geräte die weiter unten beschriebene Anmeldeprozedur
spezifiziert.
| kein Gerät: | D+, D- = low (>2,5us) |
| Low Speed: | D- = high (>2,5us) |
| Full Speed: | D+ = high (>2,5us) |
| High Speed: | verhält sich zunächst wie ein Full-Speed-Gerät (D+ = high),
und ist damit von USB-1.1-Controllern/Hubs als Full-Speed-Gerät identifizierbar.
Danach identifiziert sich das High-Speed-Gerät durch Abschalten des Pull-Up-Widerstands
und aktiviert die 45-Ohm-Abschlusswiderstände an D+ und D-. |

- LS/FS-Driver (Treiber) liefert Massepunkte (Assert_Singel_Ended_Zero) für die beiden
45-Ohm-Widerstände (Rs) an den Datenleitungen D+, D-. Das ergibt einen differentiellen
Widerstand von 90 Ohm zwischen D+ und D-.
- der High Speed Current Driver liefert die Datensignale D+, D- (HS_Data_Driver_Input).
- Der Pull-Up-Widerstand Rpu (1,5 kOhm) ist nach der Identifizierung der Geschwindigkeitsklasse
abgeschaltet.
- Die beiden Rpd-Widerstände (15 kOhm) sind vernachlässigbar gegen die 45 Ohm-Widerstände.
- Die Signalpegel werden jeweils von einer 17,8-mA-Stromquelle (High Speed Current Driver) erzeugt:
kein Gerät angesteckt: +/-17,8 mA * 45 Ohm = +/- 800 mV
Gerät angesteckt: +/-17,8 mA * 22,5 Ohm = +/- 400 mV
- Abziehen eines High-Speed-Geräts (Disconnect):
Der Hub erkennt am Spannungssprung von 400mV auf 800 mV das Abziehen des Geräts.
USB-Topologie
USB ist trotz des Namens kein echts Bussystem. Bei einem Bus hängen alle Geräte an einer Leitung,
wogegen bei USB nur alle Geräte die vom Rechner gesendeten Daten (fast) gleichzeitig empfangen.
Bei USB handelt es sich im Grunde um einen sternförmigen Aufbau mit mehreren Zwischenebenen.
Jedes Gerät ist über eine eigene Leitung mit dem Computer oder mit einem dazwischen geschalteten
Hub verbunden. USB ist also ein sternförmiges Netz von Geräten (Device), die alle von einem
Controller (im PC) verwaltet werden.
Angeschlossene Geräte (Tastatur, Maus, Drucker usw.) werden Funktionen (Functions) genannt.
Nach dem Einschalten besitzt ein Gerät die Default-Adresse 0. Bei der Initialisierung - hier
Enumeration genannt - wird jedem Gerät eine eigene Adresse zugewiesen. Jedes Gerät besitzt
entweder eine eigene Spannungsversorgung (self powered) oder es wird über das USB-Kabel
versorgt (bus powered). Vor der Initialisierung darf die Stromaufnahme aus dem USB-Kabel
maximal 100 mA und nach der Initialisierung maximal 500 mA betragen.
Beim Reset des USB (oder beim Anstecken eines Gerätes an den Bus), meldet sich jedes Device
beim Controller mit der fiktiven Adresse 0 an. Der Controller gibt dem Device eine richtige
Adresse (1..127) und liest die Konfiguration aus dem Device aus. In dieser Konfiguration
gibt das Device an, wieviele Pufferspeicher (genannt Endpunkte) es besitzt, wie groß
diese Puffer sind (max. 64 Byte) und ob das für den Controller Lesepuffer (In) oder
Schreibpuffer (Out) sind. Außerdem wird dem Controller gesagt, wie häufig er prüfen soll,
ob im Lesepuffer Daten für ihn bereitliegen. Die Konfiguration enthält noch weitere
Informationen (beispielsweise über den Strombedarf des Device).

Ein Hub ermöglicht den Anschluß mehrerer Geräte. Ein Hub nimmt Daten von den Geräten
entgegen und liefert sie an den Rechner oder
an den nächst höheren Hub. Umgekehrt nimmt ein Hub Daten vom Computer entgegen und leitet sie
an das richtige Gerät oder den nächst tieferen Hub weiter. Jeder Hub besitzt einen Upstream-Port in
Richtung Host und mehrere Downstream-Ports in Richtung der Geräte oder weiterer Hubs. Vom
Host gesendete Daten leitet der Hub an alle seine aktiven Downstream-Ports weiter. Daten vom
Gerät sendet der Hub nur in Richtung Host.
Ein Hub isoliert angeschlossene Full/ Low-Speed-Geräte vom High-Speed-Mode und leitet an diese
Geräte gerichtete Daten in der passenden Geschwindigkeit weiter. Außerdem übernimmt der Hub
das Power-Managment für die angeschlossenen Geräte. Hubs besitzen eine eigene Spannungsversorgung
oder werden über das USB-Kabel versorgt. Zwischen den Computer und ein Gerät
lassen sich bis zu sieben Hubs schalten - es gibt also bis zu sieben "Ebenen".
In jeder Ebene darf das USB-Kabel 5 m lang sein. Ein Gerät kann also maximal 35 m vom Computer
entfernt stehen. Die Daten bewegen sich nur zwischen dem Computer und dem jeweils angesprochenen
Gerät. Die USB-Geräte können sich untereinander nicht verständigen.
Die Kontrolle über die Daten hat alleine der Computer. Er fragt regelmäßig alle Geräten ab (Polling).
Die Geräte dürfen von sich aus keinerlei Daten senden. Dieses Polling kostet zwar Rechenzeit,
erlaubt aber einen einfacheren Aufbau der USB-Geräte. Ein USB-Host besteht somit aus einem
einzigen Hostcontroller, einem Root Hub (USB-Anschlüsse am PC), der Systemsoftware und den
Gerätetreibern. Den Datenfluß vom Host weg zu den Geräten nennt man "downstream", den
Datenfluß in umgekehrter Richtung "upstream". Tauscht der Computer mit einem Gerät Daten
aus, baut er immer eine direkte Verbindung dorthin auf, die "Pipe" genannt wird.
Für den Host gibt es derzeit 3 Realisierungs-Varianten:
- Universal Host Controller Interface (UHCI) wurde im November 1995 von Intel
spezifiziert. Die aktuelle Version des Dokuments trägt die
Revisionsnummer 1.1. UHCI-Chips bieten Unterstützung für USB-Geräte mit
1,5 oder 12 Mbit/s Datenrate. Sie werden ausschließlich von den Herstellern Intel und
VIA Technologies gebaut. Für Isochronous- und Interrupt-Transfers (Transaktionen) sind maximal
90% der Zeit vorgesehen, für Control-Transfers sind 10% der Zeit garantiert. Verbleibenden
Restzeiten werden für die zeitunkritischen Bulk-Transfers benützt.
- Open Host Controller Interface (OHCI) wurde von Compac, Microsoft und
National Semiconductor entwickelt. Version 1.0 des Standards wurde im Dezember 1995
veröffentlicht, die aktuelle Fassung trägt die Versionsnummer 1.0a und
stammt von September 1999. Ein OHCI-Controller hat prinzipiell die
gleichen Fähigkeiten wie seine UHCI-Pendants, erledigt aber mehr
Aufgaben in der Hardware und ist dadurch marginal schneller als ein UHCI-Controller.
Nach dem SOF-Token beginnt der Host-Controller mit nicht-periodischen Transferarten. Bei der
Initialisierung des Host-Controllers kann der Host-Controller-Treiber die maximale Zeit für dieses
erste NP-Intervall festlegen (typischer Wert: 10% des Frame-Intervalls). Danach kommen die
periodischen Datentransfers. Verbleibende Restzeiten sind wieder für nicht-periodische
Datentransfers.
- Das Enhanced Host Controller Interface (EHCI) stellt die
USB-2.0-Funktionen bereit. Das EHCI wickelt dabei nur die Übertragungen
im Hi-Speed-Modus (480 Mbit/s) ab. Um alle drei Geschwindigkeiten unterstützen
zu können, muss ein Host über einen EHCI-Controller sowie über
einen begleitenden UHCI- oder OHCI-Controller verfügen. Wenn man USB-1.1-Geräte an
einen Port mit EHCI-Chip steckt, reicht der EHCI-Controller den
Datenverkehr an einen hinter ihm liegenden UHCI- oder OHCI-Controller
weiter (diese Controller sind typischerweise auf demselben Chip). Wenn
kein EHCI-Treiber verfügbar ist, werden die High-Speed-Geräte ebenfalls
an den USB-1.1-Controller durchgereicht und arbeiten dann mit
langsamerer Geschwindigkeit, sofern dies überhaupt möglich ist.
In einem USB2.0-Host-Controller sind ein oder mehrere UHCI- oder OHCI-Controller für USB1.1
Geschwindigkeitsklassen (Low- und Full-Speed) eingebettet (Companion Host Controller). Eine
Routing-Logik bewirkt, dass USB-1.1-Geräte mit UHCI/OHCI-Controllern und USB-2.0-Geräte mit
dem EHCI-Controller verbunden werden können. Erkennt ein USB-2.0-Treiber ein angeschlossenes
Gerät als Full- oder Low-Speed-Gerät, konfiguriert er die Routing-Logik so, dass dieses Gerät mit
den Ports eines Companion USB Host Controllers verbunden wird.
Jeder Datentransfer ist über Transaktions-Deskriptoren beschrieben, man spricht auch von
virtuellen Datenkanälen, sogenannten "Pipes", die der Host einrichtet. Jede Pipe beginnt im
Pufferbereich des Arbeitsspeichers und endet in einem Endpunkt (Endpoint EP) eines Geräts. Ein
Endpunkt im Gerät ist ein Sende/Empfangs-FIFO. Die Eigenschaften eines Endpunkts sind im
Endpoint-Descriptor festgelegt. Dieser ist in jedem Gerät fest abgespeichert.
Damit der Host die Configuration auslesen kann, besitzt jedes Interface einen
EP0, der für die Konfiguration zuständig ist. Dieser ist der einzige Endpunkt, der sowohl
ausgelesen als auch beschrieben werden kann, alle anderen Endpunkte beherrschen nur eine Datenrichtung.
Der EP0 kann auch für den Datentransfer mitbenutzt werden, er bietet jedoch nur eine geringe
Datenrate von 800 Byte/s.
Alle anderen Endpunkte sind uni-direktional (senden oder empfangen). Die im
EP0 übertragenen Daten sind als Standard-Device-Requests definiert. Die zum EP0 aufgebaute Pipe
ist eine "Message" Pipe. Low-Speed-Geräte unterstützen nur Control- und Interrupt-Endpunkte.

Jedes USB-Gerät kann mehrere Endpunkte und mehrere Pipes unterstützen. Die Adressierung auf
dem Bus erfolgt über eine 7-Bit-USB-Adresse und im Gerät über eine 4-Bit-Endpunkt-Nummer. Am
Bus sind dadurch maximal 127 Geräte und Hubs anschließbar. Die Endpunkt-Nummer ermöglicht
die Realisierung verschiedener adressierbarer Funktionen innerhalb eines USB-Geräts. Ein
Endpunkt ist eindeutig definiert durch seine Nummer und seine Richtung. Pro Gerät sind daher
neben dem EP0 noch 15 IN- und 15 OUT-Endpunkte möglich. Bezugspunkt für die Richtung des
Datentransfers ist der Host:
- Out: vom Host zum Gerät (downstream)
- In: vom Gerät zum Host (upstream)
Ein großer Vorteil von USB ist die automatische Erkennung (Plug and Play) neu
angeschlossener Geräte. Das Betriebssystem muss dazu in der Lage sein, Informationen
von einem Gerät abzufragen, um dann den passenden Treiber zu laden und das Gerät
entsprechend anzusprechen. Ein neues Gerät wird dabei angemeldet (Enumeration), es
erhält eine Bus-Adresse und wird durch einen speziellen Treiber unterstützt.
Die Enumeration wird völlig selbstständig vom Betriebssystem ausgeführt.
Den Anschluss eines neuen Gerätes erkennt der Hub Pull-Up-Widerstand der Datenleitung.
Nun laufen folgende Schritte ab:
- Der Hub informiert den Host über das neu angeschlossene Gerät.
- Der Host erfragt vom Hub den Port des neuen Geräts.
- Der Host schaltet per Befehl diesen Port ein und führt einen Bus-Reset aus.
- Der Hub erzeugt ein Reset-Signal (10 ms) und gibt den Versorgungsstrom für das Gerät frei.
- Das Gerät ist nun bereit und antwortet auf der Default-Adresse 0.
- Der Host weist dem Gerät eine eigene Bus-Adresse zu.
- Der Host liest alle Konfigurations-Informationen aus dem Gerät.
- Der Host weist dem Gerät eine der möglichen Konfigurationen zu.
Die Geschichte ist recht komplex und jedes Gerät braucht seinen Treiber. Im
Gegensatz zu Nicht-USB-Komponenten wird der Treiber eben nicht beim Booten oder
gar manuell geladen, sondern vom USB-Subsystem automatisch aktiviert, wenn das Gerät
am Bus auftaucht. Irgendwann stehen dann wieder die Standard-Dateifunktionen zum
Ansprechen des Geräts zur Verfügung.
Datenübertragungsmodi
USB 2.0 kennt vier Datenübertragungsarten:
- Die Control-Transfers dienen ausschließlich der Zusammenarbeit zwischen Computer
und dem USB-Gerät. Sie dienen zur Konfiruration eines Gerätes. Oder das Gerät zeigt damit
an, dass es verfügbar ist.
Sie können in beiden Übertragungsrichtungen ablaufen und beginnen (bzw. enden)
im Gerät immer im Endpunkt EP0. Die mit EP0 aufgebaute Pipe wird als Message Pipe
bezeichnet.
Beispiel 1: Geräteadresse zuweisen bei der Konfiguration (Standard Device Request):
SETUP-Token (Befehlspaket) vom Host (enthält Geräteadresse 0 und Endpunkt-Adresse EP0)
Datenpaket vom Host (enthält u.a. die neue Geräteadresse)
ACK-Handshake–Paket an Host (Übertragung fehlerfrei)
IN-Token vom Host (enthält Geräteadresse 0 und Endpunkt-Adresse EP0)
0-Byte-Datenpaket an Host ("konnte Befehl ausführen")
ACK-Handshake–Paket vom Host
Beispiel 2: Lesen eines Device Descriptors:
SETUP-Token (Befehlspaket) vom Host (enthält Geräte- und Endpunkt-Adresse)
Datenpaket vom Host (enthält Befehlsparameter „Descriptor abfragen“)
ACK-Handshake–Paket an Host
IN-Token vom Host (enthält Geräteadresse 0 und Endpunkt-Adresse EP0)
Datenpaket an Host mit dem Device Descriptor
ACK-Handshake–Paket vom Host
Die Datenübertragung beim Control-Transfer ist über eine integrierte Fehlerkorrektur und über
eine Handshake-Prozedur besonders gesichert.
Die folgenden 3 Transfers beginnen (bzw. enden) in den Endpunkten EP1 bis EP15 und sind
unidirektional. Die dazugehörigen Pipes werden als Stream Pipes bezeichnet:
- Die Bulk-Transfers kommen zum Einsatz, wenn große Datenmengen über die Leitung gehen.
Geräte mit großen Datenmengen benutzen Bulk-Transfers. Die Daten dürfen nicht zeitkritisch
sein, da kein Polling-Intervall festgelegt wird. Bulk-Transfers sind nicht für Low-Speed-Geräte
spezifiziert. Beim Bulk-Transfer wird die gesamte gerade verfügbare Übertragungskapazität
in Anspruch genommen. Im Fehlerfall wird vom Host die Datenübertragung wiederholt.
- Interrupt-Transfers
sind bei geringen Datenmengen gefragt, die regelmäßig auftreten.
Bei Geräten, bei denen anfallende Daten zeitkritisch sind, d.h., sofort übertragen werden müssen,
wäre normalerweise ein Interrupt-Meldverfahren zum Host notwendig. Eine Interrupt-Verarbeitung
gibt es jedoch am USB nicht! Man hat dieses Problem dahingehend gelöst, dass
solche Geräte periodisch vom Host abgefragt werden. Typische Anwendungen sind Maus,
Tastatur, Joystick usw. Das Polling-Intervall (Abfrage-Intervall), das ein Gerät benötigt, ist im
Endpoint Descriptor eines Geräts definiert. Ein Polling-Intervall von z.B. 8ms besagt, dass der
Host alle 8ms einen Datentransfer mit dem Gerät durchführt. Hat das Gerät keine Daten, dann
quittiert es die Anforderung mit einem NAK-Handshake-Paket
Bei Übertragungsfehlern versucht der Host eine Wiederholung des Transfers in der nächsten
freien Transferperiode.
Paketfolge z.B.
IN-Token (Befehlspaket) an das Gerät (enthält Geräte- und Endpunkt-Adresse)
Datenpaket DATA0/1 vom Gerät
ACK-Handshake–Paket vom Host (Übertragung fehlerfrei)
Max. FIFO-Grösse im Endpunkt: 8 Byte (Low Speed), 64 Byte (Full Speed), 3072 Byte ? (High
Speed, 3072 = 3 x 1024). Die maximale Datenpaketgrösse innerhalb eines 125us Microframes
bei High Speed beträgt Theoretisch 1024 Byte. Grundsätzlich sollen Interrupttransfers aber nur
zur Übertragung kleiner Datenmengen verwendet werden!
{480 MBit/s x 125us = 62 914 Bit = 7 864 Byte}
- Isochrone Transfers übertragen die Daten ununterbrochen in
regelmäßigen Abständen. Eine Fehlerkorrektur gibt es hier nicht. Typisch für
diese Übertragungsart ist Sprache und Musik. Hier kommt es darauf an, dass die
Daten in jedem Fall sofort übertragen werden. Dafür fällt ein Fehler weniger
ins Gewicht: Schlimmstenfalls knackt es einmal kurz oder es rauscht.
"Isochron" bedeutet, dass die Daten
periodisch vom Host transferiert werden. Dies erfolgt wie beim Interupttransfer in jedem Frame
(1ms) bzw. Mikroframe (125us) oder mit einem Polling-Intervall (=Vielfaches der Intervall-
Länge), das im Endpoint-Deskriptor spezifiert ist.
Im Unterschied zum Interrupttransfer findet im Fehlerfall keine Wiederholung des Transfers
statt, d.h., kein Handshake durch das Empfangsgerät (verspätete Daten sind unnütze Daten).
Bei der isochronen Übertragung wird viel Bandbreite verbraucht. Damit aber nicht der gesamte
Datenverkehr ins Stocken gerät, bleiben immer 20 Prozent der Bandbreite für andere Übertragungen
frei. Damit ist garantiert, dass Maus und Tastatur weiter funktionieren.
Isochrone Transfers sind nicht für Low-Speed-Geräte spezifiert.
| Transfer Type | Control |
Interrupt | Isochronous |
Bulk |
| USB 1.1 | X | X |
- | - |
| USB 2.0 | X | X |
X | X |
Datenbytes/Millisekunde pro Transfer (full speed) | 832, in dreizehn 64-Byte Transfers |
64 | 1023 | 1216, in neunzehn 64-Byte Transfers |
Datenbytes/Millisekunde pro Transfer (low speed) | 24, in drei 8-Byte Transfers |
0.8, 8 Bytes in 10 ms | verboten | verboten |
| Reservierte Bandbreite | 10% | 90% Int. & Iso. gemeinsam |
90% Int. & Iso. gemeinsam | keine |
| Fehlerkorrektur | ja | ja |
ja | ja |
| Garantierte Datenrate | nein | nein |
ja | nein |
Garantierte Latezzeit (max. Zeit zwischen Transfers) | nein | ja |
ja | nein |
Die einem Endpoint zugeordnete Transferart ermittelt der Gerätetreiber aus den jeweiligen
Deskriptoren (Gerät "sagt", welchen Transfer es benötigt).
Initialisierung (Bus Enumeration)
Das Initialisieren oder Konfigurieren eines Geräts am USB wird mit Enumeration bezeichnet. Ein
Gerät durchläuft dabei vier der sechs Gerätezustände:
Powered
Default
Addressed
Configured.
Die beiden anderen Zustände sind: Attached (Hub versorgt Gerät nicht mit Strom) und Suspended
(Gerät erkennt mindestens 3ms auf dem Bus keine Aktivität und reduziert die Stromaufnahme).
Das Anstecken oder Abziehen eines Geräts am Bus wird, wie erwähnt, durch den Hub erkannt und
dem Host gemeldet. Der Host fragt den Hub ab (Full-Speed- oder Low-Speed-Gerät, Port-Adresse)
und führt dann die Enumeration in folgenden Schritten durch:
- Anstecken des Geräts am Hub bzw. Einschalten des Systems
- Port Enable durch den Hub, Hub liefert max. 100mA ans Gerät („Powered“)
- Hub erkennt Geschwindigkeitsklasse des Geräts über die Signalleitungen D+, D-
- Hub informiert Host über Interrupt-Kanal
- Hub setzt Gerät zurück: D+ und D- auf logisch Null, danach ist Gerät im Zustand „Default“.
Gerät ist jetzt für Control-Transfers zum EP0 bereit.
- Host ermittelt über GetDescriptor die maximale Paketgrösse des Kanals (Adr=0, EP0)
- Host weist Geräteadresse zu über SetAddress („Addressed“)
- Host liest Deskriptoren über GetDescriptor
- Host ermittelt aus den Deskriptoren die Ressourcen-Auslastung durch das Gerät (FIFO-Größe,
Polling-Intervalle, Stromaufnahme)
- Host lädt einen Gerätetreiber
- Host weist über den Gerätetreiber eine Konfiguration zu mit SetConfiguration („Configured“)
Nach dem Ende der Enumeration werden Interrupt-Endpunkte zyklisch abgefragt und Isochrone
Endpunkte jede Millisekunde angesprochen.
Nach einem "Power-on-Reset" arbeiten alle USB-Geräte auf Adresse 0 (Default). Es sind alle
Downstream-Ports deaktiviert, die folgenden Standard-Device-Requests sieht nur der Hub1. Zuerst
wird der Hub1 enumeriert, dann fragt der Host den Interrupt-Endpunkt des Hub1 ab und erkennt,
daß weitere Geräte an den Downstream-Ports von Hub1 angeschlossen sind. Sukzessive schaltet der
Host die Ports des Hub1 frei und enumeriert die Geräte.
Bus-Kommunikation
Zur Kommunikation über den Bus dienen Datenpakete. Davon gibt es zwei Arten, zum Übermitteln von
Control- und Steuerungsinformationen oder zum Datentransfer. Beide sind aber im Grunde gleich aufgebaut:
- Der erste Teil des Pakets besteht aus einem "Token" genannten Information, das den Inhalt
spezifiziert (Daten/Steuerinformationen/Adressierung).
- Danach folgt eine Prüfsumme.
- Sobald die Adressinformationen über die Leitung gegangen sind, kann das erste Datenpaket
folgen (bis zu 1023 Bytes). Wieder folgt eine Prüfsumme.
- Auf das Datenpaket folgt ein Handshake.
Zur zeitlichen Synchronisation der Geräte sendet der Host periodisch ein Paket SOF
(Start-of-Frame-Token) bzw. uSOF (bei high Speed) auf den Bus. Damit wird der Bus in
Zeitintervalle (Frames) von 1 ms (SOF bei Full Speed) bzw. von 0,125 ms (uSOF bei High Speed)
eingeteilt. SOF (uSOF)-Tokens entfallen bei Low-Speed-Anschlüssen. Nicht jedes Gerät überträgt
Daten in jedem Frame.
Der Host-Controller-Treiber verteilt die Datentransfers für die verschiedenen Geräte auf die
einzelnen Zeitintervalle (Scheduling der Transaktionen).
Da ein USB-Gerät von sich aus weder einen Transfer starten noch per Interrupt einen Transfer
anfordern kann, kann man für ein Gerät nur eine Pseudo-Interrupt-Fähigkeit herstellen:
Ordnet man einem Gerät einen Interrupt-Endpunkt zu, dann wird es periodisch im
Millisekundenabstand vom Host abgefragt und kann so Transferanforderungen dem Host
bekanntmachen.
Der Hostadapter selbst ist jedoch interrupt-fähig, d. h., er kann von der CPU Bedienung anfordern.
Das Anwender-Programm startet einen Datentransfer, indem es beim USB-Geräte-Treiber einen
Transfer anfordert. Es wird eine Verbindung ("Pipe") etabliert und die Daten werden übertragen.
Damit keine Daten verloren gehen, muß jedes USB-Gerät einen Datenpuffer haben, dessen Größe
sich nach dem typischen Datenaufkommen und nach seiner Datentransferrate richtet. Ebenso sind
Pufferspeicher auf der Host-Seite notwendig, um Daten eines Geräts zwischenspeichern zu können
für den Fall, dass die Daten nicht schnell genug zum Arbeitsspeicher der CPU übertragen werden.

Der Datentransfer vom Host zu den Geräten erfolgt im sogenannten Broadcast-Modus, d. h. die Daten
werden über die Hubs an alle Geräte verteilt. Nur das Gerät, das die eigene Adresse im Token-Paket
erkennt, antwortet. Eine direkte Kommunikation zwischen zwei Geräten ohne Beteiligung des Host
ist nicht möglich, sie muss grundsätzlich über den Host laufen.
Software-Schichten

- Anwender-Programm:
Es stößt mit Funktionsaufrufen (z.B. C-Funktionsaufrufe wie read/write, definiert für die
Geräte-Treiber-Schnittstelle) über den Geräte-Treiber einen Datentransfer an.
- Geräte-Treiber (Device Driver):
Er setzt die Funktionsaufrufe in USB-Befehle (USB-Requests) um und sendet diese an den
Bustreiber in Form von I/O-Request-Packets IRPs und stellt einen Pufferspeicher für die
Übertragungsdaten bereit. Ein IRP initiiert einen Datentransfer mit einem Gerät.
Device-specific-USB-Requests können z. B. Commands aus einem SCSI Command Set sein.
Geräte einer Klasse können von einem einheitlichen Treiber bedient werden.
- Bus-Treiber (Bus Driver):
Er zerlegt die IRPs eines Datentransfers in einzelne Transaktionen (transactions). Dies ist
notwendig, da der Busbetrieb in 1ms-Zeitintervalle eingeteilt ist und jeder (Teil)-Transfer daher
maximal nur 1 ms bzw. 0,125 ms dauern darf und außerdem der Bus von mehreren Geräten
quasi-gleichzeitig benutzt werden kann. Eine Transaktion muß innerhalb eines 1-ms-Zeitfensters auf
dem Bus durchführbar sein. Bei 12MBit/s sind ca. 1500 Byte in einem 1-ms-Rahmen, bei
480MBit/s sind 7500 Byte in einem 0,125-ms-Rahmen übertragbar.
- Host-Controller-Treiber (Host Controller Driver):
Der Host-Controller-Treiber greift auf die Hardware zu. Er stößt die Transaktionen über die Host
Controller Hardware (Host-Adapter) an. Diese setzt jede Transaktion in einzelne Pakete (Token- und
Data-Packets) um, und sendet die NRZI-codierten Daten bitseriell auf die Busleitung.
Für jede Transaktion erstellt der Host-Controller-Treiber im Arbeitsspeicher einen
Transaktions-Deskriptor (Festlegungen für den Transfer):
- Adresse des angesprochenen Geräts (Geräteadresse + Endpunktadresse innerhalb des Geräts)
- Transfer-Art (Control-, Interrupt-, Bulk- oder Isochronous-Transfer)
- Transfer-Richtung (IN, OUT)
- Pufferspeicher-Adresse im Host-Arbeitsspeicher für die Daten
Der Inhalt des Transaktions-Deskriptors entspricht dem Endpunkt-Deskriptor
des jeweiligen Geräts. Nur die Pufferspeicher-Adresse wird vom Geräte-Treiber
hinzugefügt.
Im Pufferspeicher sind die zu übertragenden Daten für OUT- und die Befehle für SETUP-Transfers
bereitgestellt oder es werden dort die beim IN-Transfer erhaltenen Daten
abgespeichert.
Der Host-Controller-Treiber organisiert die zeitliche Abfolge der einzelnen Transaktionen auf dem
Bus (Scheduling). Dazu erstellt er für jedes 1ms-Zeitfenster eine Transaktions-Liste (Frame-List).
Da ein Datentransfer aus mehreren Transaktionen bestehen kann, kann dieser auf mehrere
Zeitfenster verteilt sein.
Die Steuerung/Abfrage von USB-Geräten erfolgt über "USB Device Requests", auf die jedes Gerät
reagieren muß. Eine Untermenge davon sind die "Standard Device Requests".
Device Requests übergibt der Geräte-Treiber in Form von I/O-Request-Packets IRPs an den Bus-
Treiber. Alle Requests werden mit SETUP-Token über den bidirektionalen Control-Endpunkt EP0
abgewickelt.
Beim "GetStatus"-Request wird beispielswesie der Device-Status vom Host abgeholt
(Datentransferrichtung=IN).
Zusätzlich zu den Standard-Device-Requests unterstützt jedes Gerät noch gerätespezifische
Requests. In vielen Fällen sind dies Befehle aus den SCSI-Befehlssätzen der SCSI-3-Norm.
Paket-Formate
Die Informationsübertragung erfolgt in Paketen, deren allgemeines Format der folgenden
Grafik entspricht:

- Synchronisier-Bits:
Jedes Paket beginnt mit einem Synchronisierfeld ( siebenmal "0" und einmal "1", bei High Speed:
31 mal "0" und enmal "1"). Die "0"-Serie liefert wegen der NRZI-Codierung Polaritätswechsel,
mit denen der Takt im USB-Gerät synchronisiert wird. Mit diesem Gerätetakt wird der
serielle Datenstrom auf den Leitungen D+, D- abgetastet.
- Packet-Identifier (PID):
Jedes Paket enthält einen 4-Bit-Packet-Identifier und seinen invertierten Wert in den folgenden
4 Bits als Redundanz.
Entsprechend dem PID werden die nachfolgenden Daten im Empfänger verschieden interpretiert.
Grundsätzlich wird am USB die Information beginnend mit LSB übertragen.
- Optionale Elemente:
Folgende Elemente sind je nach Paket-Typ in den Paketen enthalten:
- Fortlaufende 11-Bit-FRAME-Nummer. Ist der maximale Wert 7FF erreicht, wird wieder mit 000
begonnen. Sie ist nur im START-Paket SOF enthalten.
uSOF: Nur jedes achte uSOF inkrementiert die FRAME-Nummer. Acht Mikroframes innerhalb
eines Frames verwenden dieselbe FRAME-Nummer.
- 7-Bit-Geräte-Adresse.
- 4-Bit-Endpunkt-Nummer innerhalb eines Geräts.
- CRC-Information als Datensicherung des Pakets.
- End of Packet: (Low/Full Speed: SE0-Signalisierung, High Speed: 01111111 ohne Bit-Stuffing)
Der Host sendet periodisch ein Start-of-Frame-Token (SOF) als Zeitmarke USB und erzeugt
damit Zeitfenster: 1 ms im Full Speed Mode (SOF), 0,125 ms im High Speed Mode (uSOF).
Die Frame Number (11 Bit) wird bei jedem SOF hochgezählt (modulo 2048). Im High-Speed-Mode
erhöht der Host die-Frame Number nur nach jedem achten uSOF.
Das SOF wird im Full-Speed-Mode gesendet. Low-Speed-Ports können daher kein SOF
empfangen, deshalb wird das SOF vom Hub in eine spezielle Signalisierung EOP umgewandelt
(Low-Speed-Keep-Alive: Auf die beiden zum Low-Speed-Gerät führenden Signaladern D+/D- wird
für 2 Low-Speed-Taktzyklen Low-Pegel angelegt).
Ein Gerät, das kein SOF oder Low-Speed-Keep-Alive EOP empfängt, geht in den Schlaf-Modus
(Suspend Mode) mit verringerter Stromaufnahme (ca. 0,5 mA).
Das SOF-Token geht an alle Geräte.
Befehls-Pakete (mit SETUP-Token) enthalten eine Geräteadresse und eine Endpunktadresse. Nur Geräte, die ihre
Adresse in einem Paket erkennen, dürfen reagieren. Dasselbe gilt für IN- und OUT-Token.
Die Nutzdaten werden in DATA0- und DATA1-Paketen übertragen. Sind es größere Datenmengen,
werden – aus Gründen einer eventuellen Fehlerbehandlung - immer abwechselnd DATA0- und
DATA1-Pakete verwendet. Maximal sind pro Paket 1024 Byte Nutzdaten (Full Speed) bzw. xxxx
Byte (High Speed) übertragbar. Die Nutzdaten sind über eine 16Bit-CRC-Information gesichert.
Der Empfang von Nutzdaten wird über ein ACK-Paket (erfolgreich) oder eine NAK-Packet (nicht
erfolgreich) quittiert. Über das STALL-Paket fordert ein Gerät die Hilfe des Host an wenn es z. B.
weder Daten empfangen noch senden kann.
Konfigurationen
Jedes Gerät muss vom Host erkannt werden. Es
muss also die eigene Funktionalität kennen und die entsprechenden
Konfigurationen dem Host übermitteln. Beispielsweise können
einige Geräte mit eigener Stromversorgung arbeiten (self-powered)
oder vom USB versorgt werden (bus-powered). Das Gerät teilt dem
Host seine Konfiguration über den Device-Deskriptor mit.
Dieser Deskriptor enthält alle wichtigen Daten über das Gerät wie z. B.
Gerätetyp, Hersteller-ID, Produkt-ID, Seriennummer und unterstützte USB-Version.
Dieser Devicedeskriptor ist aber nicht der einzige Deskriptor; der USB-Standard
definiert einige weitere Typen von Deskriptoren, welche in einem hierarchischen
Zusammenhang stehen:
Bei vielen USB-Geräten existiert jedoch oft nur eine Konfiguration,
obwohl durch dieses System eine enorme Flexibilität möglich wäre.
Device-Descriptor
Die Informationen sind als Baum in einem Gerät gespeichert. Zuoberst
(Wurzelknoten) steht jeweils der Device-Descriptor. Dieser beinhaltet
folgende Daten:
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x01) |
| 2 | 2 | bcdUSB | USB-Version als packed-BCD
mit dem Format JJMN, wobei JJ die Hauptnummer und M und N jeweils
Sub-Nummern der vorangehenden sind. USB 1.0 0x0100,
USB 1.1 0x0110 und USB 2.0 0x0200 |
| 1 | 4 | bDeviceClass | Klassen-Code |
| 1 | 5 | bDeviceSubClass | Subklassen-Code |
| 1 | 6 | bDeviceProtocol | Protokoll-Code. Die
letzten drei Grössen dienen dem System, um den richtigen
Klassen-Treiber zu aktivieren. Bei Klassen-Code 0 definiert jedes Interface
seinen eigenen Klassen-Code. Bei Klassen-Code 0xff ist der Code Vendor-spezifisch. |
| 1 | 7 | bMaxPacketSize |
Maximale Paketgrösse für ENDP 0. Mögliche Werte sind 8, 16, 32 und 64. |
| 2 | 8 | idVendor | Vendor-ID |
| 2 | 10 | idProduct | Produkt-ID |
| 2 | 12 | bcdDevice | Version des Gerätes (Format wie USB-Version). |
| 1 | 14 | iManufacturer | String-Index für Hersteller oder NULL. |
| 1 | 15 | iProduct | String-Index für Produkt oder NULL. |
| 1 | 16 | iSerialNumber | String-Index für
Seriennummer oder NULL. |
| 1 | 17 | bNumComfigurations | Anzahl Konfigurationen |
Configuration-Descriptor
Ein Configuration-Descriptor enthält Informationen über den aktuellen
Zustand des Geräts, beispielsweise, ob eine eigene Stromversorgung verwendet wird
oder die Anzahl Interfaces, die das Gerät unter dieser Konfiguration
anbietet. Sobald ein solcher Deskriptor geladen wird, wird automatisch
der gesamte darunterstehende Baum übergeben.
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x02) |
| 2 | 2 | wTotalLenght | Länge der total zurückgegebenen Daten (gesamter Baum) |
| 1 | 4 | bNumInterfaces | Anzahl Interfaces |
| 1 | 5 | bConfigurationVal | Konfigurations-Nummer |
| 1 | 6 | iConfiguration | String-Index für Konfiguration |
| 1 | 7 | bmAttributes | Bit 7 = 1: Bus-powered (nur USB 1.1),
Bit 6 = 1: self-powered,
Bit 5 = 1: Gerät darf den Host aufwecken |
| 1 | 8 | bMaxPower | benötigter Strom (mA). |
Interface-Descriptor
Ein Interface-Descriptor ist eine Art Header für die verschiedenen
implementierten Funktionalitäten. Beispielsweise könnte ein
Multifunktionsgerät Interfaces anbieten für das Fax, den Printer und
den Scanner. Diese Interfaces könnnen alle gleichzeitig aktiv sein. Der
Host kann jedoch zwischen den Interfaces umschalten. Tatsächlich können
sogar mehrere Interfaces für die gleiche Funktionalität erstellt
werden. Dazu gibt es im Interface-Descriptor nebst der Interfacenummer
und der anzahl Entpoints noch eine Nummer für das nächste alternative
Interface.
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x04) |
| 1 | 2 | bInterfaceNumber | Interface-Nummer |
| 1 | 3 | bAlternateSetting | nächstes alternatives Interface |
| 1 | 4 | bNumEndpoints | Anzahl ENDP für dieses Interface (ohne ENDP 0) |
| 1 | 5 | bInterfaceClass | Klassen-Code |
| 1 | 6 | bInterfaceSubClass | Subklassen-Code |
| 1 | 7 | bInterfaceProtocol | Protokoll-Code. Die letzten drei Werte stehen für Treiber Informationen, die das System zu laden hat. |
| 1 | 8 | iInterface | String-Index für Index-Beschreibung. |
Endpoint-Descriptor
Ein Endpoint-Descriptor speichert den Transfer-Typ, die
Richtung, das Polling-Intervall und die maximale Paketgrösse. Der
Endpoint 0 wird nicht durch einen Descriptor beschrieben, er ist
standardisiert (Kontroll-Funktion).
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x05) |
| 1 | 2 | bEndpointAddress | Bit 7 ist 0 für
einen Empfänger und 1 für einen Sender. Die Bits 6 bis 4 sind
reserviert (0). Die Bits 3 bis 0 bezeichnen die Nummer des ENDP. |
| 1 | 3 | bmAttributes | Bits 1 und 0 legen den Transfertyp fest: 00=Kontroll 01=Asynchron 10=Synchron (Bulk) 11=Interrupt Bits 7 bis 2 sind grunsätzlich reserviert, ausser wenn Asynchron: Bits 3 und 2: 00=Keine Synchronisation, 01=Asynchron, 10=Adaptiv, 11=Synchron Bits 5 und 4: 00=Data Edpoint, 01=Feedback Endpoint, 10=Explicit Feedback Data Endpoint, 11=reserved |
| 2 | 4 | wMaxPacketSize | Maximale Paketgrösse |
| 1 | 6 | bInterval | Nur für Asynchron und
Interrupt: Anzahl Frames, die zwischen den Pollings gewartet werden
muss. |
String-Descriptor
Darin werden die genauen Bezeichnungen der Geräte, Interfaces usw. festgehalten.
Die Strings liegen in Unicode vor. Jeder Index, der in den oben
aufgeführten Deskriptoren nicht benutzt wird, muss 0 enthalten. Der
Index 0 beinhaltet folgende Definitionen:
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x03) |
| 2 | 2 | wLANGID[0] | Code-Null-Sprache |
| 2 | 4 | wLANGID[1] | Code-Eins-Sprache |
| 2 | 6 | wLANGID[2] | Code-x-Sprache |
Die Sprachen sind international für USB festgelegt. Die folgenden
Deskriptoren definieren die eigentlichen Strings:
| Bytes | Offset | Name | Inhalt |
| 1 | 0 | bLength | Grösse des Descriptors in Bytes |
| 1 | 1 | bDescriptorType | Descriptor-Typ (0x03) |
| n | 2 | bString | String der Länge n |
Copyright © FH München, FB 04, Prof. Jürgen Plate
Letzte Aktualisierung: 18. Dec 2007