1. 程式人生 > >Linux USB 攝像頭驅動

Linux USB 攝像頭驅動



在 cortex-a8 中,可接入攝像頭的介面通常可以分為兩種, CAMERA 介面和 USB 介面的攝像頭。這一章主要是介紹 USB 攝像頭的裝置驅動程式。在我們印象中,驅動程式都是一個蘿蔔一個坑,拿到一個硬體就需要去安裝它相對應的驅動程式。有時候稍有不對還會導致電腦崩潰,是不是讓人很鬱悶?這一章我們講 USB 攝像頭裝置驅動,那麼是不是支援所有的 USB 攝像頭驅動呢?帶著這個疑問開始我們這一章的攝像頭學習之旅吧。

14. 1 確定 USB 攝像頭支援 UVC (在 PC 上) 

WEBEE 在某寶上搜索 USB 攝像頭,發現了攝像頭形狀千奇百怪,那到底哪一種適合這一章我們學習呢?攝像頭的市場並不僅僅只是針對我們這些程式猿,很多引數並不會在介紹頁面上寫出來,你去實體店上買,那些賣家很可能也不知道。所以在購買 USB 攝像頭要認準這些引數哦,不然,按照這一章的教材,很可能答不到效果哦,那麼可能就需要自己對我們的應用層的測試程式碼進行修改哦。

那什麼 USB 攝像頭適合我們這一章的教程呢,這裡有幾個關鍵字: 1.支援
UVC(免驅), 2.YUV 或者 MJPEG 格式輸出。

在寫這一章教程的時候, WEBEE 手頭剛好有一個 USB 攝像頭,想當年還是買電腦的時候送的,不知道現在能不能用上。那拿到攝像頭,我們需要怎麼做呢?

14.1.1 把攝像頭插入 PC 機的 USB 介面,檢視 ID


注:如果你是在 Ubuntu 等 linux作業系統下請看 1~2,在 windows 下請直接看看 3 。1. 在 linux 類作業系統下插入 USB 攝像頭,用 dmesg 列印資訊


#dmesg
[ 8705.813109] uvcvideo: Found UVC 1.00 device USB2.0 UVC PC
Camera (174f:5931)
[ 8705.867695] uvcvideo: UVC non compliance - GET_DEF(PROBE) not
supported. Enabling workaround.
[ 8705.886554] uvcvideo: Found UVC 1.00 device USB2.0 Camera
(1e4e:0102)
[ 8705.888801] uvcvideo: UVC non compliance - GET_DEF(PROBE) not
supported. Enabling workaround.
[8705.889829] input: USB2.0 Camera as
/devices/pci0000:00/0000:00:1a.7/usb1/1 -1/1 -1:1.0/input/input12
[ 8705.890440] usbcore: registered new interface driver uvcvideo
[ 8705.890446] USB Video Class driver (1.1.1)
[ 8827.856129] pool[5982]: segfault at 0 ip (null) sp afabc0ec error 14 in
gnome-screenshot[8048000+12000]

第一個 UVC 1.00 device USB2.0 UVC PC Camera 是筆記本自帶的攝像頭它的 VID:PID 是 174f:5931 ;第二個 UVC 1.00 device USB2.0 Camera 也就是我們插入的 USB 攝像頭他的 VID:PID 是 1e4e:0102。這裡的 ID 號可以在下一步 UVC 官方的文件中進一步確定是否被支援。

2. 用 ls /dev/video* 檢視裝置節點


這裡的 video0 是筆記本自帶的攝像頭的裝置節點, video1 才是我們剛接入的 USB 攝像頭。

3. 在 windows 作業系統下插入 USB 攝像頭插入,開啟裝置管理器


第一個 USB2.0 Camera 是我們接入的 USB 攝像頭,第二個 USB2.0 UVCPC Camera 是筆記本自帶的攝像頭。

右鍵屬性 -> 詳細資訊 > 屬性 選擇硬體 ID 檢視

可以得到插入的 USB 攝像頭 VID:PID 為 1e4e: 0102 。 這裡的 ID 號可以在下一步 UVC 官方的文件中進一步確定是否被支援。

14. 1.2 確定 USB 攝像頭種類

通過這個文件《攝像頭驅動VID+PID 大全》 來確定晶片型別,這個檔案在附帶的資料夾下;通過這個網頁 http://www.ideasonboard.org/uvc/ 來檢視是否支援 UVC,這個網站是 USB Video Class Linux device driver 的主頁,裡面有 UVC 的詳細的介紹。根據前面的列印資訊,根據自己的 ID 號, WEBEE 這裡是搜尋 USB 攝像頭的 VID 號: 1e4e 和 PID 號: 0102

通過攝像頭的 ID,可以看到該攝像頭是否支援 UVC 和其他資訊。綠勾代表支援。



14.1.3 安裝並使用 xawtv 測試 (Ubuntu 下)

1. 安裝 xawtv 測試軟體
#sudo apt-get install xawtv

2. 執行 xawtv 後面帶 usb 攝像頭的裝置節點
#xawtv /dev/videoX



得到影象, PC 端測試結束。

14. 2 移植到 WEBEE210 開發板

確定 USB 攝像頭在 PC 上可以用之後,就需要讓它在我們的開發板也能用上這個攝像頭。但是接入我們之前板子上的 USB 介面,發現核心卻沒顯示 PC機上列印的資訊。

這是因為 UVC 是 Microsoft 與另外幾家裝置廠商聯合推出的為 USB 視訊捕獲裝置定義的協議標準,目前已成為 USB org 標準之一。如今的主流作業系統(如Windows XP SP2 and later, Linux 2.4.6 and later, MacOS 10.5 and later)都已提供 UVC 裝置驅動,因此符合 UVC 規格的硬體裝置在不需要安裝任何的驅動程式下即可在主機中正常使用,這也是上面說的免驅的意思。使用 UVC 技術的包括攝像頭、數碼相機、類比影像轉換器、電視棒及靜態影像相機等裝置。

但是之前在我們板子上的核心並沒有把這個驅動包含進來,所以現在為了能在板子上執行,有兩種方法, 1.重新配置核心,把 UVC 編進核心,並測試是否可以用 2.自己從零寫這個驅動。

因為這個 usb 攝像頭涉及到了很多東西,從零寫起來比較複雜,字裡行間很難讓大家理解,所以這裡先用第一種方法實現,在後面的章節會分析核心的這個驅動,你也可以明白這個驅動的來龍去脈,再加上你自己的程式碼閱讀和悟性,相信你可以搞懂的。 -.-

注:如果你買的是 webee 配套的攝像頭直接跳到 14.3 

0. 好了,開啟我們的核心目錄

注:這裡的核心是基於移植好 OHCI 主控制器的核心,用之前的核心配置好也是不能用的,因為 usb 主控制器是會被用到的。 請務必先看第 10 章並移植好核心,該實驗需要此基礎上開發。(或者可以在資料夾下用我們配置好 ohci 的核心)


#make menuconfig

1. 進入 USB support
Device Drivers --->
   [*] USB support --->

如圖配置:



2. 選中 Multimedia support


Device Drivers --->
      <*> Multimedia support --->

如圖配置:


3. 再進入 Media USB Adapters
Device Drivers --->
    <*> Multimedia support --->
         <*>Media USB Adapters --->


如圖配置


注:如果你不想編譯成模組,可以把 UVC 這一項改為*,之後就不用 insmod 了

4. 進入 V4L platform devices


Device Drivers --->

    <*> Multimedia support --->

           <*>V4L platform devices --->

如圖配置



5. 編譯核心


#make uImage

6. 編譯模組並拷貝下面三個 ko 檔案到檔案系統下


#make modules
# cp ./drivers/media/v4l2-core/videobuf2-memops.ko /nfs/ko
# cp ./drivers/media/v4l2-core/videobuf2-vmalloc.ko /nfs/ko
#cp ./drivers/media/usb/uvc/uvcvideo.ko /nfs/ko

把生成的./arch/arm/boot/uImage 燒進開發板,重新啟動,進行下一步。

14.3 官方淘寶店上攝像頭的配置

如果你手頭上和 Webee 一樣有不知型號的攝像頭,你可以按 14.2 節去試一下能不能用。但是如果你沒有的話,強烈建議在我們官方的淘寶店購買 USB 攝像頭, 也就是上面這一張圖片, 之後按照這一節的教程,你是可以很順利的完成這一章的實驗。因為 Webee 已經用這個攝像頭實驗過了。而且這個攝像頭還可以用在接下來第八部分的綜合實驗上哦。

這一節和上一節( 14.2)差不多, 只是在核心配置中添加了適配這款攝像頭的配置而已。 如果你買的不是 webee 的攝像頭, 配置完 14.2 後可以跳過這一節 

0. 開啟我們的核心目錄
注:這裡的核心也是基於移植好 OHCI 主控制器的核心,用之前的核心配置好也是不能用的,因為 usb 主控制器是會被用到的。 請務必先看第 10 章並移植好核心,該實驗需要此基礎上開發。(或者可以在資料夾下用我們配置好 ohci 的核心)


#make menuconfig

1. 進入 USB support

Device Drivers --->
    [*] USB support --->

如圖配置:


2. 選中 Multimedia support

Device Drivers --->
      <*> Multimedia support --->

如圖配置:


3. 再進入 Media USB Adapters


Device Drivers --->
     <*> Multimedia support --->
           <*>Media USB Adapters --->

如圖配置

注:如果你不想編譯成模組,可以把 UVC 這一項改為*,之後就不用 insmod 了


4. 進入 GSPCA base webcams


Device Drivers --->
   <*> Multimedia support --->
        <*>Media USB Adapters --->
            <*>GSPCA base webcams

如圖配置


5. 進入 V4L platform devices


 Device Drivers --->
      <*> Multimedia support --->
            <*>V4L platform devices --->

如圖配置

6. 編譯核心


#make uImage

7. 編譯模組並拷貝下面三個 ko 檔案到檔案系統下


#make modules
# cp ./drivers/media/v4l2-core/videobuf2-memops.ko /nfs/ko
# cp ./drivers/media/v4l2-core/videobuf2-vmalloc.ko /nfs/ko
#cp ./drivers/media/usb/uvc/uvcvideo.ko /nfs/ko

把生成的./arch/arm/boot/uImage 燒進開發板,重新啟動,進行下一步。

14. 4 在 WEBEE210 的 LCD 上顯示 USB 攝像頭影象

1. 重啟開發板,載入模組。


#cd ./ko
#insmod videobuf2-memops.ko
#insmod videobuf2-vmalloc.ko

#insmod uvcvideo.ko

出現如下資訊


2.插入 USB 攝像頭到 webee210 板子上,出現如下資訊


ls /dev/video* ,如圖出現 video0


3. 執行 qt 測試程式這資料夾下有兩個 qt 程式: qt_camera_yuv_ts 和 qt_camera_mjpeg_ts。先拷貝生成的 qt_camera_mjpeg_ts 檔案到 QT 檔案系統下,再執行。


# ./ qt_camera_mjpeg_ts -qws