v4l2摄像头框架--基于s5pv210和 s5p6818(一)

接触v4l2框架已经很久了,因为工作中从没有用到过这个框架,因此也就没有花时间去研究学习,最主要的是当时看到这个框架太复杂,没有心情去弄明白。最近虽然也没有实际工作和该框架相关,但还是花了一部分精力去学习了以下该框架,通过这段时间大量阅读源码和论文,也算是对该框架有了一个初步的认识,现总结以下,以便以后自己翻阅方便,其次有不对的地方也希望大家给予指正。废话就这些了,下面先给大家看一个框图

这是从https://blog.csdn.net/lizuobin2/article/details/53000720地址摘录过来的,该博主对v4l2的讲解也挺好,就是感觉代码太多,看起来有点顾此失彼,但是想深入学习v4l2架构,我建议大家可以好好阅读该博主的博文,当然了也可以给我留言,我尽量把自己知道的都告诉给大家。

首先我们应该明白再大的框架其基本思想都不会离开字符设备、块设备和网络设备这些基本的设备驱动思想,v4l2是基于字符设备的一个框架,学过驱动的都应该知道应用层的系统调用最终调用到驱动得file_operations结构体中对应的函数,v4l2这个大架构也不例外,应用程序最终通过file_operations和驱动层通信,只是file_operations不用我们驱动实现,而是核心层实现了一个统一的file_operations结构体,即上图中的v4l2_fops,应用层的所有接口最终都会调用到v4l2_fops结构体中的成员,然后再由v4l2_fops调用我们驱动层实现的接口,分层之后的访问流程大致就是上面所述的那样。虽然整个架构很简单,但是估计每个人刚接触到v4l2的时候都会感觉很头大,很迷惘,虽然我们都能理解这个架构,但心里却很虚,感觉对该驱动很不理解。

其实造成v4l2比较难以理解的根本原因是这个架构包含的模块太多了,以至于我们大家都会迷失在其浩瀚的代码世界中,我个人认为学习该架构不光有很强的阅读代码的功底,还需要有一些摄像头及摄像头应用程序开发的知识,只有这样才能真正的弄明白该架构(当然,这里只是简单的指视频采集部分)。

这里我分开去讲解v4l2的一些结构体和关系。虽然在v4l2中有很多的结构体,在此我不会把所有结构体都讲解到,我只把最主要的跟架构紧密相关的部分给大家说明,这里我根据应用层的调用顺序解释一下数据结构。

应用层系统调用和video_device.cdev通信,故首先进入我们视野的就是struct video_device结构体,该结构体定义如下:

struct video_device{
        ......
	const struct v4l2_file_operations *fops;
	struct cdev *cdev;		/* character device */
	int minor;
	const struct v4l2_ioctl_ops *ioctl_ops;
};

这里我们只列出了和架构紧密相关的成员,其它成员没有列出,如有疑问,可在博文下留言。应用层的系统调用会调用到video_device.cdev的file_operations成员,file_operations中的成员函数最终会调用到video_device结构的v4l2_file_operations  fops成员,v4l2_file_operations  fops的unlocked_ioctl函数会调用到v4l2_ioctl_ops  ioctl_ops成员,最终调用到了子设备对应的ioctl等成员。

以上部分就是对开头那张图的一个说明,接下来我会根据两个实际例子向大家讲解v4l2。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章