Драйвери пристроїв введення

Давайте звернемо нашу увагу на драйвери для поширених пристроїв введення, таких як клавіатури, миші і сенсорні екрани. Але спочатку давайте коротко розглянемо готовий сервіс для доступу до обладнання, доступний для драйверів введення.

Рівень serio пропонує бібліотечні підпрограми для доступу до застарілого обладнання введення, такого як i8042-сумісні контролери клавіатури і послідовний порт. Клавіатури PS / 2 і миші підключаються до першого, а сенсорні контролери з послідовним інтерфейсом підключаються до останнього. Для взаємодії з обладнанням, які обслуговує serio, наприклад, для передачі команди для PS / 2 миші, запропоновані процедури зворотного виклику serio реєструються за допомогою serio_register_driver ().

Щоб додати новий драйвер як частина serio, за допомогою serio_register_port () реєструються точки входу open () / close () / start () / stop () / write (). Для прикладу подивіться drivers / input / serio / serport.c.

Як можна побачити на рисунку 7.1, serio - це тільки один з маршрутів доступу до низкорівневому обладнання. Деякі драйвери пристроїв введення замість нього покладаються на низкоуровневую підтримку від шинних рівнів, таких як USB або SPI.

клавіатури

Клавіатури бувають на будь-який смак - застарілі PS / 2, USB, Bluetooth, ІК, і так далі. Кожен тип має спеціальний драйвер пристрою введення, але все використовують один і той же драйвер подій клавіатури, забезпечуючи тим самим єдиний інтерфейс для користувачів. Драйвер подій клавіатури, однак, має відмінну рису в порівнянні з іншими драйверами подій: він передає дані іншій підсистемі ядра (рівню tty), а не в призначене для користувача просторі за допомогою вузлів / dev.

клавіатури ПК

Клавіатури ПК (також звані клавіатурами PS / 2 або AT клавіатурами) взаємодіє з процесором через i8042-сумісний контролер клавіатури. ПК зазвичай мають спеціальний контролер клавіатури, але на ноутбуках взаємодія з клавіатурою є одним з обов'язків вбудованого контролера загального призначення (дивіться розділ "Вбудовані контролери" в Главі 20, "Додаткові пристрої та драйвери"). Коли ви натискаєте кнопку на клавіатурі комп'ютера, це відбувається таким шляхом:

1. Контролер клавіатури (або вбудований контроллер) сканує і декодує клавіатурну матрицю і піклується про нюанси, таких як усунення брязкоту контактів.

2. Клавіатурний драйвер пристрою за допомогою serio для кожного натискання і відпускання клавіші Новомосковскет з контролера клавіатури сирі коди сканування. Різницею між натисканням і відпусканням є найстарший біт, який для останнього випадку встановлено. Наприклад, натискання на кнопку "a" дає пару скан-кодів, 0x1e і 0x9e. Спеціальні кнопки екрануються за допомогою 0xE0. так що натискання кнопки зі стрілкою вправо виробляє послідовність (0xE0 0x4D 0xE0 0xCD). Для спостереження виходять з контролера скан-кодів ви можете використовувати утиліту showkey (після символу → йдуть пояснення):

bash> showkey -s
кл-ра була в режимі UNICODE
[Якщо ви пробуєте це під X, це може не працювати, так як
X сервер також Новомосковскет / dev / console]

натисніть будь-яку кнопку (програма завершиться через 10с після
останнього натискання на кнопку).
.
0x1e 0x9e → Натискання кнопки "a"

3. Клавіатурний драйвер пристрою перетворює отримані скан-коди в коди клавіш, грунтуючись на час написання. Щоб побачити код клавіші, що відповідає кнопці "a":

bash> showkey
.
код кнопки 30 натискання → Натискання на кнопку "a"
код кнопки 30 відпускання → Відпускання кнопки "a"

Щоб повідомити ці коди клавіш далі вгору, драйвер генерує подію введення, яке передає управління драйверу подій клавіатури.

4. Драйвер подій клавіатури бере на себе роботу по перетворенню коду клавіші в залежності від завантаженої карти кодів клавіш. (Дивіться сторінки довідки loadkeys і map-файли в / lib / kbd / keymaps.) Він перевіряє, чи є перетворений код клавіш такими діями, як перемикання віртуальної консолі або перезавантаження системи. Щоб замість перезавантаження системи у відповідь на натискання Ctrl + Alt + Del запалилися світлодіоди CAPSLOCK і NUMLOCK. додайте в обробник Ctrl + Alt + Del драйвера подій клавіатури, drivers / char / keyboard.c. наступне:

static void fn_boot_it (struct vc_data * vc, struct pt_regs * regs)
<
+ set_vc_kbd_led (kbd, VC_CAPSLOCK);
+ set_vc_kbd_led (kbd, VC_NUMLOCK);
- ctrl_alt_del ();
>

5. Для звичайних клавіш перетворений код натискання відправляється асоційованого віртуальному терміналу і дисципліни лінії N_TTY. (Ми обговорювали віртуальні термінали і дисципліни ліній в Главі 6, "Драйвери послідовних портів.") Drivers / char / keyboard.c робить це в такий спосіб:

/ * Додаємо код клавіші в перемикається буфер * /
tty_insert_flip_char (tty, keycode, 0);
/ * Плануємо * /
con_schedule_flip (tty);

На рисунку 7.3 показано рух даних від моменту натискання клавіші на клавіатурі, до моменту його появи на віртуальній консолі. Ліва половина малюнка є залежною від обладнання, а права половина носить загальний характер. Відповідно до метою розробки підсистеми введення, що пролягає нижче апаратний інтерфейс є прозорим для драйвера подій клавіатури і рівня tty. Таким чином, ядро ​​введення і чітко визначені інтерфейси подій захищають користувачів введення від нюансів обладнання.

Драйвери пристроїв введення

Малюнок 7.3. Потік даних від PS / 2-сумісної клавіатури.

USB і Bluetooth клавіатури

Специфікаціями USB, пов'язаними з пристроями взаємодії з людиною (HID), передбачений протокол, за яким для взаємодії використовуються USB клавіатури, миші, набори кнопок і інших периферійних пристроїв введення. На Linux це здійснюється через клієнтський драйвер USB usbhid. який відповідає за клас USB HID (0x03). Usbhid реєструє себе в якості драйвера пристрою введення. Він відповідає API введення і повідомляє про відповідні події введення підключених HID.

Для того, щоб зрозуміти шлях коду для USB клавіатури, повернемося до Малюнку 7.3 і змінимо апаратно-залежну ліву половину. Замінимо контролер клавіатури в квадратику "Обладнання введення" на контролер USB, serio на рівень ядра USB і квадратик "Драйвер пристрою введення" на драйвер usbhid.

Для Bluetooth клавіатури замінимо на рисунку 7.3 контролер клавіатури на набір мікросхем Bluetooth, serio на рівень ядра Bluetooth і квадратик "Драйвер пристрою введення" на драйвер Bluetooth hidp.

USB і Bluetooth детально розглядаються в Розділі 11, "Універсальна послідовна шина" і в Главі 16, "Linux без проводів", відповідно.

Миші, як і клавіатури, бувають з різними можливостями і мають різні варіанти взаємодії. Давайте подивимося на зазвичай використовуються.

Миші генерують відносні пересування по осях X і Y. Крім того, вони мають одну або кілька кнопок. Деякі з них також мають коліщатко прокрутки. Драйвер пристрою введення для застарілої PS / 2-сумісної миші для взаємодії з контролером грунтується на рівні serio. Драйвер подій введення для мишей, званий mousedev. повідомляє події миші призначеним для користувача додатків за допомогою / dev / input / mice.

Приклад драйвера: Миша-коліщатко

Драйвер пристрою миші-коліщатка, реалізований в роздруківці 7.3, працює з віконними системами, такими як X Windows. Щоб побачити, як драйвер заявляє про свої схожих на миша можливості, подивіться на roller_mouse_init (). На відміну від драйвера обертового коліщатка в роздруківці 4.1 Глави 4, драйверу миші-коліщатка не потрібні методи read () або poll (). так як про події повідомляється з використанням API введення. Оброблювач переривання від коліщатка roller_isr () також відповідно змінюється. Прибираємо службові дії, що виконуються в обробнику переривання, що використовують чергу очікування, спін-блокування і процедуру store_movement () для підтримки read () і poll ().

У роздруківці 7.3, + і - на початку рядків позначають відмінності від драйвера крутного коліщатка, реалізованого в роздруківці 4.1 Глави 4.

Роздруківка 7.3. Драйвер миші-коліщатка

Схожі статті