2. Building support for a media device¶
The first step is to download the Kernel's source code, either via a distribution-specific source file or via the Kernel's main git tree1.
Please notice, however, that, if:
you're a braveheart and want to experiment with new stuff;
if you want to report a bug;
if you're developing new patches
you should use the main media development tree
In this case, you may find some useful information at the LinuxTv wiki pages:
The upstream Linux Kernel development tree is located at
2.1. Configuring the Linux Kernel¶
You can access a menu of Kernel building options with:
$ make menuconfig
Then, select all desired options and exit it, saving the configuration.
The changed configuration will be at the
.config file. It would
# CONFIG_RC_CORE is not set
# CONFIG_CEC_CORE is not set
The media subsystem is controlled by those menu configuration options:
Device Drivers --->
<M> Remote Controller support --->
[ ] HDMI CEC RC integration
[ ] Enable CEC error injection support
[*] HDMI CEC drivers --->
<*> Multimedia support --->
Remote Controller support option enables the core support for
HDMI CEC RC integration option enables integration of HDMI CEC
with Linux, allowing to receive data via HDMI CEC as if it were produced
by a remote controller directly connected to the machine.
HDMI CEC drivers option allow selecting platform and USB drivers
that receives and/or transmits CEC codes via HDMI interfaces3.
The last option (
Multimedia support) enables support for cameras,
audio/video grabbers and TV.
The media subsystem support can either be built together with the main Kernel or as a module. For most use cases, it is preferred to have it built as modules.
Instead of using a menu, the Kernel provides a script with allows enabling configuration options directly. To enable media support and remote controller support using Kernel modules, you could use:
$ scripts/config -m RC_CORE
$ scripts/config -m MEDIA_SUPPORT
Remote Controller supportshould also be enabled if you want to use some TV card drivers that may depend on the remote controller core support.
Please notice that the DRM subsystem also have drivers for GPUs that use the media HDMI CEC support.
Those GPU-specific drivers are selected via the
Graphics supportmenu, under
When a GPU driver supports HDMI CEC, it will automatically enable the CEC core support at the media subsystem.
2.1.1. Media dependencies¶
It should be noticed that enabling the above from a clean config is usually not enough. The media subsystem depends on several other Linux core support in order to work.
For example, most media devices use a serial communication bus in order to talk with some peripherals. Such bus is called I²C (Inter-Integrated Circuit). In order to be able to build support for such hardware, the I²C bus support should be enabled, either via menu or with:
./scripts/config -m I2C
Another example: the remote controller core requires support for input devices, with can be enabled with:
./scripts/config -m INPUT
Other core functionality may also be needed (like PCI and/or USB support), depending on the specific driver(s) you would like to enable.
2.1.2. Enabling Remote Controller Support¶
The remote controller menu allows selecting drivers for specific devices. It's menu looks like this:
--- Remote Controller support
<M> Compile Remote Controller keymap modules
[*] LIRC user interface
[*] Support for eBPF programs attached to lirc devices
[*] Remote controller decoders --->
[*] Remote Controller devices --->
Compile Remote Controller keymap modules option creates key maps for
several popular remote controllers.
LIRC user interface option adds enhanced functionality when using the
lirc program, by enabling an API that allows userspace to receive raw data
from remote controllers.
Support for eBPF programs attached to lirc devices option allows
the usage of special programs (called eBPF) that would allow applications
to add extra remote controller decoding functionality to the Linux Kernel.
Remote controller decoders option allows selecting the
protocols that will be recognized by the Linux Kernel. Except if you
want to disable some specific decoder, it is suggested to keep all
Remote Controller devices allows you to select the drivers
that would be needed to support your device.
The same configuration can also be set via the
script. So, for instance, in order to support the ITE remote controller
driver (found on Intel NUCs and on some ASUS x86 desktops), you could do:
$ scripts/config -e INPUT
$ scripts/config -e ACPI
$ scripts/config -e MODULES
$ scripts/config -m RC_CORE
$ scripts/config -e RC_DEVICES
$ scripts/config -e RC_DECODERS
$ scripts/config -m IR_RC5_DECODER
$ scripts/config -m IR_ITE_CIR
2.1.3. Enabling HDMI CEC Support¶
The HDMI CEC support is set automatically when a driver requires it. So, all you need to do is to enable support either for a graphics card that needs it or by one of the existing HDMI drivers.
The HDMI-specific drivers are available at the
HDMI CEC drivers
--- HDMI CEC drivers
< > ChromeOS EC CEC driver
< > Amlogic Meson AO CEC driver
< > Amlogic Meson G12A AO CEC driver
< > Generic GPIO-based CEC driver
< > Samsung S5P CEC driver
< > STMicroelectronics STiH4xx HDMI CEC driver
< > STMicroelectronics STM32 HDMI CEC driver
< > Tegra HDMI CEC driver
< > SECO Boards HDMI CEC driver
[ ] SECO Boards IR RC5 support
< > Pulse Eight HDMI CEC
< > RainShadow Tech HDMI CEC
The above contents is just an example. The actual options for HDMI devices depends on the system's architecture and may vary on new Kernels.
2.1.4. Enabling Media Support¶
The Media menu has a lot more options than the remote controller menu. Once selected, you should see the following options:
--- Media support
[ ] Filter media drivers
[*] Autoselect ancillary drivers
Media device types --->
Media core support --->
Video4Linux options --->
Media controller options --->
Digital TV options --->
HDMI CEC options --->
Media drivers --->
Media ancillary drivers --->
Except if you know exactly what you're doing, or if you want to build
a driver for a SoC platform, it is strongly recommended to keep the
Autoselect ancillary drivers option turned on, as it will auto-select
the needed I²C ancillary drivers.
There are now two ways to select media device drivers, as described below.
In order to enable modular support for one of the boards listed on
this table, with modular media core modules, the
.config file should contain those lines:
2.2. Building and installing a new Kernel¶
.config file has everything needed, all it takes to build
is to run the
And then install the new Kernel and its modules:
$ sudo make modules_install
$ sudo make install
2.3. Building just the new media drivers and core¶
Running a new development Kernel from the development tree is usually risky, because it may have experimental changes that may have bugs. So, there are some ways to build just the new drivers, using alternative trees.
There is the Linux Kernel backports project, with contains newer drivers meant to be compiled against stable Kernels.
The LinuxTV developers, with are responsible for maintaining the media subsystem also maintains a backport tree, with just the media drivers daily updated from the newest kernel. Such tree is available at:
It should be noticed that, while it should be relatively safe to use the
media_build tree for testing purposes, there are not warranties that
it would work (or even build) on a random Kernel. This tree is maintained
using a "best-efforts" principle, as time permits us to fix issues there.
If you notice anything wrong on it, feel free to submit patches at the
Linux media subsystem's mailing list: firstname.lastname@example.org. Please
[PATCH media-build] at the e-mail's subject if you submit a new
patch for the media-build.
Before using it, you should run:
you may need to run it twice if the
media-buildtree gets updated;
you may need to do a
make distcleanif you had built it in the past for a different Kernel version than the one you're currently using;
by default, it will use the same config options for media as the ones defined on the Kernel you're running.
In order to select different drivers or different config options, use:
$ make menuconfig
Then, you can build and install the new drivers:
$ make && sudo make install
This will override the previous media drivers that your Kernel were using.