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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.