################# V4L2
1. V4L2的MAJOR = 81, MINOR = 0-255
MINOR = 0-63: 视频设备 (不一定)
MINOR = 64-127: Radio设备
MINOR = 192-223: Teletext设备
MINOR = 224-255: VBI设备
2.V4L2对应的设备节点
/dev/videoX
/dev/vbiX
/dev/radioX
3.videoX,视频输入设备主要有:
3.1 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间。
3.2 V4L2 驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数。
3.3 平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
3.4 具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。
4.结构关系:
/dev/videoX (81,X)
\|/
字符设备驱动程序核心(cdev)
注册/|\ \|/调用
V4L2驱动核心
注册/|\ \|/调用
平台V4L2驱动(video_device,v4l2_dev)
\|/
具体的sensor驱动(v4l2_subdev)
\|/
Camera
video_device结构体主要用于控制Soc的video模块,
v4l2_device包含多个v4l2_subdev,每个v4l2_subdev用来控制各自的子模块,有点驱动不需要v4l2_subdev,依靠video就可以完成功能。
为了兼容更多硬件,Linux抽象了V4L2子系统。分为主设备和从设备,
主设备为控制器,负责图像数据接收和传输,主设备可通过v4l2_subdev_call调用从设备提供的方法
从设备为传感器,负责图像数据的采集(一般为i2c接口),从设备可以调用主设备的notify方法通知主设备
5. v4L2框架
video_device
\|/
v4l2_device
\|/
v4l2_subdev[]
\|/
devicenode->v4l2_fh->v4l2_ctrl_handler->v4l2 ctrls
v4l2_devie: 整个输入设备的总结构体,V4L2框架的入口,有多少输入设备就有
多少v4l2_device抽象,(一个USB摄像头整体看作一个v4l2_device)
再细分就是v4l2_subdev例如:ISP\CSI\MIPi等设备,从属于一个V4L2device之下
v4l2_subdev: 子设备,包含了ops和ctrls,这部分代码与硬件相关,需要根据硬件实现,
需要实现上下电、读取ID、饱和度、对比度和视频数据流打开关闭的接口函数
video_device:用于创建子设备节点,把操作设备接口暴露给用户空间
v4l2_fh: 是每个子设备的文件句柄,打开设备节点文件设置,方便上层索引到
v4l2_ctrl_handler,v4l2_ctrl_hander管理设备的ctrls,这些ctrls包含
调节饱和度,对比度,白平衡等
6.V4L2 core介绍
v4l2的驱动代码位于drivers\media\v4l2-core文件夹下,根据字面意思来理解其基本功能
6.1 videobuf是实现视频的内存分配,对于v4l和v4l2对应不同的文件,videobuf-core和videobuf2-core
6.2 其它结构体对应的文件
v4l2-dev 对应 video_device
v4l2-device 对应 v4l2_device
v4l2-subdev 对应 v4l2_subdev
v4l2-ioctl 对应 ioctl
目录表:
v4l2驱动代码位于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下
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
其中platform目录存放不同Soc驱动代码,对应video_device,其他大多子目录
如i2c、mmc、usb、tuners、radio对应subdev的实现
框架中最重要的是理解ioctl,v4l2驱动框架最主要的实现各个ioctl的功能
模块 | 描述
核心模块 | 由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框架。