此处我只说用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 },
心得
在编译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
depmod:在busybox
这样如果有驱动不行,还可以修改编译后再试。