wsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget9/translations/zh_CN/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget9/translations/zh_TW/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget9/translations/it_IT/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget9/translations/ja_JP/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget9/translations/ko_KR/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget9/translations/sp_SP/userspace-api/media/rc/lirc-dev-intromodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(hCSPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-laterh]hCSPDX-License-Identifier: GPL-2.0 OR GFDL-1.1-no-invariants-or-later}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhS/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro.rsthKubhtarget)}(h.. _lirc_dev_intro:h]h}(h]h ]h"]h$]h&]refidlirc-dev-introuh1hhKhhhhhhubhsection)}(hhh](htitle)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXLIRC stands for Linux Infrared Remote Control. The LIRC device interface is a bi-directional interface for transporting raw IR and decoded scancodes data between userspace and kernelspace. Fundamentally, it is just a chardev (/dev/lircX, for X = 0, 1, 2, ...), with a number of standard struct file_operations defined on it. With respect to transporting raw IR and decoded scancodes to and fro, the essential fops are read, write and ioctl.h]hXLIRC stands for Linux Infrared Remote Control. The LIRC device interface is a bi-directional interface for transporting raw IR and decoded scancodes data between userspace and kernelspace. Fundamentally, it is just a chardev (/dev/lircX, for X = 0, 1, 2, ...), with a number of standard struct file_operations defined on it. With respect to transporting raw IR and decoded scancodes to and fro, the essential fops are read, write and ioctl.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(h`It is also possible to attach a BPF program to a LIRC device for decoding raw IR into scancodes.h]h`It is also possible to attach a BPF program to a LIRC device for decoding raw IR into scancodes.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h6Example dmesg output upon a driver registering w/LIRC:h]h6Example dmesg output upon a driver registering w/LIRC:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh literal_block)}(hs$ dmesg |grep lirc_dev rc rc0: lirc_dev: driver mceusb registered at minor = 0, raw IR receiver, raw IR transmitterh]hs$ dmesg |grep lirc_dev rc rc0: lirc_dev: driver mceusb registered at minor = 0, raw IR receiver, raw IR transmitter}hjsbah}(h]h ]h"]h$]h&]hhforcelanguagenonehighlight_args}uh1jhhhKhhhhubh)}(h"What you should see for a chardev:h]h"What you should see for a chardev:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubj)}(hG$ ls -l /dev/lirc* crw-rw---- 1 root root 248, 0 Jul 2 22:20 /dev/lirc0h]hG$ ls -l /dev/lirc* crw-rw---- 1 root root 248, 0 Jul 2 22:20 /dev/lirc0}hj&sbah}(h]h ]h"]h$]h&]hhjjnonej}uh1jhhhKhhhhubh)}(hyNote that the package `v4l-utils `_ contains tools for working with LIRC devices:h](hNote that the package }(hj6hhhNhNubh reference)}(h5`v4l-utils `_h]h v4l-utils}(hj@hhhNhNubah}(h]h ]h"]h$]h&]name v4l-utilsrefuri&https://git.linuxtv.org/v4l-utils.git/uh1j>hj6ubh)}(h) h]h}(h] v4l-utilsah ]h"] v4l-utilsah$]h&]refurijQuh1h referencedKhj6ubh. contains tools for working with LIRC devices:}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK!hhhhubh block_quote)}(h- ir-ctl: can receive raw IR and transmit IR, as well as query LIRC device features. - ir-keytable: can load keymaps; allows you to set IR kernel protocols; load BPF IR decoders and test IR decoding. Some BPF IR decoders are also provided. h]h bullet_list)}(hhh](h list_item)}(hSir-ctl: can receive raw IR and transmit IR, as well as query LIRC device features. h]h)}(hRir-ctl: can receive raw IR and transmit IR, as well as query LIRC device features.h]hRir-ctl: can receive raw IR and transmit IR, as well as query LIRC device features.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjwubah}(h]h ]h"]h$]h&]uh1juhjrubjv)}(hir-keytable: can load keymaps; allows you to set IR kernel protocols; load BPF IR decoders and test IR decoding. Some BPF IR decoders are also provided. h]h)}(hir-keytable: can load keymaps; allows you to set IR kernel protocols; load BPF IR decoders and test IR decoding. Some BPF IR decoders are also provided.h]hir-keytable: can load keymaps; allows you to set IR kernel protocols; load BPF IR decoders and test IR decoding. Some BPF IR decoders are also provided.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjubah}(h]h ]h"]h$]h&]uh1juhjrubeh}(h]h ]h"]h$]h&]bullet-uh1jphhhK$hjlubah}(h]h ]h"]h$]h&]uh1jjhhhK$hhhhubh)}(h.. _lirc_modes:h]h}(h]h ]h"]h$]h&]h lirc-modesuh1hhK+hhhhhhubeh}(h]( introductionheh ]h"]( introductionlirc_dev_introeh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jhsexpect_referenced_by_id}hhsubh)}(hhh](h)}(h LIRC modesh]h LIRC modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK/ubh)}(h\LIRC supports some modes of receiving and sending IR codes, as shown on the following table.h]h\LIRC supports some modes of receiving and sending IR codes, as shown on the following table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjhhubh)}(h.. _lirc-mode-scancode:h]h}(h]h ]h"]h$]h&]hlirc-mode-scancodeuh1hhK4hjhhhhubh)}(h.. _lirc-scancode-flag-toggle:h]h}(h]h ]h"]h$]h&]hlirc-scancode-flag-toggleuh1hhK5hjhhhhj}lirc-mode-scancodejsj}jjsubh)}(h.. _lirc-scancode-flag-repeat:h]h}(h]h ]h"]h$]h&]hlirc-scancode-flag-repeatuh1hhK6hjhhhhj}(lirc-scancode-flag-togglejjjuj}(jjjjuubh)}(h``LIRC_MODE_SCANCODE``h]hliteral)}(hjh]hLIRC_MODE_SCANCODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h](jjjeh ]h"](lirc-scancode-flag-repeatjjeh$]h&]uh1hhhhK8hjhhj}(j*jjjjjuj}(jjjjjjuubjk)}(hXBThis mode is for both sending and receiving IR. For transmitting (aka sending), create a struct lirc_scancode with the desired scancode set in the ``scancode`` member, :c:type:`rc_proto` set to the :ref:`IR protocol `, and all other members set to 0. Write this struct to the lirc device. For receiving, you read struct lirc_scancode from the LIRC device. The ``scancode`` field is set to the received scancode and the :ref:`IR protocol ` is set in :c:type:`rc_proto`. If the scancode maps to a valid key code, this is set in the ``keycode`` field, else it is set to ``KEY_RESERVED``. The ``flags`` can have ``LIRC_SCANCODE_FLAG_TOGGLE`` set if the toggle bit is set in protocols that support it (e.g. rc-5 and rc-6), or ``LIRC_SCANCODE_FLAG_REPEAT`` for when a repeat is received for protocols that support it (e.g. nec). In the Sanyo and NEC protocol, if you hold a button on remote, rather than repeating the entire scancode, the remote sends a shorter message with no scancode, which just means button is held, a "repeat". When this is received, the ``LIRC_SCANCODE_FLAG_REPEAT`` is set and the scancode and keycode is repeated. With nec, there is no way to distinguish "button hold" from "repeatedly pressing the same button". The rc-5 and rc-6 protocols have a toggle bit. When a button is released and pressed again, the toggle bit is inverted. If the toggle bit is set, the ``LIRC_SCANCODE_FLAG_TOGGLE`` is set. The ``timestamp`` field is filled with the time nanoseconds (in ``CLOCK_MONOTONIC``) when the scancode was decoded. h](h)}(h/This mode is for both sending and receiving IR.h]h/This mode is for both sending and receiving IR.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hj/ubh)}(hXFor transmitting (aka sending), create a struct lirc_scancode with the desired scancode set in the ``scancode`` member, :c:type:`rc_proto` set to the :ref:`IR protocol `, and all other members set to 0. Write this struct to the lirc device.h](hcFor transmitting (aka sending), create a struct lirc_scancode with the desired scancode set in the }(hjAhhhNhNubj)}(h ``scancode``h]hscancode}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh member, }(hjAhhhNhNubh)}(h:c:type:`rc_proto`h]j)}(hj]h]hrc_proto}(hj_hhhNhNubah}(h]h ](xrefcc-typeeh"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]refdoc%userspace-api/media/rc/lirc-dev-intro refdomainjjreftypetype refexplicitrefwarn reftargetrc_protouh1hhhhK`h]hinline)}(hjh]h IR protocol}(hjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainjreftyperef refexplicitrefwarnj|remote_controllers_protocolsuh1hhhhK` is set in :c:type:`rc_proto`. If the scancode maps to a valid key code, this is set in the ``keycode`` field, else it is set to ``KEY_RESERVED``.h](hGFor receiving, you read struct lirc_scancode from the LIRC device. The }(hjhhhNhNubj)}(h ``scancode``h]hscancode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ field is set to the received scancode and the }(hjhhhNhNubh)}(h1:ref:`IR protocol `h]j)}(hjh]h IR protocol}(hjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainjreftyperef refexplicitrefwarnj|remote_controllers_protocolsuh1hhhhKAhjubh is set in }(hjhhhNhNubh)}(h:c:type:`rc_proto`h]j)}(hjh]hrc_proto}(hjhhhNhNubah}(h]h ](jijjc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainjjreftypetype refexplicitrefwarnj|rc_protouh1hhhhKAhjubh?. If the scancode maps to a valid key code, this is set in the }(hjhhhNhNubj)}(h ``keycode``h]hkeycode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh field, else it is set to }(hjhhhNhNubj)}(h``KEY_RESERVED``h]h KEY_RESERVED}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKAhj/ubh)}(hThe ``flags`` can have ``LIRC_SCANCODE_FLAG_TOGGLE`` set if the toggle bit is set in protocols that support it (e.g. rc-5 and rc-6), or ``LIRC_SCANCODE_FLAG_REPEAT`` for when a repeat is received for protocols that support it (e.g. nec).h](hThe }(hj9hhhNhNubj)}(h ``flags``h]hflags}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh can have }(hj9hhhNhNubj)}(h``LIRC_SCANCODE_FLAG_TOGGLE``h]hLIRC_SCANCODE_FLAG_TOGGLE}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubhT set if the toggle bit is set in protocols that support it (e.g. rc-5 and rc-6), or }(hj9hhhNhNubj)}(h``LIRC_SCANCODE_FLAG_REPEAT``h]hLIRC_SCANCODE_FLAG_REPEAT}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubhH for when a repeat is received for protocols that support it (e.g. nec).}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKGhj/ubh)}(hX5In the Sanyo and NEC protocol, if you hold a button on remote, rather than repeating the entire scancode, the remote sends a shorter message with no scancode, which just means button is held, a "repeat". When this is received, the ``LIRC_SCANCODE_FLAG_REPEAT`` is set and the scancode and keycode is repeated.h](hIn the Sanyo and NEC protocol, if you hold a button on remote, rather than repeating the entire scancode, the remote sends a shorter message with no scancode, which just means button is held, a “repeat”. When this is received, the }(hj}hhhNhNubj)}(h``LIRC_SCANCODE_FLAG_REPEAT``h]hLIRC_SCANCODE_FLAG_REPEAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh1 is set and the scancode and keycode is repeated.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKLhj/ubh)}(hXWith nec, there is no way to distinguish "button hold" from "repeatedly pressing the same button". The rc-5 and rc-6 protocols have a toggle bit. When a button is released and pressed again, the toggle bit is inverted. If the toggle bit is set, the ``LIRC_SCANCODE_FLAG_TOGGLE`` is set.h](hXWith nec, there is no way to distinguish “button hold” from “repeatedly pressing the same button”. The rc-5 and rc-6 protocols have a toggle bit. When a button is released and pressed again, the toggle bit is inverted. If the toggle bit is set, the }(hjhhhNhNubj)}(h``LIRC_SCANCODE_FLAG_TOGGLE``h]hLIRC_SCANCODE_FLAG_TOGGLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKRhj/ubh)}(hsThe ``timestamp`` field is filled with the time nanoseconds (in ``CLOCK_MONOTONIC``) when the scancode was decoded.h](hThe }(hjhhhNhNubj)}(h ``timestamp``h]h timestamp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh/ field is filled with the time nanoseconds (in }(hjhhhNhNubj)}(h``CLOCK_MONOTONIC``h]hCLOCK_MONOTONIC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ) when the scancode was decoded.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKWhj/ubeh}(h]h ]h"]h$]h&]uh1jjhhhK:hjhhubh)}(h.. _lirc-mode-mode2:h]h}(h]h ]h"]h$]h&]hlirc-mode-mode2uh1hhKZhjhhhhubh)}(h``LIRC_MODE_MODE2``h]j)}(hjh]hLIRC_MODE_MODE2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]jah ]h"]lirc-mode-mode2ah$]h&]uh1hhhhK\hjhhj}jjsj}jjsubjk)}(hXThe driver returns a sequence of pulse and space codes to userspace, as a series of u32 values. This mode is used only for IR receive. The upper 8 bits determine the packet type, and the lower 24 bits the payload. Use ``LIRC_VALUE()`` macro to get the payload, and the macro ``LIRC_MODE2()`` will give you the type, which is one of: ``LIRC_MODE2_PULSE`` Signifies the presence of IR in microseconds, also known as *flash*. ``LIRC_MODE2_SPACE`` Signifies absence of IR in microseconds, also known as *gap*. ``LIRC_MODE2_FREQUENCY`` If measurement of the carrier frequency was enabled with :ref:`lirc_set_measure_carrier_mode` then this packet gives you the carrier frequency in Hertz. ``LIRC_MODE2_TIMEOUT`` When the timeout set with :ref:`lirc_set_rec_timeout` expires due to no IR being detected, this packet will be sent, with the number of microseconds with no IR. ``LIRC_MODE2_OVERFLOW`` Signifies that the IR receiver encounter an overflow, and some IR is missing. The IR data after this should be correct again. The actual value is not important, but this is set to 0xffffff by the kernel for compatibility with lircd. h](h)}(h_The driver returns a sequence of pulse and space codes to userspace, as a series of u32 values.h]h_The driver returns a sequence of pulse and space codes to userspace, as a series of u32 values.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjubh)}(h&This mode is used only for IR receive.h]h&This mode is used only for IR receive.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjubh)}(hThe upper 8 bits determine the packet type, and the lower 24 bits the payload. Use ``LIRC_VALUE()`` macro to get the payload, and the macro ``LIRC_MODE2()`` will give you the type, which is one of:h](hSThe upper 8 bits determine the packet type, and the lower 24 bits the payload. Use }(hj:hhhNhNubj)}(h``LIRC_VALUE()``h]h LIRC_VALUE()}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh) macro to get the payload, and the macro }(hj:hhhNhNubj)}(h``LIRC_MODE2()``h]h LIRC_MODE2()}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh) will give you the type, which is one of:}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKchjubh)}(h``LIRC_MODE2_PULSE``h]j)}(hjnh]hLIRC_MODE2_PULSE}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhhhKhhjubjk)}(hESignifies the presence of IR in microseconds, also known as *flash*. h]h)}(hDSignifies the presence of IR in microseconds, also known as *flash*.h](hSignifies absence of IR in microseconds, also known as *gap*. h]h)}(h=Signifies absence of IR in microseconds, also known as *gap*.h](h7Signifies absence of IR in microseconds, also known as }(hjhhhNhNubj)}(h*gap*h]hgap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKnhjubah}(h]h ]h"]h$]h&]uh1jjhhhKnhjubh)}(h``LIRC_MODE2_FREQUENCY``h]j)}(hjh]hLIRC_MODE2_FREQUENCY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhKphjubjk)}(hIf measurement of the carrier frequency was enabled with :ref:`lirc_set_measure_carrier_mode` then this packet gives you the carrier frequency in Hertz. h]h)}(hIf measurement of the carrier frequency was enabled with :ref:`lirc_set_measure_carrier_mode` then this packet gives you the carrier frequency in Hertz.h](h9If measurement of the carrier frequency was enabled with }(hj hhhNhNubh)}(h$:ref:`lirc_set_measure_carrier_mode`h]j)}(hjh]hlirc_set_measure_carrier_mode}(hjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainj!reftyperef refexplicitrefwarnj|lirc_set_measure_carrier_modeuh1hhhhKrhj ubh; then this packet gives you the carrier frequency in Hertz.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKrhjubah}(h]h ]h"]h$]h&]uh1jjhhhKrhjubh)}(h``LIRC_MODE2_TIMEOUT``h]j)}(hjEh]hLIRC_MODE2_TIMEOUT}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hhhhKvhjubjk)}(hWhen the timeout set with :ref:`lirc_set_rec_timeout` expires due to no IR being detected, this packet will be sent, with the number of microseconds with no IR. h]h)}(hWhen the timeout set with :ref:`lirc_set_rec_timeout` expires due to no IR being detected, this packet will be sent, with the number of microseconds with no IR.h](hWhen the timeout set with }(hj^hhhNhNubh)}(h:ref:`lirc_set_rec_timeout`h]j)}(hjhh]hlirc_set_rec_timeout}(hjjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]refdocjv refdomainjtreftyperef refexplicitrefwarnj|lirc_set_rec_timeoutuh1hhhhKxhj^ubhk expires due to no IR being detected, this packet will be sent, with the number of microseconds with no IR.}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKxhjZubah}(h]h ]h"]h$]h&]uh1jjhhhKxhjubh)}(h``LIRC_MODE2_OVERFLOW``h]j)}(hjh]hLIRC_MODE2_OVERFLOW}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhK|hjubjk)}(hSignifies that the IR receiver encounter an overflow, and some IR is missing. The IR data after this should be correct again. The actual value is not important, but this is set to 0xffffff by the kernel for compatibility with lircd. h]h)}(hSignifies that the IR receiver encounter an overflow, and some IR is missing. The IR data after this should be correct again. The actual value is not important, but this is set to 0xffffff by the kernel for compatibility with lircd.h]hSignifies that the IR receiver encounter an overflow, and some IR is missing. The IR data after this should be correct again. The actual value is not important, but this is set to 0xffffff by the kernel for compatibility with lircd.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjubah}(h]h ]h"]h$]h&]uh1jjhhhK~hjubeh}(h]h ]h"]h$]h&]uh1jjhhhK^hjhhubh)}(h.. _lirc-mode-pulse:h]h}(h]h ]h"]h$]h&]hlirc-mode-pulseuh1hhKhjhhhhubh)}(h``LIRC_MODE_PULSE``h]j)}(hjh]hLIRC_MODE_PULSE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]jah ]h"]lirc-mode-pulseah$]h&]uh1hhhhKhjhhj}jjsj}jjsubjk)}(hX0In pulse mode, a sequence of pulse/space integer values are written to the lirc device using :ref:`lirc-write`. The values are alternating pulse and space lengths, in microseconds. The first and last entry must be a pulse, so there must be an odd number of entries. This mode is used only for IR send. h](h)}(hoIn pulse mode, a sequence of pulse/space integer values are written to the lirc device using :ref:`lirc-write`.h](h]In pulse mode, a sequence of pulse/space integer values are written to the lirc device using }(hjhhhNhNubh)}(h:ref:`lirc-write`h]j)}(hjh]h lirc-write}(hjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainj reftyperef refexplicitrefwarnj| lirc-writeuh1hhhhKhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(hThe values are alternating pulse and space lengths, in microseconds. The first and last entry must be a pulse, so there must be an odd number of entries.h]hThe values are alternating pulse and space lengths, in microseconds. The first and last entry must be a pulse, so there must be an odd number of entries.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h#This mode is used only for IR send.h]h#This mode is used only for IR send.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jjhhhKhjhhubeh}(h](jid1eh ]h"]( lirc modes lirc_modeseh$]h&]uh1hhhhhhhhK/j}jNjsj}jjsubh)}(hhh](h)}(h%Data types used by LIRC_MODE_SCANCODEh]h%Data types used by LIRC_MODE_SCANCODE}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlelirc_scancode (C struct)c.lirc_scancodehNtauh1jdhjShhhNhNubhdesc)}(hhh](hdesc_signature)}(h lirc_scancodeh]hdesc_signature_line)}(hstruct lirc_scancodeh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(h lirc_scancodeh]h desc_sig_name)}(hj~h]h lirc_scancode}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhj|hhhjhKubah}(h]jsah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jzhjhKhjwhhubh desc_content)}(hhh]h)}(h>decoded scancode with protocol for use with LIRC_MODE_SCANCODEh]h>decoded scancode with protocol for use with LIRC_MODE_SCANCODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjwhhhjhKubeh}(h]h ](jjstructeh"]h$]h&]domainjjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1juhhhjShNhNubh container)}(hX3**Definition**:: struct lirc_scancode { __u64 timestamp; __u16 flags; __u16 rc_proto; __u32 keycode; __u64 scancode; }; **Members** ``timestamp`` Timestamp in nanoseconds using CLOCK_MONOTONIC when IR was decoded. ``flags`` should be 0 for transmit. When receiving scancodes, LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set depending on the protocol ``rc_proto`` see enum rc_proto ``keycode`` the translated keycode. Set to 0 for transmit. ``scancode`` the scancode received or to be senth](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubj)}(hzstruct lirc_scancode { __u64 timestamp; __u16 flags; __u16 rc_proto; __u32 keycode; __u64 scancode; };h]hzstruct lirc_scancode { __u64 timestamp; __u16 flags; __u16 rc_proto; __u32 keycode; __u64 scancode; };}hj'sbah}(h]h ]h"]h$]h&]hhuh1jhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubh)}(h **Members**h]j )}(hj8h]hMembers}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubhdefinition_list)}(hhh](hdefinition_list_item)}(hR``timestamp`` Timestamp in nanoseconds using CLOCK_MONOTONIC when IR was decoded. h](hterm)}(h ``timestamp``h]j)}(hj]h]h timestamp}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjUubh definition)}(hhh]h)}(hCTimestamp in nanoseconds using CLOCK_MONOTONIC when IR was decoded.h]hCTimestamp in nanoseconds using CLOCK_MONOTONIC when IR was decoded.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjuubah}(h]h ]h"]h$]h&]uh1jshjUubeh}(h]h ]h"]h$]h&]uh1jShjrhKhjPubjT)}(h``flags`` should be 0 for transmit. When receiving scancodes, LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set depending on the protocol h](jZ)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjt)}(hhh]h)}(hshould be 0 for transmit. When receiving scancodes, LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set depending on the protocolh]hshould be 0 for transmit. When receiving scancodes, LIRC_SCANCODE_FLAG_TOGGLE or LIRC_SCANCODE_FLAG_REPEAT can be set depending on the protocol}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShjhKhjPubjT)}(h``rc_proto`` see enum rc_proto h](jZ)}(h ``rc_proto``h]j)}(hjh]hrc_proto}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjt)}(hhh]h)}(hsee enum rc_protoh]hsee enum rc_proto}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShjhKhjPubjT)}(h;``keycode`` the translated keycode. Set to 0 for transmit. h](jZ)}(h ``keycode``h]j)}(hj h]hkeycode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjt)}(hhh]h)}(h.the translated keycode. Set to 0 for transmit.h]h.the translated keycode. Set to 0 for transmit.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hKhj"ubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShj!hKhjPubjT)}(h0``scancode`` the scancode received or to be senth](jZ)}(h ``scancode``h]j)}(hjEh]hscancode}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj?ubjt)}(hhh]h)}(h#the scancode received or to be senth]h#the scancode received or to be sent}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj[ubah}(h]h ]h"]h$]h&]uh1jshj?ubeh}(h]h ]h"]h$]h&]uh1jShjZhKhjPubeh}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhNhNubje)}(hhh]h}(h]h ]h"]h$]h&]entries](jqrc_proto (C enum) c.rc_protohNtauh1jdhjShhhNhNubjv)}(hhh](j{)}(hrc_protoh]j)}(h enum rc_protoh](j)}(henumh]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hrc_protoh]j)}(hjh]hrc_proto}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jzhjhKhjhhubj)}(hhh]h)}(hthe Remote Controller protocolh]hthe Remote Controller protocol}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jjenumeh"]h$]h&]jjjjjjjjjjuh1juhhhjShNhNubj)}(hX/**Constants** ``RC_PROTO_UNKNOWN`` Protocol not known ``RC_PROTO_OTHER`` Protocol known but proprietary ``RC_PROTO_RC5`` Philips RC5 protocol ``RC_PROTO_RC5X_20`` Philips RC5x 20 bit protocol ``RC_PROTO_RC5_SZ`` StreamZap variant of RC5 ``RC_PROTO_JVC`` JVC protocol ``RC_PROTO_SONY12`` Sony 12 bit protocol ``RC_PROTO_SONY15`` Sony 15 bit protocol ``RC_PROTO_SONY20`` Sony 20 bit protocol ``RC_PROTO_NEC`` NEC protocol ``RC_PROTO_NECX`` Extended NEC protocol ``RC_PROTO_NEC32`` NEC 32 bit protocol ``RC_PROTO_SANYO`` Sanyo protocol ``RC_PROTO_MCIR2_KBD`` RC6-ish MCE keyboard ``RC_PROTO_MCIR2_MSE`` RC6-ish MCE mouse ``RC_PROTO_RC6_0`` Philips RC6-0-16 protocol ``RC_PROTO_RC6_6A_20`` Philips RC6-6A-20 protocol ``RC_PROTO_RC6_6A_24`` Philips RC6-6A-24 protocol ``RC_PROTO_RC6_6A_32`` Philips RC6-6A-32 protocol ``RC_PROTO_RC6_MCE`` MCE (Philips RC6-6A-32 subtype) protocol ``RC_PROTO_SHARP`` Sharp protocol ``RC_PROTO_XMP`` XMP protocol ``RC_PROTO_CEC`` CEC protocol ``RC_PROTO_IMON`` iMon Pad protocol ``RC_PROTO_RCMM12`` RC-MM protocol 12 bits ``RC_PROTO_RCMM24`` RC-MM protocol 24 bits ``RC_PROTO_RCMM32`` RC-MM protocol 32 bits ``RC_PROTO_XBOX_DVD`` Xbox DVD Movie Playback Kit protocol ``RC_PROTO_MAX`` Maximum value of enum rc_protoh](h)}(h **Constants**h]j )}(hj h]h Constants}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjO)}(hhh](jT)}(h(``RC_PROTO_UNKNOWN`` Protocol not known h](jZ)}(h``RC_PROTO_UNKNOWN``h]j)}(hj# h]hRC_PROTO_UNKNOWN}(hj% hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj! ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hProtocol not knownh]hProtocol not known}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8 hKhj9 ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj8 hKhj ubjT)}(h2``RC_PROTO_OTHER`` Protocol known but proprietary h](jZ)}(h``RC_PROTO_OTHER``h]j)}(hj\ h]hRC_PROTO_OTHER}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjV ubjt)}(hhh]h)}(hProtocol known but proprietaryh]hProtocol known but proprietary}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq hKhjr ubah}(h]h ]h"]h$]h&]uh1jshjV ubeh}(h]h ]h"]h$]h&]uh1jShjq hKhj ubjT)}(h&``RC_PROTO_RC5`` Philips RC5 protocol h](jZ)}(h``RC_PROTO_RC5``h]j)}(hj h]h RC_PROTO_RC5}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hPhilips RC5 protocolh]hPhilips RC5 protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h2``RC_PROTO_RC5X_20`` Philips RC5x 20 bit protocol h](jZ)}(h``RC_PROTO_RC5X_20``h]j)}(hj h]hRC_PROTO_RC5X_20}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hPhilips RC5x 20 bit protocolh]hPhilips RC5x 20 bit protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h-``RC_PROTO_RC5_SZ`` StreamZap variant of RC5 h](jZ)}(h``RC_PROTO_RC5_SZ``h]j)}(hj h]hRC_PROTO_RC5_SZ}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hStreamZap variant of RC5h]hStreamZap variant of RC5}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h``RC_PROTO_JVC`` JVC protocol h](jZ)}(h``RC_PROTO_JVC``h]j)}(hj@ h]h RC_PROTO_JVC}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj> ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj: ubjt)}(hhh]h)}(h JVC protocolh]h JVC protocol}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU hKhjV ubah}(h]h ]h"]h$]h&]uh1jshj: ubeh}(h]h ]h"]h$]h&]uh1jShjU hKhj ubjT)}(h)``RC_PROTO_SONY12`` Sony 12 bit protocol h](jZ)}(h``RC_PROTO_SONY12``h]j)}(hjy h]hRC_PROTO_SONY12}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjs ubjt)}(hhh]h)}(hSony 12 bit protocolh]hSony 12 bit protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshjs ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h)``RC_PROTO_SONY15`` Sony 15 bit protocol h](jZ)}(h``RC_PROTO_SONY15``h]j)}(hj h]hRC_PROTO_SONY15}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hSony 15 bit protocolh]hSony 15 bit protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h)``RC_PROTO_SONY20`` Sony 20 bit protocol h](jZ)}(h``RC_PROTO_SONY20``h]j)}(hj h]hRC_PROTO_SONY20}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hSony 20 bit protocolh]hSony 20 bit protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h``RC_PROTO_NEC`` NEC protocol h](jZ)}(h``RC_PROTO_NEC``h]j)}(hj$ h]h RC_PROTO_NEC}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj" ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(h NEC protocolh]h NEC protocol}(hj= hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9 hKhj: ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj9 hKhj ubjT)}(h(``RC_PROTO_NECX`` Extended NEC protocol h](jZ)}(h``RC_PROTO_NECX``h]j)}(hj] h]h RC_PROTO_NECX}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjW ubjt)}(hhh]h)}(hExtended NEC protocolh]hExtended NEC protocol}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjr hKhjs ubah}(h]h ]h"]h$]h&]uh1jshjW ubeh}(h]h ]h"]h$]h&]uh1jShjr hKhj ubjT)}(h'``RC_PROTO_NEC32`` NEC 32 bit protocol h](jZ)}(h``RC_PROTO_NEC32``h]j)}(hj h]hRC_PROTO_NEC32}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hNEC 32 bit protocolh]hNEC 32 bit protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h"``RC_PROTO_SANYO`` Sanyo protocol h](jZ)}(h``RC_PROTO_SANYO``h]j)}(hj h]hRC_PROTO_SANYO}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hSanyo protocolh]hSanyo protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h,``RC_PROTO_MCIR2_KBD`` RC6-ish MCE keyboard h](jZ)}(h``RC_PROTO_MCIR2_KBD``h]j)}(hj h]hRC_PROTO_MCIR2_KBD}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hRC6-ish MCE keyboardh]hRC6-ish MCE keyboard}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h)``RC_PROTO_MCIR2_MSE`` RC6-ish MCE mouse h](jZ)}(h``RC_PROTO_MCIR2_MSE``h]j)}(hjA h]hRC_PROTO_MCIR2_MSE}(hjC hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj? ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj; ubjt)}(hhh]h)}(hRC6-ish MCE mouseh]hRC6-ish MCE mouse}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV hKhjW ubah}(h]h ]h"]h$]h&]uh1jshj; ubeh}(h]h ]h"]h$]h&]uh1jShjV hKhj ubjT)}(h-``RC_PROTO_RC6_0`` Philips RC6-0-16 protocol h](jZ)}(h``RC_PROTO_RC6_0``h]j)}(hjz h]hRC_PROTO_RC6_0}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjt ubjt)}(hhh]h)}(hPhilips RC6-0-16 protocolh]hPhilips RC6-0-16 protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshjt ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h2``RC_PROTO_RC6_6A_20`` Philips RC6-6A-20 protocol h](jZ)}(h``RC_PROTO_RC6_6A_20``h]j)}(hj h]hRC_PROTO_RC6_6A_20}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hPhilips RC6-6A-20 protocolh]hPhilips RC6-6A-20 protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h2``RC_PROTO_RC6_6A_24`` Philips RC6-6A-24 protocol h](jZ)}(h``RC_PROTO_RC6_6A_24``h]j)}(hj h]hRC_PROTO_RC6_6A_24}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hPhilips RC6-6A-24 protocolh]hPhilips RC6-6A-24 protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h2``RC_PROTO_RC6_6A_32`` Philips RC6-6A-32 protocol h](jZ)}(h``RC_PROTO_RC6_6A_32``h]j)}(hj% h]hRC_PROTO_RC6_6A_32}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj# ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hPhilips RC6-6A-32 protocolh]hPhilips RC6-6A-32 protocol}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj: hKhj; ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj: hKhj ubjT)}(h>``RC_PROTO_RC6_MCE`` MCE (Philips RC6-6A-32 subtype) protocol h](jZ)}(h``RC_PROTO_RC6_MCE``h]j)}(hj^ h]hRC_PROTO_RC6_MCE}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjX ubjt)}(hhh]h)}(h(MCE (Philips RC6-6A-32 subtype) protocolh]h(MCE (Philips RC6-6A-32 subtype) protocol}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs hKhjt ubah}(h]h ]h"]h$]h&]uh1jshjX ubeh}(h]h ]h"]h$]h&]uh1jShjs hKhj ubjT)}(h"``RC_PROTO_SHARP`` Sharp protocol h](jZ)}(h``RC_PROTO_SHARP``h]j)}(hj h]hRC_PROTO_SHARP}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(hSharp protocolh]hSharp protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h``RC_PROTO_XMP`` XMP protocol h](jZ)}(h``RC_PROTO_XMP``h]j)}(hj h]h RC_PROTO_XMP}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj ubjt)}(hhh]h)}(h XMP protocolh]h XMP protocol}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhj ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj hKhj ubjT)}(h``RC_PROTO_CEC`` CEC protocol h](jZ)}(h``RC_PROTO_CEC``h]j)}(hj h]h RC_PROTO_CEC}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjt)}(hhh]h)}(h CEC protocolh]h CEC protocol}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShjhKhj ubjT)}(h$``RC_PROTO_IMON`` iMon Pad protocol h](jZ)}(h``RC_PROTO_IMON``h]j)}(hjBh]h RC_PROTO_IMON}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhj<ubjt)}(hhh]h)}(hiMon Pad protocolh]hiMon Pad protocol}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKhjXubah}(h]h ]h"]h$]h&]uh1jshj<ubeh}(h]h ]h"]h$]h&]uh1jShjWhKhj ubjT)}(h+``RC_PROTO_RCMM12`` RC-MM protocol 12 bits h](jZ)}(h``RC_PROTO_RCMM12``h]j)}(hj{h]hRC_PROTO_RCMM12}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjuubjt)}(hhh]h)}(hRC-MM protocol 12 bitsh]hRC-MM protocol 12 bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jshjuubeh}(h]h ]h"]h$]h&]uh1jShjhKhj ubjT)}(h+``RC_PROTO_RCMM24`` RC-MM protocol 24 bits h](jZ)}(h``RC_PROTO_RCMM24``h]j)}(hjh]hRC_PROTO_RCMM24}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhKhjubjt)}(hhh]h)}(hRC-MM protocol 24 bitsh]hRC-MM protocol 24 bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShjhKhj ubjT)}(h+``RC_PROTO_RCMM32`` RC-MM protocol 32 bits h](jZ)}(h``RC_PROTO_RCMM32``h]j)}(hjh]hRC_PROTO_RCMM32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhMhjubjt)}(hhh]h)}(hRC-MM protocol 32 bitsh]hRC-MM protocol 32 bits}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jshjubeh}(h]h ]h"]h$]h&]uh1jShjhMhj ubjT)}(h;``RC_PROTO_XBOX_DVD`` Xbox DVD Movie Playback Kit protocol h](jZ)}(h``RC_PROTO_XBOX_DVD``h]j)}(hj&h]hRC_PROTO_XBOX_DVD}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhMhj ubjt)}(hhh]h)}(h$Xbox DVD Movie Playback Kit protocolh]h$Xbox DVD Movie Playback Kit protocol}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1jshj ubeh}(h]h ]h"]h$]h&]uh1jShj;hMhj ubjT)}(h/``RC_PROTO_MAX`` Maximum value of enum rc_protoh](jZ)}(h``RC_PROTO_MAX``h]j)}(hj_h]h RC_PROTO_MAX}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jYhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhMhjYubjt)}(hhh]h)}(hMaximum value of enum rc_protoh]hMaximum value of enum rc_proto}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhp/var/lib/git/docbuild/linux/Documentation/userspace-api/media/rc/lirc-dev-intro:148: ./include/uapi/linux/lirc.hhMhjuubah}(h]h ]h"]h$]h&]uh1jshjYubeh}(h]h ]h"]h$]h&]uh1jShjthMhj ubeh}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjShhhNhNubeh}(h]%data-types-used-by-lirc-mode-scancodeah ]h"]%data types used by lirc_mode_scancodeah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hBPF based IR decoderh]hBPF based IR decoder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX2The kernel has support for decoding the most common :ref:`IR protocols `, but there are many protocols which are not supported. To support these, it is possible to load an BPF program which does the decoding. This can only be done on LIRC devices which support reading raw IR.h](h4The kernel has support for decoding the most common }(hjhhhNhNubh)}(h2:ref:`IR protocols `h]j)}(hjh]h IR protocols}(hjhhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjv refdomainjreftyperef refexplicitrefwarnj|remote_controllers_protocolsuh1hhhhKhjubh, but there are many protocols which are not supported. To support these, it is possible to load an BPF program which does the decoding. This can only be done on LIRC devices which support reading raw IR.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXGFirst, using the `bpf(2)`_ syscall with the ``BPF_LOAD_PROG`` argument, program must be loaded of type ``BPF_PROG_TYPE_LIRC_MODE2``. Once attached to the LIRC device, this program will be called for each pulse, space or timeout event on the LIRC device. The context for the BPF program is a pointer to a unsigned int, which is a :ref:`LIRC_MODE_MODE2 ` value. When the program has decoded the scancode, it can be submitted using the BPF functions ``bpf_rc_keydown()`` or ``bpf_rc_repeat()``. Mouse or pointer movements can be reported using ``bpf_rc_pointer_rel()``.h](hFirst, using the }(hjhhhNhNubj?)}(h `bpf(2)`_h]hbpf(2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]namebpf(2)jP/http://man7.org/linux/man-pages/man2/bpf.2.htmluh1j>hjresolvedKubh syscall with the }(hjhhhNhNubj)}(h``BPF_LOAD_PROG``h]h BPF_LOAD_PROG}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh* argument, program must be loaded of type }(hjhhhNhNubj)}(h``BPF_PROG_TYPE_LIRC_MODE2``h]hBPF_PROG_TYPE_LIRC_MODE2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. Once attached to the LIRC device, this program will be called for each pulse, space or timeout event on the LIRC device. The context for the BPF program is a pointer to a unsigned int, which is a }(hjhhhNhNubh)}(h(:ref:`LIRC_MODE_MODE2 `h]j)}(hj/h]hLIRC_MODE_MODE2}(hj1hhhNhNubah}(h]h ](jistdstd-refeh"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]refdocjv refdomainj;reftyperef refexplicitrefwarnj|lirc-mode-mode2uh1hhhhKhjubh_ value. When the program has decoded the scancode, it can be submitted using the BPF functions }(hjhhhNhNubj)}(h``bpf_rc_keydown()``h]hbpf_rc_keydown()}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h``bpf_rc_repeat()``h]hbpf_rc_repeat()}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3. Mouse or pointer movements can be reported using }(hjhhhNhNubj)}(h``bpf_rc_pointer_rel()``h]hbpf_rc_pointer_rel()}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXROnce you have the file descriptor for the ``BPF_PROG_TYPE_LIRC_MODE2`` BPF program, it can be attached to the LIRC device using the `bpf(2)`_ syscall. The target must be the file descriptor for the LIRC device, and the attach type must be ``BPF_LIRC_MODE2``. No more than 64 BPF programs can be attached to a single LIRC device at a time.h](h*Once you have the file descriptor for the }(hjhhhNhNubj)}(h``BPF_PROG_TYPE_LIRC_MODE2``h]hBPF_PROG_TYPE_LIRC_MODE2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh> BPF program, it can be attached to the LIRC device using the }(hjhhhNhNubj?)}(h `bpf(2)`_h]hbpf(2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]namebpf(2)jPjuh1j>hjjKubhb syscall. The target must be the file descriptor for the LIRC device, and the attach type must be }(hjhhhNhNubj)}(h``BPF_LIRC_MODE2``h]hBPF_LIRC_MODE2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ. No more than 64 BPF programs can be attached to a single LIRC device at a time.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h;.. _bpf(2): http://man7.org/linux/man-pages/man2/bpf.2.htmlh]h}(h]bpf-2ah ]h"]bpf(2)ah$]h&]jPjuh1hhKhjhhhhj_Kubeh}(h]bpf-based-ir-decoderah ]h"]bpf based ir decoderah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}bpf(2)](jjesrefids}(h]haj]jaj]jaj]jaj]jaj]jaj]jaunameids}(jhjjj[jXjNjjMjJjjjjj*jjjjjjjjjjju nametypes}(jjj[jNjMjjj*jjjjjuh}(hhjhjXjRjjjJjjjjjjjjjjjjjSjsj|jjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages](hsystem_message)}(hhh]h)}(hhh]h4Hyperlink target "lirc-dev-intro" is not referenced.}hj|sbah}(h]h ]h"]h$]h&]uh1hhjyubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1jwubjx)}(hhh]h)}(hhh]h0Hyperlink target "lirc-modes" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineK+uh1jwubjx)}(hhh]h)}(hhh]h8Hyperlink target "lirc-mode-scancode" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineK4uh1jwubjx)}(hhh]h)}(hhh]h?Hyperlink target "lirc-scancode-flag-toggle" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineK5uh1jwubjx)}(hhh]h)}(hhh]h?Hyperlink target "lirc-scancode-flag-repeat" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineK6uh1jwubjx)}(hhh]h)}(hhh]h5Hyperlink target "lirc-mode-mode2" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKZuh1jwubjx)}(hhh]h)}(hhh]h5Hyperlink target "lirc-mode-pulse" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKuh1jwube transformerN include_log] decorationNhhub.