//名词:
UVC(USB Video Class):UVC是一种通用的USB摄像头接口标准,使得摄像头设备能够与各种操作系统兼容,实现即插即用的功能。
CSI(Camera Serial Interface):CSI是一种串行摄像头接口,通常用于嵌入式系统和移动设备,如智能手机和平板电脑。
Source和Sink:可以把source理解为发送端的流,sink理解为接受端。
//Video设备又分为主设备和从设备对于Camera来说,
主设备:Camera Host控制器为主设备,负责图像数据的接收和传输,
从设备:从设备为Camera Sensor,一般为I2C接口,可通过从设备控制Camera采集图像的行为,如图像的大小、图像的FPS等。
//V4L2的主设备号是81,次设备号范围0~255
视频设备(次设备号范围0-63)
Radio(收音机)设备(次设备号范围64-127)
Teletext设备(次设备号范围192-223)
VBI设备(次设备号范围224-255)。
1)kernel space:
sensor、ISP、VIPP、CSI、CCI都为从设备
从dphy物理层获取视频数据册通过vb2子模块
CCI :主要是通过GPIO(供电、片选)、I2C(下发配置命令给sensor)实现配置sensor
EHCI/OHCI:USB类型摄像头
2)hardware
CSIC Controller:从dphy获取mipi协议帧
I2C Controller:与sensor的i2c block通信
GPIO Controller:sensor通常需要供电或者片选
external device
3)sensror:摄像头的接口主要有:USB,DVP.MIPI(CSI)
V4L2核心源码位于drivers/media/v4l2-core,根据功能可以划分为四类:
1)字符设备模块:由v4l2-dev.c实现,主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数。
2)V4L2基础框架:由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件构建V4L2基础框架。
3)videobuf管理:由videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
4)Ioctl框架:由v4l2-ioctl.c文件实现,构建V4L2 ioctl的框架。
//V4L2中有几个最重要的几个结构体,v4l2_device、video_device、v4l2_subdev等。
//一旦子设备注册完成,对于v4l2子系统来说就完全透明了
//我们回到V4L2来,再来谈v4l2_device和v4l2_subdev:
1) v4l2_device表示一个v4l2实例,在V4L2驱动中,使用v4l2_device来表示摄像头控制器
2) 使用v4l2_subdev来表示具体的某一个摄像头的I2C控制模块,进而通过其控制摄像头
3) v4l2_device里有一个v4l2_subdev链表,可以选择v4l2_device去控制哪一个v4l2_subdev
subdev的设计目的是为了多路复用,就是用一个v4l2_device可以服务多个v4l2_subdev
4)然而某些驱动是没有v4l2_subdev,只有video_device
//参考自 一口彭 老师