Wo genau steht die USB-Spezifikation, die erklärt, was zu tun ist, wenn das Kabel zum ersten Mal angeschlossen wird?

15

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.

Robert Bristow-Johnson
quelle
1
Sie sind also nur neugierig, was der FTDI FT220x hinter den Kulissen macht, oder? Da FTDI einen Großteil des USB-Materials für Sie erledigt, sind Ihnen auch einige Grenzen gesetzt. Ich habe die FT2232H-Familie eine Weile benutzt und werde versuchen zu erklären, was ich weiß ...
MarkU
Letztendlich versuche ich, diesen USB-Anschluss zu verwenden, der bereits intelligent genug ist, um Text zum PC mit TeraTerm hin und her zu senden. Ich hatte gehofft, den gleichen USB-Anschluss für USB-MIDI zu verwenden. Ich muss verstehen, wie man die Daten in 32-Bit-Pakete "paketiert" , aber ich dachte (und denke immer noch), dass es ein Protokoll geben muss, das dem anderen Ende sagt, dass dies ein USB-MIDI-Gerät ist. (bis jetzt habe ich einfach keinen
griff auf die usb-

Antworten:

21

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:

  • Sitzungsschicht = Kapitel 10 USB-Host-Hardware und -Software (Gerätetreiber)
  • Transportschicht = Kapitel 9 USB Device Framework
  • Netzwerkschicht = Kapitel 8 Protokollschicht (Bitstream)
  • Datenverbindungsschicht = Kapitel 7 Elektrik (Schaltung)
  • Physikalische Schicht = Kapitel 6 Mechanisch (Kabel und Stecker)

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.

MarkU
quelle
6
Mir hat die Zusammenfassung gefallen. Ich musste DIE GESAMTE 2.0-Spezifikation (über 1000 Seiten, wie ich mich erinnere) über einen Zeitraum von mehreren Wochen lesen, weil ich all diesen Mist selbst herausfinden musste. Es war keine angenehme Erfahrung, muss ich sagen. (HID konnte in meinem Fall nicht verwendet werden.) Auch keine guten Bücher zu diesem Thema. Ich hasste Jan Axelsons USB-Buch und fand ihr Buch "fast völlig nutzlos" für jemanden, der versucht, diese Arbeit als eingebettetes Mikro von Grund auf zu machen. Es ist eigentlich meistens wertlos, ansonsten. Wenn Sie ein gutes Buch für einen Implementierer (kundenspezifische Hardware) kennen, würde ich mich über einen Titel freuen !! +1
Jonk
1
Abhängig vom potenziellen Markt von Op ist die VID / PID die größte Herausforderung. Die Verwendung der Axelsons-Methode funktioniert in dem Sinne, dass Sie ihre VID (die für Ihre eigene 3,5.000 USD kostet) verwenden und eine oder mehrere ihrer PIDs kostenlos anfordern können. Sie können PIDs auch von Organisationen wie Microchip / Atmel, FTDI und TI (basierend auf ihrer VID) anfordern. Das beste Buch von IMO ist Intels "USB Design by Example", es ist ein bisschen in die Jahre gekommen, aber gut für USB 2.x. Leider brechen viele der Codebeispiele aufgrund von Änderungen in Visual Studio durch seine Überarbeitungen.
Jack Creasey
1
Der beste Weg, um Zugang zu VID / PID für Bastler zu erhalten, ist die Verwendung von LUFA (kostenlos): fourwalledcubicle.com/files/LUFA/Doc/130303/html/… ..... diese können jedoch nicht in kommerziellen Produkten verwendet werden sind gut für den Heim- / Demo-Gebrauch geeignet, bei dem Sie Kollisionen weitgehend kontrollieren können.
Jack Creasey
1
PS. Eine gute Einführung ist die Verwendung des von FTDI veröffentlichten "Embedded USB-Designs als Beispiel": ftdichip.com/Support/Documents/TechnicalPublications/… ... das enthält viele nützliche Beispiele (natürlich basierend auf FTDI-Geräten) und alle zugehörigen Arbeitsdateien einschließlich der Verwendung von PSOC-Controllern
Jack Creasey
1
Beachten Sie, dass das USB-Gerät mit eigener Stromversorgung warten muss, bis die VBUS-Spannung erkannt wird, bevor der D + oder D- Pull-up-Widerstand angelegt wird. Ich habe diesbezüglich die Zertifizierung nicht bestanden.
Adam Haun
4

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 .

Ale..chenski
quelle