当前位置:   article > 正文

2.2 Video4Linux devices

video4linux

2.2.1 Introduction
V4L2驱动程序往往非常复杂,这是由于硬件的复杂性造成的:大多数设备都有多个IC,导出/dev下的多个设备节点,还创建了非V4L2设备,例如DVB、ALSA、FB、I2C和输入(IR)设备。
特别是V4L2驱动程序必须设置支持IC以进行音频/视频复用/编码/解码,这使得其比大多数驱动程序更复杂。通常,这些IC通过一个或多个I2C总线连接到主桥驱动程序,但也可以使用其他总线。这些设备被称为"子设备"。
很长一段时间里,该框架仅限于video_device结构用于创建V4L设备节点和处理视频缓冲区的视频_buf(请注意,本文档不讨论video_buf框架)。
这意味着所有驱动程序都必须自行设置设备实例并连接到子设备。其中一些工作做起来非常复杂,许多驱动程序从未正确执行。
由于缺少框架,也无法重构许多常见代码。因此,该框架设置了所有驱动程序需要的基本构建块,同时该框架应该将常见代码重构为所有驱动程序共享的实用函数变得更容易。
一个好的参考示例是位于samples/v4l/的v4l2-pci-skeleton.c源码。它是一个PCI捕获卡的骨架驱动程序,并演示了如何使用V4L2驱动程序框架。它可以用作实际PCI视频捕获驱动程序的模板。
介绍video_buf框架的文档有哪些:
以下是介绍Linux内核中的video_buf框架的一些文档:
1. video-buf.txt: 该文档提供了关于video_buf框架的一个简要概述,介绍了video_buf核心API和与v4l2中其他API的关系。
2. videobuf-core.txt: 该文档更详细地介绍了如何使用videobuf核心,包括video buffer的分配、映射和解除映射等操作,以及如何从DMA设备进行数据传输。
3. videobuf-dma-sg.txt: 该文档介绍了videobuf-dma-sg核心,它是一个围绕DMA和scatter-gather(SG)缓冲区机制的API。它适用于像视频捕获卡这样的设备,该设备可以通过SG DMA引擎将帧数据流直接存储到用户缓冲区中。
4. videobuf-vmalloc.txt: 该文档介绍了videobuf-vmalloc API,它提供了一个虚拟内存缓冲区池,该池用于存储帧数据,而无需访问DMA引擎。
这些文档都可以在Linux内核的Documentation/video4linux2目录下找到。
2.2.2 Structure of a V4L driver
所有驱动程序都具有以下结构:
1)针对每个设备实例的结构体,其中包含设备状态。
2)初始化和控制子设备(如果有)的方法。
3)创建V4L2设备节点(/dev/videoX、/dev/vbiX和/dev/radioX)并跟踪设备节点特定数据。
4)包含每个文件句柄数据的文件句柄特定结构体;
5)视频缓冲区处理。
这是一个大致的示意图,说明它们之间的关系。

 2.2.3 Structure of the V4L2 framework
这个框架与驱动程序结构非常相似:它有一个v4l2_device结构体来表示设备实例数据,一个v4l2_subdev结构体来引用子设备实例,video_device结构体用于存储V4L2设备节点的数据,而v4l2_fh结构体用于跟踪文件句柄实例。V4L2框架还可以可选地与media框架集成。如果驱动程序设置了struct v4l2_device中的mdev字段,子设备和视频节点将自动出现在media框架中作为实体。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号