Multiple LIRC Drivers
Setup
When a system has multiple transmitters and each needs a separate instance of an lirc driver, there are two options:
- Download the lirc source code, edit the package to compile another instance of the driver for you
- Use this method to quickly create a new instance of an lirc driver from your existing driver
This process will work for lirc_serial and should work for other lirc drivers as well. The setup for this is multiple IR transmitters connected to separate serial ports.
Installation
First, find the existing lirc_serial driver and cd to that directory:
$ find /lib/modules/`uname -r` -name lirc_serial.ko /lib/modules/2.6.31-21-generic/kernel/ubuntu/lirc/lirc_serial/lirc_serial.ko $ cd /lib/modules/2.6.31-21-generic/kernel/ubuntu/lirc/lirc_serial
Next, create the new lirc_serial.ko driver, this must be done as root. This new driver can be loaded separately from lirc_serial to perhaps listen on a different port:
$ su # cat lirc_serial.ko | sed -e 's/lirc_serial/lirc_ser_01/g' > lirc_ser_01.ko # depmod -a # exit $
That's it! Now load the new driver:
$ sudo modprobe lirc_ser_01 $ dmesg | tail lirc_ser_01: auto-detected active high receiver lirc_dev: lirc_register_driver: sample_rate: 0 lirc_ser_01 $Revision: 5.104 $ registered
This process can be repeated for every device connected to a serial port on the system by replacing lirc_ser_01 with lirc_ser_02, lirc_ser_03, etc.
Setting up dkms
However, this process must be repeated when the kernel is upgraded to a new version. To have the dkms system do this automatically, first create a 'source' directory for the driver:
$ sudo mkdir -p /usr/src/mylirc-1.0 $ sudo touch /usr/src/mylirc-1.0/makefile
Then create a file named dkms.conf in /usr/src/mylirc-1.0 with a text editor that contains:
# This is /usr/src/mylirc-1.0/dkms.conf PACKAGE_NAME="mylirc" PACKAGE_VERSION="1.0" CLEAN="rm -f lirc_ser_*.ko" BUILT_MODULE_NAME[0]="lirc_ser_01" MAKE[0]="cat `find /lib/modules/$kernelver -name lirc_serial.ko` | sed -e 's/lirc_serial/lirc_ser_01/g' > lirc_ser_01.ko" DEST_MODULE_LOCATION[0]="/kernel/custom" AUTOINSTALL="yes"
This dkms.conf file can be easily modified with additional lines for lirc_ser_02, lirc_ser_03, etc, with lines that follow the format:
BUILT_MODULE_NAME[1]="lirc_ser_02" MAKE[1]="cat `find /lib/modules/$kernelver -name lirc_serial.ko` | sed -e 's/lirc_serial/lirc_ser_02/g' > lirc_ser_02.ko" DEST_MODULE_LOCATION[1]="/kernel/custom" # ... etc
Now add mylirc to dkms:
dkms add -m mylirc -v 1.0
Attempting to build and install this module right now will succeed, but not actually copy anything into the modules directory since lirc_ser_01 was already created earlier:
dkms build -m mylirc -v 1.0 dkms install -m mylirc -v 1.0
Signed Kernel Modules
Some distributions utilize signed kernel modules. If the method described here is used with signed modules, it will generate a new module with an invalid signature. An invalid signature will prevent the module from loading and cause an error message such as "key was rejected by service".
This can be confirmed by displaying information on the module:
modinfo lirc_ser_01 | grep '^sig'
There are multiple methods to resolve this problem. The simplest method is to strip the key from the newly generated module. That can be accomplished by issuing this command:
strip --strip-debug lirc_ser_01.ko
This can be manually commanded or used in the dkms method described above. For the dkms method, this command needs to be appended to the make command:
MAKE[0]="cat `find /lib/modules/$kernelver -name lirc_serial.ko` | sed -e 's/lirc_serial/lirc_ser_01/g' > lirc_ser_01.ko; strip --strip-debug lirc_ser_01.ko "
Setting up modprobe.conf
The newly created driver can be easily setup separately from your lirc_serial in your /etc/modprobe.d/lirc-serial.conf:
#COM1 equivalent, /dev/ttyS0 options lirc_serial irq=4 io=0x3f8 #COM2 equivalent, /dev/ttyS1 #options lirc_serial irq=3 io=0x2f8 # This is for my PCI-E card with two additional serial ports options lirc_ser_01 irq=17 io=0xb800 share_irq=1 install lirc_serial setserial /dev/ttyS0 uart none; /sbin/modprobe --ignore-install lirc_serial install lirc_ser_01 setserial /dev/ttyS1 uart none; /sbin/modprobe --ignore-install lirc_ser_01
Background
The reason this whole process works is because the new name of the driver is the exact same length as the previous driver name. Doing this with another lirc driver (e.g. lirc_sir) would have to use a new name that is the exact same length so lirc_s01 would work, but lirc_sir1 would not.
Sample configuration
This setup was successfully used in the following configuration:
- Single Mythtvbackend
- One PVR-350, and one PVR-150
- Hauppauge remote from the PVR-350 using the lirc_i2c driver
- IR Blaster on COM1 (the only COM port on the motherboard) using lirc_serial
- IR Blaster on COM2 (from the SYBA PCI-E RS232 SD-PEX15022 card) using lirc_ser_01
- Two Pace DC50x (one on the PVR-350, the other on the PVR-350)
This configuration has two transmitters communicating with the same type of receiver, and thus required two lirc instances running for the transmitters and one running for the receiver. Usually, only one instance of lirc is needed just with each remote configured since there are usually different devices, but in this case they are the same type of device and each one has to be controlled independently.
Setting up lirc
This unique setup requires some additional work to setup lirc properly, namely it needs the lirc files for each transmitter with a different remote name. This file should be placed in /usr/share/lirc/extras/transmitters/pace which may need to be created:
# This is /usr/share/lirc/extras/transmitters/pace/general.conf # contributed by Mike Silliman # # brand: Pace # supported devices: Pace DC50X (Comcast Digital Transport Adapter) # # Protocol: XMP-R # Device: 62.16 begin remote name DC50X flags RAW_CODES eps 30 aeps 100 gap 80412 begin raw_codes name 1 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2656 210 763 210 763 210 763 210 894 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1578 210 1841 210 763 210 763 210 894 210 763 210 763 210 name 2 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2524 210 763 210 763 210 763 210 1026 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1446 210 1841 210 763 210 763 210 1026 210 763 210 763 210 name 3 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2393 210 763 210 763 210 763 210 1157 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1315 210 1841 210 763 210 763 210 1157 210 763 210 763 210 name 4 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2261 210 763 210 763 210 763 210 1315 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1157 210 1841 210 763 210 763 210 1315 210 763 210 763 210 name 5 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2130 210 763 210 763 210 763 210 1446 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1026 210 1841 210 763 210 763 210 1446 210 763 210 763 210 name 6 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1972 210 763 210 763 210 763 210 1578 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 894 210 1841 210 763 210 763 210 1578 210 763 210 763 210 name 7 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1841 210 763 210 763 210 763 210 1709 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 763 210 1841 210 763 210 763 210 1709 210 763 210 763 210 name 8 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1709 210 763 210 763 210 763 210 1841 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2787 210 1841 210 763 210 763 210 1841 210 763 210 763 210 name 9 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1578 210 763 210 763 210 763 210 1972 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2656 210 1841 210 763 210 763 210 1972 210 763 210 763 210 name 0 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 2787 210 763 210 763 210 763 210 763 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1709 210 1841 210 763 210 763 210 763 210 763 210 763 210 name Enter 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 1841 210 763 210 763 210 1026 210 1446 210 763 210 763 210 80413 210 894 210 1709 210 763 210 2787 210 1315 210 1315 210 1157 210 2656 210 13805 210 894 210 763 210 1841 210 763 210 1026 210 1446 210 763 210 763 210 end raw_codes end remote
Now to create the config for the second remote, simply do (as root):
# cat general.conf | sed -e 's/DC50X/DC50X_2/g' > general2.conf
Setup /etc/lirc/lircd.conf to have:
# /etc/lirc/lircd.conf # Note: Transmitters _must_ come before the receiver! include "/usr/share/lirc/extras/transmitters/pace/general.conf" include "/usr/share/lirc/extras/transmitters/pace/general2.conf" #Configuration for the Hauppauge TV card remote: include "/usr/share/lirc/extras/more_remotes/hauppauge/lircd.conf.hauppauge"
Setup /etc/lirc/hardware.conf
By default lirc is setup to work with one remote and one transmitter, but this setup requires another transmitter. This can be accomplished through MultiLIRC or by the following setup:
# Add these lines to /etc/init.d/hardware.conf for the second transmitter TRANSMITTER2="Serial Port (UART) : Comcast Pace DC50X box" TRANSMITTER2_MODULES="lirc_dev lirc_ser_01" TRANSMITTER2_DRIVER="" TRANSMITTER2_DEVICE="/dev/lirc2" TRANSMITTER2_SOCKET="" TRANSMITTER2_LIRCD_CONF="pace/general2.conf" TRANSMITTER2_LIRCD_ARGS=""
Setup /etc/init.d/lirc
By default the /etc/init.d/lirc will only setup one remote and one transmitter, so it needs to be modified to support another transmitter. Use the following /etc/init.d/lirc instead of the default:
#! /bin/sh
### BEGIN INIT INFO
# Provides: lirc
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts LIRC daemon.
# Description: LIRC is used to control different
# infrared receivers and transceivers.
### END INIT INFO
load_modules ()
{
MODULES_MISSING=false
log_daemon_msg "Loading LIRC modules"
for mod in $*; do
if [ $mod = "udev" ]; then
log_end_msg 0
log_success_msg "Restarted via udev, don't reload modules"
break
else
modprobe $mod 2> /dev/null || MODULES_MISSING=true
fi
done
log_end_msg $?
if $MODULES_MISSING; then
log_failure_msg "Unable to load LIRC kernel modules. Verify your"
log_failure_msg "selected kernel modules in /etc/lirc/hardware.conf"
START_LIRCMD=false
START_LIRCD=false
fi
}
build_remote_args ()
{
REMOTE_ARGS="$*"
#For remote only detection support, we need
#both REMOTE_DEVICE and TRANSMITTER_DEVICE undefined
if [ -z "$REMOTE_DEVICE" ] && [ -z "$TRANSMITTER_DEVICE" ] && [ -c $dev ]; then
REMOTE_DEVICE="$dev"
fi
#If we have a REMOTE_DEVICE or REMOTE_DRIVER defined (either because no devices
#were defined, OR if we explicitly did), then populate REMOTE_ARGS
if [ ! -z "$REMOTE_DEVICE" ] || [ ! -z "$REMOTE_DRIVER" ]; then
if [ -n "$REMOTE_DEVICE" ] && [ "$REMOTE_DEVICE" != "none" ]; then
REMOTE_ARGS="--device=$REMOTE_DEVICE $REMOTE_ARGS"
fi
if [ -n "$REMOTE_DRIVER" ] && [ "$REMOTE_DRIVER" != "none" ]; then
REMOTE_ARGS="--driver=$REMOTE_DRIVER $REMOTE_ARGS"
fi
#Now, if we ALSO have a transmitter defined, add some args
#To make the first lircd listen up
if [ ! -z "$TRANSMITTER_DEVICE" ] || [ ! -z "$TRANSMITTER_DRIVER" ]; then
REMOTE_ARGS="$REMOTE_ARGS --listen"
fi
REMOTE_ARGS="--output=$REMOTE_SOCKET $REMOTE_ARGS"
fi
echo $REMOTE_ARGS
}
build_transmitter_args ()
{
TRANSMITTER_ARGS="$*"
#Transmitters must be explicitly be defined
if [ ! -z "$TRANSMITTER_DEVICE" ] || [ ! -z "$TRANSMITTER_DRIVER" ]; then
if [ -n "$TRANSMITTER_DEVICE" ] && [ "$TRANSMITTER_DEVICE" != "none" ]; then
TRANSMITTER_ARGS="--device=$TRANSMITTER_DEVICE $TRANSMITTER_ARGS"
fi
if [ -n "$TRANSMITTER_DRIVER" ] && [ "$TRANSMITTER_DRIVER" != "none" ]; then
TRANSMITTER_ARGS="--driver=$TRANSMITTER_DRIVER $TRANSMITTER_ARGS"
fi
#Now, if we ALSO have a remote defined, add some args
#To make the second lircd connect
if [ ! -z "$REMOTE_DEVICE" ] || [ ! -z "$REMOTE_DRIVER" ]; then
TRANSMITTER_SOCKET="${TRANSMITTER_SOCKET}1"
TRANSMITTER_ARGS="$TRANSMITTER_ARGS --connect=localhost:8765 --pidfile=/var/run/lirc/lircd1.pid"
fi
TRANSMITTER_ARGS="--output=$TRANSMITTER_SOCKET $TRANSMITTER_ARGS"
fi
echo $TRANSMITTER_ARGS
}
build_transmitter2_args ()
{
TRANSMITTER2_ARGS="$*"
#Transmitters must be explicitly be defined
if [ ! -z "$TRANSMITTER2_DEVICE" ] || [ ! -z "$TRANSMITTER2_DRIVER" ]; then
if [ -n "$TRANSMITTER2_DEVICE" ] && [ "$TRANSMITTER2_DEVICE" != "none" ]; then
TRANSMITTER2_ARGS="--device=$TRANSMITTER2_DEVICE $TRANSMITTER2_ARGS"
fi
if [ -n "$TRANSMITTER2_DRIVER" ] && [ "$TRANSMITTER2_DRIVER" != "none" ]; then
TRANSMITTER2_ARGS="--driver=$TRANSMITTER2_DRIVER $TRANSMITTER2_ARGS"
fi
#Now, if we ALSO have a remote defined, add some args
#To make the second lircd connect
if [ ! -z "$REMOTE_DEVICE" ] || [ ! -z "$REMOTE_DRIVER" ]; then
TRANSMITTER2_SOCKET="${TRANSMITTER2_SOCKET}2"
TRANSMITTER2_ARGS="$TRANSMITTER2_ARGS --connect=localhost:8765 --pidfile=/var/run/lirc/lircd2.pid"
fi
TRANSMITTER2_ARGS="--output=$TRANSMITTER2_SOCKET $TRANSMITTER2_ARGS"
fi
echo $TRANSMITTER2_ARGS
}
. /lib/lsb/init-functions
test -f /usr/sbin/lircd || exit 0
test -f /usr/sbin/lircmd || exit 0
START_LIRCMD=true
START_LIRCD=true
START_IREXEC=true
if [ -f /etc/lirc/hardware.conf ];then
. /etc/lirc/hardware.conf
fi
if [ ! -f /etc/lirc/lircd.conf ] || grep -q "^#UNCONFIGURED" /etc/lirc/lircd.conf; then
if [ "$1" = "start" ]; then
log_success_msg "No valid /etc/lirc/lircd.conf has been found."
log_success_msg "Remote control support has been disabled."
log_success_msg "Reconfigure LIRC or manually replace /etc/lirc/lircd.conf to enable."
fi
START_LIRCD=false
START_LIRCMD=false
START_IREXEC=false
fi
if [ ! -f /etc/lirc/lircmd.conf ] || grep -q "^#UNCONFIGURED" /etc/lirc/lircmd.conf; then
START_LIRCMD=false
fi
if [ ! -f /etc/lirc/lircrc ] || grep -q "^#UNCONFIGURED" /etc/lirc/lircrc; then
START_IREXEC=false
fi
#We need default socket locations
OLD_SOCKET="/dev/lircd"
if [ -z "$REMOTE_SOCKET" ]; then
REMOTE_SOCKET="/var/run/lirc/lircd"
fi
if [ -z "$TRANSMITTER_SOCKET" ]; then
TRANSMITTER_SOCKET="/var/run/lirc/lircd"
fi
if [ -z "$TRANSMITTER2_SOCKET" ]; then
TRANSMITTER2_SOCKET="/var/run/lirc/lircd"
fi
case "$1" in
start)
if [ "$LOAD_MODULES" = "true" ] && [ "$START_LIRCD" = "true" ]; then
load_modules $2 $REMOTE_MODULES $TRANSMITTER_MODULES $TRANSMITTER2_MODULES $MODULES
fi
if [ "$START_LIRCD" = "true" ]; then
[ -d "/var/run/lirc" ] || mkdir -p "/var/run/lirc"
log_daemon_msg "Starting remote control daemon(s) : LIRC "
REMOTE_LIRCD_ARGS=`build_remote_args $REMOTE_LIRCD_ARGS`
TRANSMITTER_LIRCD_ARGS=`build_transmitter_args $TRANSMITTER_LIRCD_ARGS`
TRANSMITTER2_LIRCD_ARGS=`build_transmitter2_args $TRANSMITTER2_LIRCD_ARGS`
#if we have a remote defined, it is primary process
if [ ! -z "$REMOTE_LIRCD_ARGS" ]; then
start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/lircd -- $REMOTE_LIRCD_ARGS < /dev/null
log_end_msg $?
if [ -S "$REMOTE_SOCKET" -a "$OLD_SOCKET" != "$REMOTE_SOCKET" ]; then
rm -f $OLD_SOCKET && ln -s $REMOTE_SOCKET $OLD_SOCKET
fi
#now if we additionally have a transmitter defined, it is secondary process
if [ ! -z "$TRANSMITTER_LIRCD_ARGS" ]; then
/usr/sbin/lircd $TRANSMITTER_LIRCD_ARGS < /dev/null
if [ -S "$TRANSMITTER_SOCKET" ]; then
rm -f ${OLD_SOCKET}1 && ln -s $TRANSMITTER_SOCKET ${OLD_SOCKET}1
fi
fi
#now if we additionally have a second transmitter defined, it is secondary process
if [ ! -z "$TRANSMITTER2_LIRCD_ARGS" ]; then
/usr/sbin/lircd $TRANSMITTER2_LIRCD_ARGS < /dev/null
if [ -S "$TRANSMITTER2_SOCKET" ]; then
rm -f ${OLD_SOCKET}2 && ln -s $TRANSMITTER2_SOCKET ${OLD_SOCKET}2
fi
fi
elif [ ! -z "$TRANSMITTER_LIRCD_ARGS" ]; then
start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/lircd -- $TRANSMITTER_LIRCD_ARGS < /dev/null
log_end_msg $?
if [ -S "$TRANSMITTER_SOCKET" -a "$OLD_SOCKET" != "$TRANSMITTER_SOCKET" ]; then
rm -f $OLD_SOCKET && ln -s $TRANSMITTER_SOCKET $OLD_SOCKET
fi
elif [ ! -z "$TRANSMITTER2_LIRCD_ARGS" ]; then
start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/lircd -- $TRANSMITTER2_LIRCD_ARGS < /dev/null
log_end_msg $?
if [ -S "$TRANSMITTER2_SOCKET" -a "$OLD_SOCKET" != "$TRANSMITTER2_SOCKET" ]; then
rm -f $OLD_SOCKET && ln -s $TRANSMITTER2_SOCKET $OLD_SOCKET
fi
else
log_end_msg 1
fi
fi
if [ "$START_LIRCMD" = "true" ]; then
[ -d "/var/run/lirc" ] || mkdir -p "/var/run/lirc"
log_daemon_msg "Starting remote control mouse daemon : LIRCMD "
start-stop-daemon --start --quiet --oknodo --exec /usr/sbin/lircmd < /dev/null
log_end_msg $?
fi
if [ "$START_IREXEC" = "true" ]; then
[ -d "/var/run/lirc" ] || mkdir -p "/var/run/lirc"
log_daemon_msg "Starting execution daemon: irexec"
start-stop-daemon --start --quiet --oknodo --exec /usr/bin/irexec -- -d /etc/lirc/lircrc < /dev/null
log_end_msg $?
fi
;;
stop)
if [ "$START_IREXEC" = "true" ]; then
log_daemon_msg "Stopping execution daemon: irexec"
start-stop-daemon --stop --quiet --exec /usr/bin/irexec
log_end_msg $?
fi
if [ "$START_LIRCMD" = "true" ]; then
log_daemon_msg "Stopping remote control mouse daemon: LIRCMD"
start-stop-daemon --stop --quiet --exec /usr/sbin/lircmd
log_end_msg $?
fi
if [ "$START_LIRCD" = "true" ]; then
log_daemon_msg "Stopping remote control daemon(s): LIRC"
start-stop-daemon --stop --quiet --exec /usr/sbin/lircd
log_end_msg $?
[ -h "$OLD_SOCKET" ] && rm -f $OLD_SOCKET
[ -h "${OLD_SOCKET}1" ] && rm -f ${OLD_SOCKET}1
[ -h "${OLD_SOCKET}2" ] && rm -f ${OLD_SOCKET}2
fi
;;
reload|force-reload)
if [ "$START_IREXEC" = "true" ]; then
start-stop-daemon --stop --quiet --signal 1 --exec /usr/bin/irexec
fi
if [ "$START_LIRCD" = "true" ]; then
start-stop-daemon --stop --quiet --signal 1 --exec /usr/sbin/lircd
fi
if [ "$START_LIRCMD" = "true" ]; then
start-stop-daemon --stop --quiet --signal 1 --exec /usr/sbin/lircmd
fi
;;
restart)
$0 stop
#passes parameter $2 which is possibly our udev paramater
$0 start $2
;;
*)
echo "Usage: /etc/init.d/lircd {start|stop|reload|restart|force-reload}"
exit 1
esac
exit 0
Channel change scripts
The scripts below are minimal versions that are easy to understand. See Lirc Channel Change script for a feature complete script that handles multiple IR channels and other more complex situations.
Script to change the first tuner:
#!/usr/bin/perl
# Created by regx
# Simple perl script to change channels for Myth
# make sure to set this string to
# the corresponding remote in /etc/lircd.conf
$remote_name = 'DC50X';
$channel=$ARGV[0];
@channel = split(//,$channel);
foreach(@channel){
#print $_ . "\n";
`irsend -d /var/run/lirc/lircd1 SEND_ONCE $remote_name $_`;
}
sleep 1;
`irsend -d /var/run/lirc/lircd1 SEND_ONCE $remote_name ENTER`;
Script to change the second tuner:
#!/usr/bin/perl
# Created by regx
# Simple perl script to change channels for Myth
# make sure to set this string to
# the corresponding remote in /etc/lircd.conf
$remote_name = 'DC50X_2';
$channel=$ARGV[0];
@channel = split(//,$channel);
foreach(@channel){
#print $_ . "\n";
`irsend -d /var/run/lirc/lircd2 SEND_ONCE $remote_name $_`;
}
sleep 1;
`irsend -d /var/run/lirc/lircd2 SEND_ONCE $remote_name ENTER`;
Additional notes
Sometimes the setserial may fail on the insertion of the module so just add the following lines to /etc/rc.local to restart lirc twice to ensure everything works properly:
# Add these lines to /etc/rc.local /etc/init.d/lirc restart /etc/init.d/lirc restart
Conclusion
Thats it! Now lirc is configured to use one remote and two transmitters controlling the same type of device using multiple instances of the lirc_serial driver.