Skip to content

Commit

Permalink
media: lirc: document BPF IR decoding
Browse files Browse the repository at this point in the history
This is just a start.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
  • Loading branch information
Sean Young authored and Mauro Carvalho Chehab committed Aug 4, 2019
1 parent 14e3cdb commit 16407a6
Showing 1 changed file with 38 additions and 9 deletions.
47 changes: 38 additions & 9 deletions Documentation/media/uapi/rc/lirc-dev-intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ data between userspace and kernelspace. Fundamentally, it is just a chardev
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.

It is also possible to attach a BPF program to a LIRC device for decoding
raw IR into scancodes.

Example dmesg output upon a driver registering w/LIRC:

.. code-block:: none
Expand All @@ -34,6 +37,16 @@ What you should see for a chardev:
$ ls -l /dev/lirc*
crw-rw---- 1 root root 248, 0 Jul 2 22:20 /dev/lirc0
Note that the package `v4l-utils <https://git.linuxtv.org/v4l-utils.git/>`_
contains tools for working with LIRC devices:

- 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.

.. _lirc_modes:

**********
Expand Down Expand Up @@ -129,12 +142,28 @@ on the following table.

This mode is used only for IR send.


**************************
Remote Controller protocol
**************************

An enum :c:type:`rc_proto` in the :ref:`lirc_header` lists all the
supported IR protocols:

.. kernel-doc:: include/uapi/linux/lirc.h
********************
BPF based IR decoder
********************

The kernel has support for decoding the most common 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.

First, 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 <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()``.

Once 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.

.. _bpf(2): http://man7.org/linux/man-pages/man2/bpf.2.html

0 comments on commit 16407a6

Please sign in to comment.