Инструменты пользователя

Инструменты сайта


blog:2012:0113_cyberlink_remote_for_xbmc

Хороший пульт для 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

Спасибо Кравченко Олегу за подсказку

blog/2012/0113_cyberlink_remote_for_xbmc.txt · Последнее изменение: 2022-02-19 18:16 — 127.0.0.1