|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
只要了解了Linux的基础之后,应该就可以很轻易的解决掉这方面的问题。而有些朋友们常常一接触Linux就是希望构架网站,根本没有想到要先了解一下Linux的基础。这是相当困难的。
USB摄像头以其优秀的功能和昂贵的代价失掉普遍使用。同时因其天真、便利的特征,易于集成到嵌进式体系中。可是假如利用现有的切合VideoforLinux尺度的驱动程序共同通用使用程序,难以充实使用USB带宽,帧速不高,不容易满意及时监控等请求。本文起首先容在Linux体系下USB摄像头驱动体例的一样平常办法,然后申明在此基本上怎样进步帧速。
1Linux体系中的USB摄像头驱动程序
USB设备驱动程序完整切合通用设备驱动的原则,分歧的是内核供应了一些出格的API函数,便利驱动注册、烧毁本人,比方usb_reSister()和usb_dereSister();2.4版的内核还供应了关于hotplug的撑持。
1.1USB摄像头驱动的一样平常编写办法
摄像头属于视频类设备。在今朝的Linux中心中,视频部分的尺度是VideoforLinux(简称V4L)。这个尺度实在界说了一套接口,内核、驱动、使用程序以这个接口为尺度举行交换。今朝的V4L涵盖了视、音频流捕获及处置等外容,USB摄像头也属于它撑持的范围。
因而,USB摄像头的驱动应该与内核供应的视频驱动挂钩。即起首在驱动中声明一个video_device布局,并为其指定文件操纵函数指针数组.fops,向体系注册。在使用程序收回文件操纵的相干命令时,中心依据这些指针挪用响应函数,并将该布局作为参数传送给它们。如许,就完成了驱动和中心之间的通讯。比方:
staticstructvideo_devicevdev_template={……};
//声明video_device,指出挂接驱动
staticstructfile_operationsov511_fops={……};
//声明本驱动的文件操纵函数指针
structvideo_device*vdev=video_devdata(file);
//从文件指针中提掏出video_device布局
在video_device布局中,有一个公有指针priv,能够将它指向一块保存内存。在这块内存中,保留着本驱动、本设备的相干初始化信息。这块内存的请求、初始化、指针指向等事情都是在USB驱动的列举函数.probe中完成。如许,在列举函数将把持权返还给体系后,由于内核不烧毁保存内存,以是驱动仍旧保存着本人的信息。这点与Windows体系中WDM驱动有殊途同归的地方。固然,在驱动卸载函数中,应该将请求的各块内存全体开释。
1.2利用双URB轮番通讯
尽人皆知,USBl.1总线尺度界说了把持、中止、批量、等时等四种管道。关于工夫性极强可是正确度请求不高的视频捕获使用来讲,摄像头应该利用等时传输体例。为了尽量快地失掉图象数据,应该在URB中指定USB_ISO_ASAP标记。
urb->transfer_flags=USB_ISO_ASAP;//尽量快地收回本URB
Linux体系中任何USB传输都经由过程URB完成。为进步速率,能够思索扩展URB的缓冲,如许能够下降每一个USB事件中握手信息所占比例,进步无效数据的传输速率。可是受限于总线带宽和详细的USB设备芯片,纯真扩展URB的缓冲不克不及无穷制地办理成绩。详细剖析一下USB传输在操纵体系中的完成:每次传输都要包含URB的创建、收回、接纳、数据收拾等阶段,这些工夫不发生无效数据。因而能够创建两个URB,在守候一个URB被接纳时,也就是图象正在被传感器收罗时,处置、初始化另外一个URB,并在接纳后立即将其收回。两个URB瓜代利用,年夜年夜削减了分外工夫。事情流程如所示。
这个历程是在URB的完成例程中完成的,有两点必要注重:起首处置再次初始化的代码工夫不克不及长,不然会形成完成例程的重人,假如的确来不及,能够在完成例程中设定标记,比方“数据收罗好”旗语,由使用程序利用堵塞ioctl()来查询该旗语并做处置;其次因为CPU大概会在完成例程中停止较长工夫,体系包袱较年夜,能够在.open函数中初始化两个URB并将其收回,无限度地加重体系包袱。
1.3利用双帧缓冲进步效力
Linux体系中,文件操纵一般是由read、write等体系挪用来完成。这些体系挪用在驱动中的办理办法就是用copy_to_user()、copy_from_user()等函数在核态、户态内存空间中相互拷贝。可是关于多量量的图象数据,接纳拷贝的办法明显会增添工夫开支,因而用内存映照的办法办理。起首利用vmalloc()请求充足年夜的核态内存,将其作为图象数据缓冲空间,两个URB带回的图象数据在这里暂存;然后利用remap_page_range()函数将其逐页映照到用户空间中。户态的图象处置程序利用mmap()函数,间接读写核态图象缓冲内存,年夜年夜削减分外开支
</p>
看不懂man文档的人.在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有. |
|