Daher kenne ich die USB 2.0-Spezifikation auf der USB.org-Website .
Ich bin ein bisschen faul und ungeduldig. Kann mir jemand sagen, wohin ich gehen soll, um herauszufinden, was genau von meinem Peripheriegerät erwartet wird, wenn das USB-Kabel angeschlossen ist?
Wenn es sich bei meinem Peripheriegerät beispielsweise um einen Drucker handelt, wie kann ich dem Computer am anderen Ende mitteilen, dass gerade ein Drucker (mit einer bestimmten Modellbeschreibung, nehme ich an) angeschlossen wurde? Wie erkennt der Druckertreiber auf dem Computer, welcher USB-Anschluss an den Drucker angeschlossen war?
Meine Anwendung ist eigentlich USB MIDI. Ich habe auch dieses USB-MIDI-Dokument erhalten , aber mir fehlt das grundlegendere USB-Protokoll.
Der USB-Chip, den ich verwende, ist der FTDI FT220x und ist mit dem SPI eines ADSP-21479 SHArC verbunden. Wir verwenden es jetzt einfach für die Textkommunikation mit dem PC (mit TeraTerm) als "Konsole" . Ich habe Zugriff auf den Code, der den SPI-Port einrichtet und eine Verbindung zum FTDI-Chip herstellt, aber es gibt keinen Code, der anfängliche Kommunikationen durchführt. Ich weiß nicht, was der FT220x macht, wenn er zum ersten Mal an den PC angeschlossen wird.
Ich bin nicht unglücklich zu lesen und zu lernen, aber ich möchte wissen, wo ich anfangen soll zu lesen, und eine 100-MB-USB-Spezifikation ist zu groß für ein Ziel, auf das ich schießen kann. Ein herzliches Dankeschön an alle für die umsetzbare Hilfe.
quelle
Antworten:
USB hat mehrere Ebenen, die in der USB 2.0-Spezifikation beschrieben sind . Wenn Sie mit dem OSI-Netzwerkmodell mit mehreren Ebenen vertraut sind, können Sie es sich folgendermaßen vorstellen:
Konzeptionell basiert USB auf Datenströmen, Endpunkten genannt , die entweder IN (zum Host) oder OUT (vom Host) sein können. Jedes Gerät verfügt über Endpunkt 0, der für die Steuerung und den Status verwendet wird. Ein Gerät verfügt möglicherweise über zusätzliche Endpunkte für Anwendungsdaten. Jeder Endpunkt verhält sich wie ein FIFO-Puffer.
Daten werden auf einem Endpunkt entweder als Bulk (wie TCP / IP, garantiert, dass jedes Byte ankommt und in der richtigen Reihenfolge) oder als Isochronous (wie UDP / IP, garantiert, dass sie aktuell sind, aber möglicherweise Pakete verwerfen) übertragen. Es gibt einen irreführend als " Interrupt " bezeichneten Übertragungstyp, der wirklich nur vom Host abgefragt wird.
USB 2.0 verwendet ein differentielles Paar für die Datenverbindung. Ich werde nicht weiter ins Detail gehen, da dies in Kapitel 7 der USB 2.0-Spezifikation behandelt wird. Im Allgemeinen behandeln wir dies auf der Leiterplatte als ein differentielles Paar mit angepasster Länge und stecken die für jeden USB-PHY (physikalisch) erforderlichen Vorwiderstände in die Reihe Schnittstelle) wird verwendet. USB-Peripheriegeräte verwenden einen hohen Widerstand an einer der D + - oder D- -Leitungen, um den Host zu benachrichtigen, dass es sich um Hochgeschwindigkeits- oder Niedriggeschwindigkeits-Peripheriegeräte handelt.
Sobald der USB-Host feststellt, dass ein Gerät vorhanden ist, fordert er eine Reihe von Deskriptoren vom Gerät an. Dies erledigt der FTDI-Chip hinter den Kulissen. Die Deskriptionen sind in Kapitel 9.5 beschrieben . Dazu gehören Device Descriptor , Configuration Descriptor , Interface Descriptors , Endpoint Descriptors , String Descriptors und möglicherweise sogar HID Report Descriptors .
Der Geräte-Deskriptor enthält die USB- VID- (Vendor Identification) und die PID- Nummer (Product Identification). Das Betriebssystem verwendet dieses Zahlenpaar, VID_PID, um zu bestimmen, welcher Gerätetreiber für dieses Gerät verwendet werden soll. Beachten Sie, dass die VID-Nummer durch eine Mitgliedschaft im Forum für USB-Implementierer vergeben wird. Wenn Sie also ein einzelner Erfinder sind, ist dies ein Problem.
Zusätzlich gibt es den HID-Klassentreiber (Human Interface Device), der eine etwas generische Eingabe für Tastatur / Maus / usw. sowie eine generische Eingabe / Ausgabe bereitstellt. Ein Vorteil von HID besteht darin, dass kein benutzerdefinierter Gerätetreiber bereitgestellt werden muss, der Durchsatz jedoch im Vergleich zu einem benutzerdefinierten Massentreiber etwas eingeschränkt ist. Es gibt ein ganz anderes Spezifikationsdokument über die HID-Deskriptoren; und ein HID Usage Table- Dokument , in dem alle Codenummern aufgeführt sind, die die verschiedenen Funktionen beschreiben, die für ein bestimmtes Gerät mit menschlicher Schnittstelle verfügbar sind.
Ein FTDI-Chip wie das Datenblatt FT220X enthält die USB-Schnittstelle (nicht zu verwechseln mit der seriellen Schnittstelle SPI oder der seriellen Schnittstelle RS232). Dies erledigt die meisten der in den Kapiteln 6, 7 und 8 beschriebenen Low-Level-Aufgaben.
FTDI verwendet ein EEPROM (Off-Chip beim FT2232H, On-Chip beim FT220X), um ein kleines Stück der Informationen zu enthalten, die in die Deskriptoren eingehen. Sie können die VID / PID-Werte anpassen und benutzerdefinierte Beschreibungszeichenfolgen bereitstellen.
quelle
Das Verhalten und die Interaktion von USB- "Partnern" (einem Host und einem Gerät) ist über die USB-Spezifikation verteilt. Der beste Weg, um sich einen Überblick zu verschaffen, ist ein Blick auf "Geräte-Framework", Kapitel 9, in dem die möglichen (vorgeschriebenen) Gerätezustände (Abbildung 9-1) und das Host- (und Hub-) Framework in den Kapiteln 10 und 11 beschrieben werden Protokolldetails (Pipes / Transaktionstypen / abstrakte OSI-Protokollebenen, PCB-Layout usw.). Ein besserer Griff auf die anfängliche Interaktion kann durch Studium des Portstatusdiagramms erreicht werden (Abbildung 11-10).
Wenn kein Kabel zwischen Host und Gerät angeschlossen ist, befinden sich die Host-Ports im Wesentlichen im Status "Powered State" (VBUS ist eingeschaltet), jedoch im Status "Disconnected". D + und D- Drähte werden mit 15k Pulldowns niedrig gehalten.
Wenn das Kabel angeschlossen ist, geht der VBUS in das Gerät. Das Gerät erkennt, dass es verbunden ist, und meldet ein "Verbinden" -Ereignis, indem es an einem der D-Drähte HIGH zieht, D +, wenn es sich um ein FS / HS-Gerät handelt, und D-, wenn es sich um ein LS-Gerät handelt.
Durch Ziehen von D +/- Drähten an einem bestimmten Port wird die Host-Software unterbrochen und es wird eine Änderung des Port-Status gemeldet. Die Host-Software (normalerweise "ehci.sys") leitet dann die "Port-Reset" -Sequenzierung für diesen bestimmten Port ein. Nach erfolgreichem Abschluss des "USB-Port-Resets" wird der Host-Port für die USB-Kommunikation aktiviert. Der Port wird aktiv (Frame-Pakete fließen ab).
Unter Verwendung des USB-Protokolls weist der Host diesem Gerät eine eindeutige Adresse zu und liest "Gerätedeskriptor". Dies startet den "Geräte-Enumerations" -Prozess. Die Gerätebeschreibung enthält Informationen zur zugehörigen Geräteklasse (HID, COM, MIDI, Drucker usw.) und zur VID / PID des jeweiligen Geräts sowie eine Reihe weiterer Informationen (siehe Tabelle 9-8).
Nach dem Abrufen der Geräteklasse und der VID / PID versucht die Host-Software, diese Informationen in der Geräteregistrierung abzugleichen, und lädt den entsprechenden DEVICE-Treiber, entweder generisch oder herstellerspezifisch (falls vorhanden). Der Gerätetreiber beendet dann den Aufzählungsprozess, indem er die Geräteschnittstelle auswählt, die mit der Einstellung "Gerätekonfiguration" endet. Offensichtlich wird die gesamte USB-Kommunikation nur hinter diesem bestimmten Port erkannt , auch wenn alle Pakete an alle aktivierten Ports gesendet werden.
Das Obige ist der allgemeine Rahmen des USB-Verbindungsprotokolls. Das Packen von Daten für einen bestimmten Zweck (wie MIDI) ist eine andere Geschichte und wird entweder auf Anwendungsebene oder auf Gerätetreiberebene behandelt, wenn das System die richtige Geräteklasse erhält. Um native MIDI-Kommunikation zu erhalten, muss das Gerät diese Klasse im Deskriptor haben und allen MIDI-Klassendefinitionen folgen .
quelle