LIRC

From MythTV Official Wiki
Revision as of 19:02, 17 April 2011 by Ghormann (Talk | contribs)

Jump to: navigation, search

Clean.png Cleanup: This article or section may require cleanup. Discuss the issue on the talk page

Wikipedia-logo-en.png
Wikipedia has an article on:

LIRC stands for Linux Infrared Remote Control. It is required to use a generic* Remote Control with MythTV.

Lirclogo.gif

LIRC is a program that gives your computer the ability to send and receive infra-red remote signals when combined with appropriate hardware. Most distributions include LIRC packages, but you may have to compile your own version of the program to use certain features that the packagers did not include.

  • It should be noted that many people bypass the need for LIRC altogether, and simply use a "learning remote control" and a infra-red keyboard receiver. Train the learning remote control to output the appropriate keyboard press for each button/label. Linux and MythTV will see it as a keyboard and you have a simple and straightforward infra-red controller.

Basics

IR Reception (to MythTV)

In its most basic concept, you press the 'play' button on your remote control which sends an infra-red signal to a receiver connected to your computer. This receiver sends a signal to LIRC, which identifies that you hit the 'play' key on your remote and then generates a keystroke on your computer that instructs MythTV to play.

For the infra-red receiver, you have two choices about how you set it up to work with MythTV:

  • The preferred method is to use mythtv native LIRC support, where mythtv reads ~/.mythtv/lircrc for its own key configuration
  • An alternate approach uses irxevent which is an external program that can send key presses to MythTV as if you were pressing keys on the keyboard. irxevent reads ~/.lircrc (note the dot at the start of the filename)

The receiver may be connected to the computer via a serial port, USB, or by a dedicated chip built into a TV tuner card. Each different type of physical IR receiver has its own type of kernel module.

Rect32603.png
  • The kernel module (C) uses /dev/lirc (typically) to emit the pulse-length information, which is then parsed by the lircd process. The LIRC daemon (D) then uses the information from /etc/lircd.conf (E) to convert the pulse-lengths into button press information.
Rect32606.png
  • Lastly, all programs that use LIRC need a second configuration file which tells liblirc_client.so what button presses are to be translated into which commands for each client program using LIRC, including MythTV. Once the button presses have been converted into instructions by liblirc_client.so using the lircrc (F) file (~/.mythtv/lircrc in 0.20, but 0.21 will read ~/.lircrc as well), then they are ready to be used by MythTV. (G)
Rect32607.png
  • Note that the button names in /etc/lircd.conf must match the "button" configuration names you use in your lircrc file, but are otherwise completely up to you. The translations between the button names and the mythtv's internal names is done in the .lircrc or lircrc file, in the "config" line for a button. The "config" names must match what mythtv is expecting, and for the mythtv native LIRC support the "prog" line must say "prog = mythtv". This can be debugged with ircat (invoked as `ircat mythtv`).

IR Transmission (from MythTV)

The concept of a transmitter is a little more complex. You might want to use a transmitter if, for instance, you want MythTV to control a cable/satellite box so it can record the right shows on the right channels. Let's say LIRC just sent 'Channel +' keystroke to MythTV (like detailed above). MythTV then sends a signal back to LIRC instructing it to transmit a 'Channel +' command to the cable box. The infra-red transmitter on your computer then emits an infra-red signal to your cable box instructing it to change the channel + (just as if you had pressed the channel + key on the original cable remote).

The transmitter and receiver mentioned above are two separate devices (sometimes packaged into a single box). You cannot transmit through a receiver or receive through a transmitter.

Controlling a digital cable/satellite box using Fedora, MythTV, an IR Blaster and one instance of LIRC

LIRC with Multiple External Tuners

If you are using a system with multiple external tuners, you can use LIRC to control each one independently. The proper irsend command for each tuner can be placed in a separate channel changing script, and then specified as an external channel changing program for the appropriate video source in the Mythtv-setup program.

Normally, only a single LIRC transmitter is required as long as each of the tuners have mutually exclusive remote codes, and the LIRC transmitter can placed in the line of sight of all tuners' IR receivers. In this configuration, each tuner will need a "Remote Block" setting in the lircd.conf file and irsend simply needs the correct REMOTE argument. This is probably the simplest solution to most multiple tuner systems.

However, there are some instances where unique control codes aren't possible, or simultaneous line of sight to the two receivers is not possible. In these cases, there are some options available:

  • Load multiple LIRC drivers using irsend's --device option. For some drivers, including lirc_serial (IR Blaster, etc.), this method won't work with multiple transmitters of the same type.
  • Use multiple IR emitters independently controlled by CommandIR Mini, a USB TX/RX combo device, with irsend's SET_TRANSMITTERS directive.
  • Multiple LIRC Drivers with multiple IR emitters of the same type without having to recompile lirc_serial.

Set up

Setting up LIRC can range from very easy to incredibly difficult. The difficulty level is likely related to what hardware you end up using for LIRC. There are several different hardware pieces for receiving and sending LIRC commands. A few are:

For Help Setting up LIRC on your computer, follow some of these excellent resources:

Migrating to kernel => 2.6.36 (or 2.6.35 on Fedora 14)

As of 2.6.36, the lirc drivers have been moved into the kernel. For me this broke my existing lirc MCE USB setup. As of March 2011, I had to do the following to fix it using 2.6.37 on gentoo:

  1. Enable the lirc driver in the kernel and rebuild. For the MCE USB remote this was under: Device Drivers -> Multimedia support - > Infrared remote controller adapters -> Windows Media Center Ed. eHome Infrared Transceiver
  2. Loaded the new mceusb driver (reboot or modprobe mceusb) which created /dev/lirc0. The previous non-kernel modules created the device as /dev/lirc so this is different. Therfore I had add -d /dev/lirc0 as an option to lircd when it started (for me this change was in /etc/conf.d/lirc) so the binary knew where to find the driver
  3. lircd ran without error but irw still didn’t show my keypresses on the remote. lircd -v showed 0.8.5 which is not compatible with the new drivers. I removed 0.8.5 then downloaded 0.9.0pre1 from the lirc site and installed it myself (there was no gentoo ebuild at the time). Note that this also installed drivers lirc_dev and lirc_mceusb which are the old drivers. They aren't needed so I deleted them on my system to avoid confusion in the future. After that I restart lircd and irw and could see my keypresses being captured.
  4. My last issue was that when I started mythfrontend, when I pressed up/down twice it would move 4 or 5 times. This was due to the irevents being interpreted as both lirc events and as keypresses in the kernel. This was fixed by running echo lirc > /sys/class/rc/rc0/protocols which forces them to be processed as lirc events only. Note that command needs to be run on every reboot, so it should be added wherever your distro runs such commands (gentoo is /etc/conf.d/local.start)

Here are things I DIDN’T have to do:

  1. update /etc/lirc/lircd.conf

If you have issues

  1. Run lsmod | grep lirc_ to check that the old modules aren't loaded
  2. Check that /dev/lirc0 is being created after mceusb gets loaded. If not look at dmesg after modprobbing mceusb it for clues
  3. run lircd in non deamon mode by using lircd -n <whatever other options you need>. This will keep the output to the console so you can see what’s happening.
  4. Make sure irw shows your key presses. If that doesn’t work, chances are nothing else will.

Again this all based on my experience on gentoo with 2.6.37 & 2.6.37.2. YMMV based on the distro in use - chances are some of this will be taken care of behind the scenes

The devinput option

This has been tested on Fedora 14 running 2.6.35.11-83.

  1. Install v4l-utils to obtain the ir-keytable program.
  2. Install the lirc-remotes RPM to obtain various example lircd.conf files.
  3. Run ir-keytable to verify a driver has been loaded for your IR receiver
[root@myth1 ~]# ir-keytable
Found /sys/class/rc/rc0/ (/dev/input/event3) with:
	Driver streamzap, table rc-streamzap
	Supported protocols: NEC RC-5 RC-6 JVC SONY LIRC other 
	Enabled protocols: NEC RC-5 RC-6 JVC SONY LIRC other 
	Repeat delay = 500 ms, repeat period = 33 ms
  1. Copy /usr/share/lirc-remotes/devinput/lircd.conf.devinput to /etc/lirc/lircd.conf
  2. Specify the devinput driver in /etc/sysconfig/lirc (LIRC_DRIVER="devinput")
  3. Determine which /dev/input device is available by looking in /dev/input/by-id.
  4. Specify the /dev/input device in /etc/sysconfig/lirc (LIRC_DEVICE="/dev/input/by-id/foo")
  5. Restart lirc

LIRCRC

The lircrc file defines the mapping between the buttons on your own remote (as defined in the lircd.conf) and the functions you actually want it to perform.

Keybindings has a list of all the keys used, which can be used in your lircrc file.

With native LIRC support, MythTV can use Qt keys, removing the prefix Qt::Key_. Not all of MythTV's key names match their Qt counterparts, however. Instead of Period and Comma, for example, use the symbols (. and ,) themselves. Instead of PageUp and PageDown, use PgUp and PgDown.

Keys can also have a modifier applied. These are case sensitive.

For example, Setting the (Gray Hauppauge's) Power button to be Qt::CTRL Qt::Key_Escape:

  begin
  prog = mythtv
  remote = Hauppauge_Gray
  button = Power
  config = CTRL+Escape
  end

Important.png Note: This also works as CTRL+'Esc', but NOT 'Ctrl'+Escape

"remote" is optional, but if you have multiple remotes configured in your lircd.conf e.g. for IR Blasting, you can use this line to make sure that only commands from the correct remote are used.

To configure the TV button to jump to Live TV by using the key sequence Qt::ALT Qt::Key_L,

  • Add or modify your lircrc to contain
  begin
  prog = mythtv
  remote = Hauppauge_Gray
  button = TV
  repeat = 3
  config = ALT+L
  end
  • Restart mythfrontend
  • Go to Setup/Edit Keys/JumpPoints
  • Select Live TV
  • Press enter (until you see a dialog appear, that says it is waiting for a keypress)
  • Press the TV button on your remote

Hopefully, you will now see Alt-L listed!

Troubleshooting

irw

Use the irw program to see whether LIRC and your remote are working before going any further. It shows what events are generated by your remote. This is very helpful!

The irw tool connects to the lircd socket and displays any recognized IR signals detected by the driver. If this works, then your hardware, driver and lirc.conf is working; all that remains is your application setup. If irw does not generate the expected output though, not all is lost -- see the mode2 command below.

Logging

You can enable logging for lircd with the -L option. Use this to see the results of clients connecting to lircd daemon. Compiling lircd with debugging enabled (-D option) allows you to see much more including parsing of the remote definitions.

# /usr/local/sbin/lircd --device=/dev/lirc/0 /etc/lirc/lircd.conf -L ~/lircd.log -D7
  • The log file showing "accepted new client" immediately followed by "removed client" can indicate a a ~/.lircrc or ~/.mythtv/lircrc parsing error. Check the formatting.

Make the LIRC device static

If you follow this http://parker1.co.uk/mythtv_tips.php Tip to make the lirc device static, you may notice that it only works if you have only one card with the same vendor ID. If you have more than one card from the same vendor, but with a different name, you can use the following line to create the /dev/input symlink:

ln -fs /dev/input/`cat /proc/bus/input/devices|grep -A 3 "Hauppauge Nova-S-Plus"|grep event|cut -d ' ' -f3` /dev/input/irremote

You should run this line before running lirc, for example add it to /etc/init.d/lirc here:

echo -n "Starting lirc daemon:"
ln -fs /dev/input/`cat /proc/bus/input/devices|grep -A 3 "Hauppauge Nova-S-Plus"|grep event|cut -d ' ' -f3` /dev/input/irremote
if $START_LIRCD; then

Using an udev rule may be more elegant, but I found this one liner to be more reliable.


The above failed for me for two reasons - one, my device is not an S-plus, and two, I have more than one of the same card. My small modification of the above one-liner should work for everyone:

ln -fs /dev/input/`cat /proc/bus/input/devices | grep -A 3 "Hauppauge" | grep event | cut -d ' ' -f3 | head -n1` /dev/input/irremote

The above fails on Ubuntu 10.04. A solution to this is: (Not tested on dual card setups)

ln -fs /dev/input/event$(cat /proc/bus/input/devices | grep -A 3 "Hauppauge" | grep Sysfs | sed -e "s/^.*\(.\)$/\1/") /dev/input/irremote

This makes a symbolic link in /dev/input called "irremote" this will always point to the Hauppauge event.

mode2

The command mode2 will give each separate pulse for button pushes. Some buttons have different pulses for pushing the button than for releasing the button. Using mode2 will show all pulses and is lower-level lirc testing tool than irw.

Devices

Depending on your setup, lirc may be looking for either /dev/lirc0 or /dev/lirc, and the wrong one will obviously break things. You can use ln -s /dev/lirc0 /dev/lirc or ln -s /dev/lirc /dev/lirc0 to fix this.

LircSocket

If you know LIRC is working, and mapped correctly in the lircrc file, but is not doing anything in MythTV, you may want to check your LircSocket (frontend settings). This was a problem for me with MythTV 0.22 installed via atrpms on Centos 5.4. After installing lirc manually, I had to change the LircSocket setting from /var/run/lirc/lircd to /dev/lircd to get it to work. The frontend log should contain clues that it was not able to connect to the lircd socket. /var/run/lirc/lircd is the default location for the lircd socket for lirc 0.8.6 and higher.

Key things to remember

  • If you're using a PVR-350, at least, it won't work with stock LIRC. You need 0.7.0 (as mentioned in Jarod's Guide)
  • If you're using a PVR-500MCE, please read this page: MCE_Remote
  • Set up /etc/lircd.conf to fit your remote.
  • Don't try to use a lircrc file written for irxevent if you are trying to use MythTV native LIRC support, see Lirc on Ubuntu Dapper as the basis for your own file. Or search for mythtv/configfiles/hauppauge-lircrc-nativelirc to use it as a template.

Multiple remotes

See MultiLIRC for my mods to the standard Debian Lenny lirc installation for running multiple lirc remotes and keeping everything separate.

Ubuntu/Mythbuntu lircrc generation

Mythbuntu provides a package that will intelligently parse your lircd.conf file and attempt to create valid button mappings for use in MythTV and other media player applications. Note that the use of this package is contingent on your remote being properly installed and working. You can install and invoke this package as follows:

sudo apt-get install lirc mythbuntu-lirc-generator
mythbuntu-lirc-generator

Restart mythfrontend. Your remote should now work with MythTV!


Fedora 14 x86_64 Hauppauge PVR 150

Credit goes to:

Jarod Wilson http://wilsonet.com/?p=40

Mark Weaver http://www.blushingpenguin.com/mark/blog/?p=24


1: Get firmware

Download firmware from:

http://www.blushingpenguin.com/mark/lmilk/haup-ir-blaster.bin

and copy to /lib/firmware

2: Get lircd.conf

http://www.blushingpenguin.com/mark/lmilk/lircd.conf and copy to /etc/lirc/lircd.conf

3: Probe the modules

/sbin/modprobe lirc_dev debug=1 && modprobe lirc_zilog

4: restart lirc

/etc/init.d/lirc restart

5: Make it permament

edit rc.local and add to the bottom

/sbin/modprobe lirc_dev debug=1 && modprobe lirc_zilog