SDB:Linux 红外遥控

跳转到:导航搜索
Icon-obsolete.png
本文或章节引用的是版本 '11.2',现已过时!
请参阅本文的页面以获取更多信息。

关于

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 上测试了配置文件