1. 程式人生 > >linux 下USB 攝像頭的使用說明

linux 下USB 攝像頭的使用說明

此處我只說用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選中再編譯。

這樣驅動要更新,直接替換了原來的驅動檔案就可以了,不需要每次都去編譯核心這麼麻煩。

相關推薦

linux USB 攝像頭的使用說明

此處我只說用uvc通用驅動 查詢攝像頭是否是UVC裝置,參見官網 1 找到CAMERA ID 2 lsusb -d VID:PID -v | grep “14 Video” 如果輸出有下面資訊說明支援 bFunctionClass

ARM9+LinuxUSB攝像頭影象採集

終於實現了在Micro2440+Linux2.6.29環境下通過NFS檔案系統實現USB攝像頭影象採集。在此,做一個總結,以備後續參考。  實驗條件:RedHat9.0(核心版本2.4.18),Micro2440開發板,Linux2.6.29(arm9),ANC

LinuxUSB轉串列埠驅動

Linux發行版自帶usb to serial驅動,以模組方式編譯驅動,在核心原始碼目錄下執行Make MenuConfig選擇Devces drivers-->USB seupport--> <M>USB Serial Converter support --> <M

linuxUSB轉串列埠的設定

在linux下利用簡訊modem傳送簡訊,由於簡訊modem使用的是USB串列埠轉換器(晶片為PL2303),把在配置和除錯的過程和方法在此記錄下,希望給有同樣需求的同仁提供一點幫助。 【一】、驅動相關說明:如果直接使用串列埠線,而沒有用到USB轉串列埠裝置,就不需要安裝驅

基於arm平臺linuxUSB音效卡驅動安裝和使用

核心配置 <*> Advanced Linux Sound Architecture —> usb音效卡安裝 1.apt-get install alsa-base 2

C語言高階應用---操作linuxV4L2攝像頭應用程式

#include "CameralOpt.h" int video_fd ; int length ; char *yuv[COUNT] ; struct v4l2_buffer enqueue , dequeue ; //定義出入隊的操作結構體成員 int Init_Cameral(int

linuxUSB轉串列埠識別1

minicom是linux下串列埠通訊的軟體,它的使用完全依靠鍵盤的操作,雖然沒有“超級終端”那麼易用,但是使用習慣之後讀者將會體會到它的高效與便利,下面將講解minicom的安裝和配置。 一、安裝minicom: 使用以下命令: # sudo apt-get instal

linux 和 windows 用ffmpeg 操作usb攝像頭

windows : 列裝置  ffmpeg -list_devices true -f dshow -i dummy 編碼為H.264,儲存為本地檔案  ffmpeg -f&nb

Linux環境使用V4L2+opencv以MJPEG格式讀取USB攝像頭並實時顯示

轉眼間,V4L2已經搞了很長時間,從最開始的一竅不通,到後來的漸漸熟悉,從最開始照貓畫虎的使用YUYV格式之間轉換,到後來使用MJPEG格式讀取,中間頗有周折。趁任務完成間隙,來簡單總結下V4L2的使用。(文章只主要寫了過程,完整程式已經附在最後) 有讀者要問,open

linux通過V4L2驅動USB攝像頭

目錄 前言 在移植羅技C270攝像頭到6818的過程中,核心已經檢測到了USB攝像頭,但是直接用OpenCV的API(比如CvCapture*cvCaptureFromCAM(int index)介面,無法開啟USB攝像頭,至少目前我是這麼認為的。

華為WiFi Pro E5771h-937在linux使用usb連接

華為wifi pro e5771h-937 linux centos usb網卡 芯片 模塊買了一個WiFi Pro E5771h-937無線路由,一直想在linux下使用,官方文檔也沒有linux下的說明,自己查找資料研究了一下,並測試成功。在centos7下,直接運行如下modprobe rndis_h

如何檢視LINUX的一個USB裝置使用的驅動模組

http://unix.stackexchange.com/questions/60078/find-out-which-modules-are-associated-with-a-usb-device Finding the Kernel Driver(s) Th

31全志r58平臺Android4.4.2開啟USB攝像頭

  31全志r58平臺Android4.4.2下開啟USB攝像頭   2018/10/26 16:00 版本:V1.0     開發板:SC5806     1、系統編譯:(略)      

LinuxUSB無線網絡卡實現AP模式(hostapd交叉編譯環境

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux,檢視USB裝置資訊

Linux下,檢視USB裝置資訊   首先需要將usbfs掛載一下,然後才能檢視。$ mount -t usbfs none /proc/bus/usb $ cat  /proc/bus/usb/devices 或者在檔案(/etc/fstab)中新增如下這句:

Linux格式化恢復USB啟動盤

問題描述:優盤製作成啟動盤安裝作業系統,但是後邊使用時發現無法格式化,提示 This partition cannot be modified because it contains a partition table;>please reinitialize layout of the whol

ROS利用Python和OpenCVC分別實現筆記本攝像頭/USB攝像頭/監控IP攝像頭資料的獲取

說明: 最近的一個小任務,記錄一下,希望對以後有幫助吧: -———————————————————————————————————————————————— 參考帖子 一、先利用python實現筆記本攝像頭/USB攝像頭的資料的獲取: 程式碼如下: i

關於linux呼叫多個usb攝像頭時無法工作的問題

問題 在做雙目時遇到一個問題:插一個USB攝像頭可以正常讀取資料,插兩個就會有一個沒資料,另一個攝像頭的幀率也會嚴重影響.排除硬體故障和程式碼問題後,最大的可能性是usb控制器頻寬被佔滿導致讀取資料時出錯. 解決方案 輸入lsusb檢視電腦有幾個usb控

Win7安裝OK6410的USB驅動以及Linux原始碼安裝dnw

因為飛凌的OK6410 的USB驅動在Win7下不能用,因此分享我的USB驅動的安裝過程。 一:Win7下的Ok6410 的USB下載線驅動安裝。 (參考文章:http://blog.sina.com.cn/s/blog_7f55cd3d01019sfq

linux向來坑死人的多USB裝置名(多串列埠)

有多少坑人就不多說了,讓我這個window下的程式設計師受盡折磨。 解決方法就2步,參考下面2個文章。 1、獲得裝置描述,很多文章都寫關於udev的都不寫如何獲得相關描述符,不知道怎麼想的。 http://lnmcc.net/2014/03/14/%E4%BD%BF%E7%