LIRC with dev/input

Неведнъж съм имал проблеми с lirc_gpio – драйвера за работа с дистанционните управления на някои от най-популярните TV Tuner-и. В последните версии на ядрото, секцията за поддръжка на видеокамери, TV tuner-и и всякакви подобни мултимедийни устройства, е обект на непрестанни промени, и в крайна сметка се стигна дотам, че lirc_gpio се оказа абсолютно неадекватен към текущата версия – 2.6.22. Опитът за зареждане на драйвера спира със следното съобщение:

# modprobe lirc_gpio
FATAL: Error inserting lirc_gpio
(/lib/modules/2.6.22/misc/lirc_gpio.ko):
Unknown symbol in module, or unknown parameter (see dmesg)

Причината за невъзможността на lirc_gpio дори да зареди е в някои премахнати символи в bttv секцията на ядрото (виж тук за повече информация). Работата е там, че въпросните символи не са премахнати от раз – поне 6-7 версии назад зареждането на lirc_gpio беше придружено от краткия, но ясен текст:

The bttv_* interface is obsolete and will go away, please use the
new, sysfs based interface instead.

Разбира се, първата работа, след като вече имах работещо ядро 2.6.22, беше да пратя съобщение до mailing list-а на LIRC за проблема. Изглежда нещата са по-сериозни, или точно този драйвер в момента няма разработчик, защото вече почти месец няма fix на въпросния проблем.

Ако някога сте ползвали дистанционно за управление на музикалния си плейър, или при гледане на филми с компютър, със сигурност ще оцените липсата му в първия момент, в който то не работи. Понеже ми писна от дребните проблемчета при lirc_gpio, започнах да преглеждам варианти за използване на дистанционното без да ми се налага да прибягвам до услугите на въпросния драйвер.

Оказа се, че някои от картите в bttv регистрират собствен event device, който всъщност представлява интерфейс към дистанционното управление на тунер-а. Наличието или липсата на event device зависи от опцията card при зареждане на драйвера (за някои от картите е известно адресирането на infrared приемника, за други липсва). При мен досега card беше установена на 13 и, както можете да предположите, event device нямаше. Преглеждайки списъка с поддържани карти (файлът CARDLIST.bttv в директория Documentation/video4linux от изходния код на ядрото), установих, че варианти за моят модел са опциите 6 и 41. Пробата с 41 не даде резултат, но с 6 нещата започнаха да си идват на мястото. Във файла /etc/modprobe.d/bttv сложих следните опции:

alias char-major-81     videodev
alias char-major-81-0   bttv
options bttv            card=6 radio=1 pll=1 tuner=5

С тях, при зареждането си, драйвера започна да създава и необходимият event device:

$ cat /proc/bus/input/devices
...
I: Bus=0001 Vendor=109e Product=036e Version=0001
N: Name="bttv IR (card=6)"
P: Phys=pci-0000:00:0a.0/ir0
S: Sysfs=/class/input/input2
U: Uniq=
H: Handlers=kbd event2
B: EV=100003
B: KEY=40fc310 82140000 0 0 0 0 2048000 180 4001 9e0000 0 0 ff

След като имах готовия интерфейс, оставаше да накарам LIRC да работи с него. Небходима ми беше малко информация от списъка с input-устройствата по-горе. Тя се намира на реда, започващ с H: и показва името на устройството, създадено в /dev/input. В моят случай устройството е event2 и за да създам lircd.conf за него, изпълних следното:

# irrecord -H dev/input -d /dev/input/event2 lircd.conf

Следвайки инструкциите създадох файла и го копирах в /etc/lirc, замествайки старият lircd.conf. Последната стъпка беше да редактирам файла hardware.conf в същата директория. Ето как изглеждаше той след промените:

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS=""

#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false

#Try to load appropriate kernel modules
LOAD_MODULES=false

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="dev/input"
# If DEVICE is set to /dev/lirc and devfs is in use /dev/lirc/0
# will be automatically used instead
DEVICE="/dev/input/by-path/pci-0000:00:0a.0--event-ir"
MODULES=""

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

Обърнете внимание на реда, който започва с DEVICE=. Първоначално там седеше DEVICE="/dev/input/event2", но това доведе до объркване с event device на мишката. За да не ми се налага да пипам udev-правила използвах автоматично създаваният symlink към всеки event device в директория /dev/input/by-path. Ако не сте сигурни кое от устройствата в тази директория е дистанционното, или имате повече от един TV tuner – погледнете реда, започващ с P: при изпълнението на командата:

cat /proc/bus/input/devices
...
P: Phys=pci-0000:00:0a.0/ir0
...

При мен, както виждате, дистанционно се регистрира като pci-0000:00:0a.0/ir0, и в /dev/input/by_path имам кореспондиращ symlink към /dev/input/event2 с име pci-0000:00:0a.0--event-ir. След като нанесете промените, запишете hardware.conf и рестартирайте LIRC:

/etc/init.d/lirc restart

При мен това доведе до успех – LIRC захапа дистанционното и без никакви грижи започна да реагира на сигналите от него без необходимост да ползвам проблемния драйвер lirc_gpio, от което съм повече от доволен.

Update (04.04.2008): Версия 0.8.2 на lirc за Debian идва с преработен init script, който проверява за наличие на модулите, указани в реда MODULES= на файла /etc/lirc/hardware.conf. Поддръжката на /dev/input устройства не изисква наличието на никакви модули от lirc пакета, затова реда изглежда така:

MODULES=""

Маркери: , ,

За тази статия



Категории

Подобни статии