Comment capturer les données brutes HID sur linux?

version Courte de ce que je veux accomplir: j'ai une pédale (INFINITY-IN-USB-1, si cela vous intéresse) qui est implémentée en tant que périphérique HID générique, et je voudrais qu'elle se comporte comme des touches de contrôle et alt sur linux. Je cherche quelque chose au niveau X, c'est-à-dire pas seulement des programmes individuels.

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

je veux que cette configuration fonctionne sous linux (plus précisément Gnome sous Ubuntu, mais j'utilise occasionnellement d'autres distro/window manager, donc la solution au niveau de X est appréciée). Cette pédale ne s'enregistre pas comme clavier ou même joystick, mais comme un dispositif caché avec UsagePage 12, utilisation 3. Je remarque que le dernier Ubuntu peut détecter et utiliser les touches préférées sur le clavier naturel de Microsoft, qui s'enregistrent également comme HID device*. Je fais usage de ces touches sur Windows en utilisant la même méthode que j'utilise la pédale (i.e. sans le logiciel empaqueté). Donc je suppose que cette pédale chose peut fonctionner sur linux, mais la question est comment?

[je suis nouveau au niveau inférieur sur Linux, donc s'il vous plaît être généreux avec des liens à l'introduction ou tutoriel le cas échéant.]

* pour ceux qui ne sont pas au courant, le clavier naturel de Microsoft s'enregistre à la fois comme un clavier ordinaire et comme un appareil HID Générique. Sans une certaine application (telle que l'application groupée) savoir comment interpréter l'entrée HID, les clés régulières fonctionneront mais les clés préférées et les clés de fonction spéciales sont inutiles.


pour clarifier, linux ne voit pas la pédale presses de l'entrée. Il reconnaît le périphérique USB, mais xev ne donne aucune sortie pour les presses à pédales. 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 de manière Windows et ne donne pas ce que je veux (ce 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-il nécessaire?


voici plus d'informations: si je le publie dans le terminal

cat /dev/usb/hiddev0

(dev/usb/hiddev0 est ma pédale), je reçois des codes bruts correspondant à mes pédales. C'est un début. Je sais ce que signifie ce code brut: en binaire, 0001, 0010, 0100 correspond à chaque pédale, respectivement, et la combinaison des presses de pédale envoie la combinaison de ces nombres binaires, et les sorties de l'entrée de déclenchement de pédale de quelque pédale encore être pressé (si toute pédale est en place, 0000 est envoyé).

Comment puis-je obtenir X pour écouter dev/usb/hiddev0 et traduire les codes bruts dans Peut-être un keycode spécial pour que je puisse les cartographier avec xmodmap ou quelque chose?

27
demandé sur Adam Goode 2009-05-17 09:46:20

6 réponses

. Vous allez écouter sur votre / dev / usb / hiddev0 et ensuite créer de nouveaux événements que vous enverrez sur /dev/input/uinput.

ceci explique cela et donne un petit tutoriel: Utilisation du pilote uinput dans Linux-2.6.x pour envoyer la saisie de l'utilisateur { C'est le EInfochips' "tableau de bord" publication janvier 2007 "l'Astuce du Mois" de l'article mentionné sur page archivée}.

17
répondu Adam Goode 2017-01-14 07:42:15

le périphérique apparaît-il dans /dev/input? si c'est le cas, utilisez le pilote "evdev" X pour l'accrocher comme vous le feriez pour un clavier ou une souris.

3
répondu Alexey Feldgendler 2009-11-06 00:52:06

vous devriez enquêter sur lircd. Il interprète les entrées des télécommandes. Certains remotes pris en charge se présentent apparemment comme des périphériques génériques hid, de sorte que vous pouvez être en mesure d'obtenir votre appareil pour parler à lircd.

2
répondu joeforker 2009-05-29 14:17:58

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

de toute façon, 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/d'utiliser l'appareil. Cela dumpera la sortie binaire de hiddevice pour cette clé.
  2. j'ai rapidement hacké un script python pour lire les entrées hiddevice et les événements fire. Jusqu'à présent, il travaille pour la première fois que la touche est frappée. Ceci est similaire à ce Qu'Adam a suggéré, mais je pense qu'uinput est plus difficile à programmer / utiliser bien que peut-être plus élégant, et python est facilement disponible.

c'est Donc un travail en cours (ne fonctionne que pour la première fois pressé), mais peut-être quelque chose comme cela 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 fais fausse route, s'il vous plaît dites-moi. ;)

je me rends compte qu'il y a des en-têtes qui sont inclus dans la décharge initiale de la hiddevice. En utilisant certains édition de bless hex et de bit differencing, vous pourriez trouver quelles valeurs sont importantes et faire une vérification pour elles en python. (Par exemple, le chiffre hex "B0" signifie qu'une touche de fonction spéciale a été pressée sur mon clavier, et plus tard il y a plus d'informations sur la touche qui a été pressée, etc.)

mon résultat final est le suivant: hiddevice0 semble être suspendu et arrêter de donner des données après un certain temps, pas sûr de savoir pourquoi, mais à la place, j'utilise /dev / input / event* (cela pourrait fonctionner pour vous aussi,) et que semble mieux fonctionner. Encore une fois, même hexediting et faible niveau parsing conduit à la réussite. Le long du chemin, j'ai trouvé que sudo cat /dev/input/event3 | hexdump est extrêmement utile pour déterminer les octets sont importants pour vous.

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

2
répondu kapace 2010-12-03 02:14:09

j'utilise pour ma reliure/mon raccourci 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 que peut-être vous aide à définir ceci:

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

je me demande de toute façon s'il y a un moyen de distinguer entre plusieurs appareils de la souris.

0
répondu bitozoid 2009-05-17 12:26:24

j'ai écrit sur comment j'ai obtenu mon Infinity in-USB-1 (alias "VEC USB Footpedal") pour envoyer des clés arbitraires sous X sur mon weblog:

utilisez VEC / Infinity USB Foot Pedal comme un clavier sous Linux

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

Voici la version courte:

demandez à X de reconnaître la pédale

le pedal est un périphérique USB compatible HID et le noyau n'a aucun problème à le découvrir et à rendre ses évènements disponibles à l'espace utilisateur via un /dev/input/eventX nœud. Pour voir ce que vous pouvez exécuter l' evtest programme (sur Debian: sudo apt install evtest). Si vous n'avez pas besoin pour 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. Ceci peut être corrigé avec un fichier de règles udev d'une ligne (merci à Parlatype développeur Gabor Karsay pour avoir fourni cette solution en Parlatype Question 28):

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

Mettre 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.

Maintenant, lorsque vous débranchez et rallumez la pédale USB, elle doit être reconnue par X (et envoyer les évènements du bouton de la souris). Pour vérifier, lancez la commande xev.

Remapping keys with udev hwdb

avoir une pédale qui n'envoie que des clics de souris est probablement pas ce que vous voulez. Ces codes-clés envoyés par les commutateurs de pédales peuvent être remappés avec un fichier udev hwdb.

Créer 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-pédale.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 de mettre à jour le fichier hwdb binaire:

$ sudo systemd-hwdb update

puis débranchez et repoussez l'appareil.

la première ligne du fichier hwdb correspond à notre périphérique (vendeur 05F3, <à l'!--11-->), et les lignes suivantes mappent un scancode (hex) vers un keycode. J'ai choisi les touches de fonction F14, F15 et F16, mais une liste de codes disponibles est définie dans /usr/include/linux/entrée-événement-codes.h; pour utiliser les noms #définis dans ce fichier comme des keycodes hwdb, convertissez-les simplement en minuscules et supprimez le key_ préfixe.

La valeur par défaut (pc+us) xkb disposition de clavier sur mon ordinateur cartes F14,F15 et F16XF86Launch5, XF86Launch6 et XF86Launch7 Keys, respectively. Si vous ouvrez xev maintenant et appuyez sur les pédales, vous devriez voir ces clés émises. En utilisant ces clés, chaque commutateur de pédale peut être mappé comme un hotkey dans votre bureau ou gestionnaire de fenêtres.

vous pouvez également remap le XF86* keysyms à d'autres touches en utilisant quelque chose comme xmodmap. Pour plus de détails, y compris obtenir les clés pour être mappable dans vim, plus de liens vers la documentation, des pointeurs vers la lecture du périphérique HID directement si vous voulez, et une solution pour Mac OS X, voir mon weblog

Footcontroller

une dernière chose que je mentionnerai est un programme python appelé footcontroller qui lit les événements depuis le périphérique evdev (/dev/input / eventX) et peut être configuré pour émettre des touches (via xdotool) ou exécuter des scripts en réponse à un pas sur les pédales. Il peut être utilisé à la place de xmodmap pour obtenir votre pédale pour envoyer n'importe quelle touche de touche que vous voulez.

0
répondu cristoper 2018-08-28 02:59:53