Kampis Elektroecke

Aufbau des USB-Protokolls

In diesem Kapitel möchte ich euch einen kleinen Überblick über das USB-Protokoll und die Kommunikation zwischen Device und Host geben. Dazu werde werde ich auf die einzelnen Transaktionen und die grundlegende Kommunikation eingehen, wobei ich tiefgehende Einblicke in den USB auslasse, da diese in der Regel nur für die Entwicklung eigener USB-Hardware relevant sind. Falls ihr dennoch einen Einblick auf die unterste Ebene der USB-Kommunikation erhalten wollt, so könnt ihr diesen hier bekommen. 

Bei jedem USB-Device wird eine der beiden Datenleitungen über einen Pull-Up Widerstand auf einen High-Pegel gezogen. Je nachdem ob dieser Widerstand an D+ oder D- angeschlossen ist, handelt es sich entweder um ein Full Speed Device (Pull-Up an D+) oder um ein Low Speed Device (Pull-Up an D-).

Das Ende einer USB-Verbindung, welches sich näher am Host befindet, wird Upstream End Transceiver und das Ende, welches sich näher am Device befindet, wird Downstream End Transceiver genannt. Die Datenleitungen des Upstream End Transceiver werden über Pull-Down Widerständen auf Masse gezogen.

Jedes USB-Gerät wird zudem durch eine Mindestanzahl von Bitfeldern, den sogenannten Deskriptoren, beschrieben.

  • Jedes Gerät besitzt einen Gerätedeskriptor der ganz allgemeine Informationen, wie die verwendete USB-Version oder die Hersteller-, bzw. die Produkt-ID oder die Anzahl der Gerätekonfigurationen, bereitstellt.
  • Die unterschiedlichen Gerätekonfigurationen werden über Konfigurationsdeskriptoren abgebildet, die z. B. die Stromaufnahme oder die Anzahl der Interfaces einer Gerätekonfiguration beschreiben. Der Host kann immer nur eine Gerätekonfiguration gleichzeitig aktivieren.
  • Jedes Interface wird durch einen Interfacedeskriptor beschrieben und anders als bei den Gerätekonfigurationen können mehrere Interfaces gleichzeitig aktiv sein. Ein Interfacedeskriptor beschreibt u. a. die Anzahl der Endpunkte und die Klasse eines Gerätes.
  • Die einzelnen Endpunkte eines jeden Interfaces werden durch Endpunktdeskriptoren beschrieben. Diese beinhalten z. B. Informationen wie die Größe des Endpunktes und ob es sich um einen IN oder OUT Endpunkt handelt.
  • Optionale Stringdeskriptoren
    • Manufacturer String
    • Product String
    • Serial Number String

Die Kommunikation zwischen Host und Device findet mit Hilfe von Endpunkte und Pipelines statt. Jeder Endpunkt ist als Senke, bzw. Quelle von Daten definiert und wird über eine Pipeline mit dem Host verbunden. Insgesamt kann jedes USB-Gerät bis zu 16 IN und 16 OUT Endpunkte besitzen, wobei die Größe variabel ist und in der Regel vom verwendeten USB-Controller abhängt. Ein besonderer Endpunkt ist der Endpunkt 0, da dieser Endpunkt sowohl als IN, wie auch als OUT Endpunkt verwendet wird. Dieser Endpunkt ist zudem der Standardendpunkt, der bei der Konfiguration des Gerätes genutzt wird.

Ein Datentransfer beim wird USB Transaktion genannt. Der USB-Standard kennt drei verschiedene Arten von Transaktionen:

Transaktion Beschreibung
IN Übertragung vom Device zum Host
OUT Übertragung vom Host zum Sevice
SETUP OUT Transaktion mit exakt 8 Bytes an Daten

Eine solche Transaktion kann mit einer von vier verschiedene Übertragungsarten durchgeführt werden, wobei jede Übertragungsart ihre speziellen Vorteile bietet.

Für die Kommunikation mit dem Host muss jedes USB-Gerät eine bestimmte Menge an Befehlen, die sogenannten Standard Requests , verstehen und bedienen können. Der Host nutzt diese Requests um möglichst viele Informationen über das neue Gerät zu erfragen. Nachdem der Host alle notwendigen Informationen gesammelt hat, werden die Requests für die Konfiguration und Initialisierung des eingesteckten USB-Gerätes verwendet.

Sobald ein neues USB-Gerät eingesteckt wird, wird eine der beiden Datenleitungen auf einen High-Pegel gezogen, wodurch der Host über ein neues Gerät informiert wird. Bevor der Host mit dem “befragen” des neuen Gerätes beginnt, führt er einen Reset des Gerätes durch, indem er beiden Datenleitungen für mindestens 10 Sekunden auf Low zieht (dies ist kein Hardwarereset!). Durch den Reset wird die Adresse des USB-Gerätes auf 0 zurückgesetzt. Diese Adresse kann nun vom Host genutzt werden um mit das Gerät über Endpunkt 0 zu konfigurieren. Vor der eigentlichen Kommunikation muss der Host allerdings erst die Größe des Endpunktes 0 ermitteln, welche im Gerätedeskriptor des angeschlossenen Gerätes hinterlegt ist (Bitfeld bMaxPacketSize0).

Die Erfragung des Gerätedeskriptors beginnt der Host mit einen Control Transfer. Jeder Control Transfer enthält eine SETUP Stage, die eine SETUP Transaktion und darin ein 8 Byte großes Setup-Paket, welches die Anfrage des Hosts spezifiziert, beinhaltet. 

Offset Feld Größe Beschreibung
0 bmRequestType 1 Bit 7:
Richtung
0 = Host-to-device
1 = Device-to-host
Bit 6 – 5:
Typ
0 = Standard
1 = Class
2 = Vendor
3 = Reserviert
Bit 4 – 0:
Empfänger
0 = Device
1 = Interface
2 = Endpunkt
3 = Other
4 – 31 = Reserviert
1 bRequest 1 Art des Requests
2 wValue 2 Variiert je nach Request
4 wIndex 2 Variiert je nach Request
6 wLength 2 Anzahl der zu übertragenden Bytes

Dieses Setup-Paket enthält sämtliche Anfragedetails des Hosts an das Device und wird vom Host mit den entsprechenden Werten des Requests gefüllt. In der DATA Stage antwortet das Gerät dann mit dem angefragten Daten, falls die Anfrage vom Host eine Antwort des Gerätes verlangt. Zum Abschluss sendet der Host in der STATUS Stage noch eine CRC und wenn die Übertragung fehlerfrei war, wird die Nachricht vom Gerät mit einem ACK bestätigt.

Unter Windows sieht die SETUP Stage der ersten GET_DESCRIPTOR-Anfrage folgendermaßen aus:

Offset Feld Wert Beschreibung
0 bmRequestType 0x80

Device-to-host

Standard

Device

1 bRequest 0x06 GET_DESCRIPTOR (6)
2 wValue 0x100

Deskriptortyp 1 (Gerätedeskriptor)

Deskriptorindex 0

4 wIndex 0x00
6 wLength 0x40 64 Bytes

Ein Windowshost möchte bei der ersten Anfrage immer 64 Bytes einlesen, bricht die Übertragung aber nach den ersten 8 Bytes ab und führt einen weiteren Reset des Gerätes durch. Die 8 empfangenen Bytes beinhalten die Größe vom Endpunkt 0, die der Host nun kennt. Durch den zweiten Reset wird verhindert, dass das Gerät durch die Anfrage vom Host nicht in einem undefinierten Zustand ist.

Nach dem zweiten Reset führt der Host eine SET_ADDRESS-Anfrage durch um die USB-Adresse des angeschlossenen Gerätes zu setzen. Die verwendete Adresse hängt dabei von den bereits angeschlossenen Geräten ab und ist variabel.

Nach dieser Anfrage führt der Host eine neue GET_DESCRIPTOR-Anfrage durch, nur das in diesem Fall wLength auf 18 gesetzt wird, was der kompletten Länge des Gerätedeskriptors entspricht. Das Gerät antwortet erneut mit dem Gerätedeskriptor, nur dieses mal bricht der Host nicht die Übertragung ab, sondern empfängt alle Daten und quittiert den Transfer mit einem ACK. Der Host weiß nun wie das Gerät aufgebaut ist und führt weitere Anfragen durch um alle anderen Deskriptoren zu erfragen. Sobald sich der Host sich sicher ist um was für ein Gerät es sich handelt, lädt er einen entsprechenden Treiber (z. B. einen Maustreiber) und das Gerät kann verwendet werden.

Im nächsten Teil des Tutorials beschäftigen wir uns mit der Initialisierung von dem USB-Modul des Mikrocontrollers.

Zurück

Last Updated on

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Offset Feld Größe Beschreibung
0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 DEVICE Deskriptor (Feld = 1)
2 bcdUSB 2 Verwendete USB Version
4 bDeviceClass 1 Durch das USB-IF vergebener Klassencode
5 bDeviceSubClass 1 Durch das USB-IF vergebener Subklassencode
6 bDeviceProtocol 1 Durch das USB-IF vergebener Protokolcode
7 bMaxPacketSize0 1

Maximale Paketgröße für Endpunkt 0.

Muss entweder 8, 16, 32 oder 64 sein

8 idVendor 2 Durch das USB-IF vergebene Vendor-ID
10 idProduct 2 Durch den Hersteller vergebene Produkt-ID
12 bcdDevice 2 Releasenummer des Gerätes
14 iManufacturer 1 Index des Stringdeskriptors, der den Hersteller beschreibt
15 iProduct 1 Index des Stringdeskriptors, der das Produkt beschreibt
16 iSerialNumber 1 Index des Stringdeskriptors, der die Seriennummer beschreibt
17 bNumConfigurations 1 Anzahl der Gerätekonfigurationen

 

Offset Feld Größe Beschreibung

0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 CONFIGURATION Deskriptor (Feld = 2)
2 wTotalLength 2 Größe dieses und aller anderen Deskriptoren
4 bNumInterfaces 1 Anzahl der Interfaces, die durch diesen Deskriptor unterstützt werden
5 bConfigurationValue 1 Index der durch eine SET_CONFIGURATION-Anfrage genutzt werden muss um diese Konfiguration zu laden
6 iConfiguration 1 Index des Stringdeskriptors, der diese Konfiguration beschreibt
7 bmAttributes 1 Bit 7 1
Bit 6 Self-powered
Bit 5 Remote Wakeup
Bit 4 - 0 0
8 bMaxPower 1 Maximale Stromaufnahme des Gerätes in 2 mA Schritten

 

Offset Feld Größe Beschreibung
0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 INTERFACE Deskriptor (Feld = 4)
2 bInterfaceNumber 1 Interface ID
3 bAlternateSetting 1 Alternative Einstellungen für dieses Interface
4 bNumEndpoints 1 Anzahl der Endpunkte, die für dieses Interface genutzt werden (ohne Endpunkt 0)
5 bInterfaceClass 1 Durch das USB-IF vergebener Klassencode
6 bInterfaceSubClass 1 Durch das USB-IF vergebener Subklassencode
7 bInterfaceProtocol 1 Durch das USB-IF vergebener Protokollcode
8 iInterface 1 Index des Stringdeskriptors, der dieses Interface beschreibt

 

Offset Feld Größe Beschreibung
0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 ENDPOINT Deskriptor (Feld = 5)
2 bEndpointAddress 1 Adresse des Endpunktes
Bit 7:
Richtung
0 = OUT
1 = IN
Bit 6 - 4 0
Bit 3 - 0:
Endpunktnummer
0 - 15
3 bmAttributes 1 Bit 7 - 6 0
Bit 5 - 4:
Verwendung

Nur für Isochrone Endpunkte. Andernfalls 0.

0 = Data endpoint
1 = Feedback endpoint
2 = Implicit feedback Data endpoint
3 = Reserved

Bit 3 - 2:
Synchronisation

Nur für Isochrone Endpunkte. Andernfalls 0.

0 = No Synchronisation
1 = Asynchronous
2 = Adaptive
3 = Synchronous

Bit 1 - 0:
Transfer
0 = Control
1 = Isochronous
2 = Bulk
3 = Interrupt
4 wMaxPacketSize 1 Maximale Paketgröße, die dieser Endpunkt senden oder empfangen kann
6 bInterval 1 Polling Intervall für den Endpunkt in ms Schritten für Low und Full Speed Devices oder in 125 us Schritten für High Speed Devices

 

Stringdeskriptor 0

Spezifiziert die unterstützten Sprachen der Strings

Offset Feld Größe Beschreibung
0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 STRINGDeskriptor (Feld = 3)
2 wLANGID[0] 2 LANGID Code 0
... ... ... ...
2 + x * 2 wLANGID[x] 2 LANGID Code x

Allgemeiner Stringdeskriptor

Offset Feld Größe Beschreibung
0 bLength 1 Größe des Deskriptors in Bytes
1 bDescriptorType 1 STRINGDeskriptor (Feld = 3)
2 bString 2 String im Unicode Format

 

Methode Paketgrößen in Bytes Beschreibung
Bulk

Low Speed: Nicht erlaubt

Full Speed: 8, 16, 32, 64

High Speed: Bis zu 512

Der Bulk Transfer wird immer dann genutzt, wenn viele Daten Fehlerfrei übertragen werden müssen.

In diesem Modus wird die Bandbreite auf Grund der Fehlerkontrolle nicht garantiert.

Interrupt

Low Speed: 1 bis 8

Full Speed: 1 bis 64

High Speed: Bis zu 1024

Der Interrupt Transfer wird dort eingesetzt, wo normalerweise Interrupts genutzt würden um das Vorhandensein von Daten zu signalisieren.

Wird in den meisten Fällen für die Kommunikation vom Device zum Host genutzt.

Isochronous

Low Speed: Nicht erlaubt

Full Speed: Bis zu 1023

High Speed: Bis zu 1024

Beim Isochronous Transfer wird eine feste Bandbreite im Austausch für die Fehlerfreiheit garantiert.

Diese Art der Übertragung wird z. B. im Audio- oder Videobereich genutzt.

Control

Low Speed: 8

Full Speed: 8, 16, 32, 64

High Speed: 64

Ein bidirektionaler Transfer, der sowohl eine IN, wie auch eine OUT Transaktion nutzt.

Der Control Transfer wird ausschließlich für die Konfiguration des Gerätes genutzt und überträgt Daten nur zum Endpunkt 0.

Jeder Control Transfer besteht aus einer SETUP, einer DATA und einer STATUS Stage. Die SETUP Stage beschreibt die Anfrage vom Host und die DATA Stage beinhaltet die Daten vom Gerät, falls notwendig. 

 

bmRequestType bReqest wValue wIndex wLength Data

0x00

0x01

0x02

CLEAR_FEATURE
(1)
Feature

Null

Interface

Endpunkt

0 -
0x80 GET_CONFIGURATION
(8)
0 0 1 Konfigurationsdaten
0x80 GET_DESCRIPTOR
(6)
Deskriptortyp (H) und
Deskriptorindex (L)
Null oder Sprach ID Länge des Deskriptors Deskriptor
0x81 GET_INTERFACE
(10)
0 Interface 1 Interfacedaten

0x80

0x81

0x82

GET_STATUS
(0)
0

0

Interface

Endpunkt

2 Gerät-, Interface- oder Endpunktstatus
0x00 SET_ADDRESS
(5)
Geräteadresse 0 0 -
0x00 SET_CONFIGURATION
(9)
Konfiguration 0 0 -
0x00 SET_DESCRIPTOR
(7)
Deskriptortyp (H) und
Deskriptorindex (L)
Null oder Sprach ID Länge des Deskriptors Deskriptor

0x00

0x01

0x02

SET_FEATURE
(3)
Feature

0

Interface

Endpunkt

0 -
0x01 SET_INTERFACE
(11)
Interfacedaten Interface 0 -
0x82 SYNCH_FRAME
(12)
0 Endpunkt 2 Framezähler