/ dev / input - Apa sebenarnya ini?

12

Saya ingin tahu tentang bagaimana perangkat keras berinteraksi dengan OS dan menemukan posting ini: Bagaimana cara kerja input keyboard dan output teks?

Sepertinya banyak keajaiban terjadi di direktori / dev / input. Saya memutuskan untuk melihat OS saya sendiri (Ubuntu 16.10) untuk melihat apa yang bisa saya temukan. Semua file ini terdaftar sebagai 0 byte, dan ketika saya melakukannya sudo cat mouse0 | hexdump -Csaya mendapatkan satu ton hexdata yang terlihat seperti ini:

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

Jadi saya punya beberapa pertanyaan:

  1. Apa tujuan dari file ini? Sepertinya saya bahwa file-file perangkat ini hanya digunakan sebagai perantara untuk mentransfer scancode dari kernel ke server X. Mengapa tidak langsung mengirimnya dari kernel ke server X?

  2. Kenapa banyak sekali? Saya memiliki sedikit lebih dari 20 file acara individual, tetapi hanya satu keyboard dan mouse.

Astrum
sumber

Jawaban:

17

Saya akan menjawab pertanyaan dengan urutan terbalik:

  1. Mengapa ada begitu banyak?

Itu adalah perangkat yang mendukung sebagian besar input yang ada pada mesin (ada yang lain, mikrofon misalnya tidak akan dikelola /dev/input). Bertentangan dengan asumsi bahwa satu keyboard plus satu mouse akan memberikan 2 perangkat, bahkan keyboard yang paling sederhana dan mouse yang paling sederhana pun akan tetap memberikan 6 perangkat.

Mengapa 6? Karena Xorg akan membuat keyboard input uji dan mouse input uji (keduanya virtual) selama startup-nya. Selain itu, ini akan menggabungkan keyboard uji dengan keyboard yang sebenarnya menjadi perangkat virtual utama. yaitu akan melakukan muxing dari input. Hal yang sama akan terjadi pada tes dan mouse sebenarnya.

Ditambah komputer biasa (desktop atau laptop) memiliki tombol lain selain dari keyboard: tombol power, tombol sleep.

The eventNperangkat dalam ada perangkat untuk hal-hal yang Xorg menciptakan dan untuk apa memiliki komputer. Itu Nberasal dari ID berurutan dan analog dengan ID di xinput. Misalnya pada mesin saya, saya punya:

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

Dan xinputmemberi saya ID analog:

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

(Terlihat eventNsesuai dengan id=N)

Tanpa Xorg

1.1 Apa tujuan dari file ini?

Perhatikan bahwa semua input acak (termasuk kamera USB saya!) Dilihat oleh Xorg sebagai bagian dari keyboard virtual. Ini memungkinkan untuk muxing dan demuxing input. Sebagai contoh, saya dapat memindahkan mouse saya melalui mouse USB atau trackpad saya dan aplikasi tidak perlu tahu bedanya.

(Fakta bahwa kamera USB adalah bagian dari keyboard virtual adalah karena ia memiliki tombol untuk menghidupkan dan mematikannya. Dan karena itu adalah tombol, itu menjadi bagian dari subsistem keyboard. Input video yang sebenarnya ditangani /sys/class/video4linux. )

Dengan kata lain, untuk suatu aplikasi hanya ada satu keyboard dan hanya satu mouse. Tetapi Xorg dan kernel perlu mengetahui perbedaannya. Dan ini mengarah ke bagian terakhir:

1.2 Mengapa tidak langsung mengirimnya dari kernel ke server X?

Karena Xorg perlu tahu bedanya.

Dan ada situasi di mana itu berguna. Anda dapat memetakan kembali kunci di Xorg untuk setiap perangkat input budak secara berbeda. Sebagai contoh, saya memiliki set permainan dengan pedal, ketika digunakan dalam game balap yang dihasilkannya a, bdan cuntuk masing-masing pedalnya. Namun, ketika pemrograman saya memetakan kembali tombol-tombol ini untuk Esc, Ctrldan Alt, tanpa memetakan kembali tombol pada keyboard itu sendiri.

Juga, tidak perlu mesin menjalankan Xorg. Misalnya, pada server tanpa kepala saya bisa mendapatkan output berikut:

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

Di mana perangkat input sesuai dengan port serial (terutama dalam hal ini mereka lakukan), bukan keyboard atau mouse.

grochmal
sumber
3
Dukungan kamera itu sendiri (seperti pada, mengambil video) tidak melalui subsistem input, tetapi melalui V4L2. Kamera adalah perangkat input keyboard karena kadang-kadang memiliki tombol, dan itu bertindak seperti tombol ...
Stephen Kitt
@StephenKitt - Wow, yeah. Saya tidak pernah ikut campur dengan subsistem kamera tapi sekarang saya bisa melihat / sys / class / video4linux. Ada beberapa antarmuka yang menarik di sana. Terimakasih atas infonya! (Saya telah memperbarui asnwer dan menghapus bagian yang menyesatkan).
grochmal
Xorg tidak membuat file perangkat: itu bukan driver. Ini malah membuka mereka dan melakukan IO melalui mereka. Ini menjadi sangat jelas ketika Anda memulai mesin tanpa X sama sekali dan masih melihat perangkat ini (dan dapat menjalankan misalnya gpm).
Ruslan
@Ruslan mengapa saya memerlukan driver untuk membuat file perangkat? Saya dapat membuat perangkat blok menggunakan loop mount misalnya. Perangkat akan tetap ada tanpa X tetapi file perangkat yang sebenarnya (pada kernel modern) tidak akan. X akan menggunakan udev baik-baik saja tetapi aturan udev untuk mouse misalnya tidak akan dijalankan jika boot tanpa X.
grochmal
Saya baru saja menjalankan Ubuntu 18.04 Live tanpa meluncurkan X sama sekali. Saya masih bisa melihat file-file ini. Sekali lagi: mouse dapat bekerja tanpa X, lihat mis. gpmDaemon, atau GTK2 pada framebuffer.
Ruslan
2

Tidak ada yang namanya "kirim langsung". Aplikasi harus memiliki beberapa metode membaca data, dan dalam unix yang dilakukan dengan cara yang sama mereka membaca file biasa dengan membuat simpul perangkat yang berfungsi dengan file normal IO system call untuk memungkinkan aplikasi membuka dan membacanya.

Ada sumber input lain selain mouse dan keyboard. Anda dapat mengetahui apa masing-masing dengan melihat /sys/class/input. Di sana Anda akan mendenda file dengan nama inputNN yang sama yang merupakan tautan simbolik ke node lain di sysf yang menggambarkan perangkat yang diwakilinya. Sumber umum lainnya termasuk kartu suara (yang memberi sinyal ketika semuanya dicolokkan dan dicabut) dan tombol daya fisik pada komputer.

psusi
sumber