Font Size

Cpanel

USB Gadget – USB mal anders 'rum

USB-Treiber für die Host-Seite zu programmieren ist keine große Kunst. Wie sieht es jedoch auf der anderen Seite aus. Was ist zu tun, damit ein Embedded System als USB-Client auftreten kann?


USB hat sich in den letzten Jahren als vielfältiger Standard für den Anschluss von periphären Geräten an einen Computer etabliert. Zunächst ausgelegt als Ersatz für PS/2, serielle und parallele Schnittstelle ist heute die Verbindung von schnellen Festplatten und Streaming Devices wie Videokameras typisches Einsatzfeld von USB.
Im Umfeld von USB wurde nicht nur ein serielles Protokoll standardisiert, sondern auch mehrere Device-Klassen und sogar ganze USB-Host-Controller. Für die Softwareentwicklung bringt insbesondere der letzte Aspekt eine große Erleichterung mit sich. Enhanced Host Controller Interface (kurz: ehci) ist der Host-Controller-Standard für USB 2.0. USB 1.1 Host-Controller sind in uhci bzw. ohci standardisiert. Linux verfügt über leistungsstarke und zuverlässige Treiber für alle Host-Controller. Das übergeordnete USB-Framework ermöglicht eine schnelle Entwicklung von Treibern für verschiedenste USB-Devices. Dieses ist jedoch nur selten überhaupt nötig. Für alle USB-Device-Klassen sind bereits Treiber vorhanden. Das heißt, zum Anschluss eines USB-Sticks, einer USB-Tastatur oder Maus bedarf es keiner Treiberneuentwicklung. Auch für die allermeisten USB-Seriell-Adapter, für viele USB-Kameras und andere Geräte gibt es bereits USB-Treiber und es werden ständig mehr.
Wie sieht es jedoch für das USB-Device aus? Kann ein Embedded System als USB-Device auftreten?
Die Antwort für Linux lautet: USB-Gadget! Das USB-Gadget-Framework ermöglicht die Verwendung von USB-Device-Modulen. Das Framework lässt sich in drei Schichten unterteilen:
- UDC-Treiber – Der USB-Device-Controller ist die Hardware, welche den Anschluss an den USB-Host-Controller eines PCs oder ähnlichem überhaupt erst ermöglicht. Leider gibt es keinen einheitlichen Standard für USB-Device-Controller wie es sie für die Host-Seite gibt. Dies macht in vielen Fällen eine komplette Neuentwicklung des Treibers nötig. Für viele USB-Devices gibt es aber bereits Treiber, die in den Linux-Kernel eingeflossen sind. Zu einer exakten Auflistung aller unterstützten USB-Device-Controllern sei an das entsprechende Verzeichnis im Kernel-Source verwiesem: drivers/usb/gadget/. Der UDC-Treiber stellte eine API zur Verfügung, mit der höhere Schichten Endpoints und Powermanagement benutzen können.
- Gadget-Treiber – Der Gadget-Treiber wird über dem UDC-Treiber angeordnet und greift auf dessen API zu. Sein Verhalten definiert die genaue Funktion des Embedded Systems. Es gibt Gadget-Treiber für fast jede Device-Klasse, die für USB definiert wurde. Wird nun der Gadget-Treiber für USB-Massstorage geladen, dann kann das Embedded System als Speicher, wie ein MemoryStick benutzt werden. Wird der Gadget-Treiber für CDC geladen, so ist es möglich eine Netzwerkverbindung über USB aufzubauen. Außerdem gibt es noch Gadget-Treiber für eine serielle Kommunikation, für Testzwecke und zur einfachen Implementierung eigener, proprietärer Protokolle.
- Weitere Schichten – Je nach dem welcher Gadget-Treiber geladen ist, schließen sich noch oben hin weitere Schichten an, für MassStorage ist das SCSI, für CDC natürlich der Netzwerkstack u.s.w.

Das USB-Gadget Framework ist ein typisches Beispiel dafür, wie wichtig eine sinnvolle horizontale Unterteilung der Softwaremodule ist. Wer einmal einen UDC-Treiber entwickelt hat, kann von nun an frei entscheiden, ob es nun eine USB-Stick oder eine Netzwerkverbindung oder etwas ganz anderes sein soll.

29.03.2006 08:45 (tb)