Хороший пульт для HTPC
Наконец-то, на новогодних каникулах я разжился нормальным пультом Sapphire Theatrix! Он является полной копией пульта Cyberlink Remote и определяется как нормальная USB-клавиатура в отличие от пульта Мастеркит. Из коробки умеет регулировать громкость, нажимать Enter и делать другие бесполезные вещи, и чтобы сделать из него полноценный пульт для HTPC надо повозиться.
Подключим ИК-приёмник и проверим опознало ли его ядро:
$ dmesg | tail ... [ 5298.291730] usb 3-2: Product: USB IR Combo Device [ 5298.291738] usb 3-2: Manufacturer: TopSeed Tech Corp. [ 5298.311667] input: TopSeed Tech Corp. USB IR Combo Device as /devices/pci0000:00/0000:00:04.0/usb3/3-2/3-2:1.0/input/input9 [ 5298.312194] topseed 0003:0766:0204.0007: input,hidraw4: USB HID v1.00 Keyboard [TopSeed Tech Corp. USB IR Combo Device ] on usb-0000:00:04.0-2/input0 [ 5298.327727] input: TopSeed Tech Corp. USB IR Combo Device as /devices/pci0000:00/0000:00:04.0/usb3/3-2/3-2:1.1/input/input10 [ 5298.328453] topseed 0003:0766:0204.0008: input,hiddev0,hidraw5: USB HID v1.00 Mouse [TopSeed Tech Corp. USB IR Combo Device ] on usb-0000:00:04.0-2/input1 ...
Приёмник определился как «комбо-устройство ввода» состоящее из двух клавиатур и мыши: выяснилось, что первая клавиатура отвечает за те кнопки, которые посылают повторения при удержании (например, «вверх», «вниз» и т.д.), а вторая отвечает за «обычные» кнопки, которые не генерируют повторений. Зачем в приёмнике «мышь» я не понял.
Также выяснилось, что Debian Squeeze 6.0.3 периодически забывает создать символическую ссылку для второй клавиатуры в /dev/input/by-id
, поэтому придётся писать UDEV-скрипт, который будет создавать символические ссылки в /dev/input
на оба устройства ввода с именами irrecord0
и irrecord1
.
Для скрипта нам необходима информация об устройстве, сначала узнаем идентификаторы производителя и устройства:
$ lsusb ... 0766:0204 Jess-Link Products Co., Ltd TopSpeed Cyberlink Remote Control ...
Затем найдём имена устройств ввода, для чего придётся покопаться в псевдофайловой системе:
$ cat /proc/bus/input/devices
Там надо искать строки Handlers=
соответствующие нашему приёмнику, а в них номера event-устройств: у меня это event6
и event7
.
Узнав имена устройств, определим их major- и minor-номера:
# udevadm info -q all -n /dev/input/event6 | egrep -i 'major|minor' E: MAJOR=13 E: MINOR=70 # udevadm info -q all -n /dev/input/event7 | egrep -i 'major|minor' E: MAJOR=13 E: MINOR=71
Теперь в наличии есть вся информация для скрипта:
- /etc/udev/rules.d/10-irremote.rules
SUBSYSTEM=="input",ATTRS{idVendor}=="0766",ATTRS{idProduct}=="0204",ATTR{dev}=="13:70",SYMLINK="input/irremote0" SUBSYSTEM=="input",ATTRS{idVendor}=="0766",ATTRS{idProduct}=="0204",ATTR{dev}=="13:71",SYMLINK="input/irremote1"
Чтобы скрипт сработал перезагрузим систему.
После перезагрузки смотрим список устройств ввода:
$ ls -l /dev/input ... lrwxrwxrwx 1 root root 6 Jan 14 00:20 irremote0 -> event6 lrwxrwxrwx 1 root root 6 Jan 14 00:20 irremote1 -> event7 ...
Если ссылки на месте, двигаемся дальше. Так как наш пульт ведёт себя как обычная клавиатура, то вместо монстра LIRC
обойдёмся программой inputlirc
, которая практически не нуждается в настройке.
Установим inputlirc
:
# apt-get install inputlirc
Отредактируем конфигурационный файл inputlirc
:
- /etc/default/inputlirc
# Options to be passed to inputlirc. EVENTS="/dev/input/irremote0 /dev/input/irremote1" OPTIONS="-g -m0 -c"
Вот что означают параметры, указываемые в конфигурационном файле:
- -g - захватывает устройство, чтобы пульт не мешал другим программам (например, Gnome-у)
- -m0 - по умолчанию
inputlirc
фильтрует клавиши с кодом ниже 88, этот параметр отменяет фильтр - -c - игнорировать нажатия клавиш-модификаторов (Alt, Shift, Ctrl), если пульт будет эмулировать их нажатия
Теперь запустим inputlirc
и проверим журнал на наличие ошибок:
# /etc/init.d/inputlirc restart Restarting inputlirc configuration $ tail /var/log/user.log
В качестве HTPC я использую замечательный центр XBMC, поэтому далее займёмся его настройкой.
Для того, чтобы узнать как называются кнопки пульта, можно использовать программу irw
, которая идёт вместе с пакетом LIRC
. Но в случае с XBMC, можно поступить проще - включим журнал отладки и посмотрим его содержимое, нажимая кнопки на пульте:
tailf ~/.xbmc/temp/xbmc.log
Узнав все названия кнопок пульта, назначим им внутренние кнопки XBMC. Список кнопок XBMC можно посмотреть по адресу: https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp#L1135
- ~/.xbmc/userdata/Lircmap.xml
<lircmap> <remote device="/dev/input/irremote1"> <menu>KEY_MEDIA</menu> <power>KEY_SLEEP</power> <myvideo>KEY_TV2</myvideo> <mymusic>KEY_MP3</mymusic> <mypictures>KEY_CAMERA</mypictures> <myvideo>KEY_VIDEO</myvideo> <mytv>KEY_TV</mytv> <record>KEY_RECORD</record> <_>KEY_RIGHT</_> <title>KEY_AUDIO</title> <teletext>KEY_TEXT</teletext> <_>KEY_CHANNEL</_> <subtitle>KEY_SUBTITLE</subtitle> <language>KEY_LANGUAGE</language> <display>KEY_ANGLE</display> <back>KEY_BACK</back> <info>KEY_PROPS</info> <menu>KEY_MENU</menu> <volumeplus>KEY_VOLUMEUP</volumeplus> <volumeminus>KEY_VOLUMEDOWN</volumeminus> <mute>KEY_MUTE</mute> <channelplus>KEY_CHANNELUP</channelplus> <channelminus>KEY_CHANNELDOWN</channelminus> <play>KEY_PLAY</play> <reverse>KEY_REWIND</reverse> <pause>KEY_PAUSE</pause> <forward>KEY_FASTFORWARD</forward> <skipminus>KEY_PREVIOUSSONG</skipminus> <stop>KEY_STOPCD</stop> <skipplus>KEY_NEXTSONG</skipplus> </remote> <remote device="/dev/input/irremote0"> <up>KEY_UP</up> <left>KEY_LEFT</left> <down>KEY_DOWN</down> <right>KEY_RIGHT</right> <select>KEY_ENTER</select> <one>KEY_1</one> <two>KEY_2</two> <three>KEY_3</three> <four>KEY_4</four> <five>KEY_5</five> <six>KEY_6</six> <seven>KEY_7</seven> <eight>KEY_8</eight> <nine>KEY_9</nine> <clear>KEY_DELETE</clear> <zero>KEY_0</zero> <select>KEY_ENTER</select> </remote> </lircmap>
Ссылки: http://wiki.xbmc.org/index.php?title=Hama_MCE_Remote
UPDATE: выяснилось, что после спящего режима X-сервер перехватывает приёмник как устройство ввода и inputlirc отваливается с ошибкой «device is busy». Чтобы X-сервер игнорировал приёмник создадим файл:
- /usr/share/X11/xorg.conf.d/00-irremote.conf
Section "InputClass" Identifier "Infrared remote" MatchDevicePath "/dev/irrecord*" Option "Ignore" "true" EndSection
Спасибо Кравченко Олегу за подсказку