2020-11-26 19:13:36 +08:00
|
|
|
.. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
|
2019-07-26 03:32:31 +08:00
|
|
|
|
|
|
|
.. _Remote_controllers_Protocols:
|
|
|
|
|
|
|
|
*****************************************
|
|
|
|
Remote Controller Protocols and Scancodes
|
|
|
|
*****************************************
|
|
|
|
|
|
|
|
IR is encoded as a series of pulses and spaces, using a protocol. These
|
|
|
|
protocols can encode e.g. an address (which device should respond) and a
|
|
|
|
command: what it should do. The values for these are not always consistent
|
|
|
|
across different devices for a given protocol.
|
|
|
|
|
|
|
|
Therefore out the output of the IR decoder is a scancode; a single u32
|
|
|
|
value. Using keymap tables this can be mapped to linux key codes.
|
|
|
|
|
|
|
|
Other things can be encoded too. Some IR protocols encode a toggle bit; this
|
|
|
|
is to distinguish whether the same button is being held down, or has been
|
|
|
|
released and pressed again. If has been released and pressed again, the
|
|
|
|
toggle bit will invert from one IR message to the next.
|
|
|
|
|
|
|
|
Some remotes have a pointer-type device which can used to control the
|
|
|
|
mouse; some air conditioning systems can have their target temperature
|
|
|
|
target set in IR.
|
|
|
|
|
|
|
|
The following are the protocols the kernel knows about and also lists
|
|
|
|
how scancodes are encoded for each protocol.
|
|
|
|
|
|
|
|
rc-5 (RC_PROTO_RC5)
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
This IR protocol uses manchester encoding to encode 14 bits. There is a
|
|
|
|
detailed description here https://www.sbprojects.net/knowledge/ir/rc5.php.
|
|
|
|
|
|
|
|
The scancode encoding is *not* consistent with the lirc daemon (lircd) rc5
|
|
|
|
protocol, or the manchester BPF decoder.
|
|
|
|
|
|
|
|
.. flat-table:: rc5 bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - rc-5 bit
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Start bit, always set
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- 6 (inverted)
|
|
|
|
|
|
|
|
- 2nd start bit in rc5, re-used as 6th command bit
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Toggle bit
|
|
|
|
|
|
|
|
* - 5
|
|
|
|
|
|
|
|
- 8 to 13
|
|
|
|
|
|
|
|
- Address
|
|
|
|
|
|
|
|
* - 6
|
|
|
|
|
|
|
|
- 0 to 5
|
|
|
|
|
|
|
|
- Command
|
|
|
|
|
|
|
|
There is a variant of rc5 called either rc5x or extended rc5
|
2023-01-30 07:10:53 +08:00
|
|
|
where there the second stop bit is the 6th command bit, but inverted.
|
2019-07-26 03:32:31 +08:00
|
|
|
This is done so it the scancodes and encoding is compatible with existing
|
|
|
|
schemes. This bit is stored in bit 6 of the scancode, inverted. This is
|
|
|
|
done to keep it compatible with plain rc-5 where there are two start bits.
|
|
|
|
|
|
|
|
rc-5-sz (RC_PROTO_RC5_SZ)
|
|
|
|
-------------------------
|
|
|
|
This is much like rc-5 but one bit longer. The scancode is encoded
|
|
|
|
differently.
|
|
|
|
|
|
|
|
.. flat-table:: rc-5-sz bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - rc-5-sz bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Start bit, always set
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- 13
|
|
|
|
|
|
|
|
- Address bit
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Toggle bit
|
|
|
|
|
|
|
|
* - 6
|
|
|
|
|
|
|
|
- 6 to 11
|
|
|
|
|
|
|
|
- Address
|
|
|
|
|
|
|
|
* - 6
|
|
|
|
|
|
|
|
- 0 to 5
|
|
|
|
|
|
|
|
- Command
|
|
|
|
|
|
|
|
rc-5x-20 (RC_PROTO_RC5X_20)
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
This rc-5 extended to encoded 20 bits. The is a 3555 microseconds space
|
|
|
|
after the 8th bit.
|
|
|
|
|
|
|
|
.. flat-table:: rc-5x-20 bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - rc-5-sz bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Start bit, always set
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- 14
|
|
|
|
|
|
|
|
- Address bit
|
|
|
|
|
|
|
|
* - 1
|
|
|
|
|
|
|
|
- none
|
|
|
|
|
|
|
|
- Toggle bit
|
|
|
|
|
|
|
|
* - 5
|
|
|
|
|
|
|
|
- 16 to 20
|
|
|
|
|
|
|
|
- Address
|
|
|
|
|
|
|
|
* - 6
|
|
|
|
|
|
|
|
- 8 to 13
|
|
|
|
|
|
|
|
- Address
|
|
|
|
|
|
|
|
* - 6
|
|
|
|
|
|
|
|
- 0 to 5
|
|
|
|
|
|
|
|
- Command
|
|
|
|
|
|
|
|
|
|
|
|
jvc (RC_PROTO_JVC)
|
|
|
|
------------------
|
|
|
|
|
|
|
|
The jvc protocol is much like nec, without the inverted values. It is
|
|
|
|
described here https://www.sbprojects.net/knowledge/ir/jvc.php.
|
|
|
|
|
|
|
|
The scancode is a 16 bits value, where the address is the lower 8 bits
|
|
|
|
and the command the higher 8 bits; this is reversed from IR order.
|
|
|
|
|
|
|
|
sony-12 (RC_PROTO_SONY12)
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
The sony protocol is a pulse-width encoding. There are three variants,
|
|
|
|
which just differ in number of bits and scancode encoding.
|
|
|
|
|
|
|
|
.. flat-table:: sony-12 bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - sony-12 bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 5
|
|
|
|
|
|
|
|
- 16 to 20
|
|
|
|
|
|
|
|
- device
|
|
|
|
|
|
|
|
* - 7
|
|
|
|
|
|
|
|
- 0 to 6
|
|
|
|
|
|
|
|
- function
|
|
|
|
|
|
|
|
sony-15 (RC_PROTO_SONY15)
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
The sony protocol is a pulse-width encoding. There are three variants,
|
|
|
|
which just differ in number of bits and scancode encoding.
|
|
|
|
|
|
|
|
.. flat-table:: sony-12 bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - sony-12 bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 8
|
|
|
|
|
|
|
|
- 16 to 23
|
|
|
|
|
|
|
|
- device
|
|
|
|
|
|
|
|
* - 7
|
|
|
|
|
|
|
|
- 0 to 6
|
|
|
|
|
|
|
|
- function
|
|
|
|
|
|
|
|
sony-20 (RC_PROTO_SONY20)
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
The sony protocol is a pulse-width encoding. There are three variants,
|
|
|
|
which just differ in number of bits and scancode encoding.
|
|
|
|
|
|
|
|
.. flat-table:: sony-20 bits scancode mapping
|
|
|
|
:widths: 1 1 2
|
|
|
|
|
|
|
|
* - sony-20 bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
- description
|
|
|
|
|
|
|
|
* - 5
|
|
|
|
|
|
|
|
- 16 to 20
|
|
|
|
|
|
|
|
- device
|
|
|
|
|
|
|
|
* - 7
|
|
|
|
|
|
|
|
- 0 to 7
|
|
|
|
|
|
|
|
- device
|
|
|
|
|
|
|
|
* - 8
|
|
|
|
|
|
|
|
- 8 to 15
|
|
|
|
|
|
|
|
- extended bits
|
|
|
|
|
|
|
|
nec (RC_PROTO_NEC)
|
|
|
|
------------------
|
|
|
|
|
|
|
|
The nec protocol encodes an 8 bit address and an 8 bit command. It is
|
|
|
|
described here https://www.sbprojects.net/knowledge/ir/nec.php. Note
|
|
|
|
that the protocol sends least significant bit first.
|
|
|
|
|
|
|
|
As a check, the nec protocol sends the address and command twice; the
|
|
|
|
second time it is inverted. This is done for verification.
|
|
|
|
|
|
|
|
A plain nec IR message has 16 bits; the high 8 bits are the address
|
|
|
|
and the low 8 bits are the command.
|
|
|
|
|
|
|
|
nec-x (RC_PROTO_NECX)
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
Extended nec has a 16 bit address and a 8 bit command. This is encoded
|
|
|
|
as a 24 bit value as you would expect, with the lower 8 bits the command
|
|
|
|
and the upper 16 bits the address.
|
|
|
|
|
|
|
|
nec-32 (RC_PROTO_NEC32)
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
nec-32 does not send an inverted address or an inverted command; the
|
|
|
|
entire message, all 32 bits, are used.
|
|
|
|
|
|
|
|
For this to be decoded correctly, the second 8 bits must not be the
|
|
|
|
inverted value of the first, and also the last 8 bits must not be the
|
|
|
|
inverted value of the third 8 bit value.
|
|
|
|
|
|
|
|
The scancode has a somewhat unusual encoding.
|
|
|
|
|
|
|
|
.. flat-table:: nec-32 bits scancode mapping
|
|
|
|
|
|
|
|
* - nec-32 bits
|
|
|
|
|
|
|
|
- scancode bit
|
|
|
|
|
|
|
|
* - First 8 bits
|
|
|
|
|
|
|
|
- 16 to 23
|
|
|
|
|
|
|
|
* - Second 8 bits
|
|
|
|
|
|
|
|
- 24 to 31
|
|
|
|
|
|
|
|
* - Third 8 bits
|
|
|
|
|
|
|
|
- 0 to 7
|
|
|
|
|
|
|
|
* - Fourth 8 bits
|
|
|
|
|
|
|
|
- 8 to 15
|
|
|
|
|
|
|
|
sanyo (RC_PROTO_SANYO)
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
The sanyo protocol is like the nec protocol, but with 13 bits address
|
|
|
|
rather than 8 bits. Both the address and the command are followed by
|
|
|
|
their inverted versions, but these are not present in the scancodes.
|
|
|
|
|
|
|
|
Bis 8 to 20 of the scancode is the 13 bits address, and the lower 8
|
|
|
|
bits are the command.
|
|
|
|
|
|
|
|
mcir2-kbd (RC_PROTO_MCIR2_KBD)
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
This protocol is generated by the Microsoft MCE keyboard for keyboard
|
|
|
|
events. Refer to the ir-mce_kbd-decoder.c to see how it is encoded.
|
|
|
|
|
|
|
|
mcir2-mse (RC_PROTO_MCIR2_MSE)
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
This protocol is generated by the Microsoft MCE keyboard for pointer
|
|
|
|
events. Refer to the ir-mce_kbd-decoder.c to see how it is encoded.
|
|
|
|
|
|
|
|
rc-6-0 (RC_PROTO_RC6_0)
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
This is the rc-6 in mode 0. rc-6 is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rc6.php.
|
|
|
|
The scancode is the exact 16 bits as in the protocol. There is also a
|
|
|
|
toggle bit.
|
|
|
|
|
|
|
|
rc-6-6a-20 (RC_PROTO_RC6_6A_20)
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
This is the rc-6 in mode 6a, 20 bits. rc-6 is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rc6.php.
|
|
|
|
The scancode is the exact 20 bits
|
|
|
|
as in the protocol. There is also a toggle bit.
|
|
|
|
|
|
|
|
rc-6-6a-24 (RC_PROTO_RC6_6A_24)
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
This is the rc-6 in mode 6a, 24 bits. rc-6 is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rc6.php.
|
|
|
|
The scancode is the exact 24 bits
|
|
|
|
as in the protocol. There is also a toggle bit.
|
|
|
|
|
|
|
|
rc-6-6a-32 (RC_PROTO_RC6_6A_32)
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
This is the rc-6 in mode 6a, 32 bits. rc-6 is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rc6.php.
|
|
|
|
The upper 16 bits are the vendor,
|
|
|
|
and the lower 16 bits are the vendor-specific bits. This protocol is
|
|
|
|
for the non-Microsoft MCE variant (vendor != 0x800f).
|
|
|
|
|
|
|
|
|
|
|
|
rc-6-mce (RC_PROTO_RC6_MCE)
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
This is the rc-6 in mode 6a, 32 bits. The upper 16 bits are the vendor,
|
|
|
|
and the lower 16 bits are the vendor-specific bits. This protocol is
|
|
|
|
for the Microsoft MCE variant (vendor = 0x800f). The toggle bit in the
|
|
|
|
protocol itself is ignored, and the 16th bit should be takes as the toggle
|
|
|
|
bit.
|
|
|
|
|
|
|
|
sharp (RC_PROTO_SHARP)
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
This is a protocol used by Sharp VCRs, is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/sharp.php. There is a very long
|
|
|
|
(40ms) space between the normal and inverted values, and some IR receivers
|
|
|
|
cannot decode this.
|
|
|
|
|
|
|
|
There is a 5 bit address and a 8 bit command. In the scancode the address is
|
|
|
|
in bits 8 to 12, and the command in bits 0 to 7.
|
|
|
|
|
|
|
|
xmp (RC_PROTO_XMP)
|
|
|
|
------------------
|
|
|
|
|
|
|
|
This protocol has several versions and only version 1 is supported. Refer
|
|
|
|
to the decoder (ir-xmp-decoder.c) to see how it is encoded.
|
|
|
|
|
|
|
|
|
|
|
|
cec (RC_PROTO_CEC)
|
|
|
|
------------------
|
|
|
|
|
|
|
|
This is not an IR protocol, this is a protocol over CEC. The CEC
|
|
|
|
infrastructure uses rc-core for handling CEC commands, so that they
|
|
|
|
can easily be remapped.
|
|
|
|
|
|
|
|
imon (RC_PROTO_IMON)
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
This protocol is used by Antec Veris/SoundGraph iMON remotes.
|
|
|
|
|
|
|
|
The protocol
|
|
|
|
describes both button presses and pointer movements. The protocol encodes
|
|
|
|
31 bits, and the scancode is simply the 31 bits with the top bit always 0.
|
|
|
|
|
|
|
|
rc-mm-12 (RC_PROTO_RCMM12)
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
The rc-mm protocol is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
|
|
|
|
the 12 bits.
|
|
|
|
|
|
|
|
rc-mm-24 (RC_PROTO_RCMM24)
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
The rc-mm protocol is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
|
|
|
|
the 24 bits.
|
|
|
|
|
|
|
|
rc-mm-32 (RC_PROTO_RCMM32)
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
The rc-mm protocol is described here
|
|
|
|
https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
|
|
|
|
the 32 bits.
|
|
|
|
|
|
|
|
xbox-dvd (RC_PROTO_XBOX_DVD)
|
|
|
|
----------------------------
|
|
|
|
|
|
|
|
This protocol is used by XBox DVD Remote, which was made for the original
|
|
|
|
XBox. There is no in-kernel decoder or encoder for this protocol. The usb
|
|
|
|
device decodes the protocol. There is a BPF decoder available in v4l-utils.
|