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 показує, що клавіатура IS відправляє коди сканування, але схоже, що ядро ​​просто скидає їх.

Я відчуваю, що це щось у драйверах ядра, що просто не доставляє коди сканування, яких він не очікує.

Я б подумав, що в якомусь .hфайлі у джерелі ядра десь буде якась "головна" карта ключів , але поки що я не мав успіху в своїх зусиллях, щоб знайти її.

Варто підкреслити, що я не запитую про відображення зайвих клавіш у X, як і багато інших перед мною. Це проблема низького рівня, очевидно, пов'язана з ядром. Припустимо на даний момент, що я взагалі не буду використовувати X. Що мені потрібно, щоб коди сканування з’являлися, коли я бігаю /lib/udev/keymap -i, я можу зробити звідти все інше.


Я знаю, що це не допомагає, але: навіщо ви користуєтесь Teensy? Ця клавіатура повинна працювати з прямим адаптером PS2 / USB.
goldilocks

Клавіатура прийшла зі старого терміналу IBM, вона не використовує сумісний протокол PS / 2.
користувач2543941

Ого. Це дійсно може бути те , що водій не проходить захід на (погляньте на останню частину тут ). Ви можете спробувати evtestзамість цього /lib/udev/keymap -i, не знаю, якщо вийде щось інше.
goldilocks

1
evtest також нічого не показує при використанні додаткових клавіш.
користувач2543941

1
Схоже, якщо ви хочете використовувати ці клавіші, ваш проект трохи збільшився, хаха. Найскладніше в написанні драйвера клавіатури - це вивчення API, інакше вони не виглядають настільки складними. Я не робив жодного матеріалу з ядром за деякий час, але це: LDD3 все ще дійсний для 3.x, я думаю.
goldilocks

Відповіді:


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), подивіться у Вікі Arch та файл зіставленням кодів за замовчуванням.

Це надійний і простий метод, який робить відображення на рівні ядра, таким чином працює незалежно від сервера відображення, DE тощо.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.