USB universeller serieller Bus - USB ist ein serieller Single-Master-Bus. - USB unterstützt drei Datenübertragungsgeschwindigkeiten: - Low Speed: 1,5 MBit/s - Full-Speed: 12 MBit/s (framepulse 1ms) - High-Speed: 480 MBit/s (framepulse 0,125 ms) - NRZI-Codierung mit Bit-Stuffing auf der Senderseite ermöglicht Taktrückgewinnung im Empfänger. - elektrische Baumstruktur, der Host bildet die Wurzelschnittstelle, die Hubs die Verzweigungspunkte und die Endgeräte die Blattknoten. - Max. 5 Hubs können auf Grund von Signallaufzeiten kaskadiert werden, so dass maximal 127 Endgeräte angeschlossen werden können. - Kabellänge auf 5 m begrenzt, Signallaufzeit pro Kabelsegment 30 ns. - Stecker Typ A in Upstream-Richtung am Hub. - Stecker Typ B in Downstream-Richtung am Gerät. - USB-Kabel enthält eine verdrillter Doppelader (D+/D-), sowie zwei Stromversorgungsleitungen (VCC/GND). - logische Sternstruktur, zwischen jedem einzelnen Endgerät und dem RootHub im Host besteht eine logische Punkt-zu-Punkt-Verbindung. - Der USB-Host-Controller steuert zentral den gesamten Busverkehr. Jede Datenübertragung wird vom Busmaster initiier. - Ein Scheduler generiert pro 1 ms ein Start of Frame (Framepulse). - Jedes USB-Endgerät erhält während der Konfigurationsphase (enumeration) eine eigene Adresse. - In Downstream-Richtung erfolgt der USB-Datentransfer im Broadcastmodus vom Host zur Funktion im Endgerät. - Die Spezifikation USB 1.1 definiert zwei Controller-Designs: - OHC: open-host-controller - UHC: universal-host-controller - Die Spezifikation USB 2.0 erweitert die Architektur: - EHC: enhanced-host-controller - USB-Transfertypen: - Control-Transfer: zur Steuerung der Hardware Control-Requests - Interrupt-Transfer: Host fragt periodisch alle 10 ms nach kleinen Mengen Daten (typisch 8 Bytes), z. B. Mäuse und Tastaturen - Bulk-Transfer: zeitunkritische größere Datenmengen mit Fehlerüberwachung, z.b. Drucker und Scanner - Isochronous-Transfer: große Datenmengen mit definierter Datenrate ohne Fehlerkorrektur, z.b. Audio- und Video-Daten von einer Kamera
USB Device Descriptoren Deskriptoren enthalten die Beschreibung der physikalischen und logischen Eigenschaften eines USB-Gerätes. Zur Identifizierung eines Plug-and-Play- Devices werden die Deskriptoren durch den Host während der Enumeration durch den Standard-Reguest GetDescriptor angefordert. Der USBstandard definiert eine Hierarchie von Descriptoren. /* USB descriptor types */ #define DEVICE_TYPE 1 #define CONFIGURATION_TYPE 2 #define STRING_TYPE 3 #define INTERFACE_TYPE 4 #define ENDPOINT_TYPE 5 Standard-Descriptortypen Code Eigenschaften Device-Descriptor 0x01 einer pro Gerät, 18 Byte lang Configuration-Descriptor 0x02 String-Descriptor 0x03 Verwendung optional Interface-Descriptor 0x04 Endpoint-Descriptor 0x05 ein Descriptor pro Endpoint Device-Qualifier-Descriptor 0x06 nur für USB 2.0 High-Speed-Geräte Other-Speed-Configuration- Descriptor 0x07 nur für USB 2.0 High-Speed-Geräte Ein USBdevice besitzt genau einen Device-Descriptor, der die globalen Informationen über das Gerät enthält. Der Configuration-Descriptor enthält spezifische DeviceInformationen. Es können mehrere Konfigurationen unterstützt werden, aber nur eine aktiv sein (SetConfiguration). Eine Configuration kann mehrere Interfaces enthalten, jedes mit mehreren sich ausschliessenden Endpoints Der Endpoint-Descriptor beschreibt die Eigenschaften der FIFOspeicher eines Gerätes (z.b. Bandbreite der Kamera für Video, Audio, Video+Audio).
Device-Descriptor Jedes Herstellermitglied im USB-Forum erhält eine Vendor-ID. Produkt- und Release-ID werden vom Hersteller vergeben. Klassen-, Subklassen- und Protokoll-Code müssen im Device-Descriptor noch nicht gesetzt werden, da dies im Interface-Descriptor ebenfalls möglich ist. #define Device_Descriptor_Len 18 /* SIEMENS_SEMICONDUCTOR - 0x058B */ #define VENDOR_ID 0x058B /* SAB-C541U µcontroller - 0xC541 */ #define PRODUCT_ID 0xC542 0 blenght Länge des Descriptors in byte 12h 1 bdescriptortype Type=DeviceDescriptor 01h 2 bcdusb USB-Spec.Vers. in BCD: 1.1 1001h 4 bdeviceclass Geräte-Klassen-Code 00h 5 bdevicesubclass Geräte-Subklassen-Code 00h 6 bdeviceprotocoll Protokoll-Code 00h 7 bmaxpacketsize0 Tiefe der EP0-FIFO in byte 08h 8 idvendor Vendor-ID des Herstellers 3c05h 10 idproduct Produkt-ID des Herstellers 8490h 12 bcddevice Release-Nr. Des Produkts 0201h 14 imanufacturer String-Index für Hersteller 01h 15 iproduct String-Index für Produkt 02h 16 iserialnumber String-Index für Seriennumer 03h 17 bnumconfigurations mögliche Konfigurationen 01h
Configuration-Descriptor 0 blenght Länge des Descriptors in byte 09h 1 bdescriptortype Type=ConfigurationDescriptor 02h 2 wtotallength Anzahl Descriptoren dieser 2200h Konfiguration 4 bnuminterfaces Anzahl Interfaces dieser 01h Konfiguration 5 bconfigurationvalue Nummerdieser Konfiguration 01h 6 iconfiguration String-Index für Konfiguration 04h 7 bmattributes Attribute dieser Konfiguration A0h 8 MaxPower I-Aufnahme in 2mA Einheiten 1Ah #define Config_Descriptor_Len 34 /* configuration attributes */ #define BUSPOWERED #define SELFPOWERED #define REMOTE_WAKEUP 0x80 0x40 0x20
Interface-Descriptor Der Interface-Descriptor wird immer als Teil der Configuration-Descriptor- Collection zum Host übertragen. Das Feld AlternateSettings ermöglicht die Definition von mehreren gleichartigen Interfaces mit der gleichen Interface-Nummer, aber z.b. unterschiedlichen Bandbreiten. Zu jedem Paar InterfaceNumber/ AlternateSettings gehört ein Satz Endpoint-Descriptoren. Dort wird dann z.b. über den Wert der FIFO-Fiefe die Bandbreite bestimmt. Wenn Klassen-, Subklassen- und Protokoll-Code im Device-Descriptor und Interface-Descriptor mit 0 beschrieben sind, erfolgt die Auswahl des WDM- Treibers im Host anhand der Vendor- und Produkt-ID aus dem Device- Descriptor. Für die Abfrage der textuellen Beschreibung des Interfaces dient der String- Index. 0 blenght Länge des Descriptors in byte 09h 1 bdescriptortype DescriptorType = Interface 04h 2 binterfacenumber Interface-Nummer 00h 3 balternatesetting AlternateSettings dieses Interf. 00h 4 bnumentpoints Anzahl Endpoints ohne EP0 01h 5 binterfaceclass KlassenCode (Tastatur) 03h 6 binterfacesubclass SubKlassenCode (BootDev.) 01h 7 binterfaceprotocol ProtokollCode 00h 8 iinterface StringIndex für Interface 05h
Endpoint-Descriptor Endpoint-Descriptoren können nicht einzeln durch den Host angefordert werden, sondern nur in Verbindung mit dem Configuration-Descriptor. Das untere Nibble des EndpointAddress-Byte stellt die Endpoint-Nummer dar. Bit 7 gibt die Richtung an (1=IN;0=OUT). Isochrone Endpoints können bis zu 1.023 Byte tiefe FIFOs haben. 0 blenght Länge des Descriptors in byte 07h 1 bdescriptortype DescriptorType = Endpoint 05h 2 bendpointaddress z.b. IN, EP1 81h 3 bmattributes Transferart: 03h Control-Transfer 00b Isochronous-Transfer 01b Bulk-Transfer 01b Interrupt-Transfer 11b 4 bwmaxpacketsize FIFOgrösse des Endpoints 0800h 6 bintervall Polling-Intervall (z.b. 16 ms) 10h /* Endpoint directions */ #define BI 1 #define OUT 0 #define IN 1 /* USB Transfer types */ #define CONTROL 0 #define ISOCHRONOUS 1 #define BULK 2 #define INTERRUPT 3