Настройка LIRC в Debian
Ниже представлен мой собственный опыт в настройке LIRC для управления аудиоплеером на выделенной для него железке.
Софт
В качестве ОСи в плеере используется Debian Squeeze. Вначале все было опробовано на тестовом компьютере, после чего перенесено на целевую систему.
Костыль номер 0: В дефолтном ядре не включена поддержка LIRC, поэтому модуль придется собирать вручную. Попытка собирать по этому мануалу успеха не имела. На всякий случай скопирую сюда:
# apt-get install lirc liblircclient0 lirc-modules-source setserial module-assistant linux-headers-$(uname -r) # dpkg-reconfigure lirc-modules-source > serial > ANIMAX > NO > NO > 0x3f8 > IRQ 4 # m-a update,prepare # m-a clean lirc # m-a a-i lirc # depmod -a
Костыль номер 1: Вот на моменте сборки lirc-модуля (m-a a-i lirc) процесс завершался с ошибкой. В итоге было найдено другое руководство, тут модули для lirc собирались из архива с официального сайта.
# apt-get install lirc setserial linux-headers-$(uname -r) build-essential dialog automake libtool help2man # wget -O lirc.tar.gz 'http://lirc.cvs.sourceforge.net/viewvc/lirc/lirc/?view=tar' # tar xf lirc.tar.gz # cd lirc # ./autogen.sh # ./setup.sh > отвечаем на вопросы в 1-м и 2-м пунктах. Мы будем использовать serial-датчик с собственным тактированием. > сохраняем настройки и запускаем configure, выбрав 3-й пункт # make # make install
Модуль для ядра собран, lirc поставлен, осталось настроить.
Железо
В качестве схемы ИК-приемника был использован простейший вариант из этого руководства, но с поправками.
В качестве датчика использовался TSOP 4836 (целенаправленно не искал, просто такое дали в радиомагазине по запросу "эээ... Нужен ИК-приемник с ключом внутри... Ну вот как в телевизоры ставят, с тремя выводами... Ну вы поняли :)"). Как выяснилось позже, искал я немного не такой датчик, но хорошо, что взял именно этот. А еще лучше было бы, если б взял с частотой 38 КГц (соответственно, TSOP 4838) - вроде большинство пультов используют именно ее. Продали мне его за 10 грн =\.
Кроме того, так как датчик будет внутри плеера - а значит, есть полный доступ к любому питанию в компьютере - значит, нет смысла городить огород с формированием питания из шины данных COM-порта. Поэтому из показанной выше схемы стабилизатор, диод и емкость можно убрать, резистор на 4,7 КОм (или любой близкий по номиналу. Вообще внутри ИК-датчика уже есть резистор, но его сопротивления в 33 КОм не хватало для подтяжки линии COM-порта к высокому уровню и схема не работала) включается между выводами данных и питания датчика (не ленимся заглянуть в даташит, чтобы узнать, где какой вывод. На моем это были "Выход-Общий-Питание", а не так, как там на картинке). Сигнальный выход и общий провод подключаем, как на схеме - к 1 и 5 контактам COM-порта соответственно, а вот +5В можно взять, например, с USB-разъема на материнской плате.
При желании и возможности можно проверить работоспособность датчика осциллографом. Дефолтно держится высокий уровень; выставив низкую частоту развертки и ждущий режим можно пронаблюдать изменение вида кодовых посылок при нажатии разных кнопок на пульте.
Настройка
Далее снова возвращаемся к этому мануалу.
При подгрузке lirc_serial порт не должен быть ничем занят, поэтому устанавливаем режим через setserial
# setserial /dev/ttyS0 uart none
И прописываем это в его конфиг, чтобы настройка автоматом делалась при загрузке
# echo /dev/ttyS0 uart none > /var/lib/setserial/autoserial.conf # cp /var/lib/setserial/autoserial.conf /etc/serial.conf
Загружаем модуль для работы lirc
# modprobe lirc_serial
Проверяем работу ИК-датчика. У меня команда упорно ломилась на несуществующий девайс, поэтому пришлось указать руками:
# mode2 -d /dev/lirc0
По экрану при нажатии на кнопки пульта должны побежать строчки с циферками. Если не работает - ищем, что мы сделали не так.
Далее создаем или правим конфиги:
В /etc/lirc/hardware.conf:
LIRCD_ARGS="--output=/var/run/lirc/lircd --pidfile=/var/run/lirc/lircd.pid" START_IREXEC=true LOAD_MODULES=true DEVICE="/dev/lirc0" MODULES="lirc_serial" LIRCD_CONF="/etc/lirc/lircd.conf"
Костыль номер 2: Почему-то lircd упорно не хотел создавать сокет и PID-файл, если был запущен из стартового скрипта, но прекрасно все создавал, если был запущен руками (lircd -n -d /dev/lirc0). И там, и там он был запущен от рута и с одинаковыми параметрами. Логику я так и не понял, поэтому сотворил первую строку.
Далее изучаем наш пультик. Запускаем
irrecord -d /dev/lirc0 ~/lircd.conf
и следуем инструкциям: когда спросит имя - вводим имя кнопки (для того, чтобы узнать зарезервированные есть смысл запустить irrecord --list-namespace), потом нажимаем соответствующую кнопку на пульте.
Сгенерированный файл перемещаем в /etc/lirc/lircd.conf.
Можно запустить lircd (service lirc restart), ругнется на неработающий irexec, но мы его еще не настроили. Запускаем irw, нажимаем кнопки и наблюдаем появление соответствующих строчек в консоли.
Костыль номер 3: Осталось настроить привязку клавиш к выполнению различных действий. Для этого нужен irexec. Но у меня он почему-то упорно ломился на /dev/lircd в качестве сокета. Так как переопределить в конфиге такое поведение нельзя, пришлось до старта демона делать симлинк, прописав в /etc/init.d/lirc в start-секции строчку
if [ "$START_IREXEC" = "true" ]; then + ln -sf /var/run/lirc/lircd /dev/lircd
Наполняем /etc/lirc/lircrc блоками вида:
begin prog = irexec button = KEY_VOLUMEDOWN repeat = 1 config = su -l rain -c 'mocp -v -2' end begin prog = irexec button = KEY_SHUFFLE config = su -l rain -c 'mocp -t shuffle' end
где значения в button - то, что мы раньше прописывали с помощью irrecord.
Перезапускаем сервис lirc еще раз. Пользуемся.
Запуск в эксплуатацию
На целевой машине настройка немного отличалась от тестовой.
Во-первых, там самосборное ядро, поэтому почти ничего из раздела "Софт" делать не надо. Просто включаем CONFIG_LIRC_SERIAL (находится в Device Drivers -> Staging drivers -> Media staging drivers -> Linux Infrared Remote Control и зовется "Homebrew Serial Port Receiver". Не забываем в "Мультимедиа" включить "Remote Controller support" и в появившемся меню - "LIRC"). Ставим только пакет lirc и радуемся.
Во-вторых, так как я собирал безмодульное ядро (мне так удобнее - залил бинарник и все), то драйвер последовательного порта 8250 и lirc_serial начинали драться за один и тот же адрес (помним про setserial в первом варианте, да. Вот тут оно не поможет, поэтому настройку setserial можно пропустить). Надо было передать нужные параметры драйверу 8250; как это сделать - я сходу не нашел, но в итоге дошел до того, что можно просто отключить драйвер последовательного порта в ядре - все равно ведь у нас там постоянно ИК-порт висеть будет. Выкинул драйвер и все стало хорошо.
В-третьих, при настройке в конфиге /etc/lirc/hardware.conf убираем теперь уже лишние:
LOAD_MODULES=true MODULES="lirc_serial"
ставя false в первом случае и ничего - во втором.
В остальном настройка не отличается.
Ссылки
- http://compas.com.ua/oco/mobile/articles.php?lng=ru&pg=205
- http://unixforum.org/index.php?showtopic=99268
- http://karuppuswamy.com/wordpress/2012/04/23/how-to-get-lirc-infrared-remote-control-working-in-debian-6-0-squeeze/
- http://www.open-life.org/blog/howto/569.html
- http://www.forum.free-x.de/wbb/index.php?page=Thread&threadID=802