Linux系统下USB摄像头驱动开发

发布者:JoyfulJourney最新更新时间:2016-07-25 来源: 21ic关键字:Linux系统  USB  摄像头驱动 手机看文章 扫描二维码
随时随地手机看文章
USB摄像头以其良好的性能和低廉的价格得到广泛应用。同时因其灵活、方便的特性,易于集成到嵌入式系统中。但是如果使用现有的符合Video for Linux标准的驱动程序配合通用应用程序,难以充分利用USB带宽,帧速不高,不易满足实时监控等要求。本文首先介绍在Linux系统下USB摄像头驱动编制的一般方法,然后说明在此基础上如何提高帧速。

1 Linux系统中的USB摄像头驱动程序

USB设备驱动程序完全符合通用设备驱动的准则,不同的是内核提供了一些特别的API函数,方便驱动注册、销毁自己,例如usb_reSister()和usb_dereSister();2.4版的内核还提供了对于hotplug的支持。

1.1 USB摄像头驱动的一般编写方法

摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。

因此,USB摄像头的驱动应当与内核提供的视频驱动挂钩。即首先在驱动中声明一个video_device结构,并为其指定文件操作函数指针数组.fops,向系统注册。在应用程序发出文件操作的相关命令时,核心根据这些指针调用相应函数,并将该结构作为参数传递给它们。这样,就完成了驱动和核心之间的通信。例如:

static struct video_device vdev_template={……};

//声明video_device,指出挂接驱动

static struct file_operations ov511_fops={……};

//声明本驱动的文件操作函数指针

struct video_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交替使用,大大减少了额外时间。工作流程如图1所示。

这个过程是在URB的完成例程中实现的,有两点需要注意:首先处理再次初始化的代码时间不能长,否则会造成完成例程的重人,如果确实来不及,可以在完成例程中设定标志,例如“数据采集好”旗语,由应用程序使用阻塞ioctl()来查询该旗语并做处理;其次由于CPU可能会在完成例程中停留较长时间,系统负担较大,可以在.open函数中初始化两个URB并将其发出,有限度地减轻系统负担。

1.3 使用双帧缓冲提高效率

Linux系统中,文件操作通常是由read、write等系统调用来完成。这些系统调用在驱动中的解决方法就是用copy_to_user()、copy_from_user()等函数在核态、户态内存空间中互相拷贝。但是对于大批量的图像数据,采用拷贝的方法显然会增加时间开销,因此用内存映射的方法解决。首先使用vmalloc()申请足够大的核态内存,将其作为图像数据缓冲空间,两个URB带回的图像数据在这里暂存;然后使用remap_page_range()函数将其逐页映射到用户空间中。户态的图像处理程序使用mmap()函数,直接读写核态图像缓冲内存,大大减少额外开销。

图2

    图像数据的处理可能要花费比较长的时间,不同的算法对于数据保留时间的要求也不一样。因此可以申请两帧图像缓冲,在处理一帧图像的同时,将两个URB带回的数据全部填充到另一帧缓冲中,这样可以免去时间冲突上的麻烦。

值得注意的是:这种方法要求时刻持有当前帧的序号、每一帧的起始地址等信息,不能将两帧图像混淆。这些信息可以保存在保留内存中,当前帧的数据整理、序号改变在URB完成例程中实现。

2 V4L标准的改进

V4L标准目前已经发展到第二版V4L2,其基本思路与V4L相同。

2.1 标准分析

根据V4L标准,户态程序在需要一帧图像时,CPU的走向如图2。CPU按照123456的顺序完成一个循环。在这里,有一个细节被忽略:在完成例程中,也就是图2中步骤6,该URB被立刻发出,但是由于这时用户程序正在阻塞等待,没办法再次提出获得图像的申请,因此在判断有无新请求时,判断的结果必然是当前无请求,导致下一个URB带回的数据被驱动丢弃;由于核态、户态的切换需要一定的时间,加上户态多进程同步等开销,等到应用程序能够再次发出获得一副图像的申请时,已经有不止一个URB带回的数据被丢弃掉,这些URB包含的数据正好是新一帧图像的开始部分。因此驱动必须等到再下一帧图像才能保存数据、缓冲。这样凭白损失了一帧图像,帧速最少下降一半。

2.2 改进思路:不间断采集

为了解决这个问题,可以改进V4L标准作,使其增加新的功能:通过新的参数,让ioetl()函数通知驱动不间断采集、缓冲图像数据,轮流保存在两帧缓冲区中,并在一帧图像采集好后,设定“图像采集好”旗语。户态程序只需要发出一次“获得图像”请求,就可以通过阻塞等待该旗语,不断获得图像。在采集结束后,再次通过新的参数,让驱动停止缓冲即可。CPU工作流程图如图3。

图3

    注意到图2、图3,两种“判断有无新请求”的不同,即可发现新方法假定一直有请求,因此不丢弃每个URB带回的数据,轮流保存在两个帧缓冲内。

V4L已经作为约定俗成的标准被内核支持,因此如果使用全新的参数,工作量将相当巨大,并且不能和现有的应用程序兼容。考虑到现有的图像采集应用程序使用VIDIOCMCAPTURE作为参数,并提供帧序号,要求驱动将图像保存到指定序号的帧缓冲内。由于驱动通常仅仅提供几帧缓冲,因此该序号不会大于某个数字,如10。因此可以继续使用VIDIOCMCAPTURE参数,搭配较大的序号来表示新增的功能,例如用10000和10001来分别表示开始和停止缓冲图像数据的要求。驱动在收到VIDIOCMCAPTURE要求后,检查这个序号。如果小于10000,则按照正常的方法处理,否则按照改进方法。这种思路可以有效解决兼容性问题。

2.3 实验结果

在赛扬366、USBl.1接口的计算机平台上,采用上述不间断采集改进V4L标准,配合双URB、双帧缓冲等方法后,帧速提高两倍有余,有效数据传输速度达960KB/s,接近等时传输方式下USB总线的带宽极限。

关键字:Linux系统  USB  摄像头驱动 引用地址:Linux系统下USB摄像头驱动开发

上一篇:USB便携式多道γ能谱仪的设计与实现
下一篇:微功耗RS485中继器的研制

推荐阅读最新更新时间:2024-05-03 00:32

天惠微代理DSP方案山景可烧录AP8224C2芯片适用USB声卡降噪麦克风
AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品,适用于传统音响系统、新兴的蓝牙或Wifi无线音频产品、Sound Bar和调音台等市场。该处理器在总体架构和系统组成上,充分考虑了音频领域的特点,支持MP3、WMA、WAV、FLAC、APE、AAC等多种解码格式和MP3编码。同时,提供回声消除(AEC)、魔术低音(VB)、3D环绕和Parametric EQ等丰富的声学和音效处理功能。并可以灵活选用不同容量的程序Flash芯片,以达到整个系统设计的超高性价比。 内核和存储 ·高性能 32 位 RISC 内核,最高频率 240MHz, 支持 DSP 指令,集成 FPU
[嵌入式]
天惠微代理DSP方案山景可烧录AP8224C2芯片适用<font color='red'>USB</font>声卡降噪麦克风
USB数据通信接□模块的程序设计
    本文主要介绍PDIUSBD12的固件编程问题。   USB通信固件设计的目标为使PDIUSBD12在USB上达到最大的传输速率。   1.总体规划   CPU忙于处理许多设备控制和数据处理等任务。通信固件设计成完全的中断驱动方式,当CPU处理前台任务 时,USB的传输可在后台进行,这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。   后台中断服务程序和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现,例如,PDIUSBD12 的批量输出端点可使用循环的数据缓冲区,当DIUSBD12从USB收到一个数据包时,就对CPU产生一个中断请求 ,CPU立即响应中断。   在中断服务程序中固件
[嵌入式]
USB Type-C芯片大举来犯,市场表示:架构好乱
包括Cypress、德州仪器(TI)、恩智浦半导体(NXP )、莱迪思半导体(Lattice)、Analogix与Pericom等多家晶片供应商今夏都在忙着推出USB Type-C晶片。而随着产品加速推出,USB Type-C晶片的稀缺时代很快即将成为过去。   有些供应商就选择在日前于美国旧金山举行的英特尔开发者论坛(IDF)上发布产品。     很明显地,对于系统供应商来说,USB Type-C搭载的许多新功能将会带来诸多亮点,但是对于消费者来说呢?分析师认为,现在看起来还有些过早,而且还可能会为消费者带来潜在的困惑。 Type-C应用在哪里? IHS Technology资深首席分析师Brian O'
[嵌入式]
以C8051F340单片机为核心的USB数据采集系统设计
1引言 电子设备运行状态的稳定性直接影响到现代企业的生产, 设备发生故障后高昂的维修费以及设备停机后给企业生产带来的损失, 使得各个企业纷纷采取措施, 降低设备的故障率。通过数据采集系统准确的获取设备运行特征数据, 并对数据进行分析,判断设备的运行状态是否良好, 达到提前预防故障出现、减少停机检修的目的。实际应用中对数据采集系统的可靠性, 准确性和便携性要求很高。目前常用的数据传输网络(如RS232 /RS485, CAN 等)已经不能满足大量采集数据和高速实时数据传输的要求。而USB传输具有高速可靠传输的优势, 具有成本低、可靠性高、维护方便等优点。本文以带有片上USB 和高速AD转换器的C8051F340为核心控制器件, 利用
[单片机]
以C8051F340单片机为核心的<font color='red'>USB</font>数据采集系统设计
采用MAXQ2000 USB “拇指”评估套件进行设计
采用MAXQ2000 USB “拇指”评估套件进行设计 本应用笔记介绍使用USB “拇指”评估(EV)套件快速开发MAXQ2000 RISC微控制器所需要的步骤。文档解释了怎样安装和配置评估套件的硬件和软件,怎样开发并装入板上MAXQ2000微控制器能够执行的应用程序。本文提供了一个例程,用于读取和显示环境温度。 引言 MAXQ2000 USB Thumb评估套件是评估MAXQ2000 RISC微控制器方便可靠的平台。评估(EV)套件电路板采用了具有USB接口的“拇指”外形封装( 图1 )。通过计算机上安装的MAX-IDE汇编语言集成开发环境,可以在该评估套件电路板上开发并调试应用程序。套件中包含的USB闪存驱动盘提供MA
[模拟电子]
采用MAXQ2000 <font color='red'>USB</font> “拇指”评估套件进行设计
USB技术在可穿戴计算机中的应用
1 引言 在网络计算机已经开始逐步取代了个人计算机的二十世纪末期,新一代的可穿戴计算机(Wearable Computers)又悄然来到我们周围。可穿戴计算概念的提出为人与计算机的有机结合开创了一条新途径,是实现更加友好的人机交互的新技术之一。尽管可穿戴计算机的体积很小,但却具备了PC机的所有功能,例如语音输入与输出功能、视频输出功能、图像采集功能和无线通讯功能等等。这些功能不但需要各种不同的外围设备,而且要求外设接口的数据传输速度也要快,这无疑加重了外设接口设计的困难,也成为了可穿戴计算机设计中的瓶颈和关键技术之一。通用串行总线USB(Universal Serial Bus)是应用在PC领域的新型接口技术,是Intel、Comp
[嵌入式]
瑞萨电子宣布推出新型USB Power Delivery控制器
USB接口的最大供电量可达到100W,适用于工业、家用电器和OA/ICT应用。 瑞萨电子USB PD控制器µPD720250 2014年6月2日,日本东京讯—全球领先的半导体及解决方案供应商瑞萨电子株式会社(TSE:6723)(以下简称“瑞萨”),于今日宣布推出基于USB PD规范的通用串行总线(USB) Power Delivery (PD)控制器(零件号µPD720250),该控制器通过USB PD有线供电时的最大供电能力可达到100W(20 V电压下5 A)。瑞萨将于2014年6月3日至6月7日在台北国际电脑展N0608号展台上展出其新推出的USB PD控制器,展览地点位于台北南港展览馆4楼。 结合新
[嵌入式]
瑞萨电子宣布推出新型<font color='red'>USB</font> Power Delivery控制器
郭明錤:AirPods等苹果配件产品也将转用USB-C
本周早些时候,知名分析师郭明錤声称,苹果计划在2023年发布至少一款带有USB-C接口的iPhone 15机型。 现在,在一条后续的推文中,他声称AirPods、MagSafe外接电池和秒控键盘/鼠标/板等配件也将在“可预见的未来”改用USB-C。 iPhone和上述所有配件目前都依赖苹果专有的Lightning接口进行充电和数据传输。改用USB-C将带来更通用的连接标准,并让监管机构满意,因为许多科技产品都使用USB-C,包括许多Android智能手机,还有最新的MacBook Pro、MacBook Air、iPad Pro、iPad Air和iPad mini型号。 郭还表示,由于目前无线技术的局限性,以及苹果M
[手机便携]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved