linux V4L2子系统——v4l2架构(1)之整体架构

备注:
  1. Kernel版本:5.4
  2. 使用工具:Source Insight 4.0
  3. 参考博客:
(1)V4L2 driver-整体架构
(2)视频驱动V4L2子系统驱动架构

文章目录

  • linux V4L2子系统——v4l2架构(1)之整体架构
    • 概述
    • videoX字符设备框架
    • V4L2框架
    • V4L2 core介绍
      • 概述
      • 主要结构体说明

概述

V4L(Video for Linux)是Linux内核中关于视频设备的API接口,涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本,经过修改bug和添加功能,Linux内核2.5版本推出了V4L2(Video for Linux Two)子系统,功能更多且更稳定。V4L2的主设备号是81,次设备号范围0~255,这些次设备号又分为多类设备,如视频设备(次设备号范围0-63)、Radio(收音机)设备(次设备号范围64-127)、Teletext设备(次设备号范围192-223)、VBI设备(次设备号范围224-255)。

V4L2设备对应的设备节点有/dev/videoX、/dev/vbiX、/dev/radioX。这里只讨论视频设备,视频设备对应的设备节点是/dev/videoX。视频设备以高频头或Camera为输入源,Linux内核驱动该类设备,接收相应的视频信息并处理。

Linux系统中视频输入设备主要包括以下四个部分:

  • 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间。
  • V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数。
  • 平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
  • 具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。

videoX字符设备框架

熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱动的主要工作就是实现各种各样的ioctl.v4l2的整体框架如下图所示:

下图中芯片模块对应Soc的各个子模块,video_device结构体主要用来控制Soc的video模块,v4l2_device会包含多个v4l2_subdev, 每个v4l2_subdev用来控制各自的子模块,某些驱动不需要v4l2_subdev,依靠video模块就能实现功能。

Linux系统上的Video设备多种多样,如通过Camera Host控制器接口连接的摄像头,通过USB总线连接的摄像头等。为了兼容更多的硬件,Linux内核抽象了V4L2(Video for Linux Two)子系统。V4L2子系统是Linux内核中关于Video(视频)设备的API接口,是V4L(Video for Linux)子系统的升级版本。V4L2子系统向上为虚拟文件系统提供了统一的接口,应用程序可通过虚拟文件系统访问Video设备。V4L2子系统向下给Video设备提供接口,同时管理所有Video设备。Video设备又分为主设备和从设备,对于Camera来说,Camera Host控制器为主设备,负责图像数据的接收和传输,从设备为Camera Sensor,一般为I2C接口,可通过从设备控制Camera采集图像的行为,如图像的大小、图像的FPS等。主设备可通过v4l2_subdev_call的宏调用从设备提供的方法,反过来从设备可以调用主设备的notify方法通知主设备某些事件发生了。

V4L2框架

结构体v4l2_device、video_device、v4l2_subdev和v4l2_fh是搭建框架的主要元素。

从上图可看出,V4L2框架是一个标准的树形结构,v4l2_device充当了父设备,通过链表把所有注册到其下的子设备管理起来,这些设备可以GRABBER、VBI或RADIO。

  • v4l2_device
    这个是整个输入设备的总结构体,可以认为它是整个 V4L2 框架的入口,充当驱动的管理者以及入口监护人。由该结构体引申出来 v4l2_subdev。用于视频输入设备整体的管理,有多少输入设备就有多少个v4l2_device抽象(比如一个USB摄像头整体就可以看作是一个 V4L2 device)。再往下分是输入子设备,对应的是例如 ISP、CSI、MIPI 等设备,它们是从属于一个 V4L2 device 之下的。

  • v4l2_subdev
    v4l2_subdev是子设备,v4l2_subdev结构体包含了对设备操作的ops和ctrls,这部分代码和硬件相关,需要根据硬件实现,像摄像头设备需要实现控制上下电、读取ID、饱和度、对比度和视频数据流打开关闭的接口函数。

  • video_device
    video_device用于创建子设备节点,把操作设备的接口暴露给用户空间。

  • v4l2_fh
    v4l2_fh是每个子设备的文件句柄,在打开设备节点文件设置,方便 上层索引到v4l2_ctrl_handler, v4l2_ctrl_handler管理设备的ctrls,这些ctrls(摄像头设备)包括调节饱和度、对比度和白平衡等。

V4L2 core介绍

概述

v4l2驱动代码在drivers\media\v4l2-core文件夹下,可根据字面意思来理解基本的功能。videobuf是实现视频的内存分配,对于 v4l 和 v4l2 分别对应不同的文件,如 videobuf-corevideobuf2-core, v4l2-devv4l2-devicev4l2-subdev分别对应video_devicev4l2_devicev4l2_subdev的实现,v4l2-ioctl实现ioctl等等。

drivers/media/v4l2-core
├── tuner-core.c
├── v4l2-async.c
├── v4l2-clk.c
├── v4l2-common.c
├── v4l2-compat-ioctl32.c
├── v4l2-ctrls.c
├── v4l2-dev.c
├── v4l2-device.c
├── v4l2-dv-timings.c
├── v4l2-event.c
├── v4l2-fh.c
├── v4l2-flash-led-class.c
├── v4l2-fwnode.c
├── v4l2-i2c.c
├── v4l2-ioctl.c
├── v4l2-mc.c
├── v4l2-mem2mem.c
├── v4l2-spi.c
├── v4l2-subdev.c
├── v4l2-trace.c
├── videobuf-core.c
├── videobuf-dma-contig.c
├── videobuf-dma-sg.c
└── videobuf-vmalloc.c

video驱动代码在driver/media目录下,下面分多个子目录,其中platform目录存放的是不同Soc的驱动代码,对应video_device; 其他大多子目录如:i2c、mmc、usb、tuners、radio等对应subdev的实现。

drivers/media/platform$ tree -L 1
.
├── am437x
├── aspeed-video.c
......
├── omap
├── omap3isp
├── pxa_camera.c
├── qcom
......
├── rockchip
......
├── seco-cec
├── sh_veu.c
├── sh_vou.c
├── sti
├── stm32
├── sunxi
......
└── xilinx

v4l2驱动框架最重要的是理解ioctl, 另外v4l2驱动框架最主要的是各个ioctl实现的功能,这些实现方式需要在实际操作中多加理解,不是难点。

v4l2核心源码v4l2-core分类

模块 描述
核心模块 由v4l2-dev.c实现,主要作用包括申请字符主设备号、注册class和提供video device注册注册等相关函数。
V4L2框架 由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c、v4l2-async.c、v4l2-fwnode.c、v4l2-i2c.c、v4l2-spi.c等文件实现,构建v4l2框架。
videobuf管理 由videobuf2-core.c、videobuf2-dma-contig.c、videobuf-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
ioctl框架 由v4l2-ioctl.c、v4l2-compat-ioctl32.c 文件实现,构建v4l2_ioctl框架。

主要结构体说明

详见:
(1)linux V4L2子系统——v4l2的结构体(1)之v4l2_device
(2)linux V4L2子系统——v4l2的结构体(2)之video_device
(3)linux V4L2子系统——v4l2的结构体(3)之v4l2_subdev
(4)linux V4L2子系统——v4l2的结构体(4)之ioctl
(5)linux V4L2子系统——v4l2的结构体(5)之videobuf2(vb2)

linux V4L2子系统——v4l2架构(1)之整体架构相关推荐

  1. linux V4L2子系统——v4l2架构(3)之video_device

    linux V4L2子系统--v4l2架构(3)之video_device 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: ...

  2. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构

    作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内 ...

  3. Linux内核的整体架构介绍

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  4. linux 哪个进程在使用串口_Linux内核的整体架构

    转载自蜗窝科技 Linux内核的整体架构​www.wowotech.net 作者:wowo发布于:2014-2-21 13:23 分类:Linux内核分析 0. 转载者说在前面的话 转载目的: 能够让 ...

  5. 【Linux】Linux内核的整体架构简介

    文章目录 0.前言 1.Linux 内核的核心功能 2.Linux内核的整体架构 3.Linux源代码目录结构 参考 0.前言 本文是笔者学习Linux系统的记录性文章故引用和参考较多,参考文章见文末 ...

  6. 一文看懂Linux内核的整体架构

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  7. 浅析支付系统的整体架构

    支付的典型架构 每个公司根据其业务和公司发展的不同阶段,所设计的支付系统也会有所不同.我们先看看互联网公司的一些典型的支付系统架构. 支付宝 先看看业内最强的支付宝系统,支付宝的支付系统整体架构设计 ...

  8. 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等

    1.引言 经历过稍有些规模的IM系统开发的同行们都有体会,要想实现大规模并发IM(比如亿级用户和数十亿日消息量这样的规模),在架构设计上需要一些额外的考虑,尤其是要解决用户高并发.服务高可用,架构和实 ...

  9. 【架构模式】程序整体架构分析

    Title: 程序整体架构分析 Date: 2020-9-18 Tags: 架构 设计模式 程序整体架构分析 在做软件架构设计时,根据不同的抽象层次可分为三种不同层次的模式: 架构模式(Archite ...

  10. 视频驱动V4L2子系统驱动架构 - 驱动框架

    文章系列 视频驱动V4L2子系统驱动架构 - 驱动框架 视频驱动V4L2子系统驱动架构 - ioctl 基于linux4.6.3 V4L2驱动框架 v4l2驱动架构如图所示,v4l2也就是video ...

最新文章

  1. SQL点滴5—产生时间demention,主要是时间转换
  2. sql server 2008学习7 规范化和其他基本设计问题
  3. design短语的用法总结_design的意思、用法、搭配和例句
  4. 漫步最优化二十一——全局收敛
  5. VSCode每打开一次文件弹出一个git弹窗:-login -i rev-parse --show-toplevel
  6. PyTorch学习—19.模型的加载与保存(序列化与反序列化)
  7. linux 小巧的浏览器,Linux奇技淫巧:一款特别轻量级的网页浏览器
  8. 泛微OA的http接口创建
  9. visio 画箭头_在visio2013中画箭头的具体操作
  10. 锐取电视墙服务器型号,锐取录播系统 CL4000系列多媒体录播一体机--投影时代产品专区...
  11. Winhex的使用(慢慢更
  12. obs录制不了Java_simplescreenrecorder(OBS Studio)录屏没有声音最佳解决方案
  13. 《霜冷长河》之《壮士》----英雄归来
  14. 机器学习(周志华西瓜书) 参考答案 总目录
  15. 软件工程毕业设计课题(21)基于JAVA毕业设计电子书小说网站系统毕设作品项目
  16. MaxwellWorkbenchoptiSLang联合优化总结
  17. Findbugs 缺陷详解与英文代号的对照表
  18. 实现微信自动发送/回复信息_Android版微信7.0.15
  19. note2 android版本,魅蓝Note2的系统是什么?魅蓝Note2能升级安卓5.0吗?
  20. Python系统仿真其二:半导体激光器速率方程

热门文章

  1. linux的XDG(X Desktop Group)基本目录规范
  2. Java中的数据类型
  3. 软考信息系统项目管理师考试心得-备考
  4. java实现简单战舰游戏,java – 战舰游戏 – 船舶重叠
  5. xp系统查计算机设备型号,xp电脑设备型号怎么查询
  6. yocto相关class总结
  7. word文档怎么在左侧显示目录?
  8. Centos7重置用户密码
  9. html什么布局可以兼容多平台,腾讯游戏:浅谈游戏官网现状及设计趋势
  10. matlab实现简单图形的识别