SDB:Linux 红外遥控
请参阅本文的页面以获取更多信息。
关于
LIRC 软件包用于接收和转换遥控信号。结合 irexec 和 irxevent,您可以通过遥控器控制许多程序。用 LIRC 控制 VDR、MythTV、MPlayer 和 Kaffeine 等程序非常有趣。
安装
安装 LIRC 最简单的方法是使用 Yast。在默认仓库中搜索 LIRC 和兼容的 LIRC 内核模块。您不知道正在运行哪个内核吗?您可以通过以下命令查看:
user$ uname -r
您还可以从 www.lirc.org 下载 Tarball 并自行编译。如果您想要最新版本的 LIRC,必须使用 cvs 下载。详细手册存储在此处。
安装实用链接
配置
获取可用的系统信息
当您安装了 LIRC 和兼容的内核模块后,dmesg 应该会打印出有关遥控器红外接收器的有用信息(首先是未插入接收器时,然后是插入接收器时)。您可以通过 dmesg 输出检查是哪种遥控器。例如,如果您有一个 HID 遥控器。
user@host:~> dmesg
usb 7-2: new low speed USB device using uhci_hcd and address 3
usb 7-2: configuration #1 chosen from 1 choice
input: HID 05a4:9881 as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/7-2:1.0/input/input7
input,hidraw1: USB HID v1.10 Keyboard [HID 05a4:9881] on usb-0000:00:1d.1-2
input: HID 05a4:9881 as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/7-2:1.1/input/input8
input,hidraw2: USB HID v1.10 Mouse [HID 05a4:9881] on usb-0000:00:1d.1-2
usb 7-2: New USB device found, idVendor=05a4, idProduct=9881
usb 7-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
如果您有一个普通的遥控器,dmesg 的输出看起来像这样:
user@host:~> dmesg
usb 7-2: new low speed USB device using uhci_hcd and address 4
usb 7-2: configuration #1 chosen from 1 choice
usb 7-2: New USB device found, idVendor=0bc7, idProduct=0006
usb 7-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 7-2: Product: RF receiver
usb 7-2: Manufacturer: X10 WTI
input: X10 WTI RF receiver as /devices/pci0000:00/0000:00:1d.1/usb7/7-2/input/input9
ati_remote: Weird data, len=1 ff 00 00 00 00 00 ...
usbcore: registered new interface driver ati_remote
ati_remote: Registered USB driver ATI/X10 RF USB Remote Control v. 2.2.1
lirc_dev: IR Remote Control driver registered, major 61
lirc_atiusb: USB remote driver for LIRC $Revision: 1.71 $
lirc_atiusb: Paul Miller <pmiller9@users.sourceforge.net>
usbcore: registered new interface driver lirc_atiusb
dmesg 的输出显示了许多用于后续配置步骤的有用信息。第一种情况是 HID 遥控器,第二种情况是依赖于 LIRC 驱动程序“lirc_atiusb”的遥控器。
在 openSUSE 11.2 中安装串口接收器
准备工作
您必须安装了软件包 lirc 和兼容的内核模块(此处为 lirc-kmp-desktop)。工具 setserial 用于配置串口的内核驱动程序。使用以下命令安装这些软件包:
host# zypper in lirc lirc-kmp-desktop
配置和测试内核模块
- 使用 setserial 清除串口
- 在 /etc/modprobe.d/lirc 中配置内核模块
首先检查所选端口是否已分配。(此处:/dev/ttyS0 - 主板手册中的 COM1)
host# setserial /dev/ttyS0 /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
在这种情况下,端口已分配给内核驱动程序。您可以使用以下命令清除端口。
host# setserial /dev/ttyS0 uart none
警告!这只在下次重启之前有效。现在您可以加载 lirc-kernelmodule。
现在检查其状态
host# setserial /dev/ttyS0 /dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
使用以下命令加载内核驱动程序
host# modprobe -v lirc_serial insmod /lib/modules/2.6.25.18-0.2-pae/weak-updates/lirc_serial/lirc_serial.ko irq=4 io=0x3f8
现在您必须为内核模块“lirc_serial”(串口接收器驱动程序)创建配置文件,命令如下:
host# echo -e "alias char-major-61 lirc_serial\noptions lirc_serial irq=4 io=0x3f8\n" > /etc/modprobe.d/lirc.conf
要永久取消分配串口,请添加此行
setserial /dev/ttyS0 uart none
到
“/etc/init.d/boot.local”。
使用 LIRC 模块控制的遥控器
根据 dmesg 的输出,您应该知道需要哪个 LIRC 模块来控制遥控器的接收器。在我的情况下是“lirc_serial”。您必须使用像 vim 或 nano 这样的常用编辑器以 root 身份编辑 /etc/sysconfig/lirc 的以下几行
旧:LIRCD_DEVICE="" 新:LIRCD_DEVICE="/dev/lirc0"(它也可以是“/dev/lirc”。请用以下命令检查:
user@host$ ls /dev/lir*
旧:LIRC_MODULE="" 新:LIRC_MODULE="lirc_serial" 您必须用您的模块替换 lirc_serial"。您可以在下一句中检查您正在运行哪个模块
您可以使用 lsmod 命令检查所有模块是否已正确加载
host# lsmod | grep lirc lirc_serial 14708 0 lirc_dev 11068 1 lirc_serial
在某些情况下,您希望阻止加载某个模块。您可以使用此命令实现:
host# echo "blacklist ati_remote" >> /etc/modprobe.d/blacklist
现在我们修改 /etc/sysconfig/kernel 文件,以便在启动时加载模块。添加以下几行。
lirc_serial
如果要添加其他模块,请用空格分隔。
重启后,模块应该会正确加载。您可以使用以下命令检查:
host# lsmod | grep lirc lirc_serial 14708 0 lirc_dev 11068 1 lirc_serial
文件 /dev/lirc0 也应该存在。
HID(人机接口设备)遥控器
系统会在 /dev/input/ 中创建一些文件,这些文件由遥控器控制。HID 设备由两个单独的文件控制,以使用遥控器的所有按钮。如果您不知道遥控器使用了哪些文件,请在插入红外接收器的情况下重启系统。现在进入 /dev/input/,拔下您的红外设备,并观察哪些文件消失。如果您再次插入设备,一些新文件将在 /dev/input/event* 中创建(您可以忽略 /dev/input/mice 和 /dev/input/mouse*)。这些新文件属于接收器。重启后,/dev/input/event 中的文件在某些情况下会不同。如果您受到此影响,您应该使用 /dev/input/by-id* 或 /dev/input/by-path/ 中的文件。您还应该修改脚本 lirc_multievent(见下文)。
与由 LIRC 模块控制的普通遥控器不同,您不必修改 /etc/sysconfig/lirc 或 /etc/init.d/lirc 文件。(如果您没有使用 yast 安装 LIRC,则必须选择“devinput”驱动程序!!)。LIRC 将通过脚本 lirc_multievent 启动(见下文)。将此文件复制到 /etc/init.d 并使其可执行(chmod +x)。之后,在 RunlevelEditor 中启用该服务。您也可以使用 insserv 代替 Yast RunlevelEditor。
现在,您可以从此处下载适用于 Linux 输入驱动程序的 lircd.conf,并将其保存为 /etc/lircd,conf。这是一个适用于所有 HID 遥控器的默认文件。您无需使用 irrecord 配置您的 HID 遥控器。但对于普通遥控器,您必须这样做。
首先使用 irw 进行测试
host# irw
您可能需要添加一个参数来命名设备。请检查“irw --help”。按下遥控器上的按键应该会在控制台输出信息
user@host:~> irw 0000000000010073 00 VOLUMEUP linux-input-layer 0000000000010048 00 KP8 linux-input-layer 000000000001006d 00 PAGEDOWN linux-input-layer
irrecord 和 lircd.conf 文件
您可以使用属于 LIRC 软件包的 irrecord 程序为每个支持的遥控器创建一个 lircd.conf 文件。此文件包含按键代码和按键名称(任意)。许多遥控器的文件已存在。您可以在项目页面上搜索它们。如果您找不到任何可用的文件,则必须使用 irrecord 创建自己的 lircd.conf 文件。如果您有 HID 设备,则无需执行此操作,因为您可以使用默认的 HID 文件。分配给按键的名称将在 .lircrc 文件中使用。使用以下命令开始录制:
host# irrecord "filename"
您可能需要添加一个参数来命名设备。请检查“irrecord --help”。在您按下并命名了遥控器上的所有按钮后,/etc/lircd.conf 文件将被创建。
irexec、irxevent、.lircrc 及其他
这两个程序都包含在 LIRC 软件包中。它们用于控制程序或激活程序的“事件”。irexec 和 irxevent 使用位于用户主目录中的 .lircrc(您必须先创建它)。请求通过脚本进行。
#!/bin/bash irxevent /home/username/.lircrc & irexec /home/username/.lircrc &
您可以在此处找到有关 .lircrc 文件格式的详细手册。
HID 遥控器的启动脚本
复制脚本并将其粘贴为 /etc/init.d/lirc_multievent。使用以下命令使其可执行:
host# chmod 750 /etc/init.d/lirc_multievent
#! /bin/sh
#
# /etc/init.d/lirc_multievent
#
#
### BEGIN INIT INFO
# Provides: lirc
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 5
# Default-Stop: 0 1 2 3 6
# Short-Description: lirc for use with multiple /dev/input/ devices
# Description:
### END INIT INFO
. /etc/rc.status
rc_reset
starting_lircd()
{
lircd --driver=devinput --device=/dev/input/event2 --pidfile=/var/run/lirc1.pid --listen=9988;
lircd --driver=devinput --device=/dev/input/event3 --pidfile=/var/run/lirc2.pid --connect=localhost:9988;
#
#
# In some cases you cannot allocate the files /dev/input/event after a reboot.
#But you can fix with changing the path to /dev/input/by-id/* or /dev/input /by-path/*
#
# lircd --driver=devinput --device=/dev/input/by-path/pci-0000:00:12.0-usb-0:3:1.0-event-kbd --pidfile=/var/run/lirc1.pid --listen=9988;
# lircd --driver=devinput --device=/dev/input/by-path/pci-0000:00:12.0-usb-0:3:1.1-event- --pidfile=/var/run/lirc2.pid --connect=localhost:9988;
#
#
# Example to control more than one device:
# lircd --driver=devinput --device=/dev/input/event1 --pidfile=/var/run/lirc1.pid --listen=9988
# lircd --driver=devinput --device=/dev/input/event2 --pidfile=/var/run/lirc2.pid --listen=9987
# lircd --driver=devinput --device=/dev/input/event3 --pidfile=/var/run/lirc3.pid --connect=localhost:9988 --connect=localhost:9987
#
#
if test ! -e /dev/lircd; then ln -s /var/run/lirc/lircd /dev/lircd; fi # check if symlink /dev/lircd exists, if not then create one
checkproc lircd
if [ "$?" == 0 ]; then # check if lircd is actually running
echo "sucess !";
else
echo "could not start lircd";
exit 1
fi
}
case "$1" in
start)
checkproc lircd
if [ "$?" == 0 ]; then
echo -n "lirc is already running with pid: "
pidof lircd
exit 1;
else
echo -n "starting lircd... ";
starting_lircd
fi
rc_status -v1 # done-message
;;
stop)
checkproc lircd
if [ "$?" == 0 ]; then
echo "killing lircd"
killproc lircd
else
echo "lircd is not running"
fi
rc_status -v1
;;
restart)
checkproc lircd
if [ "$?" == 0 ]; then
echo -n "lircd is already running with pid: "
pidof lircd
echo "lircd will be killed"
killproc lircd
fi
echo -n "starting lircd... ";
starting_lircd
rc_status -v1
;;
status)
checkproc /usr/sbin/lircd
if [ "$?" == 0 ]; then
echo -n "lircd is running with pid: ";
pidof lircd
else
echo "lircd is not running";
fi
if test -e /dev/lircd; then
echo "/dev/lircd exists";
else
echo "/dev/lircd does not exist";
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}";
exit 1;
;;
esac
rc_exit
程序版本、硬件
我的红外接收器是 Atric IR-Einschalter 和一个常见的无名通用遥控器。我在 openSUSE11.2 & lirc0.8.5 上测试了配置文件