Entwickeln von USB-Apps

Eine Einführung in die Entwicklung von USB-Apps

 Der Universal Serial Bus (USB) entstand aus der Frustration von PC-Nutzern, die versuchen, eine unglaublich vielfältige Palette an Peripheriegeräten an ihren Computer anzuschließen. Er ist das Produkt von Anbietern, deren Laptops einen kleinen Peripherieanschluss benötigen. Er verspricht außerdem, die Vielzahl an Kabeln und Steckernetzteilen zu reduzieren, die selbst kleinste Computerinstallationen überfordern.

USB bietet Anwendern vor allem einfache Konnektivität. Es beseitigt die Vielzahl unterschiedlicher Anschlüsse für Drucker, Tastaturen, Mäuse und andere Peripheriegeräte. In einer USB-Umgebung gibt es keine DIP-Schalter zum Einstellen von Peripherieadressen und IRQs. USB unterstützt alle Arten von Daten, von langsamen Mauseingaben bis hin zu digitalisiertem Audio und komprimiertem Video.

Jedes USB-Gerät ist ein eingebettetes System. Wenn Sie eine Anwendung entwickeln, die mit einem PC verbunden wird, sollten Sie bedenken, dass USB die altmodischen parallelen und seriellen Schnittstellen verdrängt. Früher oder später müssen Sie von RS-232 auf USB umsteigen.

USB-Übersicht

USB ist ein serielles Protokoll und eine physikalische Verbindung, die alle Daten differenziell über ein einzelnes Kabelpaar überträgt. Ein weiteres Kabelpaar versorgt nachgeschaltete Peripheriegeräte mit Strom.

 Der Standard spezifiziert zwei Kabeltypen und zwei Steckervarianten. Hochgeschwindigkeitskabel für 12-Mbit/s-Kommunikation sind besser abgeschirmt als ihre günstigeren 1,5-Mbit/s-Gegenstücke. Jedes Kabel hat an einem Ende einen „A“-Stecker und am anderen einen „B“-Stecker. Abbildung 1 zeigt, dass die „A“-Stecker den Upstream-Anschluss bilden, während die „B“-Version den Downstream-Anschluss bildet. Da sich die beiden Typen physikalisch unterscheiden, ist eine falsche Kabelinstallation unmöglich.

 Die Kabellängen sind bei 12-Mbit/s-Verbindungen auf 5 Meter und bei 1,5-Mbit/s auf 3 Meter begrenzt. Das klingt rückständig, ist aber auf die Verwendung besserer Kabel bei höheren Geschwindigkeiten zurückzuführen.

 Die USB-Topologie ist ein mehrstufiger Stern. Hubs sind die Kommunikationsknoten, die die Geräte miteinander verbinden. Ein einziges Host-Gerät (typischerweise ein PC) enthält den Root-Hub, der den Knotenpunkt für alle Geräteverbindungen bildet. Der Host ist der Master des USB-Systems und steuert und plant als solcher alle Kommunikationsaktivitäten.

 Peripheriegeräte, die über USB gesteuert werden, sind Slaves, die auf Befehle des Hosts reagieren. Sobald ein Peripheriegerät an das USB-Netzwerk angeschlossen wird, kommuniziert der Host mit dem Gerät, um dessen Identität zu ermitteln und den benötigten Gerätetreiber zu ermitteln (ein Vorgang namens „Enumeration“). Um Probleme mit DIP-Schaltern und IRQs zu vermeiden, teilt der Host dem Peripheriegerät während der Enumeration eine Geräteadresse zu.

 Die Spezifikation erkennt zwei Arten von Peripheriegeräten: eigenständige (Einzelfunktionseinheiten, wie eine Maus) oder zusammengesetzte Geräte (Geräte, bei denen sich mehr als ein Peripheriegerät einen USB-Anschluss teilt – etwa eine Videokamera mit einem separaten Audioprozessor).

 Hubs sind Brücken; sie erweitern die logische und physische Fan-Out-Verteilung des Netzwerks. Ein Hub verfügt über eine Upstream-Verbindung (die zum Root-Hub oder zum nächsten Hub in der Nähe des Root-Hubs führt) und eine bis mehrere Downstream-Verbindungen.

 Hubs sind selbst USB-Geräte und können über eine gewisse Intelligenz verfügen. Ein wesentlicher Aspekt der USB-Philosophie besteht darin, dass Benutzer Peripheriegeräte anschließen und entfernen können, ohne das gesamte System auszuschalten. Hubs erkennen diese Topologieänderungen. Sie versorgen das USB-Netzwerk außerdem mit Strom; die Stromversorgung kann vom Hub selbst kommen (sofern dieser über ein integriertes Netzteil verfügt) oder von einem vorgeschalteten Hub durchgeleitet werden.

 Sobald ein Hub ein neues Peripheriegerät erkennt (oder ein gerade entferntes), die neuen Informationen an den Host meldet und die Kommunikation mit dem neu angeschlossenen Gerät ermöglicht, wird er praktisch unsichtbar und emuliert eine intelligente Leitung, die Daten zwischen dem Host und den Geräten überträgt. Obwohl physisch als mehrstufiger Stern konfiguriert, besteht für den Anwendungscode logisch eine direkte Verbindung zwischen dem Host und jedem Gerät.

Schwarzes USB-Symbol - Kostenlose schwarze USB-Symbole

Übersicht über die USB-Kommunikation

Die USB-Kommunikation findet zwischen dem Host und den Endpunkten in den Peripheriegeräten statt . Ein Endpunkt ist ein eindeutig adressierbarer Teil des Peripheriegeräts, der Datenquelle oder -empfänger ist. 4 Bit definieren die Endpunktadresse des Geräts. Codes geben außerdem die Übertragungsrichtung an und geben an, ob es sich um eine Steuerübertragung handelt. Endpunkt 0 ist für Steuerübertragungen reserviert, wodurch 15 bidirektionale Ziele oder Datenquellen innerhalb eines Geräts entstehen.

 Das Konzept der Endpunkte führt zu einem wichtigen Konzept bei USB-Transaktionen: der Pipe . Alle Übertragungen erfolgen über virtuelle Pipes, die die Endpunkte des Peripheriegeräts mit dem Host verbinden. Beim Aufbau der Kommunikation mit dem Peripheriegerät gibt jeder Endpunkt einen Deskriptor zurück – eine Datenstruktur, die dem Host Informationen über die Konfiguration und die Erwartungen des Endpunkts liefert. Deskriptoren umfassen Übertragungstyp, maximale Größe der Datenpakete, ggf. das Intervall für Datenübertragungen und in manchen Fällen die benötigte Bandbreite. Mit diesen Daten stellt der Host Verbindungen zu den Endpunkten über virtuelle Pipes her, die sogar eine Größe (Bandbreite) haben und damit vergleichbar mit Haushaltsinstallationen sind.

 USB unterstützt vier Datenübertragungstypen: Steuerung, Isochron, Bulk und Interrupt.

 Kontrollübertragungen tauschen Konfigurations-, Setup- und Befehlsinformationen zwischen Gerät und Host aus. CRCs prüfen die Daten; erneute Übertragungen garantieren bei Bedarf die Richtigkeit dieser Pakete.

 Massenübertragungen übertragen große Datenmengen, wenn die pünktliche Zustellung nicht entscheidend ist. Typische Anwendungen sind Drucker und Scanner. Massenübertragungen sind Füller und beanspruchen ungenutzte USB-Bandbreite, wenn nichts Wichtigeres passiert. CRCs schützen diese Pakete.

 Interrupt- Übertragungen, obwohl keine Interrupts im Sinne einer CPU-Umleitung, fragen Geräte ab, ob sie gewartet werden müssen. Peripheriegeräte, die kleine Datenmengen austauschen und sofortige Aufmerksamkeit benötigen (Mäuse, Tastaturen), nutzen Interrupt-Übertragungen. Die Daten werden durch eine Fehlerprüfung validiert.

 Isochrone Übertragungen verarbeiten Streaming-Daten, beispielsweise von einem Audio- oder Videogerät. Da es sich um zeitkritische Informationen handelt, ist der Zugriff auf den USB-Bus innerhalb gewisser Grenzen garantiert. Da keine Fehlerprüfung stattfindet, muss das System gelegentlich verschlüsselte Bytes tolerieren. 

Der Host-Gerätetreiber

Die Zeiten einfacher Schnittstellen wie RS-232 sind längst vorbei! Ebenso wie die Frustration, inkompatible Geräte zuverlässig kommunizieren zu lassen. USB ist ein sehr komplexer Standard, der einen enormen Software-Support erfordert, sowohl auf der Firmware-Seite als auch auf dem Host-Computer.

 Die meisten Host-End-Verbindungen werden, ob gut oder schlecht, über PCs mit einem Microsoft-Betriebssystem erfolgen. Unter DOS oder Windows 3.x gibt es keinerlei USB-Unterstützung. Windows 95 stellte einige USB-Treiber bereit, allerdings erst in den späteren Versionen ab OEM Software Release 2.1. Alle Windows 98-Versionen enthalten einen vollständigen Satz Treiber für gängige USB-Anwendungen.

 Einige der brillantesten Firmware-Entwickler schrecken vor dem Gedanken zurück, Windows-Treiber zu schreiben – und das aus gutem Grund. Leider ist ein USB-Treiber eine ziemliche Herausforderung. Die gute Nachricht: In vielen Fällen funktionieren die mit Windows mitgelieferten Treiber sogar mit Ihren individuellen Peripheriegeräten. Sehen wir uns an, wie Windows-Treiber funktionieren.

 Microsofts Treiber-Roadmap für Windows 98 und neuere Versionen basiert auf dem Win 32 Driver Model (WDM), das verschiedene Teile des Kommunikationsprozesses in einem Treiberstapel zusammenfasst. Anwendungscode kommuniziert (über Windows-API-Aufrufe) mit Klassen- oder benutzerdefinierten Treibern im WDM. Innerhalb des WDM-Stacks selbst erfolgt die Datenübertragung über IRP (I/O Request) auf niedrigerer Ebene.

 Der Low-Level-USB-Bustreiber verwaltet die Stromversorgung, Enumeration und verschiedene USB-Transaktionen der USB-Geräte. Darunter kommuniziert der Host Controller-Treiber direkt mit der USB-Hardware im PC. Beide Treiber sind in aktuellen Windows-Versionen enthalten; Sie müssen sie weder selbst schreiben noch ändern.

 Sowohl Windows als auch die USB-Spezifikation segmentieren Treiber in „Klassen“, wobei Hardware einer Klasse ähnliche Schnittstellen nutzt. Eine Klasse definiert eine Basisspezifikation für einen bestimmten Satz von Funktionen; alle Geräte einer Klasse benötigen vergleichbare Softwareunterstützung.

 Ein Beispiel ist das Human Interface Device (HID-Klasse), das Geräte wie Mäuse, Joysticks und Tastaturen unterstützt. Ein weiteres Beispiel ist die Monitor-Klasse, die Bildposition, -größe und -ausrichtung auf Bildschirmen steuert. Windows wird mit einem vollständigen HID-Klassentreiber ausgeliefert! Wenn Ihr Peripheriegerät HID-ähnliche Unterstützung benötigt, können Sie diesen integrierten Treiber möglicherweise nutzen, ohne Hostcode schreiben zu müssen.

 Aktuelle Spezifikationen der Klassentreiber finden Sie auf der USB-Homepage ( www.usb.org ). Windows-Unterstützung hierfür gibt es natürlich von Microsoft, sie ist derzeit jedoch etwas eingeschränkt (Geräte der HID-Klasse werden jedoch tatsächlich vollständig unterstützt).

 Benutzerdefinierte Treiber sind eine Alternative zu Klassentreibern. Ein benutzerdefinierter Treiber nutzt die Fähigkeiten eines bestimmten Hardwareteils am Ende des USB-Kabels. Wenn Sie beispielsweise ein Datenerfassungssystem gebaut haben, ist wahrscheinlich kein Klassentreiber verfügbar, sodass Sie Ihren eigenen schreiben müssen – eine gewaltige Aufgabe. Wenn Ihr Gerät über Funktionen verfügt, die weit über die einer Standardklasse hinausgehen, müssen Sie möglicherweise ebenfalls einen benutzerdefinierten Treiber schreiben, um diese Funktionen zu unterstützen.

 BlueWater Systems ( www.bluewatersystems.com ) bietet außerdem ein Treiberentwicklungskit an, dessen Assistent die Entwicklung von Windows-Treibern erheblich vereinfacht. Ein Add-on, das USB Extensions Toolkit, ist eine wertvolle Hilfe für USB-Treiber. Beachten Sie jedoch, dass hierfür Lizenzgebühren pro Einheit anfallen.

 Sofern Sie nicht gerade ein typisches PC-Peripheriegerät wie eine Maus entwickeln, werden Sie wahrscheinlich auch eine Host-Anwendung erstellen, die Daten mit dem USB-Gerät austauscht und mit dem Benutzer interagiert. Ein Oszilloskop beispielsweise, das einen A/D-Wandler und eine Triggerlogik am Ende eines USB-Kabels verwendet, benötigt eine Anwendung mit einer oszilloskopähnlichen Benutzeroberfläche. Für den Datenaustausch mit dem USB-Gerät führt der Anwendungscode lediglich standardmäßige dateiähnliche API-Aufrufe aus und verwendet zur Identifizierung des Geräts einen Standard-Windows-Handle.

Die Chips

Da USB (praktisch) an das PC-Großhandelsgeschäft gebunden ist, bieten Dutzende von Anbietern Hunderte verschiedener Support-Chips an.

 USB-Komponenten lassen sich schwer kategorisieren, lassen sich aber im Allgemeinen in drei Kategorien einteilen: Host-seitige USB-Controller (die im PC integriert sind und für Leser der Embedded Systems Programming wahrscheinlich wenig interessant sind ), Geräte, die als eigenständige USB-Peripheriecontroller konzipiert sind (ähnlich einem sehr intelligenten UART; diese Chips übernehmen die Kommunikation, benötigen aber einen weiteren Mikroprozessor als Gehirn des Geräts) und Versionen gängiger Prozessoren mit USB-Schnittstelle. Um noch einmal bei der UART-Metapher zu bleiben: Diese letzte Gruppe ähnelt einer hochintegrierten CPU mit integriertem UART; sowohl Ihr Anwendungscode als auch der für die USB-Steuerung erforderliche Code laufen auf demselben Bauteil.

 Über diese drei Kategorien hinaus bieten einige Anbieter Spezialteile an, beispielsweise USB-Kamera-Controller, Audiogeräte, Brücken, die USB mit anderen Bussen verbinden, und spezielle HID-Controller.

 Es ist unmöglich, hier allen Produkten gerecht zu werden. Hier sind einige Highlights:

 Cypress bietet eine Vielzahl von Hoch- und Niedriggeschwindigkeitschips auf Basis von 8-Bit-RISC-Kernen mit für USB-Anwendungen optimierten Befehlssätzen an. Es sind sowohl einmalig programmierbare als auch EPROM-Bausteine ​​erhältlich. Die Entwicklungskits (das Starterkit kostet 99 US-Dollar, das deutlich nützlichere Entwicklerkit ist jedoch immer noch für 495 US-Dollar erhältlich) sind die ideale Lösung, um Firmware zum Laufen zu bringen.

  Der SL16-USB-Controller von Scanlogic (www.scanlogic.com) ist ein 12-Mbit/s-Controller mit kundenspezifischer Architektur. Das Entwicklungsboard enthält, wie die meisten anderer Anbieter, WDM-Treiber. Interessanterweise behauptet Scanlogic, dass Anwender eine eingebettete USB-App in nur fünf Wochen (natürlich auf ihrer Hardware) entwickeln können.

 Der PDIUSBD11 von Philips ist ein faszinierender Chip, der einen USB-Anschluss mit I2C verbindet. I2C ist eine schnelle serielle Zweidrahtschnittstelle, die bereits in vielen eingebetteten Systemen verwendet wird und in einigen Mikrocontrollern integriert ist. Mit dem PDIUSBD11 können Sie Ihr aktuelles I2C-fähiges Produkt bequem an den USB-Anschluss eines PCs anschließen.

 Zahlreiche Hersteller bieten Controller mit integriertem USB-Anschluss an, sodass Sie USB-Zugriff erhalten, ohne einen Prozessor ausschließlich für die Kommunikation zu benötigen. Motorolas Produktpalette reicht vom USB-fähigen 6805 (MC68HC05JB4) bis zum PowerPC MPC850. AMD hat mit dem 186CC die bewährte x86-Reihe um USB erweitert. Sowohl Atmel (AT43USB321) als auch Microchip (PIC 16C745) bieten Mikrocontroller mit Kommunikationsanbindung an.

 Einige Hersteller bieten Low-Level-USB-Treiber an, die Sie in Ihre Produkte integrieren können. Phoenix (http://www.phoenix.com/platform/usbaccess.html) bietet auf der Grundlage seiner BIOS-Produkte Firmware-seitige USB-Stacks an, die sich an kommerzielle Echtzeitbetriebssysteme wie Accelerated Technology, Lynx und Integrated Systems/Wind River anbinden lassen.

USB im Labor

Viele von uns nutzen PCs zur Steuerung von Kleinserien oder für einfache Überwachungsaufgaben im Labor. RS-232- und parallele Druckeranschlüsse, die für viele dieser Anwendungen unerlässlich sind, sind bei modernen PCs oft nicht mehr vorhanden. Viele Laptops bieten diese Anschlüsse nur noch über einen Erweiterungsport, verfügen aber über USB am Hauptgerät.

 Wenn Sie Ihre eigene, laborbasierte Verbindung zu einem PC für kleine Stückzahlen aufbauen und sich nicht mit der Entwicklung eigener USB-Hardware/-Software anfreunden können, sollten Sie die USBSIMM-Karte für 79 US-Dollar in Betracht ziehen. Dieser Controller im Visitenkartenformat verwendet einen Anchor Chips 2131 (ein USB-fähiges 8051-Derivat). Er bietet eine einfache und unkomplizierte Möglichkeit, Sensoren oder Instrumente an USB-basierte Computer anzuschließen.

Abschluss

Die USB-Sponsoring-Organisation hat ein Compliance-Programm entwickelt, um sicherzustellen, dass Geräte den Spezifikationen des Standards entsprechen. Obwohl es kein Gesetz gibt, das vorschreibt, dass Geräte diese Tests bestehen müssen, gewährleistet dies doch, dass die Benutzererfahrung mit Ihren Produkten so reibungslos wie möglich verläuft. Produkte, die die Kriterien des Compliance-Programms erfüllen, werden in die Integrator’s List aufgenommen – eine Art Imprimatur, die Kunden die Gewissheit gibt, dass das Gerät zumindest aus Kommunikationssicht einwandfrei funktioniert.

 In dieser Branche steht nichts still, nicht einmal der relativ neue USB-Standard. Version 2.0, die möglicherweise gerade formalisiert wird, erhöht die Kommunikationsgeschwindigkeit auf atemberaubende 480 Mbit/s. Neue Anwendungsklassen sind also nicht mehr weit entfernt.

Fordewind.io ist ein IoT-Engineering- und Entwicklungsunternehmen mit Sitz in Kiew, Ukraine. Unsere Schwerpunkte und Expertise liegen in der Automobilindustrie und Smart Home/City-Projekten. Kontaktieren Sie uns jetzt und erfahren Sie mehr darüber, wie wir Sie bei der Gestaltung der Zukunft unterstützen können.