Настройка нестандартной мультимедийной клавиатуры в Linux, процесс доступный, но имеющий массу тонкостей.
Заметка не "причесана", может содержать противоречия.
Мультимедийная клавиатура в Linux
4 подсистемы: Linux device driver, Linux evdev driver, Консоль, X-сервер
Обнаруженные ядром Linux, устройства ввода располагаются в файловой системе устройств /dev/input/.
$ ls /dev/input
by-id event0 event2 event4 event6 mouse0
by-path event1 event3 event5 mice
Названия не очень информативные, сразу невозможно сказать что к чему относиться, поэтому:
$ ls /dev/input/by-id -l
lrwxrwxrwx 1 root root 9 2012-03-27 09:57 usb-099a_USB_Keyboard-event-if01 -> ../event3
lrwxrwxrwx 1 root root 9 2012-03-27 09:57 usb-099a_USB_Keyboard-event-kbd -> ../event2
lrwxrwxrwx 1 root root 9 2012-03-27 09:57 usb-Creative_Technology_Ltd._VF0690_Live__Cam_Socialize_HD_AF_2011030800175-event-if00 -> ../event5
lrwxrwxrwx 1 root root 9 2012-03-27 09:57 usb-Philips_Electronics_Philips_USB_Digital_Speaker_System-event-if02 -> ../event4
Откуда уже видны названия устройств. Тут стоит заметить, что одно физическое устройство иногда отображается в два устройства event. Например USB Keyboard (клавиатура Dialog) - это два устройства event3 и event2.
Сканкоды (scancodes)
Кейкоды (keycodes)
X Символы (XSymbols)
Консольные программы
Showkey
showkey - показывает коды ядра,а также scancodes (с опцией -s) генерируемые при нажатии на клавишу
для клавиш которые еще не привязаны, не показывает ничего, т.е.
для клавиш, которые не имеют отображения scancode в kernel keycode,
в dmesg выводится предупреждение:
Dumpkeys
$ sudo dumpkeys -i
Getkeycodes
getkeycodes -печатает таблицу ядра соответствия scancode-to-keycode
Loadkeys
Keymaps
Evtest
evtest - монитор событий устройств ввода. Если запустить без параметров, будет предложен выбор.
X - программы
Xinput
$ sudo xinput --list
Покажет список зарегистрированных устройств, к примеру:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ USB Keyboard id=9 [slave pointer (2)]
⎜ ↳ ImPS/2 Generic Wheel Mouse id=12 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Sleep Button id=7 [slave keyboard (3)]
↳ USB Keyboard id=8 [slave keyboard (3)]
↳ Philips Electronics Philips USB Digital Speaker System id=10 [slave keyboard (3)]
↳ VF0690 Live! Cam Socialize HD A id=11 [slave keyboard (3)]
$ sudo xinput -list-props "VF0690 Live! Cam Socialize HD A"
Выведет чуть подробнее по выбранному устройству:
Device Enabled (128): 1
Coordinate Transformation Matrix (130): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Пока пользы от этого вывода нету.
Xev
xev - печатать события от устройств ввода
Быстрая модификация привязки keycode к xsymbol, при работающем X сервере:
# xmodmap -e 'keycode 164 = XF86Documents
После этого при нажатии клавиши с кодом 164 xev покажет что этот код привязан к X86Documents
В файле /usr/share/X11/XKeysymDB, предствлены xsymbols используемые X-сервером, такие как X86Documents
Постоянная привязка scancode к kernel keycode
/etc/rc.local - файл загружаемый при старте в самом конце
Пример: setkeycodes e016 171
Клавиатура Microsoft Digital Media Keyboard OEM
Эта клавиатура имеет режим работы USB и режим работы PS/2 через переходник.
Keycodes получаемые в режимах PS/2 и USB несколько отличаются.
Режим работы через PS/2 позволяет эмулировать протокол PS/2 и получить возможность настройки всех клавиш этой клавиатуры, но без функции горячего подключения.
Режим USB - некоторые клавиши не работают, но горячее подключение работает.
"Клавиатура Microsoft Digital Media Keyboard OEM". USB
Идентификация lsusb: ID 045e:00b4 Microsoft Corp.
ls /usb/input/by-id -l
usb-Microsoft_Microsoft®_Digital_Media_Keyboard-event-kbd -> ../event6
usb-Microsoft_Microsoft®_Digital_Media_Keyboard-if01-event-kbd -> ../event6
usb-Microsoft_Microsoft®_Digital_Media_Keyboard-if01-kbd -> ../js0
usb-Microsoft_Microsoft®_Digital_Media_Keyboard-kbd -> ../js0
Примечание: js0 - интерфейс джойстика.
Для тестирования джойстика - программа jstest.
jstest /dev/input/js0 показывает 38 - вверх и 39 - вниз
cat /dev/input/js0
Мой вывод evtest
/dev/input/event5:Microsoft Microsoft® Digital Media Keyboard
/dev/input/event6:Microsoft Microsoft® Digital Media Keyboard
Для evtest, устройство представлено двумя клавиатурами ().
Input device ID: bus 0x3 vendor 0x45e product 0xb4 version 0x111
Input device name: "Microsoft Microsoft® Digital Media Keyboard"
Эта клавиатура имеет режим работы USB и режим работы PS/2 через переходник. Keycodes получаемые в этом режиме несколько отличаются.
В частности, для качельки ZoomIn/ZoomOut - в USB режиме коды 418/419,
а в режиме PS/2 186/187. Также кнопка LogOff в USB режиме имеет keycode = 433, а в режиме PS/2 180
Вот пример привязки нераспознанных сканкодов к keycode в файле /etc/rc.local
$ cat /etc/rc.local
# Не все клавиши клавиатуры работают
# Набор кнопок 1,2,3,4,5
# Для 1 кнопки код 148 отображается в код X86Lounch1
setkeycodes e073 148
# Для 2 кнопки код 149 отображается в код X86Lounch2
setkeycodes e074 149
# Для 3 кнопки код 202 отображается в код X86Lounch3
setkeycodes e075 202
# Для 4 кнопки код 203 отображается в код X86Lounch4
setkeycodes e076 203
# Для 5 кнопки код 184 отображается в код X86Lounch5
setkeycodes e077 164
# Кнопка My Favorites XF86Documents
setkeycodes e078 156
# Рычаг Zoom
setkeycodes e005 177
setkeycodes e00b 178
#
setkeycodes e011 179
# Кнопка LogOff 180 - KEY_EXIT(182)
setkeycodes e016 174
# Кнопки доступные при выключенной FLock
# Help TEST
setkeycodes e03b 191
# Undo TEAT
setkeycodes e008 192
# Redo KEY_REDO
setkeycodes e007 182
# New KEY_NEW
setkeycodes e03e 181
# Open
setkeycodes e03f
# Close KEY_CLOSE
setkeycodes e040 206
# Reply KEY_REPLY
setkeycodes e041 232
# Fwd KEY_FORWARDMAIL
setkeycodes e042 233
# Send
setkeycodes e043 231
# Spell TEST
setkeycodes e023 200
# Save KEY_SAVE
setkeycodes e057 234
# Print KEY_PRINT
setkeycodes e058 210
# коды для setkeycodes взяты из крайнего правого стоблца из файла
# cat /usr/share/X11/xkb/keycodes/evdev
Устройство Joystick
xxd
$ sudo xxd /dev/input/js0
xmodmap
jstest
jstest /dev/input/js0 показывает 38 - вверх и 39 - вниз
cat /dev/input/js0
Установка поддержки джойстика в Xorg.
$ sudo apt-get install joystick
$ sudo apt-get install xserver-xorg-input-joystick
После установки
config/udev: Adding input device Microsoft Microsoft® Digital Media Keyboard (/dev/input/js0)
[ 4523.148] (II) No input driver/identifier specified (ignoring)
xinput -list не показывает ничего нового.
Перезагрузка не добавила ничего нового.
Клавиатура Microsoft Office Keyboard
В режиме подключения USB определяется как 2 устройства event - основная и дополнительная клавиатура.
Клавиатура Microsoft Corp. Office Keyboard. Режим USB
$ lsusb
ID 045e:0048 Microsoft Corp. Office Keyboard 1.0A
$ ls /dev/input/by-id/ -l
usb-045e_Microsoft®_Office_Keyboard-event-if01 -> ../event4
usb-045e_Microsoft®_Office_Keyboard-event-kbd -> ../event3
Для evtest также 2 устройства:
Для event3 - основная клавиатура
Input device ID: bus 0x3 vendor 0x45e product 0x48 version 0x110
Input device name: "Microsoft® Office Keyboard"
USB-колонки Philips SP-672U
Имеют 3 кнопки - все кнопки работают.
$ ls /dev/input/by-id/ -l
usb-Philips_Electronics_Philips_USB_Digital_Speaker_System-event-if02 -> ../event4
Отсюда видно, что устройство назначен файл event4.
$ sudo evtest /dev/input/event4
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x471 product 0x104 version 0x100
Input device name: "Philips Electronics Philips USB Digital Speaker System"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 113 (Mute)
Event code 114 (VolumeDown)
Event code 115 (VolumeUp)
Event type 4 (Misc)
Event code 4 (ScanCode)
Testing ... (interrupt to exit)
Event: time 1332875324.583249, type 4 (Misc), code 4 (ScanCode), value c00e2
Event: time 1332875324.583254, type 1 (Key), code 113 (Mute), value 1
Event: time 1332875324.583255, -------------- Report Sync ------------
Event: time 1332875324.783255, type 4 (Misc), code 4 (ScanCode), value c00e2
Event: time 1332875324.783260, type 1 (Key), code 113 (Mute), value 0
Event: time 1332875324.783261, -------------- Report Sync ------------
Event: time 1332875327.231334, type 4 (Misc), code 4 (ScanCode), value c00e2
Event: time 1332875327.231339, type 1 (Key), code 113 (Mute), value 1
Event: time 1332875327.231340, -------------- Report Sync ------------
Event: time 1332875327.407342, type 4 (Misc), code 4 (ScanCode), value c00e2
Event: time 1332875327.407348, type 1 (Key), code 113 (Mute), value 0
Event: time 1332875327.407349, -------------- Report Sync ------------
Клавиатура USB Dialog
Маленькая компактная клавиатура. Стандартна - все клавиши работают. Интереса не заслуживает. В системе представлена в виде 2 устройств. 1 - стандартная клавиатура, 2 - дополнительная клавиатура (мультимедиа-клавиши).
Вебкамера Creative Live! Cam Socialize HD AF
Вебкамера имеет 1 клавишу. Не реагирует.
В терминале:
$ sudo showkey
не реагирует на нажатие клавиши на вебкамере.
В моей системе - устройство event5:
$ sudo evtest /dev/input/event5
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x41e product 0x4086 version 0x1010
Input device name: "VF0690 Live! Cam Socialize HD A"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 212 (Camera)
Testing ... (interrupt to exit)
также не реагирует на нажатие клавиши
$ cat /usr/share/X11/xkb/keycodes/xfree86 | grep 212
<I54> = 212;
$ cat /usr/share/X11/xkb/keycodes/evdev | grep 212
<I212> = 212; // #define KEY_DASHBOARD 204
<I220> = 220; // #define KEY_CAMERA 212
Это могут быть 3 вещи.
1. Неисправная кнопка. Исправность лучше проверить в Windows, установив комплектное ПО. Проверено, работает, надеюсь на пункт 2, но похоже п.3.
2. Ошибки в отображении кодов клавиш, на одной из стадий.
3. Неподдерживаемое оборудование. Выглядит как совместимое со стандартом, а на деле, что-то да забыли разработчики или наоборот добавили.
Справочники
/usr/share/X11/xkb/rules/base.lst
Note that a list of keyboard layouts and models can be found in /usr/share/X11/xkb/rules/base.lst
Используется в XKBModel
/usr/share/X11/XKeysymDB - список xsymbols
/lib/udev/keymaps/ - содержит настройки переопределения кодов >255 для клавиатур.
Опции ядра
Опция ядра atkbd.softraw=0, переключает ядро в режим native scancode
Без этой опции showkey -s показывает сканкоды только известные ядру (см. файл input.h) и пропускает сканкоды посылаемые клавиатурой! Можно также включить режим отладки модуля i8042, чтобы посмотреть сканкоды.
Опция ядра atkbd.softraw=0 может быть включена следующим образом.
Отредактировать файл /etc/default/grub, внести ее в строку GRUB_CMDLINE_LINUX_DEFAULT и после сохранения файла, выполнить в терминале sudo update-grub. Все, с правами суперпользователя.
Ресурсы
HOWTO Мультимедийные кнопки (клавиши)
http://ru.gentoo-wiki.com/wiki/HOWTO_%D0%9C%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BC%D0%B5%D0%B4%D0%B8%D0%B9%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8_%28%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%D0%B8%29
HOWTO Добавление модели мультимедийной клавиатуры
http://ru.gentoo-wiki.com/wiki/HOWTO_%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BC%D0%B5%D0%B4%D0%B8%D0%B9%D0%BD%D0%BE%D0%B9_%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D0%B0%D1%82%D1%83%D1%80%D1%8B
Подключение Microsoft Natural 4000 в GNU/Linux
http://sphinx.net.ru/blog/entry/msnek-linux/
Использование мультимедийных клавиш
http://sphinx.net.ru/blog/entry/using-extra-keys/
Microsoft Wireless Comfort Keyboard 1.0a on Ubuntu Lucid Lynx 10.04
http://stefanobolli.blogspot.com/2010/08/microsoft-wireless-comfort-keyboard-10a.html
Комментариев нет:
Отправить комментарий