Linux драйвера для клавиатуры

Драйверы устройств ввода

Давайте обратим наше внимание на драйверы для распространённых устройств ввода, таких как клавиатуры, мыши и сенсорные экраны. Но сначала давайте кратко рассмотрим готовый сервис для доступа к оборудованию, доступный для драйверов ввода.

Serio

Уровень 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»

Читайте также:  Search files and directories in linux

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);

Дисциплина линии N_TTY обрабатывает ввод таким образом, что полученные с помощью клавиатуры данные отображаются на виртуальной консоли и позволяет приложениям пользовательского пространства читать символы из узла /dev/ttyX , подключённого к виртуальному терминалу.

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

Рисунок 7.3. Поток данных от PS/2-совместимой клавиатуры.

Рисунок 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.

Читайте также:  Kali linux команды для консоли

USB и Bluetooth подробно рассматриваются в Главе 11, «Универсальная последовательная шина» и в Главе 16, «Linux без проводов», соответственно.

Мыши

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

PS/2 мышь

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

Пример драйвера: Мышь-колёсико

Чтобы получить настоящий драйвер устройства мыши, давайте преобразуем вращающееся колёсико, рассматриваемое в Главе 4, «Создание основы», в вариант обычной PS/2 мыши. «Мышь-колёсико» создаёт одномерное движение по оси Y. Повороты колёсика по часовой стрелке и против часовой стрелки создают положительные и отрицательные относительные Y координаты соответственно (как колесо прокрутки на мыши), а нажатие на колёсико приводит к событию нажатия на левую кнопку мыши. Мышь-колёсико идеально подходит для навигации по меню в таких устройствах, как смартфоны, КПК и музыкальные плееры.

Драйвер устройства мыши-колёсика, реализованный в Распечатке 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. Драйвер мыши-колёсика

Источник

Linux драйвера для клавиатуры

Недавно я обновил свой Ubuntu с 17.10 до 18.04, и после перезагрузки клавиатура перестала работать. Он работает на экране блокировки, но ни разу не вошел в систему. Оказывается, это довольно распространенная проблема. В драйвер ввода с клавиатуры ломается после каждого крупного обновления, что вызывает недопонимание между ОС Ubuntu и устройствами ввода.

Вы можете легко исправить это, снова установив драйвер входного X-сервера. Но поскольку клавиатура изначально не работает, это становится немного сложнее. И нет, внешняя USB-клавиатура тоже не работает. Итак, вот как исправить неработающую клавиатуру после обновления Ubuntu.

Исправить клавиатуру, не работающую в Ubuntu 18.04

Случай 1: клавиатура и мышь работают на экране блокировки

Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)

В этом случае у вас есть клавиатура и трекпад, работающие на экране блокировки, вы можете напрямую запустить сеанс терминала, нажав Ctrl + Alt + F3, и перейти к этому шагу.

Случай 2: клавиатура не работает, но мышь работает на экране блокировки

Читайте также:  Dump all memory linux

Шаг 1: В этом случае войдите в систему с помощью экранной клавиатуры. Вы можете включить его, щелкнув значок «Доступность» или «Человек» в правом верхнем углу. После того, как вы вошли в систему, нам нужно еще раз включить экранную клавиатуру. Для этого откройте меню «Настройки», щелкнув стрелку в правом верхнем углу. Затем щелкните значок шестеренки в раскрывающемся меню.

Настройки-меню-гаечный ключ-инструмент

Читайте: 3 способа настройки статического IP-адреса в Ubuntu

Шаг 2: В меню «Настройки» нажмите «Универсальный доступ» на левой вкладке, чтобы перейти в меню «Слух и набор».

универсальный доступ

Шаг 3. В меню универсального доступа перейдите в меню «Набор текста». Нажмите на ползунок рядом с текстом «Экранная клавиатура» на экранной клавиатуре.

экранная клавиатура-меню

Шаг 4: Теперь, когда у нас есть экранная клавиатура, нам нужен терминал для запуска команды. Чтобы открыть терминал, щелкните правой кнопкой мыши на рабочем столе и выберите «Открыть терминал».

открытый терминал

Шаг 5: После запуска терминала введите следующую команду и нажмите Enter.

Иногда Ubuntu может попытаться стать фанатиком и запрашивать пароль даже после ввода sudo. Просто введите пароль с помощью экранной клавиатуры.
sudo apt-get install xserver-xorg-input-all
Он должен снова запросить ввод, нажмите Y и снова нажмите Enter.

install-xserver

После того, как мы установили драйверы ввода с клавиатуры X Server, перезагрузите вашу систему. Когда система будет восстановлена ​​и запущена, вы сможете использовать клавиатуру и мышь.

Случай 3: клавиатура и мышь не работают

В случае, если клавиатура, трекпад и мышь не работают у вас даже на экране блокировки, нам нужно запустить терминал во время самой загрузки. Для этого принудительно выключите систему с помощью физических ключей.

Пока система запускается, нажмите и удерживайте клавишу Shift после загрузки BIOS, и вы войдете в меню GRUB. В меню GRUB нажмите «e», чтобы изменить параметры загрузки. Найдите строку, которая выглядит следующим образом.
linux /boot/vmlinuz-4.18.0-25-generic root = UUID = a98c605-2ac4-4ee3-8070-2560255293fe ro тихий всплеск $ vt_handoff
Вставьте «/ bin / bash» перед $ vt_handoff и нажмите Ctrl + X или F10 для перезагрузки. Как только вы войдете в команду, выполните следующую команду и снова перезагрузите систему.
sudo apt-get install xserver-xorg-input-all
После перезагрузки клавиатура и мышь должны работать на вас.

Изменение файла GRUB является временным изменением, а не постоянным. Поэтому, если при загрузке происходит сбой, просто перезапустите систему, и она вернется в нормальное состояние.

Заключение

Ubuntu — хорошая бесплатная операционная система, на которую можно переключиться, если вы не хотите тратить деньги на лицензию Windows. Однако в Ubuntu есть свой набор проблем, на исправление которых требуется время. Прочтите наши другие статьи о 15 обязательных приложениях на Ubuntu сразу после новой установки и о том, как запустить Linux в Windows с помощью виртуального компьютера.

Дайте мне знать в комментариях ниже в случае возникновения каких-либо проблем или вопросов.

Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)

Источник

Оцените статью
Adblock
detector