[Howto] Gyration Infrared / RF Remote Control in Linux

I’ve had to set up this remote on quite a few linux systems now, and this is the best guide I’ve found to get it working. This is based on this old guide, which I’m updating a bit and making a couple tweaks of my own. I’ve used this on OSMC, Kodibuntu & Ubuntu so far, and it’s worked well.

Warning: Using this guide apparently makes the mouse functions unusable. I don’t know, the mouse on my remote stopped working long ago after it’d been dropped for the 9,000th time.

Install Lirc


First, install the lirc package.

sudo apt-get install lirc

The installer will ask you what hardware you have so it can use the correct config file. What you select here will be overwritten later in this guide, so it really doesn’t matter what you select.

Disable lircd automatic startup


We do not want to use Ubuntu’s init scripts and config files, therefore we need to tell it not to start up automatically. Here is the command which changes the symbolic link in /etc/rc2.d/:

sudo update-rc.d lirc disable 2

Back up files


Back up your old files that we are about to overwrite. These commands assume you are logged in as the user that is starting Kodi.

mkdir ~/backupfiles
cp /etc/rc.local ~/backupfiles
cp /etc/lirc/lircd.conf ~/backupfiles
cp ~/.kodi/userdata/Lircmap.xml ~/backupfiles
cp ~/.kodi/userdata/keymaps/Keymap.xml ~/backupfiles

Edit /etc/rc.local


Put these lines in /etc/rc.local:

/usr/sbin/lircd --driver=devinput --device=/dev/input/by-id/usb-Gyration_Gyration_RF_Technology_Receiver-if01-event-mouse --output=/dev/lircd1 --pidfile=/var/run/lircd1.pid --listen
/usr/sbin/lircd --driver=devinput --device=/dev/input/by-id/usb-Gyration_Gyration_RF_Technology_Receiver-event-kbd --output=/dev/lircd --pidfile=/var/run/lircd.pid --connect=localhost:8765

Do an ls /dev/input/by-id/ to make sure these are the correct device names! The name of the mouse device changed on me at some point and I had to update my /etc/rc.local to match.

Edit /etc/lirc/lircd.conf


#This configuration has been automatically generated via
#the Ubuntu LIRC package maintainer scripts.
#
#It includes the default configuration for the remote and/or
#transmitter that you have selected during package installation.
#
#Feel free to add any custom remotes to the configuration
#via additional include directives or below the existing
#Ubuntu include directives from your selected remote and/or
#transmitter.
 
#
# lircd.conf
# for Gyration MCE remote(s). Could almost certainly be expanded to work for their keyboard as well.
#
# Composed by Marc Randolph based upon
# initial lircd.conf by Modulok (https://bugs.launchpad.net/mythbuntu/+bug/156494/comments/6)
# with help from the Linux MCE wiki (http://wiki.linuxmce.org/index.php/Gyration-GYR3101US-codes)
#
# Notes:
# Star and Hash keys produce two key sequences: 0x002A followed by either 8 for star, or 3 for hash
#
# Revision history
# 2.3 - Marc Randolph - Renamed camera to pictures and video to videos. Added alternative mappings
# 2.2 - Marc Randolph - Added untested DVDMenu entry
# 2.1 - Marc Randolph - StarHash comment was wrong
# 2.0 - Marc Randolph - Special codes should be correct, or at least, very close to correct
# 1.0 - Marc Randolph - added missing codes and changed names to match up the mceusb remote
# - Some of the more special codes have not been verified (Pictures, LiveTV, etc)
# 0.1 - Modulok - Initial revision
#
#
begin remote
 
 name     gyration
 bits           16
 eps            30
 aeps          100
 
 one             0     0
 zero            0     0
 pre_data_bits   16
 pre_data       0x8001
 gap          135997
 toggle_bit_mask 0x0
 
      begin codes
         Home                     0x0066 # AKA "Windows button"
         Up                       0x0067
         Left                     0x0069
         Right                    0x006A
         Down                     0x006C
         Mute                     0x0071
         VolDown                  0x0072
         VolUp                    0x0073
         Power                    0x008e
         Pause                    0x0077
         More                     0x0082  # AKA "Info" or Help
         Back                     0x009E
         Skip                     0x00A3
         Replay                   0x00A5
         Stop                     0x00A6
         RecTV                    0x00A7  #Not "recorded TV", but "record current show on TV"
         Rewind                   0x00A8
         Play                     0x00CF
         Forward                  0x00D0
         Pictures                 0x00D4  # not on Dell remote
         RecordedTV               0x00E2  # aka KEY_MEDIA
         Guide                    0x016A
         LiveTV                   0x016E  # aka KEY_PVR
         DVD                      0x0185
         Music                    0x0187  # not on Dell remote  # aka KEY_MP3
         Videos                   0x0189  # not on Dell remote
         ChanUp                   0x0192
         ChanDown                 0x0193
         DVDMenu                  0x019A  # untested.  not on Dell remote
         Clear                    0x0001
         One                      0x0002
         Two                      0x0003
         Three                    0x0004
         Four                     0x0005
         Five                     0x0006
         Six                      0x0007
         Seven                    0x0008
         Eight                    0x0009
         Nine                     0x000A
         Zero                     0x000B
         Enter                    0x001C
         StarHash                 0x002A  # Star=0x2a and 0x08; Hash = 0x2a and 0x03
        a                       0x001E
     end codes
 
end remote
# Alternative mappings to try if some of the above don't work
# (please report any findings back to http://www.mythtv.org/wiki/Gyration-based_MCE_Remotes)
# Up 0x0062
# Left 0x0064
# Right 0x0066
# Down 0x0068
# Pause 0x0075
# Power 0x008E
# Halt 0x019C
# Lights 0x0111
# Clear 0x0016
# Enter 0x0024
# DVDMenu 0x0029

Create ~/.kodi/userdata/keymaps/Keymap.xml


<!-- This file contains the mapping of keys (gamepad, remote, and keyboard) to actions within XBMC -->
<!-- The <global> section is a fall through - they will only be used if the button is not          -->
<!-- used in the current window's section.  Note that there is only handling                       -->
<!-- for a single action per button at this stage.                                                 -->
<!-- For joystick/gamepad configuration under linux/win32, see below as it differs from xbox       -->
<!-- gamepads.                                                                                     -->
 
<!-- The format is:                      -->
<!--    <device>                         -->
<!--      <button>action</button>        -->
<!--    </device>                        -->
 
<!-- To map keys from other remotes using the RCA protocol, you may add <universalremote> blocks -->
<!-- In this case, the tags used are <obc#> where # is the original button code (OBC) of the key -->
<!-- You set it up by adding a <universalremote> block to the window or <global> section:       -->
<!--    <universalremote>             -->
<!--       <obc45>Stop</obc45>         -->
<!--    </universalremote>            -->
<!-- To find out the OBC's of your remote, try enabling the <displayremotecodes> tag in AdvancedSettings.xml -->
 
<!-- Note that the action can be a built-in function.                 -->
<!--  eg <B>XBMC.ActivateWindow(MyMusic)"</B>                         -->
<!-- would automatically go to My Music on the press of the B button. -->
 
<!-- Joysticks / Gamepads:                                                                    -->
<!--   See the sample PS3 controller configuration below for the format.                      -->
<!--                                                                                          -->
<!--  Joystick Name:                                                                          -->
<!--   Do 'cat /proc/bus/input/devices' or see your xbmc log file  to find the names of       -->
<!--   detected joysticks. The name used in the configuration should match the detected name. -->
<!--                                                                                          -->
<!--  Button Ids:                                                                             -->
<!--   'id' is the button ID used by SDL. Joystick button ids of connected joysticks appear   -->
<!--   in xbmc.log when they are pressed. Use your log to map custom buttons to actions.      -->
<!--                                                                                          -->
<!--  Axis Ids / Analog Controls                                                              -->
<!--   Coming soon.                                                                           -->
 
<keymap>
  <global>
    <remote>
      <three>VolumeUp</three>
      <six>VolumeDown</six>
      <nine>Mute</nine>
      <play>Play</play>
      <pause>Pause</pause>
      <stop>Stop</stop>
      <forward>FastForward</forward>
      <reverse>Rewind</reverse>
      <left>Left</left>
      <right>Right</right>
      <up>Up</up>
      <down>Down</down>
      <select>Select</select>
      <pageplus>PageUp</pageplus>
      <pageminus>PageDown</pageminus>
      <back>ParentDir</back>
      <menu>ContextMenu</menu>
      <info>Info</info>
      <skipplus>SkipNext</skipplus>
      <skipminus>SkipPrevious</skipminus>
      <display>FullScreen</display>
      <start>PreviousMenu</start>
      <record>Screenshot</record>
      <volumeplus>VolumeUp</volumeplus>
      <volumeminus>VolumeDown</volumeminus>
      <mute>Mute</mute>
      <power>XBMC.ShutDown()</power>
      <myvideo>XBMC.ActivateWindow(MyVideos)</myvideo>
      <mymusic>XBMC.ActivateWindow(MyMusic)</mymusic>
      <mypictures>XBMC.ActivateWindow(MyPictures)</mypictures>
      <mytv>XBMC.ActivateWindow(Home)</mytv>
    </remote>
  </global>
</keymap>

##Create ~/.kodi/userdata/Lircmap.xml


<!-- This file contains the mapping of LIRC keys to XBMC keys used in Keymap.xml  -->
<!--                                                                              -->
<!-- How to add remotes                                                           -->
<!-- <remote device="name_Lirc_calls_the_remote">                                 -->
<!--                                                                              -->
<!-- For the commands the layout following layout is used                         -->
<!-- <XBMC_COMMAND>LircButtonName</XBMC_COMMAND>                                  -->
<!--                                                                              -->
<!-- For a list of XBMC_COMMAND's check out the <remote> sections of keymap.xml   -->
 
<lircmap>
        <remote device="gyration">
                <select>Enter</select>
                <pause>Pause</pause>
                <stop>Stop</stop>
                <forward>Forward</forward>
                <reverse>Rewind</reverse>
                <left>Left</left>
                <right>Right</right>
                <up>Up</up>
                <down>Down</down>
                <select>OK</select>
                <pageplus>ChanUp</pageplus>
                <pageminus>ChanDown</pageminus>
                <back>Back</back>
                <menu>Guide</menu>
                <play>Play</play>
                <info>More</info>
                <skipplus>Skip</skipplus>
                <skipminus>Replay</skipminus>
                <display>LiveTV</display>
                <start>Home</start>
                <record>Record</record>
                <volumeplus>VolUp</volumeplus>
                <volumeminus>VolDown</volumeminus>
                <mute>Mute</mute>
                <power>Power</power>
                <myvideo>Videos</myvideo>
                <mymusic>Music</mymusic>
                <mypictures>Pictures</mypictures>
                <mytv>TV</mytv>
                <one>One</one>
                <two>Two</two>
                <three>Three</three>
                <four>Four</four>
                <five>Five</five>
                <six>Six</six>
                <seven>Seven</seven>
                <eight>Eight</eight>
                <nine>Nine</nine>
                <zero>Zero</zero>
                <mytv>Red</mytv>
                <mymusic>Green</mymusic>
                <mypictures>Yellow</mypictures>
                <myvideo>Blue</myvideo>
        </remote>
</lircmap>

##Testing


Make sure lircd is not running:

sudo killall lircd

Start lircd using /etc/rc.local:

sudo /etc/rc.local

We use the irw command to test. It comes with the lirc package. This is me pressing various buttons, then holding the volume up. Notice that the repeating key shows incrementing numbers. You should get a blank line that will print the key name as configured in lircd.conf when that button is pressed.

sudo irw /dev/lircd
00000000800100a6 00 Stop gyration
00000000800100a7 00 RecTV gyration
0000000080010073 00 VolUp gyration
0000000080010073 00 VolUp gyration
0000000080010073 01 VolUp gyration
0000000080010073 02 VolUp gyration
0000000080010073 03 VolUp gyration
0000000080010073 04 VolUp gyration
0000000080010073 05 VolUp gyration
0000000080010073 06 VolUp gyration
0000000080010073 07 VolUp gyration
0000000080010073 08 VolUp gyration
0000000080010073 09 VolUp gyration
0000000080010073 0a VolUp gyration
0000000080010073 0b VolUp gyration
0000000080010073 0c VolUp gyration
0000000080010073 0d VolUp gyration

Please let me know if you’ve found this guide helpful, had any problems, or would like to suggest a change.

Can I ask why you are installing the Debian lirc package, when OSMC already ships with our own custom version of lirc included ? (eg armv7-lircd-osmc) This is only going to cause you issues having two copies of lircd installed. Our custom version is patched to support button event codes higher than 255 - the Debian version is not.

Lircd is not started at boot time but on the fly by udev rules in /lib/udev/rules.d/98-lircd.rules when compatible hardware is detected - the correct way to start an instance of lircd with a different driver would be to add a udev rule in /etc/udev/rules.d/ that matches the hardware device by USB/device ID and passes a custom ENV{lircd_driver}. See 98-lircd.rules for examples of how to do this, for example:

ENV{ID_VENDOR_ID}=="0bc7", ENV{ID_MODEL_ID}=="0003", \
  ENV{lircd_driver}="atilibusb", \
  ENV{lircd_conf}="/etc/lirc/atilibusb-lircd.conf"

Another problem with your tutorial is that your lircd.conf does not use valid KEY_ button namings. This will prevent the button presses being passed through the kernel via eventlircd. See the xbox360 profile as an example of correct key naming. Because of the way you have set up your custom lircd instance you will be bypassing eventlircd, but this is really not the correct way to do it, and you will lose the repeat filter in eventlircd.

See if you can adapt your tutorial a bit to work within the existing lircd/eventlircd framework in OSMC - this will minimise any changes necessary, allow you to use the repeat filter in eventlircd, and also allow other remotes to work simultaneously.

I’d be happy to work with you to come up with an OSMC-specific guide for this remote if you’ve got the time to do so. I can fix all the key names easily enough, but I’ll need some help figuring out the proper way to run lircd with the osmc packages.

I’m still a beginner in linux in a lot of ways and count myself lucky to find a working solution to a problem, not always realizing it may not be the best way to do it.