第1篇 V2L2框架

参考:韦东山Linux教程
参考:https://blog.csdn.net/weixin_42462202/article/details/99680969
参考:https://blog.csdn.net/u013836909/article/details/125359789

  1. V4L2 框架图
v4l2驱动框架主要的对象有video_device、v4l2_device、v4l2_subdev、videobuf
    video_device
    	一个字符设备,为用户空间提供设备节点(/dev/videox),提供系统调用的相关操作(openioctl…)
    v4l2_device
    	嵌入到video_device中,表示一个v4l2设备的实例
    v4l2_subdev
    	依附在v4l2_device之下,并表示一个v4l2设备的子设备,一个v4l2_devide下可以有多个sub_device
    	subdev的设计目的是为了多路复用,就是用一个v4l2_device可以服务多个v4l2_subdev
    videobuf
    	v4l2驱动的缓存管理

image

image

  1. V4L2 架构层级与重要数据说明
V4l2 框架:

		APP:	 open, read, write
		==================================================
		kernel:
			核心层:(v4l2-dev.c 可理解为中间层,				//注意 v4l2 层的原理还不太懂
					提供接口函数 : video_register_device)
										|
										|分配/设置(v4l2_fops)/注册 cdev		//设备节点为 "/dev/videoX"
			----------------------------------------------
			硬件相关(uvc_driver.c)	
				分配 video_device
				设置 video_device
						.struct cdev *cdev;
						.struct v4l2_device *v4l2_dev;
								.struct list_head subdevs;				//v4l2_subdev 的链表,v4l2_device的主要目的时用来管理 v4l2_subdev
										.struct v4l2_subdev_ops *ops;	//v4l2_subdev_ops ,实现了一系列的操作,供 v4l2_device 调用
						.fops											//struct v4l2_file_operations , cdev->fops 会调用该结构体
						.ioctl_ops										//struct v4l2_ioctl_ops

						
				注册: video_register_device(video_device)(会调用核心层的代码,实现分配/设置(v4l2_fops)/注册 cdev) 
				
		==================================================
		硬件


				struct v4l2_file_operations {
					read 
					write
					poll
					unlocked_ioctl
					mmap
					open
					release
				};

				struct v4l2_ioctl_ops {				//必需的11个ioctl
					// 表示它是一个摄像头设备
					.vidioc_querycap      = vidioc_querycap,

					/* 用于列举、获得、测试、设置摄像头的数据的格式 */
					.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
					.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
					.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
					.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,

					/* 缓冲区操作: 申请/查询/放入队列/取出队列 */
					.vidioc_reqbufs       = vidioc_reqbufs,
					.vidioc_querybuf      = vidioc_querybuf,		//配合 mmap , 实现分配映射缓存 
					.vidioc_qbuf          = vidioc_qbuf,			//把缓冲区放入队列
					.vidioc_dqbuf         = vidioc_dqbuf,			//当有数据时,得到缓冲区状态,哪个缓冲区有数据,再读取

					// 启动/停止
					.vidioc_streamon      = vidioc_streamon,
					.vidioc_streamoff     = vidioc_streamoff,	
					
					//非必需:用于设置属性
					vidioc_queryctrl : 发起USB控制传输获得亮度的最小值、最大值、默认值、步进值。   根据设备描述符可知支持的属性
					vidioc_s_ctrl    : 把APP传入的亮度值通过USB传输发给硬件
					vidioc_g_ctrl    : 发起USB传输获得当前亮度值
				};

posted @   charlie12345  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示