/ dev / input - O que exatamente é isso?

8

Eu estava curioso sobre como o hardware interagia com o sistema operacional e me deparei com este post: Como funciona a entrada de teclado e a saída de texto?

Parece que muita mágica acontece no diretório / dev / input. Eu decidi dar uma olhada no meu próprio sistema operacional (Ubuntu 16.10) para ver o que eu poderia descobrir. Todos esses arquivos estão listados como 0 bytes, e quando eu faço sudo cat mouse0 | hexdump -C eu recebo uma tonelada de hexdata que se parece com isso:

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

Então, tenho algumas perguntas:

  1. Qual é o objetivo deste arquivo? Parece-me que esses arquivos de dispositivos são usados apenas como intermediários para transferir o scancode do kernel para o servidor X. Por que não apenas enviá-lo diretamente do kernel para o servidor X?

  2. Por que existem tantos? Eu tenho um pouco mais de 20 arquivos de eventos individuais, mas apenas um teclado e mouse.

por Astrum 27.01.2017 / 00:40

2 respostas

11

Eu vou com a pergunta na ordem inversa:

  1. Why are there so many?

Esses são dispositivos que representam a maioria das entradas presentes em uma máquina (há outras, um microfone, por exemplo, não será gerenciado em /dev/input ). Ao contrário do pressuposto de que um teclado mais um mouse daria 2 dispositivos, até mesmo o teclado mais simples e o mouse mais simples ainda forneceriam 6 deles.

Por que 6? Porque o Xorg criará um teclado de entrada de teste e um mouse de entrada de teste (ambos virtuais) durante sua inicialização. Além disso, ele agrega o teclado de teste com o teclado real em um dispositivo virtual principal. isto é, irá executar o muxing da entrada. O mesmo acontecerá com o mouse test e real.

Além disso, um computador típico (desktop ou laptop) tem outros botões além do teclado: botão de energia, botão de suspensão.

Os dispositivos eventN são dispositivos para as coisas que o Xorg cria e para o que o computador possui. O N vem de IDs sequenciais e é análogo aos IDs em xinput . Por exemplo, na minha máquina eu tenho:

[~]# 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

E xinput me dá IDs análogas:

[~]$ 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)]

(Veja que eventN corresponde a id=N )

Sem o Xorg

1.1 What is the purpose of this file?

Note que todas as entradas aleatórias (incluindo minha câmera USB!) são vistas pelo Xorg como parte do teclado virtual. Isso permite a entrada de muxing e demuxing. Por exemplo, posso mover meu mouse pelo mouse USB ou pelo trackpad e um aplicativo não precisa saber a diferença.

(O fato de a câmera USB fazer parte do teclado virtual é porque ela tem um botão para ligar e desligar. E como ela é um botão, ela se torna parte do subsistema do teclado. A entrada de vídeo real é manipulado em /sys/class/video4linux .)

Em outras palavras, para um aplicativo, existe apenas um teclado e apenas um mouse. Mas tanto o Xorg quanto o kernel precisam conhecer as diferenças. E isso leva à última parte:

1.2 Why not just send it directly from the kernel to the X server?

Porque o Xorg precisa saber a diferença.

E há situações em que é útil. Você pode remapear chaves no Xorg para cada dispositivo de entrada escravo de forma diferente. Por exemplo, eu tenho um conjunto de jogos com pedais, quando usado em um jogo de corrida ele gera a , b e c para cada um de seus pedais . No entanto, quando estou programando, eu faço o remapeamento dessas teclas para Esc , Ctrl e Alt , sem remapear as teclas no próprio teclado.

Além disso, não é necessário que uma máquina execute o Xorg. Por exemplo, em um servidor sem cabeçalho, posso obter a seguinte saída:

[~]$ 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

Onde os dispositivos de entrada correspondem a portas seriais (notavelmente neste caso eles fazem) em vez de teclado ou mouse.

    
por 27.01.2017 / 03:19
3

Não existe algo como "enviar diretamente". Os aplicativos devem ter algum método de leitura dos dados, e no unix isso é feito da mesma forma que eles lêem arquivos regulares criando um nó de dispositivo que funciona com as chamadas normais do sistema IO para permitir que os aplicativos sejam abertos e lidos.

Existem outras fontes de entrada além do mouse e do teclado. Você pode descobrir o que cada um está procurando em /sys/class/input . Lá você vai multar arquivos com os mesmos nomes inputNN que são links simbólicos para outro nó no sysfs que descreve o dispositivo que eles representam. Outras fontes comuns incluem placas de som (que sinalizam quando as coisas estão conectadas e desconectadas) e o botão de energia física no computador.

    
por 27.01.2017 / 03:14

Tags