|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  |  | 
|  | =================================== | 
|  | 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 tree\ [1]_. | 
|  |  | 
|  | 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 ``master`` branch: | 
|  |  | 
|  | https://git.linuxtv.org/media_tree.git/ | 
|  |  | 
|  | In this case, you may find some useful information at the | 
|  | `LinuxTv wiki pages <https://linuxtv.org/wiki>`_: | 
|  |  | 
|  | https://linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers | 
|  |  | 
|  | .. [1] The upstream Linux Kernel development tree is located at | 
|  |  | 
|  | https://git.kernel.org/pub/scm/li  nux/kernel/git/torvalds/linux.git/ | 
|  |  | 
|  | 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 | 
|  | look like:: | 
|  |  | 
|  | ... | 
|  | # CONFIG_RC_CORE is not set | 
|  | # CONFIG_CEC_CORE is not set | 
|  | CONFIG_MEDIA_SUPPORT=m | 
|  | CONFIG_MEDIA_SUPPORT_FILTER=y | 
|  | ... | 
|  |  | 
|  | 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  ---> | 
|  |  | 
|  | The ``Remote Controller support`` option enables the core support for | 
|  | remote controllers\ [2]_. | 
|  |  | 
|  | The ``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. | 
|  |  | 
|  | The ``HDMI CEC drivers`` option allow selecting platform and USB drivers | 
|  | that receives and/or transmits CEC codes via HDMI interfaces\ [3]_. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | .. note:: | 
|  |  | 
|  | 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 | 
|  |  | 
|  | .. [2] ``Remote Controller support`` should also be enabled if you | 
|  | want to use some TV card drivers that may depend on the remote | 
|  | controller core support. | 
|  |  | 
|  | .. [3] 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 support`` | 
|  | menu, under ``Device Drivers``. | 
|  |  | 
|  | When a GPU driver supports HDMI CEC, it will automatically | 
|  | enable the CEC core support at the media subsystem. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | 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  ---> | 
|  |  | 
|  | The ``Compile Remote Controller keymap modules`` option creates key maps for | 
|  | several popular remote controllers. | 
|  |  | 
|  | The ``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. | 
|  |  | 
|  | The ``Support for eBPF programs attached to lirc devices`` option allows | 
|  | the usage of special programs (called eBPF) that would allow aplications | 
|  | to add extra remote controller decoding functionality to the Linux Kernel. | 
|  |  | 
|  | The ``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 | 
|  | sub-options enabled. | 
|  |  | 
|  | The ``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/config`` | 
|  | 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 | 
|  |  | 
|  | 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`` | 
|  | menu\ [4]_:: | 
|  |  | 
|  | --- 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 | 
|  |  | 
|  | .. [4] 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. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | ``Filter media drivers`` menu | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | This menu is meant to easy setup for PC and Laptop hardware. It works | 
|  | by letting the user to specify what kind of media drivers are desired, | 
|  | with those options:: | 
|  |  | 
|  | [ ] Cameras and video grabbers | 
|  | [ ] Analog TV | 
|  | [ ] Digital TV | 
|  | [ ] AM/FM radio receivers/transmitters | 
|  | [ ] Software defined radio | 
|  | [ ] Platform-specific devices | 
|  | [ ] Test drivers | 
|  |  | 
|  | So, if you want to add support to a camera or video grabber only, | 
|  | select just the first option. Multiple options are allowed. | 
|  |  | 
|  | Once the options on this menu are selected, the building system will | 
|  | auto-select the needed core drivers in order to support the selected | 
|  | functionality. | 
|  |  | 
|  | .. note:: | 
|  |  | 
|  | Most TV cards are hybrid: they support both Analog TV and Digital TV. | 
|  |  | 
|  | If you have an hybrid card, you may need to enable both ``Analog TV`` | 
|  | and ``Digital TV`` at the menu. | 
|  |  | 
|  | When using this option, the defaults for the media support core | 
|  | functionality are usually good enough to provide the basic functionality | 
|  | for the driver. Yet, you could manually enable some desired extra (optional) | 
|  | functionality using the settings under each of the following | 
|  | ``Media support`` sub-menus:: | 
|  |  | 
|  | Media core support ---> | 
|  | Video4Linux options ---> | 
|  | Media controller options ---> | 
|  | Digital TV options ---> | 
|  | HDMI CEC options ---> | 
|  |  | 
|  | Once you select the desired filters, the drivers that matches the filtering | 
|  | criteria will be available at the ``Media support->Media drivers`` sub-menu. | 
|  |  | 
|  | ``Media Core Support`` menu without filtering | 
|  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | If you disable the ``Filter media drivers`` menu, all drivers available | 
|  | for your system whose dependencies are met should be shown at the | 
|  | ``Media drivers`` menu. | 
|  |  | 
|  | Please notice, however, that you should first ensure that the | 
|  | ``Media Core Support`` menu has all the core functionality your drivers | 
|  | would need, as otherwise the corresponding device drivers won't be shown. | 
|  |  | 
|  | Example | 
|  | ------- | 
|  |  | 
|  | In order to enable modular support for one of the boards listed on | 
|  | :doc:`this table <cx231xx-cardlist>`, with modular media core modules, the | 
|  | ``.config`` file should contain those lines:: | 
|  |  | 
|  | CONFIG_MODULES=y | 
|  | CONFIG_USB=y | 
|  | CONFIG_I2C=y | 
|  | CONFIG_INPUT=y | 
|  | CONFIG_RC_CORE=m | 
|  | CONFIG_MEDIA_SUPPORT=m | 
|  | CONFIG_MEDIA_SUPPORT_FILTER=y | 
|  | CONFIG_MEDIA_ANALOG_TV_SUPPORT=y | 
|  | CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y | 
|  | CONFIG_MEDIA_USB_SUPPORT=y | 
|  | CONFIG_VIDEO_CX231XX=y | 
|  | CONFIG_VIDEO_CX231XX_DVB=y | 
|  |  | 
|  | Building and installing a new Kernel | 
|  | ==================================== | 
|  |  | 
|  | Once the ``.config`` file has everything needed, all it takes to build | 
|  | is to run the ``make`` command:: | 
|  |  | 
|  | $ make | 
|  |  | 
|  | And then install the new Kernel and its modules:: | 
|  |  | 
|  | $ sudo make modules_install | 
|  | $ sudo make install | 
|  |  | 
|  | 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 | 
|  | <https://backports.wiki.kernel.org/index.php/Main_Page>`_, 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: | 
|  |  | 
|  | https://git.linuxtv.org/media_build.git/ | 
|  |  | 
|  | 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: media@vger.kernel.org. Please | 
|  | add ``[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:: | 
|  |  | 
|  | $ ./build | 
|  |  | 
|  | .. note:: | 
|  |  | 
|  | 1) you may need to run it twice if the ``media-build`` tree gets | 
|  | updated; | 
|  | 2) you may need to do a ``make distclean`` if you had built it | 
|  | in the past for a different Kernel version than the one you're | 
|  | currently using; | 
|  | 3) 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. |