LIRC
来自 官方网站
- LIRC (Linux Infrared Remote Control) 是一个用于解码和发送许多(但并非所有)常用遥控器红外信号的软件包。
本文涵盖了 LIRC 在串口或 USB 红外设备上的设置和使用。
LIRC 是一个守护进程,可以将支持的遥控器上的按键按下转换为特定程序的命令。在这种情况下,“特定程序”意味着根据当前运行且接收 LIRC 命令的程序不同,同一个按键按下可以执行不同的操作。
- 按下遥控器上的按钮,使其发送红外 (IR) 或射频 (RF) 信号。
- 信号由连接到 Linux 计算机的接收器接收。
- 内核(通过正确的模块)将来自遥控器的脉冲数据呈现在诸如
/dev/lirc0,/dev/input/eventX,/dev/ttyUSBX或/dev/ttyS0之类的设备上。 /usr/bin/lircd使用来自/etc/lirc/lircd.conf.d/foo.conf的信息将脉冲数据转换为按钮按下信息。- 使用 LIRC 的程序根据
~/.config/lircrc或程序特定的映射,将来自/usr/bin/lircd的按钮按下信息转换为用户定义的动作。
安装
配置
接收器和发送器配置
为了正常运行,可能需要指定 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
串口
现代内核拥有 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 并继续。建议将配置文件分享给他人。
应用程序特定操作
通过将相应的配置文件放入 ~/.config/lircrc/ (如果需要请手动创建),将键码绑定到应用程序特定的操作,详情见 lircrc(5)。这仅适用于感知 LIRC 的应用程序,如 MPlayer, VLC, MythTV 和 totem (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 没有输出:
- 运行 mode2 或 xmode2 看看 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,适当更改 driver 和 device。
如果没有输出,任务就变成了寻找正确的驱动程序/设备组合。首先检查 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 中相应地更改 driver 和 device。
示例
适用于 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