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