web-dev-qa-db-fra.com

Comment capturer une entrée HID brute sur linux?

Version courte de ce que je veux accomplir: j'ai une pédale (INFINITY-IN-USB-1, si cela présente un intérêt) implémentée en tant que périphérique HID générique, et j'aimerais qu'elle se comporte bien comme touches de contrôle et alt sur linux. Je cherche quelque chose au niveau de X, c’est-à-dire pas seulement des programmes individuels. 

Version plus longue: cette configuration fonctionne sous Windows XP en appelant dll RegisterRawInputDevices et GetRawInputData et en écoutant l'entrée dans une fenêtre masquée. Tout est accompli avec un script assez simple Autohotkey (pouvez poster ici si quelqu'un est intéressé). Le fait est qu'il n'y a pas besoin de pilote supplémentaire, etc. seules les dll Windows natives sont nécessaires. 

Je veux que cette configuration fonctionne sur linux (plus spécifiquement Gnome sous Ubuntu, mais j’utilise occasionnellement d’autres distro/gestionnaires de fenêtres, une solution au niveau de X est donc appréciée). Cette pédale ne s’enregistre pas elle-même en tant que clavier ni même manette de jeu, mais en tant que périphérique HID avec UsagePage 12, Utilisation 3. Je remarque que la dernière Ubuntu peut détecter et utiliser les touches favorites du clavier Microsoft Natural Keyboard, qui s’enregistrent également en tant que périphérique HID. *. J'utilise ces touches sous Windows en utilisant la même méthode que la pédale (c'est-à-dire sans le logiciel fourni). Je suppose donc que cette pédale peut également fonctionner sous Linux, mais la question est de savoir comment?

[Je suis nouveau dans le domaine de niveau inférieur de Linux, alors soyez généreux avec les liens d'introduction ou les didacticiels, le cas échéant.]

* Pour ceux qui ne sont pas au courant, le clavier Microsoft Natural Keyboard s'inscrit à la fois comme clavier classique et périphérique HID générique. Si aucune application (telle que l’application fournie) ne sait interpréter l’entrée HID, les touches ordinaires fonctionneront, mais les touches favorites et les touches de fonction spéciales sont inutiles. 


Pour clarifier, linux ne voit pas les pédales pressées en tant qu'entrée. Il reconnaît le périphérique USB, mais xev ne fournit aucune sortie pour les pédales à pédale. J'ai vu des rapports de personnes utilisant avec succès la pédale sous WINE pour le logiciel de transcription, mais cela doit fonctionner sous Windows et ne donne pas ce que je veux (qui fait que la pédale ressemble à un clavier pour toutes les applications Linux natives). Je me demande si un pilote de clavier Linux de bas niveau est nécessaire.


Voici quelques informations supplémentaires: Si je publie ceci dans le terminal

cat /dev/usb/hiddev0

(dev/usb/hiddev0 est ma pédale), je reçois des codes bruts correspondant à mes presses à pédale. C'est un début. Je sais ce que signifie ce code brut: en binaire, 0001, 0010, 0100 correspond à chaque pédale, respectivement, et une combinaison de pressions de pédale envoie une combinaison de ces nombres binaires, et des déclenchements de l’entrée de déclenchement de pédale de la pédale toujours enfoncée (si tous la pédale est levée, 0000 est envoyé).

Comment faire en sorte que X écoute dev/usb/hiddev0 et traduise les codes bruts en peut-être un code spécial permettant de les mapper avec xmodmap ou quelque chose d'autre?

30
polyglot

Vous voudrez uinput. Vous écouterez sur votre/dev/usb/hiddev0, puis créerez de nouveaux événements que vous enverrez le /dev/input/uinput.

Ceci explique cela et donne un petit tutoriel: Utilisation du pilote uinput sous Linux - 2.6.x pour envoyer les entrées utilisateur {Ceci est le numéro de la publication "Tableau de bord" de EInfochips de janvier 2007 "Le conseil du mois" article mentionné sur this page archivée}.

19
Adam Goode

Est-ce que le périphérique apparaît dans/dev/input? Si tel est le cas, utilisez le pilote X "evdev" pour le connecter comme vous le feriez pour un clavier ou une souris.

4

Même problème ici, mais avec des touches spéciales sur un clavier sans fil. Je ressens ta douleur.

Quoi qu'il en soit, en essayant d'obtenir que cela fonctionne, voici ma méthode:

  1. sleep 10; killall cat puis rapidement dans un autre terminal: cat /dev/usb/hiddevice0 > key1.usbdump et appuyez sur/utiliser le périphérique. Cela videra la sortie binaire du coffre-fort pour cette clé.
  2. J'ai rapidement piraté un script python pour lire les événements d'entrée et de déclenchement sur le périphérique vide. Jusqu'à présent, cela fonctionne pour la première fois, la touche est frappée. Ceci est similaire à ce que Adam a suggéré, mais je pense qu’il est plus difficile de programmer/utiliser bien que peut-être plus élégant, et le python est facilement disponible.

Donc, ceci est un travail en cours (ne fonctionne que pour la première fois pressé), mais peut-être que quelque chose comme ceci pourrait fonctionner pour vous:

sf1 = open("test.usbdump").read() # read the earlier usb dump from hiddevice
kb = open("/dev/usb/hiddev0")
while 1:
    # Prints true if the specific key has been read.
    print (kb.read(len(sf1)) == sf1)
    # Basically all that has to be done is if ^ is true, then fire off the event you want.

Si quelqu'un peut m'aider avec mon programme ou si je le fais mal, s'il vous plaît dites-le moi. ;)

Je me rends compte que certains en-têtes sont inclus dans le dump initial du hiddevice. En utilisant l’édition des hexagones et la différenciation des bits, vous pouvez trouver les valeurs qui sont importantes et les vérifier en python. (Par exemple, le chiffre hexadécimal "B0" signifie qu'une touche de fonction spéciale a été enfoncée sur mon clavier, puis que vous avez plus d'informations sur la touche sur laquelle vous avez appuyé, etc.)

Mon résultat final est le suivant: hiddevice0 semble bloquer et cesser de donner des données après un certain temps, je ne sais pas pourquoi, mais j'utilise plutôt/dev/input/event * (cela pourrait fonctionner pour vous aussi), et cela semble mieux fonctionner. Encore une fois, le même hexediting et la même analyse syntaxique mènent au succès. En cours de route, j'ai trouvé que Sudo cat /dev/input/event3 | hexdump est extrêmement utile pour déterminer quels octets sont importants pour vous.

Donc, si vous avez un clavier IBM Sk-8812 et souhaitez utiliser les touches spéciales, vous pouvez me parler pour obtenir le script que j'ai utilisé.

2
kapace

Vous devriez enquêter sur lircd. Il interprète les entrées des télécommandes. Certaines télécommandes prises en charge se présentent apparemment comme des périphériques cachés génériques. Vous pourrez donc peut-être faire communiquer votre périphérique à lircd.

2
joeforker

J'ai écrit comment mon Infinity IN-USB-1 (AKA "VEC USB Footpedal") a envoyé des keysyms arbitraires sous X sur mon blog:

Utilisez la pédale USB VEC/Infinity comme clavier sous Linux

(Cela devrait également fonctionner pour IN-USB-2 et peut-être pour d'autres modèles de contrôleurs au pied USB vendus par VEC et P.I. Engineering et leurs clones.)

Voici la version courte:

Obtenez X pour reconnaître la pédale

La pédale est un périphérique USB compatible HID et le noyau n'a aucun problème à le découvrir et à rendre ses événements accessibles à l'espace utilisateur via un nœud /dev/input/eventX. Pour voir que vous pouvez exécuter le programme evtest (sur Debian: Sudo apt install evtest). Donc, vous n'avez pas besoin d'aller au niveau HID pour utiliser les pédales.

Le problème est que udev ne le marque pas comme un clavier ou une souris, donc X l’ignore. Ce problème peut être résolu avec un fichier de règles udev d’une ligne (grâce à Parlatype développeur Gabor Karsay pour avoir fourni cette solution dans Parlatype Issue 28 ):

ACTION=="add|change", KERNEL=="event[0-9]*", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="00ff", ENV{ID_INPUT_KEYBOARD}="1"

Placez cette ligne dans un fichier appelé /etc/udev/rules.d/10-vec-usb-footpedal.rules. Pas besoin de redémarrer quoi que ce soit, udev devrait automatiquement détecter le fichier.

Désormais, lorsque vous débranchez et rebranchez la pédale USB, elle devrait être reconnue par X (et envoyer des événements de bouton de souris). Pour vérifier, exécutez xev.

Remappage de keysyms avec udev hwdb

Avoir une pédale qui envoie seulement des clics de souris n’est probablement pas ce que vous voulez. Les codes de clé envoyés par les commutateurs de pédale peuvent être remappés avec un fichier udev hwdb.

Créez un fichier sous /etc/udev/hwdb.d/ (j'ai mis le mien dans /etc/udev/hwdb.d/60-usb-footpedal.hwdb) contenant ces lignes: /Etc/udev/hwdb.d/60-usb-footpedal.hwdb

evdev:input:b*v05F3p00FF*
 KEYBOARD_KEY_90001=f14
 KEYBOARD_KEY_90002=f15
 KEYBOARD_KEY_90003=f16

Cette fois, nous devons informer le système pour mettre à jour le fichier binaire hwdb:

$ Sudo systemd-hwdb update

Et puis débranchez et repugez le périphérique.

La première ligne du fichier hwdb correspond à notre périphérique (fournisseur 05F3, produit 00FF), et les lignes suivantes mappent un scancode (hex) en un code clé. J'ai choisi les touches de fonction F14, F15 et F16, mais une liste des codes de clé disponibles est définie dans /usr/include/linux/input-event-codes.h ; pour utiliser les noms # définis dans ce fichier en tant que codes clés hwdb, convertissez-les simplement en minuscules et supprimez le préfixe key_.

La disposition de clavier xkb par défaut (pc + us) sur mon ordinateur mappe F14, F15 et F16 en XF86Launch5, XF86Launch6 et XF86Launch7, respectivement. Si vous ouvrez maintenant xev et appuyez sur les pédales, vous devriez voir ces keysyms émises. À l'aide de ces claviers, chaque commutateur de pédale peut être associé à une touche de raccourci dans votre bureau ou votre gestionnaire de fenêtres.

Vous pouvez également remapper le XF86* keysyms sur d'autres clés en utilisant quelque chose comme xmodmap. Pour plus de détails, y compris la possibilité de mapper les clés dans vim, plus de liens vers la documentation, des indicateurs permettant de lire le périphérique HID directement si vous le souhaitez, et une solution pour Mac OS X, voir mon weblog post

Footcontroller

Une dernière chose que je mentionnerai est un programme python appelé footcontroller qui lit les événements du périphérique evdev (/ dev/input/eventX) et peut être configuré pour émettre des frappes de touche (via xdotool) ou exécuter des scripts en réponse à stepping sur les pédales. Il peut être utilisé à la place de xmodmap pour que votre pédale envoie le trait de votre choix.

1
cristoper

J'utilise pour ma reliure/raccourcis une combinaison de compiz, easystroke et xmacro.

Pour vos besoins, je pense que la pièce manquante est xbindkeys. J'ai trouvé ce lien pour vous qui peut peut-être vous aider à le configurer:

http://linux-trackball.dreamhosters.com/

Je me demande quand même s'il existe un moyen de distinguer plusieurs souris.

0
bitozoid