摘要:嵌入式环境下的USB摄像头驱动需要充分利用USB总线与内核中的USB核心密切配合并且保证数据流的高速与稳定。本文从Linux内核的USB核心模块出发,遵循Video4Linux接口标准,采用urb策略与内存映射的方式以提高数据读取速度,设计开发了基于Linux环境下的USB摄像头驱动,并在ARM9实验平台上对该驱动程序进行了测试与分析。
引言
嵌入式图像处理的应用范围随着嵌入式技术的不断发展而不断扩大,摄像头作为数字图像采集的基础,驱动程序的开发显得尤为重要。作为操作系统内核与硬件设备之间的接口,驱动程序是否优良,直接影响着硬件设备能否正常、高效运转。带有USB(通用串行总线)接口的摄像头因其具有支持热插拔、接口通用性好、实时性强、较高的传输速率、低成本、易于扩展等优点而备受青睐。但是嵌入式系统中支持USB摄像头的驱动程序很少,因此,研究和开发嵌入式环境下的USB摄像头驱动程序具有应用价值和现实意义。
USB摄像头驱动程序构架
设备驱动程序是计算机软、硬件之间存在的悖论的产物:软件和硬件不应该互相渗透到对方的领域。因此,设备驱动程序是介于操作系统与硬件之间,将硬件设备的具体工作细节对操作系统内核完全屏蔽的接口。用户的操作通过标准化的调用执行,经设备驱动程序映射到实际的硬件设备上。
由于在不同的环境下通常需要不同的方式来操作硬件,所以在编写访问硬件的设备驱动程序时,不能给用户强加任何特定的策略(策略,既是如何使用这些功能[1])。驱动程序应该处理如何使硬件工作的问题,而将怎样使用硬件的问题留给上层应用程序,即驱动程序的作用在于提供机制(机制,既是需要提供什么功能[1])。
USB子系统分析
一个USB子系统是由几个点对点的连接方式构建而成的树状结构,在该系统中USB只是担当设备和主控制器之间通信通道的角色,对它所发送或者接受的数据没有任何特殊的内容和结构上的要求。
Linux内核支持两种主要类型的USB驱动程序:宿主系统上的驱动程序和设备上的驱动程序[2]。宿主系统上的USB驱动程序控制插入其中的USB设备,而设备上的驱动程序则控制该设备如何与主机通信。
Linux内核提供了USB核心模块,该模块将不同类型的USB主控制器完全屏蔽,而为上层的USB设备驱动程序提供了用于访问和控制USB设备的接口(如图1)。因此USB核心模块将USB主控制器和USB设备驱动程序隔开,也同时将USB驱动程序的编写与具体的硬件隔开。
驱动模块构架
每个硬件设备在操作系统内核中都对应一个驱动模块。USB摄像头设备在内核中表现为一个字符设备,并且属于视频类的硬件设备。Linux内核为视频类设备提供了内核接口Video4Linux,该内核接口使得Linux环境下的上层应用程序可以像访问普通文件一样对其进行读写操作。因此该驱动模块提供的机制应该符合Video4Linux接口