1 .. SPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later
3 .. _Remote_controllers_Protocols:
5 *****************************************
6 Remote Controller Protocols and Scancodes
7 *****************************************
9 IR is encoded as a series of pulses and spaces, using a protocol. These
10 protocols can encode e.g. an address (which device should respond) and a
11 command: what it should do. The values for these are not always consistent
12 across different devices for a given protocol.
14 Therefore out the output of the IR decoder is a scancode; a single u32
15 value. Using keymap tables this can be mapped to linux key codes.
17 Other things can be encoded too. Some IR protocols encode a toggle bit; this
18 is to distinguish whether the same button is being held down, or has been
19 released and pressed again. If has been released and pressed again, the
20 toggle bit will invert from one IR message to the next.
22 Some remotes have a pointer-type device which can used to control the
23 mouse; some air conditioning systems can have their target temperature
26 The following are the protocols the kernel knows about and also lists
27 how scancodes are encoded for each protocol.
32 This IR protocol uses manchester encoding to encode 14 bits. There is a
33 detailed description here https://www.sbprojects.net/knowledge/ir/rc5.php.
35 The scancode encoding is *not* consistent with the lirc daemon (lircd) rc5
36 protocol, or the manchester BPF decoder.
38 .. flat-table:: rc5 bits scancode mapping
51 - Start bit, always set
57 - 2nd start bit in rc5, re-used as 6th command bit
77 There is a variant of rc5 called either rc5x or extended rc5
78 where there the second stop bit is the 6th commmand bit, but inverted.
79 This is done so it the scancodes and encoding is compatible with existing
80 schemes. This bit is stored in bit 6 of the scancode, inverted. This is
81 done to keep it compatible with plain rc-5 where there are two start bits.
83 rc-5-sz (RC_PROTO_RC5_SZ)
84 -------------------------
85 This is much like rc-5 but one bit longer. The scancode is encoded
88 .. flat-table:: rc-5-sz bits scancode mapping
101 - Start bit, always set
127 rc-5x-20 (RC_PROTO_RC5X_20)
128 ---------------------------
130 This rc-5 extended to encoded 20 bits. The is a 3555 microseconds space
133 .. flat-table:: rc-5x-20 bits scancode mapping
146 - Start bit, always set
182 The jvc protocol is much like nec, without the inverted values. It is
183 described here https://www.sbprojects.net/knowledge/ir/jvc.php.
185 The scancode is a 16 bits value, where the address is the lower 8 bits
186 and the command the higher 8 bits; this is reversed from IR order.
188 sony-12 (RC_PROTO_SONY12)
189 -------------------------
191 The sony protocol is a pulse-width encoding. There are three variants,
192 which just differ in number of bits and scancode encoding.
194 .. flat-table:: sony-12 bits scancode mapping
215 sony-15 (RC_PROTO_SONY15)
216 -------------------------
218 The sony protocol is a pulse-width encoding. There are three variants,
219 which just differ in number of bits and scancode encoding.
221 .. flat-table:: sony-12 bits scancode mapping
242 sony-20 (RC_PROTO_SONY20)
243 -------------------------
245 The sony protocol is a pulse-width encoding. There are three variants,
246 which just differ in number of bits and scancode encoding.
248 .. flat-table:: sony-20 bits scancode mapping
278 The nec protocol encodes an 8 bit address and an 8 bit command. It is
279 described here https://www.sbprojects.net/knowledge/ir/nec.php. Note
280 that the protocol sends least significant bit first.
282 As a check, the nec protocol sends the address and command twice; the
283 second time it is inverted. This is done for verification.
285 A plain nec IR message has 16 bits; the high 8 bits are the address
286 and the low 8 bits are the command.
288 nec-x (RC_PROTO_NECX)
289 ---------------------
291 Extended nec has a 16 bit address and a 8 bit command. This is encoded
292 as a 24 bit value as you would expect, with the lower 8 bits the command
293 and the upper 16 bits the address.
295 nec-32 (RC_PROTO_NEC32)
296 -----------------------
298 nec-32 does not send an inverted address or an inverted command; the
299 entire message, all 32 bits, are used.
301 For this to be decoded correctly, the second 8 bits must not be the
302 inverted value of the first, and also the last 8 bits must not be the
303 inverted value of the third 8 bit value.
305 The scancode has a somewhat unusual encoding.
307 .. flat-table:: nec-32 bits scancode mapping
329 sanyo (RC_PROTO_SANYO)
330 ----------------------
332 The sanyo protocol is like the nec protocol, but with 13 bits address
333 rather than 8 bits. Both the address and the command are followed by
334 their inverted versions, but these are not present in the scancodes.
336 Bis 8 to 20 of the scancode is the 13 bits address, and the lower 8
337 bits are the command.
339 mcir2-kbd (RC_PROTO_MCIR2_KBD)
340 ------------------------------
342 This protocol is generated by the Microsoft MCE keyboard for keyboard
343 events. Refer to the ir-mce_kbd-decoder.c to see how it is encoded.
345 mcir2-mse (RC_PROTO_MCIR2_MSE)
346 ------------------------------
348 This protocol is generated by the Microsoft MCE keyboard for pointer
349 events. Refer to the ir-mce_kbd-decoder.c to see how it is encoded.
351 rc-6-0 (RC_PROTO_RC6_0)
352 -----------------------
354 This is the rc-6 in mode 0. rc-6 is described here
355 https://www.sbprojects.net/knowledge/ir/rc6.php.
356 The scancode is the exact 16 bits as in the protocol. There is also a
359 rc-6-6a-20 (RC_PROTO_RC6_6A_20)
360 -------------------------------
362 This is the rc-6 in mode 6a, 20 bits. rc-6 is described here
363 https://www.sbprojects.net/knowledge/ir/rc6.php.
364 The scancode is the exact 20 bits
365 as in the protocol. There is also a toggle bit.
367 rc-6-6a-24 (RC_PROTO_RC6_6A_24)
368 -------------------------------
370 This is the rc-6 in mode 6a, 24 bits. rc-6 is described here
371 https://www.sbprojects.net/knowledge/ir/rc6.php.
372 The scancode is the exact 24 bits
373 as in the protocol. There is also a toggle bit.
375 rc-6-6a-32 (RC_PROTO_RC6_6A_32)
376 -------------------------------
378 This is the rc-6 in mode 6a, 32 bits. rc-6 is described here
379 https://www.sbprojects.net/knowledge/ir/rc6.php.
380 The upper 16 bits are the vendor,
381 and the lower 16 bits are the vendor-specific bits. This protocol is
382 for the non-Microsoft MCE variant (vendor != 0x800f).
385 rc-6-mce (RC_PROTO_RC6_MCE)
386 ---------------------------
388 This is the rc-6 in mode 6a, 32 bits. The upper 16 bits are the vendor,
389 and the lower 16 bits are the vendor-specific bits. This protocol is
390 for the Microsoft MCE variant (vendor = 0x800f). The toggle bit in the
391 protocol itself is ignored, and the 16th bit should be takes as the toggle
394 sharp (RC_PROTO_SHARP)
395 ----------------------
397 This is a protocol used by Sharp VCRs, is described here
398 https://www.sbprojects.net/knowledge/ir/sharp.php. There is a very long
399 (40ms) space between the normal and inverted values, and some IR receivers
402 There is a 5 bit address and a 8 bit command. In the scancode the address is
403 in bits 8 to 12, and the command in bits 0 to 7.
408 This protocol has several versions and only version 1 is supported. Refer
409 to the decoder (ir-xmp-decoder.c) to see how it is encoded.
415 This is not an IR protocol, this is a protocol over CEC. The CEC
416 infrastructure uses rc-core for handling CEC commands, so that they
417 can easily be remapped.
422 This protocol is used by Antec Veris/SoundGraph iMON remotes.
425 describes both button presses and pointer movements. The protocol encodes
426 31 bits, and the scancode is simply the 31 bits with the top bit always 0.
428 rc-mm-12 (RC_PROTO_RCMM12)
429 --------------------------
431 The rc-mm protocol is described here
432 https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
435 rc-mm-24 (RC_PROTO_RCMM24)
436 --------------------------
438 The rc-mm protocol is described here
439 https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
442 rc-mm-32 (RC_PROTO_RCMM32)
443 --------------------------
445 The rc-mm protocol is described here
446 https://www.sbprojects.net/knowledge/ir/rcmm.php. The scancode is simply
449 xbox-dvd (RC_PROTO_XBOX_DVD)
450 ----------------------------
452 This protocol is used by XBox DVD Remote, which was made for the original
453 XBox. There is no in-kernel decoder or encoder for this protocol. The usb
454 device decodes the protocol. There is a BPF decoder available in v4l-utils.