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

USB摄像头以其良好的性能和低廉的价格得到广泛应用。同时因其灵活、方便的特性,易于集成到嵌入式系统中。但是如果使用现有的符合Video for Linux标准的驱动程序配合通用应用程序,难以充分利用USB带宽,帧速不高,不易满足实时监控等要求。本文首先介绍在Linux系统下USB摄像头驱动编制的一般方法,然后说明在此基础上如何提高帧速。

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

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

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驱动有异曲同工之处。当然,在驱动卸载函数中,应当将申请的各块内存全部释放。

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并将其发出,有限度地减轻系统负担。

3 使用双帧缓冲提高效率

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

linux摄像头内核驱动开发,Linux系统下USB摄像头驱动开发相关推荐

  1. linux系统下 USB 摄像头1080分辨率采集帧率低问题的解决方法

    linux系统上一般使用 video4linux2来操作系统摄像. 1.安装一个 v4l2-ctrl工具: sudo apt install v4l-utils 2.查看摄像头支持的视频参数 sudo ...

  2. linux usb摄像头图像分辨率,linux系统下 USB 摄像头1080分辨率采集帧率低问题的解决方法...

    linux系统上一般使用 video4linux2来操作系统摄像. 1.安装一个 v4l2-ctrl工具: sudo apt install v4l-utils 2.查看摄像头支持的视频参数 sudo ...

  3. linux图形图像驱动,Linux_Linux操作系统下USB图像采集驱动的安装,ARMlinux下USB摄像头图像的采集 - phpStudy...

    Linux操作系统下USB图像采集驱动的安装 ARMlinux下USB摄像头图像的采集很难,往往望而却步.相比较LINUX系统下的摄像头驱动的安装简单的多,下面就介绍我的安装过程. 我使用的linux ...

  4. OK6410开发板linux系统下的SPI驱动和测试

    OK6410下的SPI驱动是可以用的,但是飞凌把它作为其它用途了,我们修改一些代码才能在/dev目录下创建SPI的设备节点文件 Step1:打开arch/arm/mach_s3c64XX/mach_m ...

  5. linux系统下编写I2C驱动

    I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...

  6. Linux 系统下 NVIDIA 显卡驱动,GNOME 桌面环境不兼容

    NVIDIA 显卡驱动在 Windows 系统下的安装非常方便,大部分第三方软件都能直接自动检测型号,并从 NVIDIA 官网上下载驱动安装.但是在 Linux 操作系统下,NVIDIA 显卡的驱动需 ...

  7. 联想打印机 linux驱动怎么安装步骤,如何在MAC系统下安装打印机驱动

    故障现象: 如何在MAC系统下安装打印机驱动?解决方案: 一.LJ2208安装苹果驱动步骤: 1.运行lenovo Lj2208 install: 2.点击"继续": 3.软件许可 ...

  8. usrp运行完整linux,Ubuntu系统下USRP硬件驱动(UHD)的编译与安装

    在Ubuntu系统下USRP硬件驱动(UHD)安装最简单的方式就是直接从Ettus Research官方提供的PPA源安装,不过本文介绍的是如何从源代码进行编译与安装. 1.从PPA源安装只需要下面三 ...

  9. Linux(CentOS 7_x64位)系统下安装RDkit(修正)

    Linux(CentOS 7_x64位)系统下安装RDkit(修正) 一.RDKit简介 Linux(CentOS 7_x64位)系统下安装RDkit点击打开链接 前面写的一篇CentOS 7下安装R ...

  10. linux下usb转串口驱动分析

    linux下usb转串口驱动分析 分类: linux driver 2012-06-08 15:11 456人阅读 评论(0) 收藏 举报 linux struct interface returni ...

最新文章

  1. python前端开发招聘_web前端和python学哪个出来工资高?
  2. Java面试题基础知识(收集)
  3. Iris——整合go-playground/validator参数校验Demo
  4. elasticsearch 查询数据 | 分页查询
  5. SpringBoot+Vue博客系统---后端接口开发
  6. 批梯度下降 随机梯度下降_梯度下降及其变体快速指南
  7. python实现猴子排序(Monkey_sort)闲聊睡眠排序
  8. 学习单片机系列(一)单片机选型
  9. 超简单!一部手机就能提取视频中的语音转换成文字
  10. Multisim 13-电子线路实验
  11. 如何调用阿里云、百度云API接口
  12. ICPC训练联盟2021寒假冬令营(5)(部分题解):
  13. 编写一个python程序判断用户输入的8位银行卡_用Python编写的程序,提示用户输入一个由7位数字组成的帐号?...
  14. 在Java里面使用Pairs或者二元组
  15. Google map地图限制显示区域、拖拽范围
  16. android 给图片蒙上蒙层_Android 新手引导蒙层效果实现代码示例
  17. C++ 测量整型(int, short, long 和 long long ) 的长度
  18. code::blocks下载与安装
  19. Cookie的Secure属性
  20. 移动硬盘已连接USB我的电脑不显示的全网最细汇总多种解决方法(保姆级图文详细步骤)

热门文章

  1. 关于 pace 有意思的一篇文章
  2. 使用HTML编写浣溪沙,浣溪沙_巅峰Hacker_新浪博客
  3. 互联网日报 | 京东健康提交赴港上市招股书;荣耀联合美团推出“共享笔记本”服务;携程获第三方支付牌照...
  4. Linux makefile 教程 非常详细,且易懂
  5. FLASH连连看算法分析及源代码
  6. 导致ERP企业管理系统实施失败的四点原因
  7. Python爬虫+requests+伪装浏览器 爬取小说入门总结
  8. 基于单片机的打地鼠游戏仿真设计(#0040)
  9. 白菜萝卜的做法 - 凉拌菜
  10. springboot教务评教系统毕业设计源码252116