/ dev / input - Qu'est-ce que c'est exactement?

12

J'étais curieux de savoir comment le matériel interagissait avec le système d'exploitation et je suis tombé sur ce message: Comment fonctionnent les entrées de clavier et les sorties de texte?

Il semble que beaucoup de magie se produise dans le répertoire / dev / input. J'ai décidé de jeter un œil à mon propre système d'exploitation (Ubuntu 16.10) pour voir ce que je pouvais découvrir. Tous ces fichiers sont répertoriés comme 0 octet, et quand je le fais, sudo cat mouse0 | hexdump -Cj'obtiens une tonne de données hexadécimales qui ressemble à ceci:

00000000  b3 82 8a 58 00 00 00 00  53 74 09 00 00 00 00 00  |...X....St......|
00000010  01 00 1c 00 00 00 00 00  b3 82 8a 58 00 00 00 00  |...........X....|
00000020  53 74 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |St..............|
00000030  b6 82 8a 58 00 00 00 00  06 56 0e 00 00 00 00 00  |...X.....V......|
00000040  01 00 10 00 01 00 00 00  b6 82 8a 58 00 00 00 00  |...........X....|
00000050  06 56 0e 00 00 00 00 00  00 00 00 00 00 00 00 00  |.V..............|

J'ai donc quelques questions:

  1. Quel est le but de ce fichier? Il me semble que ces fichiers de périphériques ne sont utilisés que comme intermédiaires pour transférer le scancode du noyau vers le serveur X. Pourquoi ne pas simplement l'envoyer directement du noyau au serveur X?

  2. Pourquoi il y en a tant? J'ai un peu plus de 20 fichiers d'événements individuels, mais seulement un clavier et une souris.

Astrum
la source

Réponses:

17

Je vais passer à la question dans l'ordre inverse:

  1. Pourquoi y en a-t-il autant?

Ce sont des appareils qui représentent la plupart des entrées présentes sur une machine (il y en a d'autres, un microphone par exemple ne sera pas géré /dev/input). Contrairement à l'hypothèse selon laquelle un clavier et une souris donneraient 2 appareils, même le clavier et la souris les plus simples en donneraient encore 6.

Pourquoi 6? Parce que Xorg créera un clavier d'entrée de test et une souris d'entrée de test (toutes deux virtuelles) lors de son démarrage. En outre, il agrégera le clavier de test avec le clavier réel dans un appareil virtuel principal. c'est-à-dire qu'il effectuera le multiplexage de l'entrée. La même chose se produira pour le test et la souris réelle.

De plus, un ordinateur typique (ordinateur de bureau ou ordinateur portable) possède d'autres boutons que le clavier: bouton d'alimentation, bouton de veille.

Les eventNappareils qui s'y trouvent sont des appareils pour les choses que Xorg crée et pour ce que l'ordinateur a. Le Nprovient d'ID séquentiels et est analogue aux ID de xinput. Par exemple sur ma machine j'ai:

[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root     100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root     140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1

Et xinputme donne des identifiants analogues:

[~]$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
    ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

(Regardez qui eventNcorrespond à id=N)

Sans Xorg

1.1 À quoi sert ce fichier?

Notez que toutes les entrées aléatoires (y compris ma caméra USB!) Sont vues par Xorg comme faisant partie du clavier virtuel. Cela permet le multiplexage et le démultiplexage des entrées. Par exemple, je peux déplacer ma souris via ma souris USB ou via mon trackpad et une application n'a pas besoin de connaître la différence.

(Le fait que la caméra USB fasse partie du clavier virtuel est dû au fait qu'elle a un bouton pour l'activer et le désactiver. Et comme il s'agit d'un bouton, il fait partie du sous-système du clavier. L'entrée vidéo réelle est gérée /sys/class/video4linux. )

En d'autres termes, pour une application, il n'y a vraiment qu'un seul clavier et une seule souris. Mais Xorg et le noyau doivent tous les deux connaître les différences. Et cela conduit à la dernière partie:

1.2 Pourquoi ne pas simplement l'envoyer directement du noyau au serveur X?

Parce que Xorg a besoin de connaître la différence.

Et il y a des situations où cela est utile. Vous pouvez remapper les clés de Xorg sur chaque périphérique d'entrée esclave différemment. Par exemple, j'ai un jeu de jeu avec pédales, lorsqu'il est utilisé dans un jeu de course qu'il produit a, bet cpour chacune de ses pédales. Pourtant, lors de la programmation, je remappe ces touches vers Esc, Ctrlet Altsans remapper les touches du clavier lui-même.

De plus, il n'est pas nécessaire qu'une machine exécute Xorg. Par exemple, sur un serveur sans tête, je peux obtenir la sortie suivante:

[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root      80 Nov  8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov  8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov  8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov  8 02:36 event2

Lorsque les périphériques d'entrée correspondent aux ports série (notamment dans ce cas, ils le font) au lieu du clavier ou de la souris.

grochmal
la source
3
La prise en charge de la caméra elle-même (comme dans, récupération de vidéo) ne passe pas par le sous-système d'entrée, mais par V4L2. Les caméras sont des périphériques d'entrée de clavier car elles ont parfois des boutons, et ceux-ci agissent comme des touches ...
Stephen Kitt
@StephenKitt - Wow, oui. Je ne me suis jamais mêlé du sous-système de la caméra mais maintenant je peux voir / sys / class / video4linux. Il y a là quelques interfaces intéressantes. Merci pour l'info! (J'ai mis à jour la réponse et supprimé la partie trompeuse).
grochmal
Xorg ne crée pas de fichiers de périphérique: ce n'est pas un pilote. Il les ouvre à la place et effectue les E / S à travers eux. Cela devient vraiment évident lorsque vous démarrez la machine sans X du tout et voyez toujours ces périphériques (et pouvez par exemple exécuter gpm).
Ruslan
@Ruslan pourquoi aurais-je besoin d'un pilote pour créer des fichiers de périphérique? Je peux créer un périphérique bloc en utilisant un montage en boucle par exemple. Les appareils seraient toujours là sans X, mais les fichiers des appareils réels (sur les noyaux modernes) ne le seront pas. X utilisera bien udev mais les règles udev pour une souris par exemple ne seront pas exécutées si vous
démarrez
Je viens d'exécuter Ubuntu 18.04 Live sans lancer X du tout. Je peux toujours voir ces fichiers. Encore une fois: la souris peut fonctionner sans X, voir par exemple le gpmdémon, ou GTK2 sur framebuffer.
Ruslan
2

Il n'y a rien de tel que «l'envoyer directement». Les applications doivent avoir une méthode de lecture des données, et sous Unix, cela se fait de la même manière qu'elles lisent les fichiers normaux en créant un nœud de périphérique qui fonctionne avec les appels système d'E / S de fichiers normaux pour permettre aux applications de les ouvrir et de les lire.

Il existe d'autres sources d'entrée en plus de la souris et du clavier. Vous pouvez découvrir ce que chacun est en regardant /sys/class/input. Là, vous affinez les fichiers avec les mêmes noms inputNN qui sont des liens symboliques vers un autre nœud dans les sysfs qui décrivent le périphérique qu'ils représentent. D'autres sources courantes incluent les cartes son (qui signalent lorsque les choses sont branchées et débranchées) et le bouton d'alimentation physique de l'ordinateur.

psusi
la source