linuxV4L2子系统——v4l2构架(1)之整体构架
备注:
1.Kernel版本:5.4
2.使用工具:SourceInsight4.0
3.参考博客:
(1)V4L2driver-整体构架
文章目录
概述
V4L(VideoforLinux)是Linux内核中关于视频设备的API插口,涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本,经过更改bug和添加功能,Linux内核2.5版本推出了V4L2(VideoforLinuxTwo)子系统,功能更多且更稳定。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系统中视频输入设备主要包括以下四个部份:
videoX字符设备框架
熟悉v4l2用户空间编程的都晓得,v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开,关掉,查询,设置等操作.v4l2设备是一个字符设备,并且其驱动的主要工作就是实现各类各样的ioctl.v4l2的整体框架如右图所示:
右图中芯片模块对应Soc的各个子模块,video_device结构体主要拿来控制Soc的video模块,v4l2_device会包含多个v4l2_subdev,每位v4l2_subdev拿来控制各自的子模块,个别驱动不须要v4l2_subdevlinux是什么系统,借助video模块才能实现功能。
Linux系统上的Video设备多种多样,如通过CameraHost控制器插口联接的摄像头,通过USB总线联接的摄像头等。为了兼容更多的硬件,Linux内核具象了V4L2(VideoforLinuxTwo)子系统。V4L2子系统是Linux内核中关于Video(视频)设备的API插口,是V4L(VideoforLinux)子系统的升级版本。V4L2子系统向下为虚拟文件系统提供了统一的插口,应用程序可通过虚拟文件系统访问Video设备。V4L2子系统向上给Video设备提供插口,同时管理所有Video设备。Video设备又分为主设备和从设备,对于Camera来说,CameraHost控制器为主设备,负责图象数据的接收和传输,从设备为CameraSensor,通常为I2C插口,可通过从设备控制Camera采集图象的行为,如图像的大小、图像的FPS等。主设备可通过v4l2_subdev_call的宏调用从设备提供的方式,反过来从设备可以调用主设备的notify方式通知主设备个别风波发生了。
V4L2框架
结构体v4l2_device、video_device、v4l2_subdev和v4l2_fh是搭建框架的主要元素。
从上图可看出,V4L2框架是一个标准的树状结构,v4l2_device充当了父设备,通过数组把所有注册到其下的子设备管理上去,这种设备可以GRABBER、VBI或RADIO。
V4L2core介绍概述
v4l2驱动代码在driversmediav4l2-core文件夹下,可按照字面意思来理解基本的功能。videobuf是实现视频的显存分配linux防火墙设置,对于v4l和v4l2分别对应不同的文件linux mmc驱动架构,如videobuf-core和videobuf2-core,v4l2-dev、v4l2-device、v4l2-subdev分别对应video_device、v4l2_device、v4l2_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目录下linux mmc驱动架构,下边分多个子目录,其中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和提供videodevice注册注册等相关函数。
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)linuxV4L2子系统——v4l2的结构体(1)之v4l2_device
(2)linuxV4L2子系统——v4l2的结构体(2)之video_device
(3)linuxV4L2子系统——v4l2的结构体(3)之v4l2_subdev
(4)linuxV4L2子系统——v4l2的结构体(4)之ioctl
(5)linuxV4L2子系统——v4l2的结构体(5)之videobuf2(vb2)