Bog BOS: Использование пульта ДУ в Linux: Lirc
Пакет Lirc позволяет использовать пульт ДУ для управления операционной системой Linux и прикладными программами. В качестве пульта ДУ можно использовать как самодельные устройства (на сайте даются рекомендации по их изготовлению), так и промышленно изготавливаемые ИК передатчики. В частности, я использую пульт ДУ и ИК приёмник от ТВ тюнера AVerMedia TVPhone98 w/VCR и ТВ тюнера AverMedia AVerTV Studio 307. Пакет также позволяет использовать оборудование для передачи ИК сигналов.
В состав пакета входят:
- драйверы различных устройств (модули ядра)
- демон lircd, преобразующий ИК сигналы, полученные от драйвера, в стандартные сообщения, которые прикладные программы могут получить через сокет
- демон lircmd, получающий сообщения от lircd и имитирующий мышку в X Windows
- программы для управления приложениями, которые не имеют прямого интерфейса с lircd
- irexec — запуск программ по нажатию кнопки ДУ
- irxevent — посылка X Windows сообщения по нажатию кнопки ДУ
- irpty — псевдотерминал, запускает программу и имитирует нажатие клавиш клавиатуры
- вспомогательные программы для отладки и настройки
- irrecord — утилита для создания lircd.conf
- irw — читает сообщения с сокета lircd и выдает на stdout; в качестве параметра можно указать имя сокета (/dev/lircd); на каждое нажатие выдаётся строка текста (число-повторений у меня всегда равно нулю; имя-клавиши и имя-пульта-ДУ определяются в /etc/lircd.conf и не могут содержать пробелы):
- ircat — отладочная программа для конфигурационного файла
/.lircrc; в качестве параметра указывается имя программы (точнее имя описывающей её секции); по нажатию кнопки на пульте ДУ ircat выводит на stdout строку, привязанную к этой кнопке
- mode2, smode2, xmode2 — осциллоскоп для инфракрасных сигналов (smode2 требует svgalib); не работает с TV картами
- rc (переименован в irsend) — посылает команды на видеомагнитофон или ТВ (если позволяет оборудование), есть отдельный пакет xrc
- интерфейсная библиотека: liblirc_client
- правила для udev: /etc/udev/rules.d/lirc.rules
- отдельный пакет lircrc_config — GUI для редактирования
/.lircrc (gvim удобнее 😉
Сервер lircd преобразует ИК сигналы, полученные от различных драйверов, в стандартного вида сообщения, которые прикладные программы могут получить через сокет (/dev/lircd). В качестве параметра можно указать имя файла настройки (обычно /etc/lircd.conf). По сигналу HUP сервер перечитывает файл настройки и переоткрывает журнальный файл (если не используется syslog), после чего извещает клиентов. Ключи:
- —nodaemon (отладочная печать, не уходить в фоновый режим)
- —permission=mode (0666; права доступа к сокету при его создании, если файл уже существует в момент запуска, то права доступа не изменяются)
- —driver=имя-драйвера (полный список имён можно получить запустив lircd с ключом «-H help»)
- —device=имя-файла (/dev/lirc)
- —listen=порт (8765; слушать сетевой порт)
- —connect=хост[:порт] (использовать сервер lircd на другом хосте)
- —output=имя-сокета (/dev/lircd)
- —pidfile=имя-файла (/var/run/lircd.pid)
- —logfile=имя-файла (syslog или /var/log/lircd в зависимости от параметров сборки)
Сервер lircmd получает сообщения от lircd и имитирует мышку типа MouseSystems, IntelliMouse или IMPS/2. Файл настройки — /etc/lircmd.conf. Ключ —nodaemon позволяет отлаживать работу сервера. Сообщения об ошибках выводятся на syslog.
- установить драйверы для AverMedia AVerTV Studio 307 (модуль saa7134 и пр.) и обеспечить их загрузку (в частности, saa7134 подгружает модуль ir_common:
- FC3: установить пакеты с репозитория at-stable: lirc-kmdl-2.6.10-1.770_FC3.i686 (не нужен?), lirc-lib-devel.i386, lirc-lib.i386, lirc.i386, lirc-devices.noarch, portaudio.i386 (зачем он понадобился?)
- FC6: установить пакеты lirc, lirc-devel и lirc-doc
- посмотреть какое клавиатурное устройство создают saa7134/ir_common (в данном случае /dev/input/event2):
- отредактировать /etc/sysconfig/lircd в FC3 или /etc/sysconfig/lirc в FC6 (не удивлюсь, если при следующей загрузке номер устройства будет другим — у меня в /dev/input/ длинный список):
- проверить /etc/init.d/lircd (/etc/init.d/lirc в FC6)
- установить /etc/lircd.conf (взять здесь от Nickolay V. Shmyrev)
- тестовый запуск:
- запустить irw и понажимать кнопки на пульте ДУ (пришлось остановить lirc и поменять настройки кнопок с цифрами с помощью «irrecord -H dev/input -d /dev/input/event4 /etc/lircd.conf»; взять результат в /etc/lircd.conf.conf)
- обеспечение запуска lircd:
- создать
/.lircrc и опробовать его с помощью irexec
- для моего пульта ДУ требуется предварительно установить, настроить и загрузить драйверы v4l и bttv
- скачать и развернуть архив
- при сборке пакета создаются модули ядра (непонятно зачем, если все непосредственное взаимодействие с аппаратурой производится драйверами btttv и i2c), поэтому ядро необходимо подготовить для сборки
- cd /usr/src/linux-2.4
- make distclean (может достаточно make mrproper?)
- make menuconfig (сразу выйти с сохранением)
- make dep
- make bzImage (warning: kernel is too big for standalone boot from floppy, но я и не собираюсь его устанавливать, но если ядро не собрать, то модуль потом не загружается)
- make modules (не компилируется drivers/addon/cipe, убрал ее и поменял drivers/addon/Makefile)
- ./setup.sh (создает configure.sh на всякий случай для последующего запуска, нужен пакет dialog — /usr/bin/dialog)
- Driver configuration -> TV card -> AverMedia TV card (TVCapture 98, TVPhone98; card 13/41)
- Software configuration -> Compile tools for X-Windows
- Save configuration & run configure
- make (нужен root, т.к. собирается модуль в /usr/src/linux)
- make install (устанавливаются модули ядра!)
- /lib/modules/2.4.18-14/misc/lirc_dev.o
- /lib/modules/2.4.18-14/misc/lirc_gpio.o
- /dev/lirc (char 61, 0)
- /dev/lircd (named pipe)
- /dev/lircm (named pipe)
- /usr/local/sbin: lircd, lircmd
- /etc/lircd.conf (из remotes/avermedia/lircd.conf.avermedia98)
- /etc/lircmd.conf (из remotes/avermedia/lircmd.conf.avermedia98)
- /usr/local/lib: liblirc_client.a, liblirc_client.so.0.0.0, liblirc_client.so.0, liblirc_client.so, liblirc_client.la
- /usr/local/bin: irw, irpty, irexec, ircat, mode2, rc, irxevent, xmode2, irrecord
- /usr/local/include/lirc/lirc_client.h
- /usr/local/man/man1: irexec.1, ircat.1, irpty.1, irrecord.1, irw.1, irxevent.1, mode2.1, smode2.1, xmode2.1, rc.1
- /usr/local/man/man8: lircd.8, lircmd.8
- поменять права для /dev/lircd и /dev/lircmd, если хочется иметь доступ к lirc не только для root
- depmod -a # обновление БД зависимости модулей ядра
- для моего пульта ДУ требуется предварительно установить, настроить и загрузить драйверы v4l и bttv
- скачать и развернуть архив
- при сборке пакета создаются модули ядра (непонятно зачем, если все непосредственное взаимодействие с аппаратурой производится драйверами btttv и i2c), поэтому ядро необходимо подготовить для сборки
- cd /usr/src/linux-2.4
- make distclean (может достаточно make mrproper?)
- make menuconfig (сразу выйти с сохранением)
- make dep
- make bzImage (warning: kernel is too big for standalone boot from floppy, но я и не собираюсь его устанавливать, но если ядро не собрать, то модуль потом не загружается)
- make modules (не компилируется drivers/addon/cipe, убрал ее и поменял drivers/addon/Makefile)
- ./setup.sh (создает configure.sh на всякий случай для последующего запуска, нужен пакет dialog — /usr/bin/dialog)
- Driver configuration -> TV card -> AverMedia TV card (TVCapture 98, TVPhone98; card 13/41)
- Software configuration -> Compile tools for X-Windows
- Save configuration & run configure
- make (нужен root, т.к. собирается модуль в /usr/src/linux)
- make install (устанавливаются модули ядра!)
- /lib/modules/2.4.18-14/misc/lirc_dev.o
- /lib/modules/2.4.18-14/misc/lirc_gpio.o
- /dev/lirc (char 61, 0)
- /dev/lircd (named pipe)
- /dev/lircm (named pipe)
- /usr/local/sbin: lircd, lircmd
- /etc/lircd.conf (из remotes/avermedia/lircd.conf.avermedia98)
- /etc/lircmd.conf (из remotes/avermedia/lircmd.conf.avermedia98)
- /usr/local/lib: liblirc_client.a, liblirc_client.so.0.0.0, liblirc_client.so.0, liblirc_client.so, liblirc_client.la
- /usr/local/bin: irw, irpty, irexec, ircat, mode2, rc, irxevent, xmode2, irrecord
- /usr/local/include/lirc/lirc_client.h
- /usr/local/man/man1: irexec.1, ircat.1, irpty.1, irrecord.1, irw.1, irxevent.1, mode2.1, smode2.1, xmode2.1, rc.1
- /usr/local/man/man8: lircd.8, lircmd.8
- поменять права для /dev/lircd и /dev/lircmd, если хочется иметь доступ к lirc не только для root
- depmod -a # обновление БД зависимости модулей ядра