LINUX下USB视频设备用户空间驱动研究与开发.doc
《LINUX下USB视频设备用户空间驱动研究与开发.doc》由会员分享,可在线阅读,更多相关《LINUX下USB视频设备用户空间驱动研究与开发.doc(93页珍藏版)》请在三一办公上搜索。
1、浙江大学计算机科学与技术学院硕士学位论文 Linux下USB视频设备用户空间驱动研究与开发 姓名:徐家 申请学位级别:硕士 专业:计算机应用技术 指导教师:陈奇20100308摘要Linux设备驱动一般运行在内核空间,近些年来,为了提高驱动开发效率, 一些研究人员提出了在用户空间下开发驱动的概念,相对于内核驱动,用户空间 下的驱动有着以下优点:1,调试的方便;2,用户空驱动出错不会引起系统崩 溃;3,用户空间驱动可以使用C语言库,简化驱动的开发;4,用户空间驱动对 内核依赖性较少,有更好的移植性,并且可以发布封闭源代码的驱动。应用程序可以通过系统调用和内核驱动进行交互,但对于用户空间驱动,需
2、要实现相应的框架来支持应用程序与驱动之间的交互。本文针对视频设备的特 性,设计并实现了用户空间的V4L2交互框架,通过该框架,应用程序可以方便 的以V4L2标准与用户空间驱动进行交互,并能减少用户空间驱动的开发工作量。视频设备有较复杂的工作机制和数据格式,在用户空间下开发丨能够有效的 提高驱动开发效率和降低调试的难度。本文从USB视频设备的共性出发,利用 Libusb库设计并实现了 USB视频设备的用户空间驱动,并使用C+语言以面向对 象的思想来组织驱动的开发,并实现了视频驱动中可重用的传输缓冲区模块,同 时C+相对与C语言更强的语言安全性也提髙了驱动的稳定性。关键词:Linux驱动,视频设备
3、,用户空间,V4L2交互框架,传输缓冲区AbstractLinux device drivers usually run in kernel space. Recent years, in order to improve the driver development efficiency, some researchers propose the user space driver development concept. Compare to kernel space driver, user-space driver has the following advantages: 1, co
4、nvenience of debugging; 2,the user space driver error will not cause system crashes ; 3,the user space drivers can use the C language library, simplify driver development; 4, user-space drivers are less dependent on the kernel, so have better portability, and can release closed source drivers.The ap
5、plication uses the system calls to communicate with kernel driver, while in user space driver, there needs an appropriate framework to facilitate the interaction between application and driver. In this paper, considering the characteristics of video equipment, it designs and implements the user spac
6、e V4L2 interaction framework. Using this framework, the application can communicate with user-space drivers under V4L2 standard easily, and also reduces the workload of the user space driver development.Video device has complex working mechanisms and data formats, develop its driver in user space an
7、d improve the develop efficiency and reduce debugging difficulty. This article uses Libusb library to design and implement a user space USB video device driver, and uses the C + +, with object-oriented idea to the organize driver development, and realizes a reused transmission buffer module. C+ s mo
8、re safety in language can increase the driver stability.Keywords : Linux driver, video device, user space, VL42 interaction framework, transfer buffer图目录2.1应用程序与内核驱动交互方式72.2应用程序与用户空间驱动交互方式83.1 V4L2交互框架结构图144.1 USB设备的配置、接口与端点关系图244.2 USB视频设备拓扑结构254. 3典型USB视频设备的接口描述符264. 4驱动整体模块示意图304. 5视频帧状态转换图334. 6
9、视频队列操作示意图345.1等时传输函数调用流程405. 2视频帧填充过程415. 3数据读写同步方法445.4视频数据传输流程45图图图图图图图图图图图图图图5.5传输缓冲区对象UML图46表目录1查询以及初始化设备V4L2命令.2数据传输V4L2命令3 V4L2交互框架上层接口1批量传输端点和等时传输端点比较1 USB命令格式2 BFH字段构成1获取视频帧时间对比33345566 表表表表表表表表12 20 27 38 40 49 492 Luvcview资源使用对比致谢转眼间,两年半的研究生生涯快要结束了,在这里要感谢所有帮助我的老师 和同学。首先,我要感谢我的导师陈奇老师,陈老师严谨的
10、治学态度和平易近人 的为人处世给我留下了深刻印象,也将使我终身受益。陈老师在科研上对我不断 的指导和鞭策是我不断成长的动力,同时陈老师在生活和学业上给了我各方面的 关怀,使我能够顺利的完成毕业设计。其次,我要感谢何江峰师兄,无论遇到科研还是生活上的问题,他都能乐于 帮助并,并耐心解决。接着我要感谢王志鹏、宋国兵同学正是与他们一起合作,才顺利的完成了实 验室与华为预研部和合作的项目。同时也要.感谢夏杰、程春惠、车延辙、钱丰等 同学,正是这些同学组成了实验室一个团结的集体。最后我要感谢我的父母亲及其他关爱的人,我的成长和进步里不开你们的支徐家2010年1月于求是园第1章绪论1.1课题研究背景设备驱
11、动是硬件与应用程序之间的桥梁,也是Linux系统中不可缺少的一部 分。从Linux 1.0到2. 6版本的发展过程中,Linux内核对硬件设备的支持越来 越全面,同时随着硬件设备种类、型号的不断增加,Linux内核中的驱动程序的 代码总量也在不断增加,已占到内核代码的70%左右。研究表明设备驱动问题 是影响操作系统稳定性的主要因素之一23】,而Linux内核中驱动代码中的错误是 其他内核代码的7倍左右24】。随着计算机硬件性能的不断提高,设备驱动效率不 再成为制约硬件设备性能表现的瓶颈,而驱动的稳定性的越来越受到重视。同时, 硬件设备的更新换代和新设备出现的速度也越来越快,对于硬件驱动的开发时
12、间 周期也要求越来越高21】。传统的Linux设备驱动一般由C语言开发,而C语言缺 乏类型安全性是影响Linux设备驱动稳定性的重要因素之一。相对于应用程序, Linux设备驱动在开发方法和工具上所取得进展也相当有限,缺乏相关的开发 SDK和开发工具,驱动幵发往往需要开发人员精通内核底层的数据结构,不仅有 着较高的门槛,同时也不利于缩短驱动开发周期。1.2国内外研究现状分析针对Linux设备驱动的稳定性和开发效率问题,国内外的一些学者进行了相 关的研究,研究领域主要集中在以下几个方向:1,在Linux内核中引入JAVA 等类型安全语言进行驱动开发;2,通过髙层的建模语言对驱动进行开发;3用 户
13、空间驱动开发的相关技术研究。Shan Chen, Lingling Zhou23提出了在Linux内核中使用java语言进行驱动 开发的方法。Shan Chen, Lingling Zhou在实现内核空间Java虚拟机基础上, 给出了基于内核Java虚拟机的驱动开发方法,在驱动中引入Java虚拟机能够从 编译、运行时提高驱动的稳定性,当然在驱动执行效率上可能会有所降低。Fabrice Mrillon, Laurent R6veilUre2U提出了使用接口定义语言 Devil 进行驱动开发的方法。Devil语言从I/O端口、寄存器和设备变量三个层次来对 驱动进行抽象,通过Devil语言能够清晰明
14、确的表示驱动涉及到的端口、寄存器 和设备变量,以及三者之间的相互联系。Devil程序编译后生成的相应C语言 宏,驱动程序需要操作硬件时直接调用这些C语言宏,这样既能够避免直接编写 对硬件操作的代码而带来的错误,并能够使开发人员在一个更高的语言层次开发 驱动,提高驱动开发的效率。Christopher L. Conway, Stephen A. Edwards125提出 了通过 Domain-Specific Language-NDL语言开发驱动的方法,NDL借鉴了 Devil语言的语法结构。NDL驱 动的描述由寄存器集合、访问寄存器的协议和一系列设备函数构成。NDL语言通 过对驱动中常用的写寄
15、存器、I/O数据拷贝命令进行了抽象和封装,使得需要多 行C语言代码实现的操作在NDL中可以简洁的被表示,同时NDL将设备相关的系 统调用或执行代码封装为库函数,方便开发人员的使用。目前大多数设备驱动开发方法的研究都在Linux内核空间中展幵,但Linux 内核空间编程相对与用户空间编程来说限制较多,使用一些的新的方法或非传统 的手段往往需要对内核进行重新改造,工程量较大。用户空间驱动作为一个新兴 的概念,则有着如下优点:1,驱动调试的方便,用户用GDB等常用工具即可进 行驱动的调试;2,驱动开发的便利,在用户空间开发驱动时,可以使用C语言 库,并使用第三方的开发库,提高驱动的开发效率;3,用户
16、空间驱动挂起了, 可以被简单杀死并重启动,并不会影响整个系统的运行3】;4,有学者提出在内 核使用C+面向对象的思想来组织驱动,提高驱动的重用性4】,在用户空间,由 于不受内核对C+语言的限制,可以用更方便的通过面向对象的思想来实现驱动 程序,提高同类型驱动代码的重用性;5,在驱动内部可以实现一些复杂的功能, 如音视频数据的压缩等。因此在用户空间中,开发驱动程序不仅有着较大灵活性, 并且能够提高驱动程序的健壮性和开发效率。1.3用户空间驱动分析Linux地址空间可以分为内核空间和用户空间,应用程序主要运行在用户空 间,而系统服务、驱动程序等一般运行在内核空间,运行在内核空间的程序优先 级较高,
17、并能使用特权级别的操作,有较高的执行效率,但内核空间程序的问题 可能会导致系统崩溃。内核空间中只支持C语言编程,无法直接使用较高层的语 言如C+、Java等进行开发,在内核空间中无法使用C语言库或其他开发库,一 般只能使用内核数据结构和系统函数,同时也不支持浮点数操作,内核空间程序 的这些限制直接了制约了驱动程序的开发速度,同时不利于提高驱动的稳定性。 User Space I/O System,简称UIO,是作为Linux内核中对用户空间驱动开 发提供支持的一个框架在Linux2. 6. 23版本中被加正式入内核。UI0并不是一个 广义上的驱动框架,在Linux内核中被支持的很好的驱动子系统
18、,如串口和USB 等子系统,并不在UI0支持的范围之列。UI0支持的设备需要满足如下特性:1, 设备内存可以被映射,并且通过写设备I/O内存可以直接操控硬件;2,设备通 常能够产生中断信号;3,设备并不在标准的Linux设备子系统支持之列【5。UI0 可以将驱动大部分的工作都放在用户空间,但在内核空间还是需要编写小部分代 码,这部分代码主要是工作是将驱动连接到总线,并注册中断处理程序,使得用 户空间驱动能接收到硬件中断。用户空间的驱动进行注册后,会生成/dev/uioO 的设备文件,应用程序能够以的open、ioctl等常规指令对该设备文件进行操作。 据估计,在内核空间实现68个标准的ioct
19、l指令的驱动程序需要5000行左右的 代码,但在用户空间实现同样功能的驱动程序,只需要3000行用户空间代码和 156行内核空间代码。但UI0作为一个刚刚发展起来的框架,功能还比较有限, 目前只支持字符型设备驱动,而不支持块设备、网络设备等驱动,对其他Linux 设备子系统支持也不是很好。Libusb是支持用户空间下访问USB设备的函数库。Linux下最初只能在内核 空间中访问USB设备,但Linux内核开发人员看到了在用户空间下访问USB设备 的必要性,因此在Linux中引入了 usbdevfs文件系统。usbdevfs和proc 样, 并不是一个实际的文件系统,而是在内存中动态生成的虚拟文
20、件系统,通过 usbdevfs及其提供的函数接口,在用户空间能够直接访问USB设备,也使得在 用户空间开发USB设备驱动成为可能。为了避免与原有的devfs文件系统产生混 淆,usbdevfs 在 Linux2. 6 内核中被更名为 usbfs。usbfs 加载在/proc/bus/usb 目录下,该目录下的每一个设备文件对应了一个实际USB设备,usbfs定义了 相关的函数和数据结构,通过引用相关头文件,便可以在用户空间程序中访问 usb设备。Libusb实际上是通过usbfs来访问USB设备6】,不过对相关usbfs 函数接口进行了封装,是一个更高层的函数库。Libusb有良好的跨平台特性
21、, 可以运行在Linux、FreeBSD、NetBSD、MacOs x、Windows等平台,因此基于 Libusb开发的USB视频设备驱动、USB存储设备驱动或其他USB外设驱动也有良 好的移植性。VGALIB是Linux下一个底层的图形库,功能类似与X Windows,应用程序通 过VGALIB提供的API,可以直接操作VGA的端口。VGALIB为进程分配了和视频 内存区域同样大小的内存,并支持进程能够直接访问视频内存来控制屏幕显示Linux用户空间驱动作为一个起步不是很久的事物,也存在着一些不足, 虽然一些现有的技术能够使得在用户空间直接访问硬件设备成为可能,但相对于 内核空间驱动,主要
22、还存在以下不足之处:1,用户空间驱动还未形成类似内核 驱动一样形成完善的框架,包括应用程序如何调用空间驱动,应用程序和驱动之 间的消息和数据交互的机制。2,用户空间驱动与应用程序的藕合性问题,现有 的交互方式下,用户空间驱动与应用程序往往会高度藕合,不符合软件设计中高 内聚低藕合的要求9】;3,用户空间驱动的效率问题,相对于内核驱动,用户空 间驱动在效率上可能会有所降低。4,一些内核驱动中的标准协议,如V4L2等, 需要在用户空间驱动中实现。1.4本文的工作与创新本文分析了用户空间与内核空间中驱动开发在实现机制和具体细节上的差 异,针对用户空间驱动现有的不足,设计并实现了 V4L2交互框架,该
23、交互框架 有良好的重用性和扩展性,方便应用程序和视频设备用户空间驱动之间的交互, 同时能够对用户空间下视频设备驱动开发提供有效的支持,降低驱动开发的工作 量。并利用Libusb库提出并实现了 USB视频设备用户空间驱动幵发方法,该方 法能够有效提高USB视频设备驱动开发的效率。并在用户空间驱动开发中使用 C+语言面向对象的思想来组织驱动的开发与设计,实现了可重用的传输缓冲区 模块,并使驱动的代码有着良好的维护性和扩展性,并提高了驱动程序的健壮性。 本文对以下几方面内容进行了研究-分析对比了 Linux内核驱动和用户空间驱动在程序特性、框架支持、调 试方法、可移植性方面的差别,并指出了用户空间驱
24、动需要改进的地方。 对于用户空间驱动与内核空间驱动在调用接口上的不同,提出并实现了 V4L2交互框架,该框架有效的屏蔽和解决了调用接口的问题,并提供了 应用程序与用户空间视频设备驱动之间的控制传递,数据传输的相应机 制,并实现了框架的标准调用接口,通过该框架,可以减少用户空间驱 动开发的复杂度。分析了 USB视频设备的相关协议与标准,讨论了对USB视频设备进行控制的基本原理和方法。 分析了用户空间下对USB设备进行读写访问的Libusb库,并在此基础上 提出了 USB视频设备驱动在用户空间的实现的方法,针对用户空间驱动 与内核空间驱动的不同,分析并给出了在用户空间实现USB视频设备驱 动的实现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX USB 视频 设备 用户 空间 驱动 研究 开发
链接地址:https://www.31ppt.com/p-2388055.html