1.. SPDX-License-Identifier: GPL-2.0
2
3===================================
4Building support for a media device
5===================================
6
7The first step is to download the Kernel's source code, either via a
8distribution-specific source file or via the Kernel's main git tree\ [1]_.
9
10Please notice, however, that, if:
11
12- you're a braveheart and want to experiment with new stuff;
13- if you want to report a bug;
14- if you're developing new patches
15
16you should use the main media development tree ``master`` branch:
17
18    https://git.linuxtv.org/media_tree.git/
19
20In this case, you may find some useful information at the
21`LinuxTv wiki pages <https://linuxtv.org/wiki>`_:
22
23    https://linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers
24
25.. [1] The upstream Linux Kernel development tree is located at
26
27       https://git.kernel.org/pub/scm/li  nux/kernel/git/torvalds/linux.git/
28
29Configuring the Linux Kernel
30============================
31
32You can access a menu of Kernel building options with::
33
34    $ make menuconfig
35
36Then, select all desired options and exit it, saving the configuration.
37
38The changed configuration will be at the ``.config`` file. It would
39look like::
40
41    ...
42    # CONFIG_RC_CORE is not set
43    # CONFIG_CEC_CORE is not set
44    CONFIG_MEDIA_SUPPORT=m
45    CONFIG_MEDIA_SUPPORT_FILTER=y
46    ...
47
48The media subsystem is controlled by those menu configuration options::
49
50    Device Drivers --->
51	<M> Remote Controller support  --->
52	[ ] HDMI CEC RC integration
53	[ ] Enable CEC error injection support
54	[*] HDMI CEC drivers  --->
55	<*> Multimedia support  --->
56
57The ``Remote Controller support`` option enables the core support for
58remote controllers\ [2]_.
59
60The ``HDMI CEC RC integration`` option enables integration of HDMI CEC
61with Linux, allowing to receive data via HDMI CEC as if it were produced
62by a remote controller directly connected to the machine.
63
64The ``HDMI CEC drivers`` option allow selecting platform and USB drivers
65that receives and/or transmits CEC codes via HDMI interfaces\ [3]_.
66
67The last option (``Multimedia support``) enables support for cameras,
68audio/video grabbers and TV.
69
70The media subsystem support can either be built together with the main
71Kernel or as a module. For most use cases, it is preferred to have it
72built as modules.
73
74.. note::
75
76   Instead of using a menu, the Kernel provides a script with allows
77   enabling configuration options directly. To enable media support
78   and remote controller support using Kernel modules, you could use::
79
80	$ scripts/config -m RC_CORE
81	$ scripts/config -m MEDIA_SUPPORT
82
83.. [2] ``Remote Controller support`` should also be enabled if you
84       want to use some TV card drivers that may depend on the remote
85       controller core support.
86
87.. [3] Please notice that the DRM subsystem also have drivers for GPUs
88       that use the media HDMI CEC support.
89
90       Those GPU-specific drivers are selected via the ``Graphics support``
91       menu, under ``Device Drivers``.
92
93       When a GPU driver supports HDMI CEC, it will automatically
94       enable the CEC core support at the media subsystem.
95
96Media dependencies
97------------------
98
99It should be noticed that enabling the above from a clean config is
100usually not enough. The media subsystem depends on several other Linux
101core support in order to work.
102
103For example, most media devices use a serial communication bus in
104order to talk with some peripherals. Such bus is called I²C
105(Inter-Integrated Circuit). In order to be able to build support
106for such hardware, the I²C bus support should be enabled, either via
107menu or with::
108
109    ./scripts/config -m I2C
110
111Another example: the remote controller core requires support for
112input devices, with can be enabled with::
113
114    ./scripts/config -m INPUT
115
116Other core functionality may also be needed (like PCI and/or USB support),
117depending on the specific driver(s) you would like to enable.
118
119Enabling Remote Controller Support
120----------------------------------
121
122The remote controller menu allows selecting drivers for specific devices.
123It's menu looks like this::
124
125         --- Remote Controller support
126         <M>   Compile Remote Controller keymap modules
127         [*]   LIRC user interface
128         [*]     Support for eBPF programs attached to lirc devices
129         [*]   Remote controller decoders  --->
130         [*]   Remote Controller devices  --->
131
132The ``Compile Remote Controller keymap modules`` option creates key maps for
133several popular remote controllers.
134
135The ``LIRC user interface`` option adds enhanced functionality when using the
136``lirc`` program, by enabling an API that allows userspace to receive raw data
137from remote controllers.
138
139The ``Support for eBPF programs attached to lirc devices`` option allows
140the usage of special programs (called eBPF) that would allow aplications
141to add extra remote controller decoding functionality to the Linux Kernel.
142
143The ``Remote controller decoders`` option allows selecting the
144protocols that will be recognized by the Linux Kernel. Except if you
145want to disable some specific decoder, it is suggested to keep all
146sub-options enabled.
147
148The ``Remote Controller devices`` allows you to select the drivers
149that would be needed to support your device.
150
151The same configuration can also be set via the ``script/config``
152script. So, for instance, in order to support the ITE remote controller
153driver (found on Intel NUCs and on some ASUS x86 desktops), you could do::
154
155	$ scripts/config -e INPUT
156	$ scripts/config -e ACPI
157	$ scripts/config -e MODULES
158	$ scripts/config -m RC_CORE
159	$ scripts/config -e RC_DEVICES
160	$ scripts/config -e RC_DECODERS
161	$ scripts/config -m IR_RC5_DECODER
162	$ scripts/config -m IR_ITE_CIR
163
164Enabling HDMI CEC Support
165-------------------------
166
167The HDMI CEC support is set automatically when a driver requires it. So,
168all you need to do is to enable support either for a graphics card
169that needs it or by one of the existing HDMI drivers.
170
171The HDMI-specific drivers are available at the ``HDMI CEC drivers``
172menu\ [4]_::
173
174	--- HDMI CEC drivers
175	< >   ChromeOS EC CEC driver
176	< >   Amlogic Meson AO CEC driver
177	< >   Amlogic Meson G12A AO CEC driver
178	< >   Generic GPIO-based CEC driver
179	< >   Samsung S5P CEC driver
180	< >   STMicroelectronics STiH4xx HDMI CEC driver
181	< >   STMicroelectronics STM32 HDMI CEC driver
182	< >   Tegra HDMI CEC driver
183	< >   SECO Boards HDMI CEC driver
184	[ ]     SECO Boards IR RC5 support
185	< >   Pulse Eight HDMI CEC
186	< >   RainShadow Tech HDMI CEC
187
188.. [4] The above contents is just an example. The actual options for
189       HDMI devices depends on the system's architecture and may vary
190       on new Kernels.
191
192Enabling Media Support
193----------------------
194
195The Media menu has a lot more options than the remote controller menu.
196Once selected, you should see the following options::
197
198	--- Media support
199	[ ] Filter media drivers
200	[*] Autoselect ancillary drivers
201	    Media device types --->
202	    Media core support --->
203	    Video4Linux options --->
204	    Media controller options --->
205	    Digital TV options --->
206	    HDMI CEC options --->
207	    Media drivers --->
208	    Media ancillary drivers --->
209
210Except if you know exactly what you're doing, or if you want to build
211a driver for a SoC platform, it is strongly recommended to keep the
212``Autoselect ancillary drivers`` option turned on, as it will auto-select
213the needed I²C ancillary drivers.
214
215There are now two ways to select media device drivers, as described
216below.
217
218``Filter media drivers`` menu
219^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
220
221This menu is meant to easy setup for PC and Laptop hardware. It works
222by letting the user to specify what kind of media drivers are desired,
223with those options::
224
225	[ ] Cameras and video grabbers
226	[ ] Analog TV
227	[ ] Digital TV
228	[ ] AM/FM radio receivers/transmitters
229	[ ] Software defined radio
230	[ ] Platform-specific devices
231	[ ] Test drivers
232
233So, if you want to add support to a camera or video grabber only,
234select just the first option. Multiple options are allowed.
235
236Once the options on this menu are selected, the building system will
237auto-select the needed core drivers in order to support the selected
238functionality.
239
240.. note::
241
242   Most TV cards are hybrid: they support both Analog TV and Digital TV.
243
244   If you have an hybrid card, you may need to enable both ``Analog TV``
245   and ``Digital TV`` at the menu.
246
247When using this option, the defaults for the media support core
248functionality are usually good enough to provide the basic functionality
249for the driver. Yet, you could manually enable some desired extra (optional)
250functionality using the settings under each of the following
251``Media support`` sub-menus::
252
253	    Media core support --->
254	    Video4Linux options --->
255	    Media controller options --->
256	    Digital TV options --->
257	    HDMI CEC options --->
258
259Once you select the desired filters, the drivers that matches the filtering
260criteria will be available at the ``Media support->Media drivers`` sub-menu.
261
262``Media Core Support`` menu without filtering
263^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
264
265If you disable the ``Filter media drivers`` menu, all drivers available
266for your system whose dependencies are met should be shown at the
267``Media drivers`` menu.
268
269Please notice, however, that you should first ensure that the
270``Media Core Support`` menu has all the core functionality your drivers
271would need, as otherwise the corresponding device drivers won't be shown.
272
273Example
274-------
275
276In order to enable modular support for one of the boards listed on
277:doc:`this table <cx231xx-cardlist>`, with modular media core modules, the
278``.config`` file should contain those lines::
279
280    CONFIG_MODULES=y
281    CONFIG_USB=y
282    CONFIG_I2C=y
283    CONFIG_INPUT=y
284    CONFIG_RC_CORE=m
285    CONFIG_MEDIA_SUPPORT=m
286    CONFIG_MEDIA_SUPPORT_FILTER=y
287    CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
288    CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
289    CONFIG_MEDIA_USB_SUPPORT=y
290    CONFIG_VIDEO_CX231XX=y
291    CONFIG_VIDEO_CX231XX_DVB=y
292
293Building and installing a new Kernel
294====================================
295
296Once the ``.config`` file has everything needed, all it takes to build
297is to run the ``make`` command::
298
299    $ make
300
301And then install the new Kernel and its modules::
302
303    $ sudo make modules_install
304    $ sudo make install
305
306Building just the new media drivers and core
307============================================
308
309Running a new development Kernel from the development tree is usually risky,
310because it may have experimental changes that may have bugs. So, there are
311some ways to build just the new drivers, using alternative trees.
312
313There is the `Linux Kernel backports project
314<https://backports.wiki.kernel.org/index.php/Main_Page>`_, with contains
315newer drivers meant to be compiled against stable Kernels.
316
317The LinuxTV developers, with are responsible for maintaining the media
318subsystem also maintains a backport tree, with just the media drivers
319daily updated from the newest kernel. Such tree is available at:
320
321https://git.linuxtv.org/media_build.git/
322
323It should be noticed that, while it should be relatively safe to use the
324``media_build`` tree for testing purposes, there are not warranties that
325it would work (or even build) on a random Kernel. This tree is maintained
326using a "best-efforts" principle, as time permits us to fix issues there.
327
328If you notice anything wrong on it, feel free to submit patches at the
329Linux media subsystem's mailing list: media@vger.kernel.org. Please
330add ``[PATCH media-build]`` at the e-mail's subject if you submit a new
331patch for the media-build.
332
333Before using it, you should run::
334
335    $ ./build
336
337.. note::
338
339    1) you may need to run it twice if the ``media-build`` tree gets
340       updated;
341    2) you may need to do a ``make distclean`` if you had built it
342       in the past for a different Kernel version than the one you're
343       currently using;
344    3) by default, it will use the same config options for media as
345       the ones defined on the Kernel you're running.
346
347In order to select different drivers or different config options,
348use::
349
350    $ make menuconfig
351
352Then, you can build and install the new drivers::
353
354    $ make && sudo make install
355
356This will override the previous media drivers that your Kernel were
357using.
358