Возможно ли, чтобы клавиша на клавиатуре не генерировала скан-код?

Я недавно перешел на Linux полный рабочий день, и я наслаждаюсь кривой обучения. Тем не менее, одна особенность меня сильно озадачила: некоторые комбинации клавиш Fn на моем ноутбуке не работают, спец. Увеличение / уменьшение громкости, отключение звука и т. Д. Комбинации, которые работают, включают WLAN, спящий режим, цикл видео, цифровую клавиатуру и т. Д. Я могу исключить ошибку H/W, поскольку клавиши отлично работали в Windows 7 (хотя только при было установлено программное обеспечение горячих клавиш производителя ноутбука).

Я искал сеть для возможных объяснений, и наткнулся на понятия скан-код (HW-зависимый), keycode и keysym. Я думаю, что понимаю основы, и обнаружил, что консоль и X имеют свои собственные отображения и должны быть переназначены отдельно. Консоль использует отображение кода сканирования на коды ядра, но X по какой-то причине имеет свое отображение. Со своей стороны я попытался:

  1. Установите параметр загрузки atkbd.softraw=0
  2. Переключение в режим консоли с помощью Ctrl + Alt + F1
  3. Используемый showkey --scancodes, К сожалению, ключи, которые я пытаюсь заставить работать, не показывают никакого вывода сканкода
  4. Используемый dmesg чтобы увидеть, произошли ли события нажатия неизвестной клавиши, но ни одного не найдено.
  5. В отчаянии попробовал acpi_listen чтобы увидеть, действительно ли ключи запускают какие-либо события acpi, это делают только клавиши спящего режима и цикла видео, другие ничего не выводят

На этом этапе я подумал, что, возможно, мне следует попробовать получить коды сканирования из самой среды X, используя xev, но не повезло.

Я приехал сюда только в крайнем случае. Я надеюсь, что у кого-то есть хорошее объяснение того, почему некоторые комбинации функциональных клавиш не генерируют никакого результата в инструментах, которые я пробовал выше. Если это помогает, я использую Linux Mint 17.3 Cinnamon, а ноутбук сделан HCL. evtest показывает устройство клавиатуры, которое должно быть переведено в набор 2 клавиатуры. Если нужно больше информации, я был бы рад сделать это. Благодарю.

РЕДАКТИРОВАТЬ: Нет соответствующих настроек BIOS доступны.

Признание: все мои знания об этом основаны на том, что я читал на Arch wiki, Ubuntu wiki, множестве постов на форуме и других сайтах. Так что, если я технически неправ в чем-то, пожалуйста, потерпите меня и поправьте меня. Я люблю учиться этому материалу:)

2 ответа

Да, некоторые клавиши на USB-клавиатурах могут не генерировать скан-код, отправляемый по протоколу USB HID клавиатуры, а вместо этого использовать другой протокол USB для передачи некоторого пользовательского ввода. Судя по тому, что вы описали, это, скорее всего, то, что происходит здесь. Вы можете использовать программы из evmu-toolsпакет (это имя Debian) или более старый evtestпрограмма, чтобы узнать больше о том, что ваше конкретное устройство делает с вещами, которые не отправляют коды сканирования клавиатуры.

(Из чтения вопроса Unix & Linux SE «Как заставить все мои ключи отправлять коды клавиш» также кажется, что что-то происходит с кодами клавиш выше 255, но я не понимаю, что там происходит.)

В вашем понимании многослойности также есть ошибка:

Консоль использует сопоставление скан-кодов с кодами клавиш ядра, но X по какой-то причине имеет свое собственное сопоставление.

Это не совсем правильно. Ядро сопоставляет коды сканирования с кодами клавиш от 1 до 255; вы можете увидеть это сопоставление и изменить его с помощью setkeycodes(8)или удев. (На странице Arch Wiki Сопоставление скан-кодов с кодами клавиш есть много подробностей по этому поводу.) Не все скан-коды имеют сопоставление с кодом клавиши; получение скан-кода без записи о переводе — это то, что вы могли бы увидеть в dmesg, были ли они.

Только после того, как код сканирования будет преобразован в код ключа ядра, консоль и X11 получат к ним доступ; каждый имеет свой собственный механизм преобразования кодов клавиш в действия.

Обратите внимание, что консольная программа showkey -sне показывает фактические полученные коды сканирования; он считывает коды клавиш (как показано showkey -k) и переводит их обратно в скан-коды, используя таблицу ядра, показанную getkeycodes(8).

Это может зависеть от оконного менеджера X11. Вы должны попытаться использовать xev(1), чтобы понять, что происходит.

Может быть, использовать какой-то другой набор настольных xfce или же lxde или же gnome, kde, icewm может помочь

Может быть, явно настроить вашу клавиатуру (например, в /etc/Xorg.conf...) может помочь.

Другие вопросы по тегам