跳转至内容

LIRC

来自 ArchWiki

来自 官方网站

LIRC (Linux Infrared Remote Control) 是一个用于解码和发送许多(但并非所有)常用遥控器红外信号的软件包。
注意 自 4.18 内核起,内核可以使用 BPF 解码某些红外遥控器的信号,这使得 LIRC 在某些情况下变得冗余。[1]

本文涵盖了 LIRC 在串口或 USB 红外设备上的设置和使用。

LIRC 是一个守护进程,可以将支持的遥控器上的按键按下转换为特定程序的命令。在这种情况下,“特定程序”意味着根据当前运行且接收 LIRC 命令的程序不同,同一个按键按下可以执行不同的操作。

  1. 按下遥控器上的按钮,使其发送红外 (IR) 或射频 (RF) 信号。
  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 服务的 驱动程序 (driver) 和/或 设备 (device)。如果在运行依赖 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 将由内核 创建。如果没有,请检查 journal 寻找相关错误。以下是串口设备的 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 电路的声卡可用于 接收发送 红外代码。

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

使用 alsamixer 取消麦克风输入的静音并设置足够的增益。你可以使用 audacity 检查波形和增益。应该能看到清晰的方波脉冲:既不能是平线,也不能过载。此外,解调后的脉冲应当能被耳朵轻松感知。注意 LIRC 和 irrecord 读取的是 右声道中的正脉冲。负脉冲将无法工作。

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

lirc-gitAUR 中包含 audio 驱动程序,它同时支持接收和发送。注意,默认约 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 文件对应一个设备,并描述其协议、扫描码 (scancodes) 和键码 (keycodes)。它允许 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 的应用程序,如 MPlayer, VLC, MythTVtotem (Kodi 也支持 LIRC 但方式非标准,见 Kodi#Using a remote control)。

在独立文件中定义这些应用程序特定配置,并将其包含在 lircrc 中,例如:

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

以普通用户身份运行

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

使用 lirc-user-service 的 AUR 包

提供了 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/modprobe.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 检测为红外设备,它使用 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

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.