LIRC

来自 ArchWiki

来自 官方网站

LIRC (Linux Infrared Remote Control) 是一个软件包,可以解码和发送许多(但不是全部)常用遥控器的红外信号。
注意: 自 4.18 版本以来,内核可以使用 BPF 解码某些红外遥控器的信号,这有时会使 LIRC 变得多余。[1]

本文介绍了使用串行或 USB 红外设备设置和使用 LIRC。

LIRC 是一个守护进程,可以将受支持的遥控器上的按键转换为特定于程序的命令。在此上下文中,“特定于程序”一词意味着按键可以根据哪个程序正在运行并从 LIRC 接收命令而执行不同的操作。

  1. 按下遥控器上的按钮会导致其发送红外或射频信号。
  2. 信号由连接到 Linux 计算机的接收器接收。
  3. 内核(通过正确的模块)使用来自遥控器的脉冲数据呈现在设备上,例如 /dev/lirc0/dev/input/eventX/dev/ttyUSBX/dev/ttyS0
  4. /usr/bin/lircd 使用来自 /etc/lirc/lircd.conf.d/foo.conf 的信息将脉冲数据转换为按钮按下信息。
  5. 使用 LIRC 的程序根据 ~/.config/lircrc 或程序特定的映射将来自 /usr/bin/lircd 的按钮按下信息转换为用户定义的操作。

安装

安装 lirc 软件包。如果您需要音频驱动程序,请安装 lirc-gitAUR

配置

接收器和发射器配置

注意: 本节是一个快速摘要。完整的文档可在 上游 获得。

LIRC 服务的驱动程序和/或设备可能需要指定才能正常运行。如果服务在运行依赖 LIRC 的程序(如 irrecord)时突然停止,请在 journalctl 输出中查找如下消息

Driver `devinput' not found or not loadable (wrong or missing -U/--plugindir?).
readlink() failed for "auto": No such file or directory

在配置文件中设置这些,然后重启服务。

/etc/lirc/lirc_options.conf
[lircd]
driver = driver-name
device = /dev/path-to-dev

串口

提示: 对于 DIY 原理图,请参考串口 接收器发射器 文档。请注意,串口设备比 audio_alsaaudio 更可靠。

现代内核具有 serial_ir 模块,它取代了旧的 lirc_serial 驱动程序。它甚至支持连接到主板串口的 DIY 接收器和发射器。安装 setserialAUR 并运行

# setserial /dev/ttyS0 uart none
# modprobe serial_ir

加载 serial_ir 模块后,设备 /dev/lirc0 将由内核创建。如果不是,请检查 日志 中是否有任何相关错误。串口设备的 LIRC 配置示例

/etc/lirc/lirc_options.conf
[lircd]
driver          = default
device          = auto

[modinit]
code = /usr/bin/setserial /dev/ttyS0 uart none
code1 = /usr/sbin/modprobe serial_ir

声卡

注意: 使用声卡作为红外设备有很多缺陷,并且不比其他硬件设置更有优势。

带有连接的外部 DIY 电路的声卡可用于接收发送 红外代码。

audio_alsa 驱动程序 包含在 lirc 中,但仅支持接收。

使用 alsamixer 取消麦克风输入静音并设置足够的增益。您可以使用 audacity 检查波形和增益。应该有可区分的方波脉冲:既不是平直的,也不是过载的。同样,良好的解调脉冲也很容易通过耳朵感知。请注意,LIRC 和 irrecord 读取右声道中的正脉冲。负脉冲将不起作用。

/etc/lirc/lirc_options.conf
driver          = audio_alsa
device          = default

audio 驱动程序 包含在 lirc-gitAUR 中,并支持接收和发送。请注意,默认延迟约为 0.02 可能会导致“Warning: Output underflow”和传输损坏 - 接收器将不会响应它。尝试更高的值,例如 0.05。

增加声卡输出音量,否则 LED 信号会很弱且范围很小。LED 闪烁可以用智能手机相机检测到,因为它对红外波长敏感。

/etc/lirc/lirc_options.conf
driver          = audio
device          = ALSA:default@48000:0.05

远程配置

目录 /etc/lirc/lircd.conf.d/ 包含用于遥控器的系统范围配置文件。每个 *.conf 文件对应一个设备,并描述其协议、扫描码和键码。它允许 LIRC 接收和发送特定硬件的信号。这些文件未包含在 lirc 软件包中,应在某处找到或由用户创建。

搜索远程配置

可以在 LIRC 遥控器数据库 中找到大量配置文件。访问该 URL 或使用 irdb-get(1) 搜索数据库。

使用 irdb-get 查找 “Streamzap” 遥控器的配置文件的示例

$ irdb-get find stream
atiusb/atiusb.lircd.conf
digital_stream/DTX9900.lircd.conf
snapstream/Firefly-Mini.lircd.conf
streamzap/PC_Remote.lircd.conf
streamzap/streamzap.lircd.conf
x10/atiusb.lircd.conf
$ irdb-get download streamzap/streamzap.lircd.conf
Downloaded sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/streamzap/streamzap.lircd.conf as streamzap.lircd.conf

一旦确定,将所需的 .conf 复制到 /etc/lirc/lircd.conf.d/ 以允许守护程序初始化对其的支持。

# cp streamzap.lircd.conf /etc/lirc/lircd.conf.d/

创建远程配置

可以使用 irrecord(1) 创建遥控器配置,它会指导用户完成该过程。如果使用检测到的遥控器,请按如下方式调用它

# irrecord --device=/dev/lirc0 MyRemote

该程序将指示用户开始敲击遥控器上的按键以学习它,最终映射出每个按钮及其相应的扫描码。完成后,将生成的文件保存到 /etc/lirc/lircd.conf.d/foo.conf 并继续。考虑与他人共享配置文件。

应用程序特定操作

提示: 互联网上提供了许多特定于应用程序的 lircrc 文件。

通过将各自的配置文件放在 ~/.config/lircrc/ 中,将键码绑定到应用程序特定的操作,如果需要,应手动创建该目录,请参阅 lircrc(5)。这仅适用于支持 LIRC 的应用程序,例如 MPlayerVLCMythTVtotemKodi 也支持 LIRC,但以非标准方式进行,请参阅 Kodi#使用遥控器)。

在单独的文件中定义这些应用程序特定的配置,并将它们包含在 lircrc 中,例如

include "~/.config/lircrc/mplayer"
include "~/.config/lircrc/mythtv"
include "~/.config/lircrc/vlc"

以普通用户身份运行

默认情况下,lircd 以 root 身份运行。为了提高稳定性和安全性,上游建议以普通用户身份运行它。请参阅 链接的附录 14。

使用 AUR 软件包 lirc-user-service

提供了 lirc-user-serviceAUR,它可以自动完成所有操作。

测试

启动/启用 lircd.service

接收命令

运行 irw(1),将遥控器指向接收器并按下一些按钮。接收到的代码将打印到 stdout。

$ irw
000000037ff07bfe 00 One mceusb
000000037ff07bfd 00 Two mceusb
000000037ff07bfd 01 Two mceusb
000000037ff07bf2 00 Home mceusb
000000037ff07bf2 01 Home mceusb

如果 irw 没有输出

  • 运行 mode2xmode2 以查看 LIRC 是否实际从红外传感器读取到任何内容,如果没有 - 检查硬件
  • 如果 mode2 接收到脉冲数据,请检查 /etc/lirc/lircd.conf.d/ 中的配置文件是否有错误

发送命令

列出已注册的遥控器(配置文件)

$ irsend LIST "" ""
LG_6710CMAP01A

列出特定设备的可用代码

$ irsend LIST LG_6710CMAP01A ""
0000000000007887 KEY_POWER
000000000000f807 KEY_MUTE
000000000000e817 KEY_VOLUMEUP
...

选择已发现的设备 LG_6710CMAP01A 并发送命令 KEY_POWER

$ irsend SEND_ONCE LG_6710CMAP01A KEY_POWER

故障排除

远程功能如同键盘

当使用 Xorg 时

Xorg 检测到一些遥控器,例如 Streamzap USB PC Remote,作为人机接口设备 (HID),这意味着某些或所有按键将显示为击键,就像从物理键盘输入一样。如果要使用 LIRC 管理设备,此行为将带来问题。

要禁用,请创建以下文件并重启 X

/etc/X11/xorg.conf.d/90-streamzap.conf
Section "InputClass"
  Identifier "Ignore Streamzap IR"
  MatchProduct "Streamzap"
  MatchIsKeyboard "true"
  Option "Ignore" "true"
EndSection

不要忘记根据 Name 中显示的属性更改 MatchProduct 属性,该属性来自以下输出

$ grep -e IR /proc/bus/input/devices

例如,对于 N: Name="cx88 IR (WinFast DTV2000 H rev.",使用 WinFast

不使用 Xorg 时

通过创建 /etc/modprobed.d/streamzap.conf 来黑名单有问题的模块,以抑制此行为。为 Streamzap 遥控器提供了一个示例。

install ir_sharp_decoder /bin/false
install ir_xmp_decoder /bin/false
install ir_rc5_decoder /bin/false
install ir_nec_decoder /bin/false
install ir_sony_decoder /bin/false
install ir_mce_kbd_decoder /bin/false
install ir_jvc_decoder /bin/false
install ir_rc6_decoder /bin/false
install ir_sanyo_decoder /bin/false

更改默认配置

irw 获取不到任何输出的用户可能在 /etc/lirc/lirc_options.conf 中错误地设置了默认配置(或者可能已被更新覆盖)。

首先,检查 /dev/lirc0 是否存在

$ mode2 --driver default --device /dev/lirc0

在按下遥控器上的按钮时观察输出。如果存在输出,请编辑 /etc/lirc/lirc_options.conf,并根据需要更改 driverdevice

如果没有显示输出,则任务变为找到正确的驱动程序/设备组合。首先检查 lirc 默认检测到的组合。从 v4l-utils 软件包运行 ir-keytable 并检查输出。它看起来会类似于这样

 Found /sys/class/rc/rc0/ (/dev/input/event5) with:
       Driver ite-cir, table rc-rc6-mce
       Supported protocols: unknown other lirc rc-5 jvc sony nec sanyo mce-kbd rc-6 sharp xmp
       Enabled protocols: lirc
       Extra capabilities: <access denied>

在这种情况下,LIRC 自动检测到 /dev/input/event5 作为 IR 设备,它使用 devinput 驱动程序。通过运行以下命令检查此组合是否有效

$ mode2 --driver devinput --device /dev/input/event5

现在尝试按下遥控器上的按钮。如果没有输出,请尝试不同的驱动程序和设备组合。一旦确定了有效组合,请在 /etc/lirc/lirc_options.conf 中相应地更改 driverdevice

示例

MCE RC6 兼容接收器的示例配置

/etc/lirc/lirc_options.conf
[lircd]
nodaemon        = False
driver          = default
device          = /dev/lirc0
output          = /var/run/lirc/lircd
pidfile         = /var/run/lirc/lircd.pid
plugindir       = /usr/lib/lirc/plugins
permission      = 666
allow-simulate  = No
repeat-max      = 600

[lircmd]
uinput          = False
nodaemon        = False

参见