一种基于V4L2框架的UVC Camera驱动实现系统及方法技术方案

技术编号:18398383 阅读:35 留言:0更新日期:2018-07-08 19:17
本发明专利技术公开了一种基于V4L2框架的UVC Camera驱动实现系统及方法,包括底层的驱动层,用于驱动连接视频输出设备,提供视频输出设备所需驱动程序,通过该驱动程序实现视频输出设备属性的设置、视频格式的选择、视频数据的捕获;中间的V4L2核心层,该V4L2核心层向上为字符设备驱动层访问视频输出设备提供通用的设备文件节点,向下为驱动层提供的驱动程序的编写提供统一的V4L2架构;上层的字符设备驱动层,将视频设备将以文件的形式显示出来。本发明专利技术的一种基于V4L2框架的UVC Camera驱动实现系统及方法与现有技术相比,对所用摄像头硬件性能进行了最大挖掘,同时因为采用UVC规范,所以驱动可使用于所有采用Linux操作系统的产品上,具备很好的可维护性,实用性强。

【技术实现步骤摘要】
一种基于V4L2框架的UVCCamera驱动实现系统及方法
本专利技术涉及Linux
,具体地说是一种实用性强的基于V4L2框架的UVCCamera驱动实现系统及方法。
技术介绍
Linux系统下的设备基本可分成3类:字符设备、块设备和网络设备。字符设备以单字节为单位读写数据,比如串口数据的收发就是按字节来进行,在实际开发中一般还会在串口驱动中维护一个缓冲区用来中转数据以提供效率,但就串口硬件本身而言并没有这样做的要求,它仅仅是软件层面上的一种优化。不同于字符设备,块设备以数据块为单位存放数据,比如K9F2G08U0M上的数据存放就是以(2K+64)字节为单位来进行。网络设备同时兼有块设备和字符设备的部分特点,它以报文、包、帧的形式进行数据的收发。Linux操作系统的最大特点是“一切皆文件”,也就是说它把所有的设备都当做文件,以操作文件的方式来访问设备。出于对内核代码的安全性考虑,应用程序不允许直接访问硬件,它只能使用系统调用接口函数来访问硬件的驱动程序,对于每一个系统调用接口函数,驱动程序会一一实现与之对应的函数。字符设备是Linux3类设备中涵盖设备类型最为广泛的一类,比如我们常见的鼠标、显示器、音频设备以及我们用到的摄像头设备等都属于字符设备。字符驱动设备的核心结构体是file_operations,里面定义了访问硬件需要的所有可能操作函数,而应用程序执行系统调用以实现指定操作时,最终负责完成实际工作的就是file_operations中的某一成员函数。file_operations中的成员函数构造好之后,还要在驱动程序的入口函数中调用register_chrdev_region,cdev_init,cdev_add等函数将file_operations注册到内核维护的一个设备链表中。另外,在驱动程序的出口函数中还要调用unregister_chrdev_region函数来注销字符设备。对于复杂的字符驱动,会引入分层的概念,比如LCD驱动,内核中已帮我们编写好了LCD驱动的中间层程序fbmem.c,它里面不仅构造好了file_operations,并且register_chrdev和驱动的出入口函数也在其中,我们需要做的只是分配、设置、注册一个fb_info结构体,并把fb_info告诉fbmem.c,以及硬件相关的操作。当应用程序调用open、write、read或者其他函数来操作LCD时,它首先会调用fbmem.c中file_operations提供的open、write、read等函数,在这些函数里面会进一步调用fb_info里面提供的函数或者根据fb_info里面的属性来操作硬件。一个完整的系统调用涉及软件系统的诸多方面,以打开一个字符设备文件为例,最上层的应用程序先调用glibc提供的open函数打开字符设备文件,接着glibc根据open函数传入的参数执行“swi”指令触发CPU异常,进而令进程陷入内核态,内核中的异常处理函数再根据传入的参数找到对应的驱动程序,返回一个文件描述符fd给glibc,进而返回给应用程序,完成open系统调用。应用程序、库、内核、驱动之间的调用关系如图1所示。V4L,其全称是Video4Linux(VideoforLinux),从2.1.x版本的内核中开始出现,是在linux内核中关于视频设备的API接口,涉及开关视频设备、采集并处理视频图像信息。经常使用在需要采集图像的场合,如视频监控,webcam,可视电话等。虽然V4L工作的很好,也显著的提高了视频类设备驱动及应用程序的编写效率,但是在一些方面并不是那么完善,各种不同的API相当依赖buffer的类型,也没有提供相关的接口用于视频缓冲区管理。另外,V4L还存在一些bug,有些bug在整个V4L维护期间都没有得到很好的修复。由于早期的V4L有很多缺陷,BillDirks等人对其进行了重新设计,并取名为VideoforLinux2(V4L2使用),最早出现于Linux2.5.x版本。V4L2相比于V4L有更好的扩展性和灵活性,并且支持的硬件设备更多。Linux内核框架下的驱动程序编写采用简洁清晰的多层次架构来对接口进行抽象和统一,底层的驱动程序直接面向硬件,负责硬件功能的软件抽象,顶层的驱动程序按照设备类型负责实现面向字符设备,块设备,网络设备三类接口。前两类设备驱动对应文件系统中/dev目录下的设备文件节点,不同的文件节点代表不同的设备,对硬件设备的操作就是对设备文件节点的操作,而负责实现这一接口一致性抽象的就是虚拟文件系统层(VFS)。面向网络接口的设备也被分配了代表设备的名称,但没有被映射进文件系统,其接口函数的调用方式也与文件系统中的设备文件节点不同。V4L2即videoforlinuxversion2,它是在Linux驱动程序分层设计思想的指导下实现的有关视频设备的驱动中间层,向上为APP访问硬件设备提供通用的设备文件节点,向下为驱动底层代码的编写规范统一的V4L2架构。用户空间通过调用各种ioctl实现对采用V4L2驱动的视频设备的控制,并且允许使用mmap进行内存映射。但是,现有的V4L2架构中进行代码的实际编写时,并没有做到对所用摄像头硬件性能进行最大挖掘,无法适用于所有采用Linux操作系统的产品上。基于此,亟需一种适用范围广泛、可对摄像头硬件性能进行最大挖掘、基于V4L2架构的UVCCamera驱动技术。
技术实现思路
本专利技术的技术任务是针对以上不足之处,提供一种实用性强的基于V4L2框架的UVCCamera驱动实现系统及方法。一种基于V4L2框架的UVCCamera驱动实现系统,包括,底层的驱动层,用于驱动连接视频输出设备,提供视频输出设备所需驱动程序,通过该驱动程序实现视频输出设备属性的设置、视频格式的选择、视频数据的捕获,所述视频输出设备采用摄像头;中间的V4L2核心层,该V4L2核心层向上为字符设备驱动层访问视频输出设备提供通用的设备文件节点,向下为驱动层提供的驱动程序的编写提供统一的V4L2架构;上层的字符设备驱动层,将视频设备将以文件的形式显示出来。所述驱动层中提供的驱动程序通过视频流接口实现视频输出设备对视频数据的捕获,在对视频数据的捕获时,视频输出设备内置包括以下函数的结构体实现:probe、disconnect和id_table,其中,id_table函数确定当前驱动程序能支持的所有视频输出设备;probe、disconnect函数分别在设备被插入和拔出的时候被调用,用于初始化和释放软硬件资源;与上述结构体配合使用的,所述驱动层中的驱动程序通过以下三组指针集实现上述功能函数:第一组为一个release函数指针,该release函数为一个释放捕捉的函数;第二组是常规函数指针,这里的常规函数包括:open函数、release函数、用于进行数据传输的poll函数和mmap函数、ioctl函数;第三组是v4l2_ioctl_ops函数,负责设备的初始化,数据的输入、输出。所述驱动层中提供的驱动程序通过视频控制接口实现视频输出设备属性的设置,在对属性设置时,视频输出设备通过内置包括以下三个ioctl函数的结构体实现:用于查询指定属性信息的VIDIOC_QUERYCT本文档来自技高网
...

【技术保护点】
1.一种基于V4L2框架的UVC Camera驱动实现系统,其特征在于,包括,底层的驱动层,用于驱动连接视频输出设备,提供视频输出设备所需驱动程序,通过该驱动程序实现视频输出设备属性的设置、视频格式的选择、视频数据的捕获,所述视频输出设备采用摄像头;中间的V4L2核心层,该V4L2核心层向上为字符设备驱动层访问视频输出设备提供通用的设备文件节点,向下为驱动层提供的驱动程序的编写提供统一的V4L2架构;上层的字符设备驱动层,将视频设备将以文件的形式显示出来。

【技术特征摘要】
1.一种基于V4L2框架的UVCCamera驱动实现系统,其特征在于,包括,底层的驱动层,用于驱动连接视频输出设备,提供视频输出设备所需驱动程序,通过该驱动程序实现视频输出设备属性的设置、视频格式的选择、视频数据的捕获,所述视频输出设备采用摄像头;中间的V4L2核心层,该V4L2核心层向上为字符设备驱动层访问视频输出设备提供通用的设备文件节点,向下为驱动层提供的驱动程序的编写提供统一的V4L2架构;上层的字符设备驱动层,将视频设备将以文件的形式显示出来。2.根据权利要求1所述的一种基于V4L2框架的UVCCamera驱动实现系统,其特征在于,所述视频输出设备中配置有视频控制接口、视频流接口,其中视频控制接口提供视频输入通道、输出通道,视频流接口则负责视频数据的传输以及视频数据格式的修改;视频流经输入通道得以捕获并经模数转换后送到视频控制接口内部进行数据处理,得到处理的视频流最终通过视频控制接口的输出通道传送到视频流接口的输入端,从而完成整个视频数据的捕获、处理、传递过程。3.根据权利要求2所述的一种基于V4L2框架的UVCCamera驱动实现系统,其特征在于,所述驱动层中提供的驱动程序通过视频流接口实现视频输出设备对视频数据的捕获,在对视频数据的捕获时,视频输出设备内置包括以下函数的结构体实现:probe、disconnect和id_table,其中,id_table函数确定当前驱动程序能支持的所有视频输出设备;probe、disconnect函数分别在设备被插入和拔出的时候被调用,用于初始化和释放软硬件资源;与上述结构体配合使用的,所述驱动层中的驱动程序通过以下三组指针集实现上述功能函数:第一组为一个release函数指针,该release函数为一个释放捕捉的函数;第二组是常规函数指针,这里的常规函数包括:open函数、release函数、用于进行数据传输的poll函数和mmap函数、ioctl函数;第三组是v4l2_ioctl_ops函数,负责设备的初始化,数据的输入、输出。4.根据权利要求2所述的一种基于V4L2框架的UVCCamera驱动实现系统,其特征在于,所述驱动层中提供的驱动程序通过视频控制接口实现视频输出设备属性的设置,在对属性设置时,视频输出设备通过内置包括以下三个ioctl函数的结构体实现:用于查询指定属性信息的VIDIOC_QUERYCTRL函数、用于获取包括对比度、亮度值的属性信息的VIDIOC_G_CTRL函数和VIDIOC_S_CTRL函数;与上述结构体配合使用的,所述驱动层中的驱动程序通过以下三组驱动函数实现上述功能函数:uvc_query_v4l2_ctrl函数、uvc_ctrl_ge函数t、uvc_ctrl_set函数,其中,uvc_query_v4l2_ctrl函数用于查询设备的某一属性信息;uvc_ctrl_get函数用来获取设备的某一属性的当前参数值;uvc_ctrl_set函数用来将新的参数值设进设备的指定属性中。5.根据权利要求2所述的一种基于V4L2框架的UVCCamera驱动实现系统,其特征在于,所述驱动层中提供的驱动程序通过视频流接口实现视频输出设备中视频数据格式的选择,在视频数据的格式选择时,视频输出设备通过内置包括以下ioctl函数的结构体实现:VIDIOC_ENUM_FMT、VIDIOC_G_FMT、VIDIOC_TRY_FMT、VIDIOC_S_FMT,依次是列举函数、获得函数、测试函数、设置摄像头支持的视频数据格式函数;与上述结构体配合使用的,所述驱动层中的驱动程序通过以下驱动函数实现上述功能函数:uvc_query_v4l2_ctrl函数、uvc_ctrl_ge函数t、uvc_ctrl_set函数,其中,uvc_query_v4l2_ctrl函数用于查询视频数据的某一属性信息;uvc_ctrl_get函数用来获取视频数据的某一属性的当前参数值;uvc_ctrl_set函数用来将新的参数值设进视频数据的指定属性中。6.一种基于V4L2框架的UVCCamera驱动实现方法,其特征在于,基于上述系统,其实现过程为,一、...

【专利技术属性】
技术研发人员:王鹏
申请(专利权)人:郑州云海信息技术有限公司
类型:发明
国别省市:河南,41

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1