3. 远程控制器协议和扫描码¶
红外线 (IR) 被编码为一系列脉冲和间隔,使用一种协议。这些协议可以编码例如地址(哪个设备应该响应)和一个命令:它应该做什么。对于给定的协议,这些值在不同的设备之间并不总是一致的。
因此,红外解码器的输出是一个扫描码;一个单独的 u32 值。使用键映射表,这可以映射到 Linux 键码。
也可以编码其他东西。一些红外协议编码一个切换位;这是为了区分同一按钮是否被按住,或者是否被释放并再次按下。如果被释放并再次按下,切换位将在一个红外消息到下一个红外消息之间反转。
一些遥控器具有可用于控制鼠标的指针类型设备;一些空调系统可以在红外线中设置其目标温度。
以下是内核知道的协议,并列出了每个协议的扫描码是如何编码的。
3.1. rc-5 (RC_PROTO_RC5)¶
此红外协议使用曼彻斯特编码来编码 14 位。这里有一个详细的描述 https://www.sbprojects.net/knowledge/ir/rc5.php。
扫描码编码与 lirc 守护进程 (lircd) rc5 协议或曼彻斯特 BPF 解码器不一致。
rc-5 位 |
扫描码位 |
描述 |
1 |
无 |
起始位,始终设置 |
1 |
6 (反转) |
rc5 中的第二个起始位,重新用作第 6 个命令位 |
1 |
无 |
切换位 |
5 |
8 到 13 |
地址 |
6 |
0 到 5 |
命令 |
rc5 有一个变体,称为 rc5x 或扩展 rc5,其中第二个停止位是第 6 个命令位,但反转了。这样做是为了使扫描码和编码与现有方案兼容。此位存储在扫描码的第 6 位中,反转。这样做是为了使其与有两个起始位的普通 rc-5 兼容。
3.2. rc-5-sz (RC_PROTO_RC5_SZ)¶
这很像 rc-5,但长一位。扫描码的编码方式不同。
rc-5-sz 位 |
扫描码位 |
描述 |
1 |
无 |
起始位,始终设置 |
1 |
13 |
地址位 |
1 |
无 |
切换位 |
6 |
6 到 11 |
地址 |
6 |
0 到 5 |
命令 |
3.3. rc-5x-20 (RC_PROTO_RC5X_20)¶
此 rc-5 扩展到编码 20 位。在第 8 位之后有一个 3555 微秒的间隔。
rc-5-sz 位 |
扫描码位 |
描述 |
1 |
无 |
起始位,始终设置 |
1 |
14 |
地址位 |
1 |
无 |
切换位 |
5 |
16 到 20 |
地址 |
6 |
8 到 13 |
地址 |
6 |
0 到 5 |
命令 |
3.4. jvc (RC_PROTO_JVC)¶
jvc 协议很像 nec,没有反转值。它在这里描述 https://www.sbprojects.net/knowledge/ir/jvc.php。
扫描码是一个 16 位的值,其中地址是低 8 位,命令是高 8 位;这与红外顺序相反。
3.5. sony-12 (RC_PROTO_SONY12)¶
sony 协议是一种脉冲宽度编码。有三种变体,它们只是在位数和扫描码编码上有所不同。
sony-12 位 |
扫描码位 |
描述 |
5 |
16 到 20 |
设备 |
7 |
0 到 6 |
功能 |
3.6. sony-15 (RC_PROTO_SONY15)¶
sony 协议是一种脉冲宽度编码。有三种变体,它们只是在位数和扫描码编码上有所不同。
sony-12 位 |
扫描码位 |
描述 |
8 |
16 到 23 |
设备 |
7 |
0 到 6 |
功能 |
3.7. sony-20 (RC_PROTO_SONY20)¶
sony 协议是一种脉冲宽度编码。有三种变体,它们只是在位数和扫描码编码上有所不同。
sony-20 位 |
扫描码位 |
描述 |
5 |
16 到 20 |
设备 |
7 |
0 到 7 |
设备 |
8 |
8 到 15 |
扩展位 |
3.8. nec (RC_PROTO_NEC)¶
nec 协议编码一个 8 位地址和一个 8 位命令。它在这里描述 https://www.sbprojects.net/knowledge/ir/nec.php。 请注意,该协议首先发送最低有效位。
作为检查,nec 协议将地址和命令发送两次;第二次是反转的。这样做是为了验证。
一个普通的 nec 红外消息有 16 位;高 8 位是地址,低 8 位是命令。
3.9. nec-x (RC_PROTO_NECX)¶
扩展 nec 有一个 16 位地址和一个 8 位命令。它被编码为一个 24 位的值,正如您所期望的那样,低 8 位是命令,高 16 位是地址。
3.10. nec-32 (RC_PROTO_NEC32)¶
nec-32 不发送反转的地址或反转的命令;使用整个消息,所有 32 位。
为了正确解码,第二个 8 位不能是第一个的反转值,并且最后 8 位也不能是第三个 8 位值的反转值。
扫描码具有有点不寻常的编码。
nec-32 位 |
扫描码位 |
前 8 位 |
16 到 23 |
第二 8 位 |
24 到 31 |
第三 8 位 |
0 到 7 |
第四 8 位 |
8 到 15 |
3.11. sanyo (RC_PROTO_SANYO)¶
sanyo 协议类似于 nec 协议,但地址为 13 位而不是 8 位。地址和命令都后跟它们的反转版本,但这些不存在于扫描码中。
扫描码的第 8 到 20 位是 13 位地址,低 8 位是命令。
3.12. mcir2-kbd (RC_PROTO_MCIR2_KBD)¶
此协议由 Microsoft MCE 键盘为键盘事件生成。请参阅 ir-mce_kbd-decoder.c 以了解它是如何编码的。
3.13. mcir2-mse (RC_PROTO_MCIR2_MSE)¶
此协议由 Microsoft MCE 键盘为指针事件生成。请参阅 ir-mce_kbd-decoder.c 以了解它是如何编码的。
3.14. rc-6-0 (RC_PROTO_RC6_0)¶
这是模式 0 中的 rc-6。rc-6 在这里描述 https://www.sbprojects.net/knowledge/ir/rc6.php。扫描码与协议中的精确 16 位相同。还有一个切换位。
3.15. rc-6-6a-20 (RC_PROTO_RC6_6A_20)¶
这是模式 6a 中的 rc-6,20 位。rc-6 在这里描述 https://www.sbprojects.net/knowledge/ir/rc6.php。扫描码与协议中的精确 20 位相同。还有一个切换位。
3.16. rc-6-6a-24 (RC_PROTO_RC6_6A_24)¶
这是模式 6a 中的 rc-6,24 位。rc-6 在这里描述 https://www.sbprojects.net/knowledge/ir/rc6.php。扫描码与协议中的精确 24 位相同。还有一个切换位。
3.17. rc-6-6a-32 (RC_PROTO_RC6_6A_32)¶
这是模式 6a 中的 rc-6,32 位。rc-6 在这里描述 https://www.sbprojects.net/knowledge/ir/rc6.php。高 16 位是供应商,低 16 位是供应商特定的位。此协议适用于非 Microsoft MCE 变体(供应商 != 0x800f)。
3.18. rc-6-mce (RC_PROTO_RC6_MCE)¶
这是模式 6a 中的 rc-6,32 位。高 16 位是供应商,低 16 位是供应商特定的位。此协议适用于 Microsoft MCE 变体(供应商 = 0x800f)。协议本身的切换位被忽略,第 16 位应作为切换位。
3.20. xmp (RC_PROTO_XMP)¶
此协议有多个版本,仅支持版本 1。请参阅解码器 (ir-xmp-decoder.c) 以了解其编码方式。
3.21. cec (RC_PROTO_CEC)¶
这不是一个红外协议,而是一个基于 CEC 的协议。CEC 基础设施使用 rc-core 来处理 CEC 命令,以便可以轻松地重新映射它们。
3.22. imon (RC_PROTO_IMON)¶
此协议由 Antec Veris/SoundGraph iMON 遥控器使用。
该协议描述了按钮按下和指针移动。该协议编码 31 位,扫描码就是这 31 位,最高位始终为 0。
3.23. rc-mm-12 (RC_PROTO_RCMM12)¶
rc-mm 协议在此处描述 https://www.sbprojects.net/knowledge/ir/rcmm.php。扫描码就是这 12 位。
3.24. rc-mm-24 (RC_PROTO_RCMM24)¶
rc-mm 协议在此处描述 https://www.sbprojects.net/knowledge/ir/rcmm.php。扫描码就是这 24 位。
3.25. rc-mm-32 (RC_PROTO_RCMM32)¶
rc-mm 协议在此处描述 https://www.sbprojects.net/knowledge/ir/rcmm.php。扫描码就是这 32 位。
3.26. xbox-dvd (RC_PROTO_XBOX_DVD)¶
此协议由为原始 XBox 制作的 XBox DVD 遥控器使用。此协议没有内核内解码器或编码器。usb 设备解码该协议。v4l-utils 中有一个可用的 BPF 解码器。