SDB:Linux Infrared Remote Control

Jump to: navigation, search
Icon-obsolete.png This article or section refers to the version '11.2' and it is now obsolete!
Please refer to this article's discussion page for more information.

About

The package LIRC is used to receive and convert remote control signals.You can control many programs via remote control in combination with irexec and irxevent. Very interesting is to control some programs like VDR, MythTV, MPlayer and Kaffeine with LIRC.

Installation

The easiest way to install LIRC is, to do this with Yast. Search for LIRC and the compatible LIRC kernel module in the default repositories. Don't you know which kernel do you run? You can check this with

 user$ uname -r

Also you can download the Tarball from www.lirc.org and compile it by yourself. If you want the latest version of LIRC, you must download it with cvs. A detailed manual is stored here.


Useful Links for the Installation

Configuration

Get available systeminformations

When you installed LIRC and the compatible kernel module, dmesg should print useful informations(first with unplugged receiver and then with the receiver plugged in) about the infrared receiver of the remote control. You can check what kind of remote control it is with the dmesg output. For example if you have a HID remote control.

 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

I you have a common remote control, the output of dmesg looks like this:

 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

The outpot of dmesg displays many usesful informations for the next configuration steps. In the first case it's a HID remote control in and in the second it's a remote control which depends on the LIRC driver "lirc_atiusb".


Installing a serial receiver with openSUSE 11.2

Preperation

You must have installed the packages lirc and the compatible kernel module (here lirc-kmp-desktop). The tool setserial is used to configure the kernel driver of the serial port. Install these packages with:

host# zypper in lirc lirc-kmp-desktop

Configuration and test the kernel module

  • clearing the serial Port with setserial
  • configure kernel module in /etc/modprobe.d/lirc

First check if the choosen port is assigned to something. (here: /dev/ttyS0 - COM1 in the mainboard manual):

host# setserial /dev/ttyS0
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

In this case is the port assigned to the kernel driver. You can clear the port with the following command.

host# setserial /dev/ttyS0 uart none

Warning! This takes only effect until the next reboot. Now you can load the lirc-kernelmodule.

Now check his status

host#  setserial /dev/ttyS0
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4

Load the kernel driver with:

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

Now you can must create the configuration file for the kernel module "lirc_serial"(driver for serial receiver) with

 host# echo -e "alias char-major-61 lirc_serial\noptions lirc_serial irq=4 io=0x3f8\n" > /etc/modprobe.d/lirc.conf

To unassign the serial port permanently add this line

setserial /dev/ttyS0 uart none

to

"/etc/init.d/boot.local".


Remote controls which where controlled with the LIRC module

After the output from dmesg you should know which LIRC_module is needed to control the receiver of the remote control. In my case it is "lirc_serial". You must edit folling lines of the /etc/sysconfig/lirc with a common editor like vim or nano as root:

old: LIRCD_DEVICE="" new: LIRCD_DEVICE="/dev/lirc0" (it also can be "/dev/lirc". Check this with

user@host$ ls /dev/lir*


old: LIRC_MODULE="" new: LIRC_MODULE="lirc_serial" You must replace lirc_serial" with your module. You can check which module you're running in the next setence

You can check if all your modules loaded corrently with the command lsmod

host# lsmod | grep lirc
lirc_serial            14708  0
lirc_dev               11068  1 lirc_serial

In some cases you want prevent to load a module. You can do this with this command:

 host# echo "blacklist ati_remote" >> /etc/modprobe.d/blacklist

Now we modify the /etc/sysconfig/kernel file to load the module on boot. Add these lines.

 lirc_serial

If you want to add some other modules seperate these with spaces.

After Reboot the module should correctly loaded. You can check this with:

host# lsmod | grep lirc
lirc_serial            14708  0
lirc_dev               11068  1 lirc_serial

The file /dev/lirc0 should also exist.


HID (Human Interface Device) remote control

The System creates a few files in /dev/input/, which were controlled by the remote control. HID devices were controlled by two serveral files to use all the buttons of the remote control. If you don't know which files are used by the remote control, reboot the system with the plugged infrared receiver. Now go to /dev/input/ unplug your infrared device and watch which files disappear. If you plug in your device again, some new file were created in /dev/input/event* (you can ignore /dev/input/mice und /dev/input/mouse*). These new files are proppriated to the receiver. After reboot are the files in /dev/input/event in some cases different. If you are affected to this you should use the files in /dev/input/by-id* or /dev/input/by-path/ . You should also modify the script lirc_multievent (See below) .

In opposition to an usual remote control which is controlled by the LIRC module, you mustn't modify the files /etc/sysconfig/lirc alternatively /etc/init.d/lirc. (If you haven't installed LIRC with yast, you must choose the driver "devinput"!!).LIRC starts with the script lirc_multievent (see below). Copy this file into /etc/init.d and make it executable (chmod +x). After that enable the service in the RunlevelEditor. You can also use insserv instead of the Yast RunlevelEditor.

Now you download the lircd.conf for the Linux input driver here and save the file as /etc/lircd,conf. This is a default file for all HID remote controls. You needn't configure your HID remote control with irrecord. But with a common remote control you must.

First test with irw:

host# irw

Perhaps you must add a parameter to name the device. Check "irw --help". A keypress on the remote control should give an output on console:

 user@host:~> irw
 0000000000010073 00 VOLUMEUP linux-input-layer
 0000000000010048 00 KP8 linux-input-layer
 000000000001006d 00 PAGEDOWN linux-input-layer


irrecord and the lircd.conf file

You can create a lircd.conf file for every supported remote control with the program irrecord, which belongs to the LIRC package. This file contains the key code and a name for the key (arbitrary). Files for many remote controls already existing. You can search them on the the project page. If you can't find any working files, you must create your own lircd.conf file with irrecord. You mustn't do this if you have a HID device, because you can use the default HID file. The assigned names for the key will be used in the .lircrc file. Start the record wird:

host# irrecord "filename"

Perhaps you must add a parameter to name the device. Check "irrecord --help". After you have pushed and named all buttons on the remote control, the /etc/lircd.conf file will be created.

irexec, irxevent, .lircrc & co

Both programs are included in the LIRC package. They were used to control programs or activate "events" of programs. irexec and irxevent use the .lircrc which is located(first you must create it.) in the home directory of the user. the request is effected with a script:

  #!/bin/bash
 irxevent /home/username/.lircrc &
 irexec /home/username/.lircrc &

You can find a detailed manual about the file format of a .lircrc here.

Starting script for a HID remote control

Copy the script and paste it as /etc/init.d/lirc_multievent. Make it executable with

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


Programversion, Hardware

My infrared receiver is a Atric IR-Einschalter and a common noname univeral remote control. I tested the configuration file with openSUSE11.2 & lirc0.8.5