Последнее изменение файла: 2007.02.16
Скопировано с www.bog.pp.ru: 2023.09.23
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:
saa7134[0]: registered input device for IR
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/ длинный список):
LIRCD_OPTIONS="-H dev/input -d /dev/input/event2"
проверить /etc/init.d/lircd (/etc/init.d/lirc в FC6)
установить /etc/lircd.conf (взять
здесь от Nickolay V. Shmyrev)
тестовый запуск:
service lirc[d] start
запустить irw и понажимать кнопки на пульте ДУ (пришлось остановить lirc и
поменять настройки кнопок с цифрами
с помощью "irrecord -H dev/input -d /dev/input/event4 /etc/lircd.conf";
взять результат в /etc/lircd.conf.conf)
обеспечение запуска lircd:
chkconfig --level 345 lirc[d] on
создать ~/.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/sbin/lircd (это демон, журнал в /var/log/lircd)
запускаем irw и жмем кнопки на пульте ДУ, на терминал должны выводиться названия клавиш
Настройка lircd производится с помощью файла /etc/lircd.conf
(лучше не трогать без нужды ;).
Настройка lircmd производится с помощью файла /etc/lircmd.conf
(я его удалил, чтобы lircmd не запускался совсем).
Чтобы обеспечить автоматический запуск lircd (и, если нужно, lircmd)
копируем /etc/init.d/lircd из lirc-0.6.5-fr3.i386.rpm в /etc/rc.d/init.d (поправить с учетом /usr/local/sbin).
Затем добавляем lircd в список сервисов:
/sbin/chkconfig --add lircd
/sbin/chkconfig --level 2345 lircd on
Запускаем lircd (и lircmd) в первый раз вручную (при следующей
загрузке это произойдет автоматически):
Демон lircd декодирует сигналы, поступающие с ИК приемника, и передает приложениям
сообщения в виде пары: имя приемника, имя клавиши. Имя клавиши задается в /etc/lircd.conf
совпадающим с надписью на соответствующей кнопке ДУ. Например, для моих устройств ДУ передаются
следующие имена приемников и клавиш:
Для доступа к /dev/lircd большинство приложений использует входящую
в состав пакета библиотеку liblirc_client. Так как в состав библиотеки входят подпрограммы
разбора файлов конфигурации, то большинство приложений используют для настройки
интерфейса с пультом ДУ файлы одного формата, точнее 1 файл. По умолчанию, этот файл называется
~/.lircrc, но приложение может позволять задавать отдельный файл конфигурации.
Файл конфигурации состоит из блоков строк, заключенных
между скобками begin и end. Директива include вставляет содержимое указанного файла.
После запуска каждое приложение находится с точки
зрения библиотеки liblirc_client в основном режиме, при обработке очередного блока
приложение может перейти в указанный в нем поименованный режим. Блоки, описывающие
поведение программы в поименованном режиме, заключаются в файле конфигурации
в скобки
begin имя-режима
begin
...
end
...
end имя-режима
Внутри блока могут быть использованы следующие директивы:
prog = имя программы, к которой относится данный блок
remote = имя приемника (по умолчанию - *, т.е. любой)
button = имя клавиши
repeat = число (что делать, если клавиша нажата несколько раз; по умолчанию - 0,
т.е. игнорировать повторы, иначе учитывать каждое n-е нажатие)
delay = число (по умолчанию - 0; сколько повторений пропустить прежде чем начать
обработку директивы repeat)
config = строка, передаваемая приложению (если задано несколько директив config,
то значение каждой строки передается приложению по очереди при нажатии той же клавиши;
непечатные символы записываются как в C - \n или \xFF)
mode = переход в указанный режим
(если имя режима совпадает с именем приложения, то оно переходит в данный режим при запуске;
действия по переключениям режимов выполняются для всех клиентских программ независимо от
значения prog (и похоже, что независимо от текущего режима);
все приложения рекомендуется запускать одновременно, чтобы избежать
рассогласования режимов)
flags =
startup_mode (при запуске приложение сразу переходит в указанный в директиве режим)
mode (покинуть режим; только для блоков внутри поименованного режима)
once (только в сочетании с директивой mode; строка config передается приложению только
при входе и выходе из режима)
quit (прекратить разбор блоков)
В одном блоке может быть задана последовательность директив remote и button,
в этом случае для передачи строки приложению требуется последовательное нажатие указанных кнопок
(удобно для задания пароля для poweroff ;).
Если приложение может самостоятельно обрабатывать команды ДУ (mplayer, xine,
xawtv, tvtime), то для него задаются отдельные блоки в конфигурационном файле:
begin
prog = mplayer
button = FULLSCREEN
config = vo_fullscreen
end
Если приложение может управляться событиями X Windows, то
интерфейс между Lirc и приложением осуществляется с помощью утилиты irxevent
(в качестве параметра может задаваться имя файла конфигурации; irxevent надо запускать
в начале сеанса вместе с другими lirc-приложениями):
begin
prog = irxevent
button = POWER
config = Key Escape xawtv
end
В директиве config кроме имени клавиши X Windows
(см. список в файле irxevent.keys)
или символа (возможно, с использованием префиксов shift-,
numlock-, ctrl-, alt-, meta-) можно также указывать:
config = Button кнопка-мышкиxyимя-окна
config = xy_Key xyклавишаимя-окна
Вместо имени окна (часто совпадает с именем приложения, см. также xwininfo и xev)
можно указывать идентификатор окна или CurrentWindow или RootWindow.
Некоторые программы (xterm, xemacs) требуется настраивать, чтобы они позволяли прием сообщений
(при этом создается дырка в безопасности!):
XTerm.vt100.allowSendEvents: true
Если приложение управляется нажатием клавиш клавиатуры (консольная программа), то
ею можно управлять с помощью утилиты irpty (в данном случае для каждого приложения необходим
отдельный файл конфигурации, утилита создает псевдотерминал):
Запуск приложений по нажатию кнопок ДУ можно
осуществлять с помощью утилиты irexec,
для чего надо вставить в скрипт инициализации сеанса ( .bash_profile? ):
irexec --daemon [имя-файла-конфигурации]
Перед этим в ~/.lircrc надо записать:
begin
prog = irexec
button = VIDEO
mode = mplayer
config = gmplayer 1>/dev/null 2>/dev/null &
flags = once
end
begin
prog = irexec
button = TV/FM
config = xawtv -geometry 768x576 >/dev/null &
mode = xawtv
flags= once
end
begin xawtv
begin
prog = irxevent
button = POWER
config = Key Escape xawtv
end
end xawtv
begin mplayer
begin
prog = mplayer
button = FULLSCREEN
config = vo_fullscreen
end
end mplayer
irexec можно также использовать для управления приложениями, имеющими
вспомогательные управляющие программы:
begin
prog = irexec
button = power
config = xawtv-remote quit
flags = mode
end