]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - Documentation/media/kapi/v4l2-intro.rst
[media] doc-rst: reorganize the kAPI v4l2 chapters
[mirror_ubuntu-zesty-kernel.git] / Documentation / media / kapi / v4l2-intro.rst
CommitLineData
2a1fcdf0
HV
1Introduction
2------------
3
4The V4L2 drivers tend to be very complex due to the complexity of the
5hardware: most devices have multiple ICs, export multiple device nodes in
6/dev, and create also non-V4L2 devices such as DVB, ALSA, FB, I2C and input
7(IR) devices.
8
9Especially the fact that V4L2 drivers have to setup supporting ICs to
10do audio/video muxing/encoding/decoding makes it more complex than most.
11Usually these ICs are connected to the main bridge driver through one or
12more I2C busses, but other busses can also be used. Such devices are
13called 'sub-devices'.
14
15For a long time the framework was limited to the video_device struct for
16creating V4L device nodes and video_buf for handling the video buffers
17(note that this document does not discuss the video_buf framework).
18
19This meant that all drivers had to do the setup of device instances and
20connecting to sub-devices themselves. Some of this is quite complicated
21to do right and many drivers never did do it correctly.
22
23There is also a lot of common code that could never be refactored due to
24the lack of a framework.
25
26So this framework sets up the basic building blocks that all drivers
27need and this same framework should make it much easier to refactor
28common code into utility functions shared by all drivers.
29
926977e0 30A good example to look at as a reference is the v4l2-pci-skeleton.c
0185f850 31source that is available in samples/v4l/. It is a skeleton driver for
926977e0
HV
32a PCI capture card, and demonstrates how to use the V4L2 driver
33framework. It can be used as a template for real PCI video capture driver.
2a1fcdf0 34
f6fa883b
MCC
35Structure of a V4L driver
36-------------------------
2a1fcdf0
HV
37
38All drivers have the following structure:
39
401) A struct for each device instance containing the device state.
41
422) A way of initializing and commanding sub-devices (if any).
43
f44026db
HV
443) Creating V4L2 device nodes (/dev/videoX, /dev/vbiX and /dev/radioX)
45 and keeping track of device-node specific data.
2a1fcdf0 46
44061c05
MCC
474) Filehandle-specific structs containing per-filehandle data;
48
495) video buffer handling.
2a1fcdf0
HV
50
51This is a rough schematic of how it all relates:
52
4c21d4fb
MCC
53.. code-block:: none
54
2a1fcdf0
HV
55 device instances
56 |
57 +-sub-device instances
58 |
59 \-V4L2 device nodes
60 |
61 \-filehandle instances
62
63
f6fa883b
MCC
64Structure of the V4L2 framework
65-------------------------------
2a1fcdf0
HV
66
67The framework closely resembles the driver structure: it has a v4l2_device
68struct for the device instance data, a v4l2_subdev struct to refer to
69sub-device instances, the video_device struct stores V4L2 device node data
f818b358 70and the v4l2_fh struct keeps track of filehandle instances.
2a1fcdf0 71
2c0ab67b
LP
72The V4L2 framework also optionally integrates with the media framework. If a
73driver sets the struct v4l2_device mdev field, sub-devices and video nodes
74will automatically appear in the media framework as entities.