Linux系统下USB摄像头驱动多缓冲与图像采集研究.doc
文本预览下载声明
Linux系统下USB摄像头驱动多缓冲与图像采集研究
摘要:通过对基于中星微ZC0301芯片的USB摄像头符合Video for Linux和Video for Linux Version Two标准的两个驱动程序的分析研究,给出了符合这两种标准的USB摄像头驱动程序在图像数据多帧缓冲和图像采集设计中的不同点,并实现了相应的图像采集程序。
关键词:Linux;摄像头;驱动程序;Video for Linux;Video for Linux Two;多缓冲
中图分类号:TP316文献标识码:A文章编号:1009-3044(2008)33-1485-04
The Investigation of Multi-Buffer in USB Camera Driving Program and Image Capture in Linux System
ZHANG Wen-ya
(School of Information Science Technology, Southwest Jiaotong University, Chengdu 610031, China)
Abstract: This paper analyzes two USB camera drivingprograms of Vimicro companys ZC0301 chip.One is in conformity with the Video for Linux principle and the other is in conformity with the Video for Linux Two principle.The difference between the two programs about multi-buffer and image capture is given,and the image capture program is implemented.
Key words: Linux; camera; device driver; Video for Linux; Video for Linux Two; multi-buffer
1 引言
USB摄像头目前已得到广泛应用。因其灵活、方便的特性,易于集成到嵌入式系统中。比如视频聊天、网络监控和可视电话等。在我们开发的无线网络摄像机系统中,USB摄像头直接连接到嵌入式开发版,先用摄像头进行图像采集,再通过嵌入式模块进行进一步的处理。摄像头驱动程序一般在设计中采用符合V4L(Video for Linux)标准的驱动程序配合相应的应用程序,用的比较多的是开源的spca5xx驱动程序,但随着Video for Linux Version Two标准的出现,在一些驱动中也采用符合V4L2(Video for Linux Version Two)标准的驱动程序配合相应的应用程序。作者在开发过程中使用的是基于中星微ZC0301芯片的摄像头。通过在设计过程中对这款摄像头分别基于这两种标准的驱动程序的研究,给出了这两种驱动程序在多缓冲和图像采集方面处理的不同点,并分别给出相应的图像采集程序框架,以期加深读者对驱动程序的理解,根据实际开发需要更好的进行应用程序方面的设计。符合V4L的驱动程序参考开源的gspcav1驱动程序,符合V4L2的驱动程序参考linux2.6内核内的zc0301驱动程序。
2 使用多缓冲提高效果
在Linux系统中,文件操作通常是由read、write等系统调用来完成。通过在驱动中用copy_to_user,copy_from_user等函数在内核态、用户态内存空间中互相拷贝数据。但我们主要处理的是大批量的图像数据,采用上面的方法,频繁的进行读写,会增加时间开销。因此一般采用内存映射的方法来解决。mmap 方法是 file_operation 结构的一部分, 当发出 mmap系统调用时被引用。首先申请足够大的内核态内存,将其作为图像数据缓冲空间,URB带回的图像数据在这里暂存;然后使用函数将其逐页映射到用户空间中。用户态的图像处理程序使用mmap() 函数,直接读写内核态图像缓冲内存,这样可以大大减少额外开销,提高效率。
2.1 符合V4L标准的驱动中的多帧缓冲
在gspcav1驱动程序中,采用双帧缓冲,即在核态内存申请两帧图像缓冲内存。
gspcav1的设备数据结构
struct usb_spca50x {
struct video_device *vdev;
struct usb_device *dev;
char *fbuf;
struct spca
显示全部