Ядро Linux сбрасывает пользовательские коды сканирования клавиатуры

16

У меня есть винтажная клавиатура IBM 122 модели M, которую я адаптирую для использования на современном компьютере. Я использую Teensy 2.0 для кодирования и обработки USB. Я позаимствовал прошивку из проекта клавиатуры Humble Hacker ( https://github.com/humblehacker/keyboard ) и добавил дополнительные ключи в конфигурацию сборки. Все идет нормально.

Все «обычные» ключи работают, но ядро, кажется, сбрасывает дополнительные ключи ( F13- F24и т. Д.).

Запуск /lib/udev/keymap -i input/event0показывает коды сканирования всех нормальных клавиш, но ничего для дополнительных клавиш.

Запуск wiresharkдля захвата пакетов через порт USB показывает, что клавиатура отправляет коды сканирования, но похоже, что ядро ​​просто сбрасывает их в принципе.

Я чувствую, что это что-то в драйверах ядра, которое просто не доставляет коды сканирования, чего оно не ожидает.

Я бы подумал, что в каком-то .hфайле в исходном коде ядра будет какая-то карта «главного» ключа , но до сих пор мне не удалось найти ее.

Стоит подчеркнуть, что я не спрашиваю о сопоставлении дополнительных клавиш в X, как многие другие до меня. Это проблема низкого уровня, по-видимому, связанная с ядром. Предположим на данный момент, что я не буду использовать X вообще. Что мне нужно, чтобы коды сканирования отображались при запуске /lib/udev/keymap -i, я могу сделать все остальное оттуда.

user2543941
источник
Я знаю, что это не помогает, но: почему вы используете Teensy? Эта клавиатура должна работать с прямым адаптером PS2 / USB.
Златовласка
Клавиатура пришла из старого терминала IBM, она не использует PS / 2-совместимый протокол.
user2543941 10.07.14
Вау. Возможно, драйвер не передает событие (посмотрите последнюю часть здесь ). Вы можете попробовать evtestвместо этого /lib/udev/keymap -i, не знаю, выйдет ли что-то по-другому
Златовласка
1
evtest также ничего не показывает, когда используются дополнительные ключи.
user2543941
1
Похоже, может быть, если вы захотите использовать эти ключи, ваш проект стал немного больше, смеется. Самым сложным в написании драйвера клавиатуры будет изучение API, иначе они не будут такими сложными. Некоторое время я не занимался ядром, но вот что: LDD3 по-прежнему действителен для 3.x, я думаю.
Златовласка

Ответы:

1

Ядро видит странные коды сканирования и сбрасывает их. Я попытался бы получить эти значения кодов сканирования и затем обновить индекс аппаратной базы данных. Короче говоря, план таков:

  • получить коды из вывода dmesg - dmesg должен вывести что-то вроде этого при нажатии неизвестного кода клавиши:

    Unknown key pressed (translated set 2, code 0xa0 on isa0060/serio0)
    

a0 будучи значением кода.

  • создать файл сопоставления пользовательских кодов. Примеры и справка находятся в файле по умолчанию
    ( /usr/lib/udev/hwdb.d/60-keyboard.hwdbдля Arch это может отличаться в других дистрибутивах).

  • обновить и запустить аппаратную базу данных, выполнив команды:

    > udevadm hwdb --update
    > udevadm trigger /dev/input/eventXX
    

где eventXXсоответствует вашей клавиатуре (вы можете получить его, запустив evtest). Вы также можете перезагрузить компьютер вместо запуска.

Посмотрите в Arch wiki и в файле сопоставления кодов по умолчанию более подробное описание (или в вашей документации по распространению, если это не Arch).

Это надежный и простой метод, который делает отображение на уровне ядра, поэтому работает независимо от того, какой сервер отображения, DE и т. Д.

xbob
источник