USB-Geräte sind weitaus komplexer als nur Pipes, die Sie lesen und schreiben. Sie müssen Code schreiben, um sie zu manipulieren. Sie müssen keinen Kerneltreiber schreiben. Siehe http://libusb.info (geb. libusb.org) und http://libusb.sourceforge.net/api-1.0 . Dies soll mit Linux, OSX, Windows, Android, OpenBSD usw. funktionieren. Unter Mac OS X gibt es Funktionen auf Benutzerebene im E / A-Kit , mit denen Sie auf USB zugreifen können. Unter Windows können Sie möglicherweise WinUSB verwenden, dies ist jedoch kompliziert.
Hier ist ein kleines Diagramm, das ich einmal gezeichnet habe, um die Architektur von USB zu verstehen:
╭──────────────────────────────────────╮
┌──────┐ │ device ┌─────┐ ┌───────────┐ │
│ Port ├──┐ │ ┌─┤ EP0 ├──┤ control │ │
└──────┘ │ │ ┌────────┐ │ └─────┘ │┌─────────┐│ │
├────┤addr = 2├─┤ ┌─────┐ ││ ││ │
│ │ └────────┘ ├─┤ EP1 ├──┼┤interface││ │
│ │ │ └─────┘ ││ #0 ││ │
│ │ │ ┌─────┐ │├─────────┤│ │
│ │ ├─┤ EP2 ├──┼┤ ││ │
│ │ │ └─────┘ ││interface││ │
│ │ │ ┌─────┐ ││ #1 ││ │
│ │ └─┤ EP3 ├──┼┤ ││ │
│ │ └─────┘ │└─────────┘│ │
│ │ └───────────┘ │
│ ╰──────────────────────────────────────╯
│
│
:
Zusammenfassung: Jedes Gerät hat eine Adresse (vom O / S zugewiesen und Änderungen vorbehalten) und bis zu (glaube ich) 32 Endpunkte.
Innerhalb des Geräts befinden sich eine oder mehrere "Schnittstellen". Beispielsweise kann eine Webkamera eine "Kamera" -Schnittstelle und eine "Mikrofon" -Schnittstelle bereitstellen. Ein Multifunktionsdrucker würde mehrere Schnittstellen bereitstellen.
Endpunkt 0 wird zur Steuerung und Konfiguration des Geräts verwendet, und die anderen dienen zum Zugriff auf die verschiedenen Schnittstellen. Jede Schnittstelle hat null oder mehr (normalerweise mehr) Endpunkte.
Endpunkte können eine von mehreren Übertragungsarten sein:
- Steuerübertragungen werden zum Abfragen und Konfigurieren des Geräts verwendet. Jedes Gerät muss einen Mindestsatz von Steueranweisungen unterstützen. Ich glaube, dass Kontrollübertragungen nur mit Endpunkt 0 verwendet werden.
- Massenübertragungen senden oder empfangen Daten mit voller Bandbreite
- Interrupt-Übertragungen (Ich bin mir nicht sicher, wie sich dies von Massenübertragungen unterscheidet; USB hat keine Interrupts). Beispiele sind Tastatur und Maus
- Isochrone Übertragungen senden oder empfangen Daten mit voller Bandbreite mit Echtzeitanforderungen, jedoch ohne Zuverlässigkeit. Wird für Audio- / Videoanwendungen verwendet.
Ebenfalls erwähnenswert: Ein USB-Gerät kann mehrere Konfigurationen haben, die steuern, welche Schnittstellen verfügbar sind und so weiter. Das Ändern einer Gerätekonfiguration ist fast so, als würde man das Gerät ausstecken und an seiner Stelle ein anderes Gerät einstecken.
Alle diese Informationen sind in Gerätedeskriptoren, Konfigurationsdeskriptoren, Schnittstellendeskriptoren, Endpunktdeskriptoren usw. enthalten, die über Endpunkt Null abgefragt werden können.
(Intern sind Daten kein Bytestrom, sondern werden in Pakete gepackt, deren genaue Formate Teil der USB-Spezifikation sind. Zum größten Teil müssen Sie sich darüber keine Gedanken machen, da die Controller und Treiber diesen Teil verwalten Du.)
In der Praxis müssen Sie abhängig von Ihrer API-Bibliothek und Ihrem Betriebssystem das Gerät erkennen, die verschiedenen Deskriptoren lesen, um herauszufinden, womit Sie es zu tun haben, optional die Konfiguration festlegen (sofern das Betriebssystem dies zulässt), die Schnittstelle öffnen, und öffnen Sie die Endpunkte.
Für Massenendpunkte können Sie Rohdaten lesen und schreiben. Für Steuerübertragungen stellt die API-Bibliothek Funktionsaufrufe bereit. Ich habe noch nie Interrupt- oder isochrone Übertragungen verwendet. Ich bin sicher, dass Ihre API-Bibliothek die entsprechende Dokumentation enthält.
Weitere Informationen: "Funktion" ist eine Sammlung von Schnittstellen, die zusammenarbeiten. Es ist ursprünglich nicht Teil der USB-Spezifikation, und es liegt am Gerätetreiber, zu wissen, welche Schnittstellen zusammengefasst werden sollen. Die USB-Arbeitsgruppe hat Geräteklassen definiert, die Funktionen unterstützen. Dies erfolgt über den Interface Association Descriptor (IAD).
echo "test" > /dev/bus/usb/003/013
stattdessen versuchenprintf
? Auch dies könnte eine weitere Frage, die helfen könnten.