www.mikrocontroller.net

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


Autor: Miikku Miitto (miikku)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Miikku Miitto (miikku)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Edding (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.