Настройка LIRC в Debian

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Ниже представлен мой собственный опыт в настройке 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 в первом варианте, да. Вот тут оно не поможет). Надо было передать нужные параметры драйверу 8250; как это сделать - я сходу не нашел, но в итоге дошел до того, что можно просто отключить драйвер последовательного порта в ядре - все равно ведь у нас там постоянно ИК-порт висеть будет. Выкинул драйвер и все стало хорошо.

В-третьих, при настройке в конфиге /etc/lirc/hardware.conf убираем теперь уже лишние:

LOAD_MODULES=true
MODULES="lirc_serial"

ставя false в первом случае и ничего - во втором.

В остальном настройка не отличается.

Ссылки