关闭

linux 下USB 摄像头的使用说明

2334人阅读 评论(0) 收藏 举报
分类:

此处我只说用uvc通用驱动

查询摄像头是否是UVC设备,参见官网

  • 1 找到CAMERA ID
  • 2 lsusb -d VID:PID -v | grep “14 Video”
    如果输出有下面信息说明支持

    bFunctionClass 14 Video
    bInterfaceClass 14 Video
    bInterfaceClass 14 Video
    bInterfaceClass 14 Video

    lsusb -d VID:PID -v 可以列出了一个usb设备的有所信息,接口,更详细的树形图lsusb -t

UVC驱动代码详解

详情请看此系列博文

我要说的一点就是该驱动的可能限制,在写应用程序时就要注意到。
uvc_driver.c里头一段话就说了驱动的限制:

This driver aims to support video input and ouput devices compliant with the ‘USB Video Class’ specification.
The driver doesn’t support the deprecated v4l1 interface. It implements the mmap capture method only, and doesn’t do any image format conversion in software. If your user-space application doesn’t support YUYV or MJPEG, fix it :-). Please note that the MJPEG data have been stripped from their Huffman tables (DHT marker), you will need to add it back if your JPEG codec can’t handle MJPEG data.

从中看出以下几点:

  • 1 只支持mmap方式 ,不支持read,usrptr什么的。所以v4l2里说的用户获取摄像头数据的方式有三种在这个驱动里那是没有的,到底支不支持你要看看你自己的内核里面的驱动说明了。
  • 2 不再支持v4l1接口
  • 3 不做任何图像格式转换,只输出YUYV或MJPEG(?)
  • 4 MJPEG 格式的data没有Huffman tables,所以如果要做格式转换需要自己加入Huffman tables才行。

明明是UVC摄像头,但不是不支持怎么办?

更新驱动文件吧,下载下来的内核里的uvc驱动并不是最新的,现在摄像头更新的快且多,肯定是跟不上的,因此需要自己修改,一般在 static struct usb_device_id uvc_ids[]这个结构里增加你的摄像头型号就好了:
比如我的摄像头是0ac8:3420,就不支持,那么在drivers/media/video/uvc/uvc_driver.c的uvd_ids中增加如下就行。

     { .match_flags      = USB_DEVICE_ID_MATCH_DEVICE
                 | USB_DEVICE_ID_MATCH_INT_INFO,
       .idVendor     = 0x0ac8,
       .idProduct        = 0x3420,
       .bInterfaceClass  = USB_CLASS_VIDEO,
       .bInterfaceSubClass   = 1,
       .bInterfaceProtocol   = 0,
       .driver_info      = UVC_QUIRK_FIX_BANDWIDTH },

譔结构如下

struct usb_device_id {
    /* which fields to match against? */
    __u16       match_flags;

    /* Used for product specific matches; range is inclusive */
    __u16       idVendor;
    __u16       idProduct;
    __u16       bcdDevice_lo;
    __u16       bcdDevice_hi;

    /* Used for device class matches */
    __u8        bDeviceClass;
    __u8        bDeviceSubClass;
    __u8        bDeviceProtocol;

    /* Used for interface class matches */
    __u8        bInterfaceClass;
    __u8        bInterfaceSubClass;
    __u8        bInterfaceProtocol;

    /* Used for vendor-specific interface matches */
    __u8        bInterfaceNumber;

    /* not matched against */
    kernel_ulong_t  driver_info
        __attribute__((aligned(sizeof(kernel_ulong_t))));
};
/* Some useful macros to use to create struct usb_device_id */
#define USB_DEVICE_ID_MATCH_VENDOR      0x0001
#define USB_DEVICE_ID_MATCH_PRODUCT     0x0002
#define USB_DEVICE_ID_MATCH_DEV_LO      0x0004
#define USB_DEVICE_ID_MATCH_DEV_HI      0x0008
#define USB_DEVICE_ID_MATCH_DEV_CLASS       0x0010
#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS    0x0020
#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL    0x0040
#define USB_DEVICE_ID_MATCH_INT_CLASS       0x0080
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS    0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL    0x0200
#define USB_DEVICE_ID_MATCH_INT_NUMBER      0x0400

match_flags用上面的宏赋值,是个位或值,可用”|”赋多值,
driver_info的值可参考What are quirks and how do I use them?

心得

在编译uvc驱动的内核时,最好将它们以模块的方式编译内核,并勾选上自动加载(Automatic kernel module loading),新版内核如果选择了加载模块就默认了似乎,因为我也没找到这选项。一插上摄像头,uvc相关模块就自动加载了。如下:

# lsmod
Module                  Size  Used by    Not tainted
uvcvideo               64611  0 
videobuf2_core         21211  1 uvcvideo
videodev               85103  2 uvcvideo,videobuf2_core
videobuf2_vmalloc       2119  1 uvcvideo
videobuf2_memops        1550  1 videobuf2_vmalloc
leds_s3c24xx            1193  0 
led_class               2321  1 leds_s3c24xx
evbug                   1594  0 
# 

要想能自动加载,需要了解下linux中加载模块有关的几个命令
depmod, modprobe, lsmod,insmod

  • 首先安装模块到文件系统中:

    make modules_install INSTALL_MOD_PATH=/path/to/rootfs

    这样会将编译出来的模块安装到/path/to/rootfs/lib/kernel-version/modules下

  • 在开发板上运行depmod。
    depmod没有这个命令工具则在busybox中的Linux Module Utilities选中再编译。

这样驱动要更新,直接替换了原来的驱动文件就可以了,不需要每次都去编译内核这么麻烦。

0
0
查看评论

Linux 下摄像头视频采集与显示

说明: 1、本文所提及的摄像头不是zc0301p,使用的API不是V4L,显示所使用的上位机不是QT,特此说明。 2、UVC只是一个驱动,如果它能成功驱动摄像头,会在/dev目录下出现video(或video0、video1等等)。这样,就可以使用Linux提供(准确说不是Linux提供,具体的...
  • leo115
  • leo115
  • 2012-03-09 15:09
  • 26774

Linux 获取摄像头数据并实时显示

联想笔记本z475,Ubuntu16; 使用v4l2获取摄像头数据; 使用SDL来显示YUV数据; #include #include #include #include #include #include #include #include #include //#include//if SDL2...
  • junjun5156
  • junjun5156
  • 2016-09-04 02:46
  • 2742

摄像头(WebCam)在Linux操作系统中的驱动方法

作者:北南南北来自:LinuxSir.Org摘要:本文主要内容是摄像头(WebCam)在Linux操作系统中的驱动方法;本文是以源码码编译的方法来安装驱动程序的;虽然能把摄像驱动起来,但缺少好的视频聊天程序。看来只能一步一步的来了。希望就在眼前; 本文正在修正中.....请指点,谢谢~~目录1、摄像...
  • force_eagle
  • force_eagle
  • 2007-11-02 08:24
  • 5376

Linux下成功安装摄像头 :-)

    一直 酝酿了很久,资料软件也找得差不多了,动手开始做事情拉.    首先要下载的是摄像头驱动程序,推荐使用spca5xx webcam drivers,可以到网站FreeWorld libland http://mxhaard.fr...
  • neohuo
  • neohuo
  • 2006-02-16 21:06
  • 3169

基于Linux的摄像头采集v4l2

集体的源码如下:#include #include #include #include #include #include #include #include #include #include #include #include ...
  • u011046042
  • u011046042
  • 2016-05-22 11:09
  • 4048

linux应用项目(二)摄像头(2)从零写一个V4L2虚拟摄像头驱动之详细分析

一、框架搭建 内核在V4l2-dev.c (linux-3.4.2\drivers\media\video) 中提供了V4L2的核心函数。我们再来看一下整体框架: 我们要做的是写个硬件相关驱动,其中用到了核心层V4l2-dev提供的API函数。比如内核 中的vivi.c,是一个虚拟视频驱动+虚...
  • fengyuwuzu0519
  • fengyuwuzu0519
  • 2017-06-22 20:45
  • 2459

LINUX下采集V4L2摄像头数据源码

  • 2016-11-06 20:30
  • 1.93MB
  • 下载

和菜鸟一起学linux之V4L2摄像头应用流程

对于v4l2,上次是在调试收音机驱动的时候用过,其他也就只是用i2c配置一些寄存器就可以了。那时只是粗粗的了解了,把收音机当作v4l2的设备后会在/dev目录下生成一个radio的节点。然后就可以操作了。后来就没怎么接触了。这周,需要调试下usb的摄像头。因为有问题,所以就要跟进,于是也就要开始学习...
  • eastmoon502136
  • eastmoon502136
  • 2012-11-16 11:52
  • 44753

在嵌入式Linux系统中使用摄像头

简介 本文主要基于ARM嵌入式模块系统展示在嵌入式Linux中使用摄像头示例,所采用的模块为Toradex VF61,是一款性价比极高但不包含硬件视频编解码加速的模块,核心处理器为NXP/Freescale Vybrid,Cortex-A5和M4异构双核架构。 1). 目前越来越多的嵌入式系...
  • toradexsh
  • toradexsh
  • 2016-02-20 00:12
  • 4633

linux USB 摄像头 驱动 移植,使用

USB摄像头驱动的移植 原文地址: http://blog.csdn.net/woshidahuaidan2011/article/details/52055057 1、USB摄像头的配置 UVC,全称为:USB video class 或USB video device...
  • qq160816
  • qq160816
  • 2016-08-16 12:09
  • 1872
    个人资料
    • 访问:122702次
    • 积分:2049
    • 等级:
    • 排名:千里之外
    • 原创:85篇
    • 转载:5篇
    • 译文:0篇
    • 评论:20条
    文章分类
    最新评论