Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 1 | Introduction |
| 2 | ------------ |
| 3 | |
| 4 | The V4L2 drivers tend to be very complex due to the complexity of the |
| 5 | hardware: 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 | |
| 9 | Especially the fact that V4L2 drivers have to setup supporting ICs to |
| 10 | do audio/video muxing/encoding/decoding makes it more complex than most. |
| 11 | Usually these ICs are connected to the main bridge driver through one or |
| 12 | more I2C busses, but other busses can also be used. Such devices are |
| 13 | called 'sub-devices'. |
| 14 | |
| 15 | For a long time the framework was limited to the video_device struct for |
| 16 | creating V4L device nodes and video_buf for handling the video buffers |
| 17 | (note that this document does not discuss the video_buf framework). |
| 18 | |
| 19 | This meant that all drivers had to do the setup of device instances and |
| 20 | connecting to sub-devices themselves. Some of this is quite complicated |
| 21 | to do right and many drivers never did do it correctly. |
| 22 | |
| 23 | There is also a lot of common code that could never be refactored due to |
| 24 | the lack of a framework. |
| 25 | |
| 26 | So this framework sets up the basic building blocks that all drivers |
| 27 | need and this same framework should make it much easier to refactor |
| 28 | common code into utility functions shared by all drivers. |
| 29 | |
Hans Verkuil | 926977e | 2014-03-14 08:38:21 -0300 | [diff] [blame] | 30 | A good example to look at as a reference is the v4l2-pci-skeleton.c |
Arnd Bergmann | 0185f85 | 2016-04-25 10:17:21 -0300 | [diff] [blame] | 31 | source that is available in samples/v4l/. It is a skeleton driver for |
Hans Verkuil | 926977e | 2014-03-14 08:38:21 -0300 | [diff] [blame] | 32 | a PCI capture card, and demonstrates how to use the V4L2 driver |
| 33 | framework. It can be used as a template for real PCI video capture driver. |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 34 | |
Mauro Carvalho Chehab | f6fa883 | 2016-07-22 10:15:42 -0300 | [diff] [blame] | 35 | Structure of a V4L driver |
| 36 | ------------------------- |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 37 | |
| 38 | All drivers have the following structure: |
| 39 | |
| 40 | 1) A struct for each device instance containing the device state. |
| 41 | |
| 42 | 2) A way of initializing and commanding sub-devices (if any). |
| 43 | |
Hans Verkuil | f44026d | 2010-08-06 12:52:43 -0300 | [diff] [blame] | 44 | 3) Creating V4L2 device nodes (/dev/videoX, /dev/vbiX and /dev/radioX) |
| 45 | and keeping track of device-node specific data. |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 46 | |
Mauro Carvalho Chehab | 44061c0 | 2009-02-14 07:29:07 -0300 | [diff] [blame] | 47 | 4) Filehandle-specific structs containing per-filehandle data; |
| 48 | |
| 49 | 5) video buffer handling. |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 50 | |
| 51 | This is a rough schematic of how it all relates: |
| 52 | |
Mauro Carvalho Chehab | 4c21d4f | 2016-07-17 15:25:27 -0300 | [diff] [blame] | 53 | .. code-block:: none |
| 54 | |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 55 | device instances |
| 56 | | |
| 57 | +-sub-device instances |
| 58 | | |
| 59 | \-V4L2 device nodes |
| 60 | | |
| 61 | \-filehandle instances |
| 62 | |
| 63 | |
Mauro Carvalho Chehab | f6fa883 | 2016-07-22 10:15:42 -0300 | [diff] [blame] | 64 | Structure of the V4L2 framework |
| 65 | ------------------------------- |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 66 | |
| 67 | The framework closely resembles the driver structure: it has a v4l2_device |
| 68 | struct for the device instance data, a v4l2_subdev struct to refer to |
| 69 | sub-device instances, the video_device struct stores V4L2 device node data |
Nicolas THERY | f818b35 | 2012-10-26 09:01:55 -0300 | [diff] [blame] | 70 | and the v4l2_fh struct keeps track of filehandle instances. |
Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 71 | |
Laurent Pinchart | 2c0ab67 | 2009-12-09 08:40:10 -0300 | [diff] [blame] | 72 | The V4L2 framework also optionally integrates with the media framework. If a |
| 73 | driver sets the struct v4l2_device mdev field, sub-devices and video nodes |
| 74 | will automatically appear in the media framework as entities. |