Страницы

понедельник, 27 декабря 2010 г.

Дополнительные клавиши мультимедийной клавиатуры. Multimedia keys on keyboard


Настройка нестандартной мультимедийной клавиатуры в 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