Подключение клавиатуры MS NEK 4k

Материал из ALT Linux Wiki


Подключение клавиатуры Microsoft Natural Ergonomic Keyboard 4000 в ALT Linux

Этими же инструкциями можно пользоваться для подключения клавиатуры из комплекта MS Natural Ergonomic Desktop 7000. Под «подключением» здесь надо понимать настройку компонентов ALT Linux так, чтобы стало возможным использовать дополнительные (в том числе мультимедийные) клавиши данной клавиатуры.


Ядро

Для корректной работы клавиатуры требуется ядро версии старше 2.6.24-rc6. На момент публикации я использовал ядро kernel-image-std-ll-2.6.25-alt8.M41.1 из бранча 4.1.

Сразу замечу, что на момент написания статьи, использовать рычажок зума и клавишу проверки орфографии было невозможно без правки заголовков и пересборки ядра, поскольку эти клавиши генерируют коды со значениями больше 255, в то время, как X-сервер такие коды (>255) просто игнорирует.

Устройства

Клавиатура с точки зрения ядра представляется двумя устройствами. Фактически, одно из них отвечает за обработку «стандартных» клавиш, другое — за дополнительные. В дальнейшем, эти устройства потребуется настроить по-разному. Поэтому, сразу зафиксируем их имена, чтобы они не зависели от порта, к которому подключена клавиатура. Для начала, посмотрим, какими устройствами представлена клавиатура:

$ cat /proc/bus/input/devices

[лишний вывод убран]

I: Bus=0003 Vendor=045e Product=00db Version=0111
N: Name="Microsoft Natural� Ergonomic Keyboard 4000"
P: Phys=usb-0000:00:10.2-2/input0
S: Sysfs=/devices/pci0000:00/0000:00:10.2/usb4/4-2/4-2:1.0/input/input5
U: Uniq=
H: Handlers=kbd event5
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffe
B: MSC=10
B: LED=107

I: Bus=0003 Vendor=045e Product=00db Version=0111
N: Name="Microsoft Natural� Ergonomic Keyboard 4000"
P: Phys=usb-0000:00:10.2-2/input1
S: Sysfs=/devices/pci0000:00/0000:00:10.2/usb4/4-2/4-2:1.1/input/input6
U: Uniq=
H: Handlers=kbd event6
B: EV=10001f
B: KEY=37fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
B: REL=40
B: ABS=1 0
B: MSC=10

Отсюда видно, что в моем случае, клавиатура представлена устройствами event5 и event6. Теперь найдем в базе udev строку modalias, являющуюся уникальной для каждого устройства. В моем случае это будет выглядеть так:

$ udevinfo -a -p `udevinfo -q path -n /dev/input/event5`|grep modalias|grep usb
    ATTRS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc01ip01"

$ udevinfo -a -p `udevinfo -q path -n /dev/input/event6`|grep modalias|grep usb
    ATTRS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"

Теперь создадим файл с правилами udev, которые будут выдавать нашей клавиатуре устройства с постоянными именами. Правила udev выполняются в порядке нахождения соответствия (правило «кто раньше встал, того и тапки» или «кто успел, тот и съел»). Поэтому начнем имя файла с числа 10:

$ cat /etc/udev/rules.d/10-msnek4k.rules
# Rules for MS Natural Ergonomic Keyboard 4000
KERNEL=="event*",SYSFS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc01ip01", MODE="0644", NAME="input/event40"
KERNEL=="event*",SYSFS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00", MODE="0644", NAME="input/event41"

В моем случае, клавиатура будет представляться устройствами /dev/input/event40 и /dev/input/event41. Вы можете подставить свои числа, но название устройства все равно должно быть input/event* — это условие драйвера evdev (по крайней мере, так было).

Сейчас самое время пнуть udev, чтобы он перечитал правила (что-то вроде udevadm control --reload_rules) или просто перезагрузиться.

Итак, наша клавиатура получила фиксированные устройства, теперь пора настроить X-сервер.

X-сервер (Xorg) и HAL

С некоторых пор, настройки устройств ввода Xorg переехали в HAL и, видимо, это надолго. Поэтому сразу будем настраивать все через HAL. Для начала уберем из ServerLayout все, что касается устройств ввода. Вот как выглядит секция ServerLayout в моем xorg.conf:

Section "ServerLayout"
        Identifier     "Minimal layout"
        Screen         "Screen0" 0 0
        Option         "AllowEmptyInput" "yes"
        Option         "AutoAddDevices" "yes"
EndSection

Теперь Xorg будет обращаться к HAL за устройствами ввода и их настройками. Обратимся и мы. Создадим новую политику HAL для настройки нашей клавиатуры:

$ cat /etc/hal/fdi/policy/55-xorg-xkb.fdi
<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
  <device>

    <match key="linux.device_file" string="/dev/input/event40">
        <merge key="input.x11_driver" type="string">kbd</merge>
        <merge key="input.x11_options.XkbModel" type="string">microsoft7000</merge>
    </match>

    <match key="linux.device_file" string="/dev/input/event41">
        <merge key="input.x11_driver" type="string">evdev</merge>
        <merge key="input.x11_options.XkbModel" type="string">microsoft7000</merge>
    </match>

  </device>
</deviceinfo>

В данной политике описано, что для устройства event40 (стандартная часть клавиатуры) нужно использовать драйвер Xorg’а kbd, а для устройства event41 (дополнительные клавиши) — драйвер evdev. При этом для сопоставления кодов клавишам следует использовать описание модели microsoft7000 (клавиатура из вышеупомянутого комплекта MS Natural Ergonomic Desktop 7000).

Теперь перезапустим hal daemon, чтобы он перечитал политики, и display manager, чтобы он перечитал настройки:

# /etc/init.d/haldaemon restart
Stopping HAL service:                                                   [ DONE ]
Starting HAL service:                                                   [ DONE ]
# /etc/init.d/dm restart
Stopping display manager service:                                       [ DONE ]
Starting display manager service:                                       [ DONE ]

Посмотреть на результат можно командой hal-device

Если теперь посмотреть события X11 (например, в xev), то вы заметите, что все клавиши заработали, но клавиши с цифрами 1-5 над кнопкой «My Favorites» генерируют keysym NoSymbol. Чтобы можно было нормально пользоваться дополнительными кнопками, нужно их коды привязать к более юзабельным keysym-ам. Сделать это можно по-разному, например, описать желанные привязки в файлах конфигурации иксового модуля XKB. Подробности можно найти в превосходном руководстве по XKB Ивана Паскаля. Есть и другой метод — использование xmodmap. Что выбрать — решать вам. Я выбрал способ с xmodmap.

xmodmap позволяет связывать коды клавиш с keysym’ами. Для решения нашей проблемы напишем следующий файлик:

$ cat ~/.Xmodmap
!
! MS NEK 4k multimedia keys
!
keycode 183 = F21
keycode 184 = F22
keycode 93  = F23
keycode 131 = F24
keycode 247 = F25

Если теперь выполнить xmodmap ~/.Xmodmap, то дополнительные клавиши 1-5 начнут генерировать коды F21-F25, которые уже можно будет где-то использовать.

Основная проблема в ALT Linux в том, что в дистрибутиве «из коробки» выполнить-то эту конструкцию неоткуда. Файл .xsession исполняется только если не выбран оконный менеджер. Если включить вызов xmodmap в .xsession.d/* или в .xprofile, то переназначение клавиш затрется последующим вызовом setxkbmap (из fixkeyboard). Поэтому, нужно либо править файл /etc/X11/Xsession, чтобы какой-то из файлов выполнялся после вызова fixkeyboard, либо править fixkeyboard, чтобы пользовательский .Xmodmap выполнялся независимо от состояния XKB. Например, можно привести конец файла /etc/X11/xinit/fixkeyboard к следующему виду:

# xkb and xmodmap don't play nice together
#if [ -z "$XKB_IN_USE" ]; then
#       [ -s $sysmodmap ] && xmodmap "$sysmodmap"
        [ -s $usermodmap ] && xmodmap "$usermodmap"
#fi

Тогда пользовательский .Xmodmap будет автоматически выполнен при запуске сессии пользователя.

При выборе метода с модификацией XKB эти изменения не потребуются.

Что дальше?

Вы можете использовать xbindkeys для того, чтобы назначить дополнительным клавишам желаемые действия, независимо от оконного менеджера. Либо использовать для этого встроенные средства оконного менеджера/десктопного окружения. Например, чтобы в KDE назначить клавишам регулировки и отключения звука соответствующие действия, запустите KMix, выберите в меню Настройка -> Глобальные комбинации клавиш и назначьте действиям соответствующие клавиши. Чтобы осуществлять вызов калькулятора по одноименной кнопке, откройте «редактор меню» (из контекстного меню кнопки К или из меню Настройка -> Редактор меню), перейдите к пункту Служебные -> Рабочий стол -> Калькулятор (KCalc), и назначьте соответствующую «текущую клавишу».

Продвинутые пользователи с опытом пересборки ядер под ALT Linux могут попытаться завести также рычажок зума и кнопку проверки орфографии. Необходимая информация есть по ссылкам ниже.

Ссылки