一、介绍:
V4L2全名为VideoFor Linux 2,它是针对Linux系统的视频设备处理架构。视频设备主要包括输入设备(摄像头)及输出设备(显示设备)。
V4L2架构设计之初是只针对视频设备的,那时的V4L2被限制只能在struct video_device 结构体里面创建,并且用video_buf控制视频缓存。但随着硬件的变化也越来越复杂,现在大部分设备里面包含了多个子设备IC,比较常见的子设备如编解码器、传感器、摄像头控制器等。通常这些IC一般通过i2c总线连接到主板,这些设备都统称为sub-devices(即子设备)。
二、V4L2设备驱动编写分类:
Linux的video设备驱动实现,驱动开发者需要按照V4L2的驱动模型进行设计,该驱动模型主要围绕核心数据结构structvideo_device来展开设计,通过该数据结构来完成视频设备的分配、设置、注册等工作。
1.对于没有子设备的简单视频设备来说,其驱动程序重点需要实现两个操作集:v4l2_file_operations和v4l2_ioctl_ops,V4L2架构最终会调用这两个操作集中的函数接口,来完成对视频设备硬件的控制。
2.对于有子设备的视频设备,则需要借助v4l2_subdev框架(or soc camera 子系统?)来完成复杂视频设备驱动。每一个subdev驱动程序都应该创建一个struct v4l2_subdev结构实例,你可以在你的驱动程序中单独的为该结构申请内存,同样可以将这个结构嵌入到其他的驱动数据结构中去。
三、soc camera 子系统:
从内核文档看:Documentation/video4linux/soc-camera.txt
soc-camera的作者之所以引入这个子系统,我想一个主要目的就是把camera驱动划分为camera host端,camera device端,这样同一个camera sensor驱动就可以方便的移植到多个camera host下,而无须做较多的改动。
soc-camera 子系统在camera host驱动和camera sensor驱动间提供了统一的接口,camera senor驱动就是v4l2 subdev驱动,它要和类似I2C设备驱动的camera驱动绑定(在probe函数中
会调用函数:v4l2_i2c_subdev_init(sd, client, &sensor_ops);//与i2c client建立联系。)。对于现在很多公司在接入摄像头时要开发的驱动,指的就是这个类似I2C设备驱动的camera的驱动。
三、V4L2设备驱动层级划分:
V4L2核心层:包含v4l2_file_operations和v4l2_ioctl_ops
soc camera 子系统:在子系统中会实现v4l2_file_operations接口(除了ioctl接口)和v4l2_ioctl_ops接口,向下暴露两个部分:soc camera device 和 soc camera host