77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. SPDX-License-Identifier: GPL-2.0
 | |
| 
 | |
| Introduction
 | |
| ------------
 | |
| 
 | |
| The V4L2 drivers tend to be very complex due to the complexity of the
 | |
| hardware: most devices have multiple ICs, export multiple device nodes in
 | |
| /dev, and create also non-V4L2 devices such as DVB, ALSA, FB, I2C and input
 | |
| (IR) devices.
 | |
| 
 | |
| Especially the fact that V4L2 drivers have to setup supporting ICs to
 | |
| do audio/video muxing/encoding/decoding makes it more complex than most.
 | |
| Usually these ICs are connected to the main bridge driver through one or
 | |
| more I2C buses, but other buses can also be used. Such devices are
 | |
| called 'sub-devices'.
 | |
| 
 | |
| For a long time the framework was limited to the video_device struct for
 | |
| creating V4L device nodes and video_buf for handling the video buffers
 | |
| (note that this document does not discuss the video_buf framework).
 | |
| 
 | |
| This meant that all drivers had to do the setup of device instances and
 | |
| connecting to sub-devices themselves. Some of this is quite complicated
 | |
| to do right and many drivers never did do it correctly.
 | |
| 
 | |
| There is also a lot of common code that could never be refactored due to
 | |
| the lack of a framework.
 | |
| 
 | |
| So this framework sets up the basic building blocks that all drivers
 | |
| need and this same framework should make it much easier to refactor
 | |
| common code into utility functions shared by all drivers.
 | |
| 
 | |
| A good example to look at as a reference is the v4l2-pci-skeleton.c
 | |
| source that is available in samples/v4l/. It is a skeleton driver for
 | |
| a PCI capture card, and demonstrates how to use the V4L2 driver
 | |
| framework. It can be used as a template for real PCI video capture driver.
 | |
| 
 | |
| Structure of a V4L driver
 | |
| -------------------------
 | |
| 
 | |
| All drivers have the following structure:
 | |
| 
 | |
| 1) A struct for each device instance containing the device state.
 | |
| 
 | |
| 2) A way of initializing and commanding sub-devices (if any).
 | |
| 
 | |
| 3) Creating V4L2 device nodes (/dev/videoX, /dev/vbiX and /dev/radioX)
 | |
|    and keeping track of device-node specific data.
 | |
| 
 | |
| 4) Filehandle-specific structs containing per-filehandle data;
 | |
| 
 | |
| 5) video buffer handling.
 | |
| 
 | |
| This is a rough schematic of how it all relates:
 | |
| 
 | |
| .. code-block:: none
 | |
| 
 | |
|     device instances
 | |
|       |
 | |
|       +-sub-device instances
 | |
|       |
 | |
|       \-V4L2 device nodes
 | |
| 	  |
 | |
| 	  \-filehandle instances
 | |
| 
 | |
| 
 | |
| Structure of the V4L2 framework
 | |
| -------------------------------
 | |
| 
 | |
| The framework closely resembles the driver structure: it has a v4l2_device
 | |
| struct for the device instance data, a v4l2_subdev struct to refer to
 | |
| sub-device instances, the video_device struct stores V4L2 device node data
 | |
| and the v4l2_fh struct keeps track of filehandle instances.
 | |
| 
 | |
| The V4L2 framework also optionally integrates with the media framework. If a
 | |
| driver sets the struct v4l2_device mdev field, sub-devices and video nodes
 | |
| will automatically appear in the media framework as entities.
 |