Forum: PC-Programmierung IO-Ports für USB-Gerät?


von Miikku M. (miikku)


Lesenswert?

Hi!

Dass das auch mit entsprechenden Bibliotheken geht ist mir schon bewusst 
(und ich hab es auch schon mit der Libusb versucht), aber es hat auch 
seinen Reiz, auf etwas niedrigerer Ebene zu versuchen, ein USB-Gerät zu 
kontaktieren.

Es geht mir jetzt im Allgemeinen darum, ob es möglich ist, ein USB-Gerät 
durch das auslesen und einsetzen von Bytes in Ports zu kontrollieren. 
Dazu wäre dann die Hauptfrage, welche Port-Gruppen denn für USB gedacht 
sind oder wie das sonst funktioniert.

Was ich mir momentan als Ziel gesetzt habe ist, einen Knopf meines 
USB-Headsets einzulesen (also zu prüfen, ob er gedrückt ist), weil Linux 
leider meine Kopfhörer nicht unterstützt und es keinen passenden Treiber 
gibt. Aber selbst wenn es den gäbe, es geht mir eigentlich weniger darum 
das Ziel zu erreichen, als zu Wissen, wie es funktioniert.

Momentan bin ich so weit, dass ich per "inb()" bzw. "outb()" aus der 
"sys/io.h", alle IO-Ports setzen und lesen kann, von 0x000 bis 0x3FF. 
Nur weiß ich eben nicht welche. Ich hab mir das jetzt so vorgestellt, 
dass ich einfach dann beobachte, was sich da bei den entsprechenden 
Ports tut, wenn ich den Knopf drücke und umgekehrt, was das Gerät tut, 
wenn ich die Ports wie setze.

Achja, meine Daten:
OS: Linux (Ubuntu 10.4), Sprache: C/C++ (GCC)

Freue mich auf Antworten,
mit freundlichen Grüßen,
Miikku

von Rolf M. (rmagnus)


Lesenswert?

Miikku Miitto schrieb:
> Hi!
>
> Dass das auch mit entsprechenden Bibliotheken geht ist mir schon bewusst
> (und ich hab es auch schon mit der Libusb versucht), aber es hat auch
> seinen Reiz, auf etwas niedrigerer Ebene zu versuchen, ein USB-Gerät zu
> kontaktieren.

Noch niedriger? Du möchtest also nicht nur den Treiber für das USB-Gerät 
selber schreiben, sondern auch den für den USB-Controller.

> Es geht mir jetzt im Allgemeinen darum, ob es möglich ist, ein USB-Gerät
> durch das auslesen und einsetzen von Bytes in Ports zu kontrollieren.
> Dazu wäre dann die Hauptfrage, welche Port-Gruppen denn für USB gedacht
> sind oder wie das sonst funktioniert.

Du wirst einen USB-Stack programmieren müssen.

> Was ich mir momentan als Ziel gesetzt habe ist, einen Knopf meines
> USB-Headsets einzulesen (also zu prüfen, ob er gedrückt ist), weil Linux
> leider meine Kopfhörer nicht unterstützt und es keinen passenden Treiber
> gibt. Aber selbst wenn es den gäbe, es geht mir eigentlich weniger darum
> das Ziel zu erreichen, als zu Wissen, wie es funktioniert.

Dann wird aber dieser eine Knopf das einzige USB-Gerät sein, das noch 
geht, da du den Controller blockierst und das System daher keinen 
Zugriff mehr auf USB-Geräte hat.

> Momentan bin ich so weit, dass ich per "inb()" bzw. "outb()" aus der
> "sys/io.h", alle IO-Ports setzen und lesen kann, von 0x000 bis 0x3FF.
> Nur weiß ich eben nicht welche. Ich hab mir das jetzt so vorgestellt,
> dass ich einfach dann beobachte, was sich da bei den entsprechenden
> Ports tut, wenn ich den Knopf drücke und umgekehrt, was das Gerät tut,
> wenn ich die Ports wie setze.

Da wird ja nicht einfach irgend ein Wert in einem Port geändert, wenn du 
den Knopf drückst. Das wäre ungefähr so, als ob du mal per ftp eine 
Datei an deinen Rechner schickst und dann mal suchst, an welchem 
I/O-Port deiner Netzwerkkarte die Datei wieder rauskommt.

von Miikku M. (miikku)


Lesenswert?

Erstmal danke für die Antwort! :)

> Noch niedriger? Du möchtest also nicht nur den Treiber für das USB-Gerät selber
> schreiben, sondern auch den für den USB-Controller.

Naja ich hab halt im Netz bisher noch keine näheren Erläuterungen zum 
Thema USB und IO-Ports gefunden, deshalb frage ich ja nach den 
Zusammenhängen. Mir war nicht klar, dass das so weit voneinander 
entfernt ist. Aber jetzt hast Du mich neugierig gemacht, was macht denn 
der USB-Controller? Könntest Du mir ein paar Googlebare Stichwörter zum 
Thema geben? Wäre sehr nett.

> Du wirst einen USB-Stack programmieren müssen.

Was ist das?

> Dann wird aber dieser eine Knopf das einzige USB-Gerät sein, das noch
> geht, da du den Controller blockierst und das System daher keinen
> Zugriff mehr auf USB-Geräte hat.

Das wäre natürlich nicht mein Ziel :/
Also muss ich doch wieder auf LIBUSB zurückgreifen?

> Da wird ja nicht einfach irgend ein Wert in einem Port geändert, wenn du
> den Knopf drückst. Das wäre ungefähr so, als ob du mal per ftp eine
> Datei an deinen Rechner schickst und dann mal suchst, an welchem
> I/O-Port deiner Netzwerkkarte die Datei wieder rauskommt.

Uiui... Okay also dann kann ich das definitiv so nicht machen. (Ich hab 
es auch schon ausprobiert. Leider ändern sich - wenn ich im 
2-Sekunden-Takt prüfe - immer ungefähr 8 Ports und alle völlig 
zusammenhangslos (aus meiner Sicht), daran ändert sich nix, wenn ich den 
Knopf drücke....)

Okay... Also leg ich mich jetzt wieder mit Libusb an, oder kennt jemand 
zufällig eine andere ähnlich gute oder gar bessere Lib?

Danke nochmal.
Mit freundlichen Grüßen,
Miikku

von Christian R. (supachris)


Lesenswert?

Also die LibUSB Ist schon der richtige Ansatz, vor allem unter Linux. 
Klar ändern sich da immer Ports, wenn man nicht weiß, was man sucht, ist 
Re-Engineering ziemlich aufwendig. Mit den IO-Ports das wird nix, da 
kannst du höchstens den USB Host Controller ansprechen, also 
beispielsweise den in der Southbridge verbauten PCI-Host Controller. Das 
bringt dich aber nicht weiter, denn du musst schon recht weit oben im 
USB Stack sein, um solche Sachen wie Tastendruck zu erforschen. Die 
LibUSB erlaubt die Zugriff auf sämtliche Funktionen, die das USB Gerät 
bietet. Allerdings musst du selbst herausfinden, was da was ist.

von Edding (Gast)


Lesenswert?

libusb allein wird nicht helfen, da sich der Headset-Knopf vermutlich 
als HID anmeldet, und deswegen gleich vom HID-Kernel-Treiber 
weggeschnappt wird. (=> Blacklist)

So würde ich vorgehen:

Zuerst: mit lsusb (-v) den exakten Device-Descriptor auslesen, und 
anschauen. Was für Geräte melden sich an? Vermutung: USB-Audio-Class und 
HID-Keyboard.

Dann: Schauen, ob der HID-Teil evtl schon als Event-device angelegt 
wird, und auch so angesprochen werden kann => kein libusb nötig.

Oder: Ob der Keyboard-Teil auch als Keyboard angemeldet wird, und 
(SendCoreEvents "true"), auch schon Tastendrücke an X11 schickt. Dann 
fehlt dem X11 nur das richtige Keyboard-Layout/Map-File/Rule-Set um die 
Taste auch zu verarbeiten.
(ggfs "xev" starten, Headset-Taste drücken. Kommt was an?)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.