воскресенье, 7 марта 2010 г.

Прыгающий нод lirc'а

Вечно забываю поститься тут. Буду навёрстывать.

Данная заметка всецело пригодиться пользователям пультов дистанционного управления для своих электронно-вычислительных машин (напр. продукция фирмы avermedia). Пользователи, активно использующие данные девайсы, наверняка сталкивались с внезапно не реагирующим на манипуляции курсором мыши прямо сразу после загрузки иксов и, всё так же внезапно, своей машиной, напрочь не реагирующей на команды, посылаемые с, собственно, ПДУ.

Вышеописанную проблему можно решить двумя способами:
1. Перетыкнуть (отсоединить-подсоединить) манипулятор типа "мышь". Мышка сразу заработает. Делать cat на всяческие /dev/input/event* и смотреть, реагирует ли оно на нажатия клавиш на ПДУ. Найденный прописать в /etc/conf.d/lircd и перезапустить lircd. Не забыть запустить офигевший от не того девайса irexec. Пульт работает. Повторять по мере необходимости и надеятся, что когда-нибудь оно само рассосётся.

2. Первый способ, конечно, действенный, но от него, почему-то, очень быстро устаёшь. :) Поэтому, легче всего немножко разобраться во всём этом.

Вообще говоря, раньше была очень удобоваримая нода типа pci-blablabla-blabla-event-ir, лежала она по адресу /dev/input/by-path/ и никуда она оттуда не девалась. Поэтому проблемы не существовало. Однако, после очередного когда-то произведённого emerge -DNu world данная проблема себя проявила: статическая нода исчезла и файлик конфигурации lirc'а пришлось исправить на event4 (например 4, у вас может быть, и скорее всего, будет по-другому). Собственно, работало оно очень долго, до очередного апдейта, после которого уже индекс ноды генерился как Бог на душу пошлёт (в порядке, в котором девайсы появляются в системе).


К чему я это? Да к тому, что если снова сделать статический нод и прописать его в соответствующем месте в /etc/conf.d/lircd то о проблеме можно будет забыть (хотя бы до следующего апдейта xD). Сделать такое можно при помощи udev'a (почитать о нём можно на сайтах и в манах).
Итак, в кратце, удев у нас строго следует определённым правилам. Правила эти лежат в каталоге /etc/udev/rules.d/. Если там уже есть файл 10-local.rules, то писать новое правило можно в него. В противном случае создаём указанный файл самодержавно. Что же в него писать? Для начала нужно найти правильный event* в каталоге /dev/input/. Делаем cat /dev/input/event4 (тыкайте табом и смотрите, какие там есть, перебирайте), тыкаем кнопки на пульте. Если в консоле появляется вывод - вы нашли верный файл устройства.

Для удобства изложения, положим, event4 - файл верный. Вы же, далее по тексту, вместо event4 представляйте свой вариант верного имени.

Затем выполняем следующую команду (фактически - две команды): udevadm info -a -p `udevadm info -q path -n /dev/input/event4` (это не одинарная кавычка, а штрих, который находится на одной кнопке с тильдой и буквой "Ё"; набирается в английской раскладке; текст, обрамлённый данными знаками интерпретируется интерпретатором как отдельная команда; можно подставлять в иные команды; детально об этом можно почитать в книжках по интерпретатору Борна, например). В выводе данной команды нас интересуют параметры первого parent (родительского) девайса (в случае использования пульта ДУ через/от tv-тюнер(а)). Нужна нам строчка ATTRS{name} (у меня оно выглядит так: ATTRS{name}=="bttv IR (card=41)"). Копируем данную строчку в буфер обмена. Далее возвращаемся к нашим баранам. То есть, открываем/создаём файл /etc/udev/rules.d/10-local.rules и пишем в него следующее:

KERNEL=="event*", ATTRS{name}=="bttv IR (card=41)", SYMLINK+="irremctrl"

Обратите внимание: никаких переносов, ибо удев расценит перенесённую на другую строку часть как отдельное правило, и получится ноое знает что. Вместо ATTRS{name}=="bttv IR (card=41)" вставляем из буфера ту самую строчку, что скопировали в него ранее. По-русски данное правило звучит следующим образом: когда (если) в системе появится устройство, проименованное ядром как event*, у которого атрибут "имя" соответствует bttv IR (card=41) - создать дополнительный (прирастить) симлинк irremctrl (в каталоге /dev). Теперь остаётся только перезапустить удев (/etc/init.d/udev restart). После перезапуска удева появится новая нода: /dev/irremctrl. Открываем /etc/conf.d/lircd и в соответствующем месте, вместо чего-то типа
LIRCD_OPTS="--driver=dev/input -d /dev/input/event4 /etc/lircd.conf"
Прописываем что-то типа
LIRCD_OPTS="--driver=dev/input -d /dev/irremctrl /etc/lircd.conf"
То есть меняем /dev/input/event4 на /dev/irremctrl.
Перезапускаем lircd и запускаем irexec, конечно.

Вот и всё.
Живи и процветай!

Комментариев нет: