Ich versuche, Rohdaten auf ein an meinen Computer angeschlossenes USB-Gerät zu schreiben. Ich verwende Kali Linux und habe den richtigen Dateipfad gefunden: "/ dev / usb / 003/013". Wenn ich jedoch versuche, Daten darauf zu schreiben, wird eine Fehlermeldung angezeigt.
root@kali:~/usb# printf "test" > /dev/bus/usb/003/013
bash: printf: write error: Invalid argument
Ich habe auch versucht, Katze zu verwenden:
root@kali:~/usb# cat test > /dev/bus/usb/003/013
cat: write error: Invalid argument
Im vorherigen Fall ist die Datei 'test' vorhanden und enthält Daten. Es scheint, dass das System nicht in den Dateideskriptor schreiben kann, obwohl es dort ist.
Nach Recherchen bin ich zu dem Schluss gekommen, dass Sie entweder:
A. Benötigen Sie einen USB-Treiber, der mit dem Gerät verbunden werden kann.
B. Verwenden Sie einen SCSI-Durchgang, um Daten direkt auf die Endpunkte des Geräts zu schreiben.
Ich bin neu in der USB-Programmierung und obwohl ich ein Spiel zum Ausprobieren bin, habe ich noch nie einen Treiber geschrieben. Jeder Rat oder jede Hilfe wäre dankbar.
Ist es möglich, Rohdaten wie ursprünglich versucht auf das Gerät zu schreiben? Wenn nicht, können Sie mir einige Optionen erläutern, die mir zur Verfügung stehen?
quelle
echo "test" > /dev/bus/usb/003/013
stattdessen versuchenprintf
? Auch dies könnte eine weitere Frage, die helfen könnten.Antworten:
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:
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:
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).
quelle