亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2176 | 回復(fù): 0
打印 上一主題 下一主題

使gspca支持自己的USB攝像頭(轉(zhuǎn)) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-10-19 18:54 |只看該作者 |倒序?yàn)g覽
0 前言
    在Linux下驅(qū)動(dòng)USB攝像頭一直不是容易的事情,盡管其內(nèi)核中就集成了對(duì)0V511系列攝像頭的支持,開(kāi)源驅(qū)動(dòng)spca5xx/gspca也提供了對(duì)大部分主流攝像頭的支持,但還是無(wú)法涵蓋所有品牌的各種型號(hào)的攝像頭,尤其是對(duì)于國(guó)內(nèi)的中低端用戶(hù),很難找到直接可用的Linux下的驅(qū)動(dòng)。
    本文簡(jiǎn)單介紹了gspca驅(qū)動(dòng)程序、spcagui和spcaview等測(cè)試程序的安裝過(guò)程,并以在gspca中添加對(duì)Logitech QuickCam Easy/Cool(快看靈訊版)攝像頭的支持為例,給出了在gspca驅(qū)動(dòng)程序中添加新的攝像頭支持的一般方法。
1 安裝gspca驅(qū)動(dòng)程序
    gspca用于2.6.17以上的內(nèi)核版本,以前的版本使用spca5xx驅(qū)動(dòng)程序。gspca可直接支持的攝像頭列表可見(jiàn)
http://mxhaard.free.fr/spca5xx.html
。
    (1)安裝內(nèi)核頭文件
#uname -r
2.6.20-1.2962.fc6
#arch
i686
#wget http://fedora.fastbull.org/updates/testing/6/i386/kernel-devel-2.6.20-1.2962.fc6.i686.rpm#rpm -ivh kernel-devel-2.6.20-1.2962.fc6.i686.rpm    這樣,內(nèi)核頭文件被安裝到/usr/src/kernels/2.6.20-1.2962.fc6-i686目錄下。
    (2)安裝gspca驅(qū)動(dòng):
#wget http://mxhaard.free.fr/spca50x/Download/gspcav1-20070508.tar.gz#tar xfv gspcav1-20070508.tar.gz#cd gspcav1-20070508#./gspca_build
    gspca_build是一個(gè)自動(dòng)編譯、安裝、加載驅(qū)動(dòng)模塊的腳本?梢允褂妹睢癲epmod -ae”來(lái)檢查內(nèi)核模塊的依賴(lài)關(guān)系是否沖突。
    注意,安裝好驅(qū)動(dòng)并加載gspca.ko模塊后,一般會(huì)有/dev/video和/dev/video0等設(shè)備文件的存在,否則可能是驅(qū)動(dòng)程序?qū)Ρ緳C(jī)的攝像頭的支持有問(wèn)題。另外,要正常使用攝像頭,內(nèi)核中應(yīng)有video for linux的支持(Fedora內(nèi)核一般是默認(rèn)支持)。
    (3)安裝spcagui、spcaview等攝像頭測(cè)試程序
    實(shí)際上,只要正確安裝好驅(qū)動(dòng)之后,就可以使用"應(yīng)用程序->Internet->Kopete"或gnome-netmeeting等程序來(lái)測(cè)試攝像頭是否能正常工作了。當(dāng)然也可以使用spcagui、spcaview等專(zhuān)門(mén)的攝像頭工具軟件。
    要安裝spcagui或spcaview,必須先安裝SDL、SDL-devel、SDL_image和SDL_image-devel軟件包。然后直接make并make install即可。
2 gspca不能直接支持Logitech QuickCam Easy/Cool(快看靈訊版,046d:08af)
    Logitech的攝像頭有個(gè)“特點(diǎn)”,一個(gè)英文名有好幾個(gè)中文名,例如快看靈訊版和快看酷訊版,包裝盒上都寫(xiě)的是Logitech QuickCam Cool,由于在gspca的攝像頭支持列表中看到了Logitech QuickCam Cool,于是買(mǎi)了個(gè)靈訊版。
    首先在Windows上試驗(yàn)攝像頭效果,插入U(xiǎn)SB口,顯示設(shè)備為L(zhǎng)ogitech QuickCam Easy/Cool,就感覺(jué)情況不妙,一看Vendor ID:Product ID是046d:08af,果然不在gspca的攝像頭支持列表內(nèi)。不管怎么樣,先到Fedora下試試再說(shuō)。
#lsusb
Bus 002 Device 001: ID 0000:0000  
Bus 002 Device 003: ID 046d:08af Logitech, Inc.
Bus 001 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 001: ID 0000:0000
    可見(jiàn)設(shè)備ID的確是046d:08af。加載gspca驅(qū)動(dòng)模塊后,運(yùn)行spcagui或者spcaview,提示“No such file or directory.”
    “l(fā)s /dev/video*”發(fā)現(xiàn)沒(méi)有任何相應(yīng)的設(shè)備文件,于是手動(dòng)建立:
#mknod /dev/video0 c 81 0#ln -s /dev/video0 /dev/video
    之后再運(yùn)行spcagui或者spcaview,提示“Device not found.”
    在Google上搜了兩個(gè)晚上,還是沒(méi)能找到解決問(wèn)題的辦法?磥(lái)唯一能找到問(wèn)題所在并加以解決的辦法就是從gspca驅(qū)動(dòng)程序的源代碼入手了。
3 使gspca驅(qū)動(dòng)程序支持Logitech QuickCam Easy/Cool    (1)gspca驅(qū)動(dòng)程序結(jié)構(gòu)簡(jiǎn)析
    gspca驅(qū)動(dòng)程序的核心代碼是gspca_core.c,包括了設(shè)備注冊(cè)、注銷(xiāo)、各種操作方法集(定義了所支持的攝像頭設(shè)備列表,設(shè)備檢測(cè)和初始化,設(shè)備打開(kāi)、參數(shù)設(shè)置、關(guān)閉等各種操作函數(shù))。
    gspca.h是一個(gè)核心頭文件,它的主要內(nèi)容有:
    a)定義所支持的Vendor ID號(hào),例如:
#define VENDOR_LOGITECH 0x046d    b)為所支持的DSP橋接控制芯片型號(hào)進(jìn)行編號(hào),例如:
#define BRIDGE_ZC3XX 12    c)為所支持的CMOS/CCD圖像傳感器型號(hào)進(jìn)行編號(hào),例如:
#define SENSOR_HV7131B  2
#define SENSOR_HDCS2020 9
#define SENSOR_HV7131C 12
#define SENSOR_HV7131R 15
#define SENSOR_PAS202 19
#define SENSOR_TAS5130C_VF0250 22   
    另外,它還定義了圖像格式相關(guān)的常量和數(shù)據(jù)結(jié)構(gòu)(如圖像分辨率,色彩空間,調(diào)色板等),幀數(shù)據(jù)結(jié)構(gòu),攝像頭操作方法集等。
    Vimicro,Sonix,PixArt,Sunplus等文件夾中定義了各傳感器相關(guān)的頭文件。
    decoder文件夾中包含了對(duì)各種圖像格式進(jìn)行編解碼的源代碼。
    結(jié)論:要驅(qū)動(dòng)一個(gè)攝像頭,首先要知道它的DSP芯片和CMOS芯片型號(hào)。如果攝像頭的Vendor ID,DSP芯片,image sensor不在其中,則要定義DSP和sensor芯片的相應(yīng)頭文件,并在gspca.h中添加相應(yīng)的設(shè)備信息,還要把攝像頭加入到gspca_core.c的攝像頭設(shè)備列表中。
    (2)與Logitech QuickCam Easy/Cool相近的攝像頭信息列表
Camera Type
Product ID
Bridge DSP
Sensor
Comments(sensor in driver code)
QC IM
08a0
zc030x
HDCS2020
TAS5130C(08a0/a1/a3,08d9/da)
QC IM
08a6
zc030x
HV7131R
HV7131C (08a6/ad, 08d7)
NoteBook Deluxe
08a9
zc0302
HV7131B
HDCS2020 (08a2/a9/ae, 08d8)
QC Image
08a7
zc030x
PAS202
QC for Notebook
08ae
zc030x
PAS202
HDCS2020
QC Cool
08ac
zc030x
PAS202
HV7131B
Communicate STX
08ad
zc0302
TAS5130C
HV7131C
Communicate STX
08d7
vc0302/zc0302
TAS5130C
HV7131C
QC IM/Connect
08d9
zc030x
TAS5130C
QC Messenger
08da
zc030x
TAS5130C
NoteBook Deluxe
08d8
vc0302/zc0302
TAS5130C
QC Easy/Cool
08af
?(zc030x)
?
(HV7131C/HV7131B/TAS5130C/HDCS2020)
    上面是Logitech攝像頭產(chǎn)品中與Logitech QuickCam Easy/Cool相近的產(chǎn)品(從Product ID,攝像頭英文名,產(chǎn)品價(jià)格等判斷),摘自
http://mxhaard.free.fr/spca5xx.html
,其中最后一列的注釋是gspca_core.c源文件中給相應(yīng)型號(hào)攝像頭定義的CMOS芯片型號(hào),與網(wǎng)頁(yè)上的列表并不完全一致,我們以驅(qū)動(dòng)程序中定義的為準(zhǔn)。
    列出上面的表,主要是為了要推斷出Logitech QuickCam Easy/Cool的DSP芯片型號(hào)和CMOS傳感器型號(hào)。從上表可以發(fā)現(xiàn),所有的攝像頭都使用了zc030x(包括zc0302)作為DSP控制芯片,因此可以斷定,Easy/Cool也使用了這一系列的DSP芯片,在驅(qū)動(dòng)程序中用BRIDGE_ZC3XX表示。而CMOS芯片也無(wú)非是HV7131C/HV7131B/TAS5130C/HDCS2020中的一種,我們可以逐一試驗(yàn)。
    (3)在gspca_core.c中添加Logitech QuickCam Easy/Cool相關(guān)信息
    由于Logitech QuickCam Easy/Cool的Vendor、DSP型號(hào)、CMOS傳感器型號(hào)在gspca.h中均有定義,也有相關(guān)的芯片頭文件,因此,只需改動(dòng)gspca_core.c,把Easy/Cool攝像頭的信息加入到其中即可。
以下藍(lán)色部分是添加的相關(guān)內(nèi)容。
    在gspca_core.c中有一個(gè)Camera型號(hào)列表,如下:
enum {
    UnknownCamera = 0, // 0
    IntelPCCameraPro,
    IntelCreateAndShare,
    ......
    PhilipsDMVC1300K,
    LogitechQC_EasyCool, // added by aaron
    LastCamera
};
static struct cam_list clist[] = {
    {UnknownCamera, "Unknown"},
    {IntelPCCameraPro, "Intel PC Camera Pro"},
    {IntelCreateAndShare, "Intel Create and Share"},
    ......
    {PhilipsDMVC1300K,"Philips DMVC 1300K"},
    {LogitechQC_EasyCool,"Logitech QuickCam Easy_Cool"},     //added by aaron
    {-1, NULL}
};
static __devinitdata struct usb_device_id device_table[] = {
    {USB_DEVICE(0x0733, 0x0430)}, /*Intel PC Camera Pro*/
    {USB_DEVICE(0x0733, 0x0401)}, /* Intel Create and Share */
    ......
    {USB_DEVICE(0x0471, 0x0322)}, /* Philips DMVC1300K */
    {USB_DEVICE(0x046d, 0x08af)},
    /* Logitech QuickCam Easy_Cool, added by aaron */

    {USB_DEVICE(0x0000, 0x0000)}, /* MystFromOri Unknow Camera */
    {} /* Terminating entry */
};
static int
gspca_attach_bridge(struct usb_spca50x *spca50x)
{
    /* set the default epadr */
    spca50x->epadr =1;
    switch (spca50x->bridge) {
    ......
    case BRIDGE_ZC3XX:
        spca50x->cameratype = JPGH;
        info("USB GSPCA camera found.(ZC3XX) ");
        memcpy(&spca50x->funct, &fzc3xx, sizeof (struct cam_operation));
        break;
    ...... //other DSP bridges
    default:
        return -ENODEV;
    }
    return 0;
}
    檢測(cè)攝像頭型號(hào):
static int
spcaDetectCamera(struct usb_spca50x *spca50x)
{
    struct usb_device *dev = spca50x->dev;
    __u8 fw = 0;
    __u16 vendor;
    __u16 product;
    /* Is it a recognised camera ? */
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
        vendor = le16_to_cpu(dev->descriptor.idVendor);
        product = le16_to_cpu(dev->descriptor.idProduct);
    #else
        vendor = dev->descriptor.idVendor;
        product = dev->descriptor.idProduct;
    #endif
    switch (vendor) {
    case 0x046d: /* Logitech Labtec */
        switch (product) {
        case 0x08af: //added by aaron
            spca50x->desc = LogitechQC_EasyCool;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor =
SENSOR_HV7131B;
            break;

        ......
        case 0x08a0:
            spca50x->desc = QCim;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_TAS5130CXX;
            break;
        case 0x08a1:
            spca50x->desc = QCimA1;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_TAS5130CXX;
            break;
        case 0x08a2: // zc302 chips
            spca50x->desc = LabtecPro;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_HDCS2020;
            break;
        case 0x08a3:
            spca50x->desc = QCchat;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_TAS5130CXX;
            break;
        case 0x08a6:
            spca50x->desc = LogitechQCim;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_HV7131C;
            break;
        case 0x08a7:
            spca50x->desc = LogitechQCImage;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_PAS202;
            break;
        case 0x08d8:
        case 0x08a9:
            spca50x->desc = LogitechNotebookDeluxe;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_HDCS2020;
            break;
        case 0x08ae:
            spca50x->desc = QuickCamNB;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_HDCS2020;
            break;
        case 0x08ac:
            spca50x->desc = LogitechQCCool;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor = SENSOR_HV7131B;
            break;
        ......
        default:
            goto error;
        };
        break;
    ...... //other vendors
    return gspca_attach_bridge(spca50x);
    error:
    return -ENODEV; //no camera match
}
static int
spca5xx_probe(struct usb_interface *intf, const struct usb_device_id *id){
    ......
    if ((err_probe = spcaDetectCamera(spca50x))     到此,我們對(duì)gspca驅(qū)動(dòng)程序的擴(kuò)展就算完成了。在函數(shù)spcaDetectCamera()中的switch結(jié)構(gòu)中,將我們的攝像頭放到第一個(gè)case,是為了在探測(cè)攝像頭時(shí)第一個(gè)就找到我們的攝像頭,提高檢測(cè)速度。
    需要指出兩點(diǎn),一是在函數(shù)spcaDetectCamera()中,我們假定Logitech QC Easy/Cool的CMOS傳感器型號(hào)為SENSOR_HV7131B,這需要在后續(xù)的實(shí)驗(yàn)中進(jìn)行驗(yàn)證;二是spca5xx_probe()函數(shù)中,紅色代碼部分,實(shí)際上調(diào)用了spcaDetectCamera()函數(shù)來(lái)探測(cè)攝像頭,如果出錯(cuò)則報(bào)錯(cuò)" Devices not found !! "并退出,由于之前gspca中沒(méi)有Easy/Cool攝像頭的信息,因此,之前即使自己創(chuàng)建了/dev/video0等設(shè)備文件,還是會(huì)報(bào)錯(cuò)“找不到設(shè)備”。
    (4)卸載舊的gspca驅(qū)動(dòng)模塊,安裝新的
gspca驅(qū)動(dòng)模塊
#rm -f /dev/video*    //刪除舊的自己創(chuàng)建的設(shè)備節(jié)點(diǎn)
#modprobe -rv gspca
#make uninstall
#make clean
#./gspca_build
#ls /dev/video*
lrwxrwxrwx 1 root  root  6 09-22 21:44 /dev/video->video0
crw------- 1 aaronwong root 81, 0 09-22 21:42 /dev/video0
    可見(jiàn),這次在加載gspca驅(qū)動(dòng)模塊后,自動(dòng)生成了設(shè)備文件/dev/video0和/dev/video。
   
    (5)攝像頭試用效果

$spcagui
SpcaGui version: 0.3.5 date: 18 September 2005
video device /dev/video0
Camera found: Logitech QuickCam Easy_Cool
VIDIOCGPICT brightnes=32768 hue=0 color=0 contrast=32768 whiteness=0depth=24 palette=4
Bridge found: ZC301-2
Unable to find a StreamId !!
StreamId: 6 Unknow Camera
try palette 15 depth 12
Available  palette 15
try palette 3 depth 16
Available  palette 3
try palette 4 depth 24
Available  palette 4
try palette 5 depth 32
Available  palette 5
probe size in
Available Resolutions width 640  heigth 480
Available Resolutions width 384  heigth 288
Available Resolutions width 352  heigth 288
Available Resolutions width 320  heigth 240
Available Resolutions width 192  heigth 144
Available Resolutions width 176  heigth 144
grabbing method default MMAP asked
VIDIOCGMBUF size 2457616  frames 2  offets[0]=0 offsets[1]=1228808
......
    截圖如下:


    (6)修正CMOS芯片型號(hào)信息
#modprobe -v gspca
insmod /lib/modules/2.6.20-1.2962.fc6/kernel/drivers/media/video/v4l1-compat.ko
insmod /lib/modules/2.6.20-1.2962.fc6/kernel/drivers/media/video/v4l2-common.ko
insmod /lib/modules/2.6.20-1.2962.fc6/kernel/drivers/media/video/videodev.ko
insmod /lib/modules/2.6.20-1.2962.fc6/kernel/drivers/usb/media/gspca.ko
#dmesg | grep gspca
/home/aaronwong/webcam/driver/gspcav1-20070508/gspca_core.c: USB GSPCA camera found.(ZC3XX)
/home/aaronwong/webcam/driver/gspcav1-20070508/gspca_core.c: [spca5xx_probe:4109] Camera type JPEG
/home/aaronwong/webcam/driver/gspcav1-20070508/Vimicro/zc3xx.h: [zc3xx_config:515] Sensor ID:2
/home/aaronwong/webcam/driver/gspcav1-20070508/Vimicro/zc3xx.h: [zc3xx_config:597] Find Sensor HV7131R(c)
/home/aaronwong/webcam/driver/gspcav1-20070508/gspca_core.c: [spca5xx_getcapability:1218] maxw 640 maxh 480 minw 176 minh 144
usbcore: registered new interface driver gspca
/home/aaronwong/webcam/driver/gspcav1-20070508/gspca_core.c: gspca driver 01.00.18 registered
    注意紅色標(biāo)出的部分,即使在驅(qū)動(dòng)程序中指定QuickCam Easy/Cool攝像頭的CMOS SENSOR類(lèi)型為SENSOR_HV7131B(或者是SENSOR_HDCS2020等其他類(lèi)型),在加載gspca.ko模塊時(shí),找到的還是HV7131R(c),因此,QuickCam Easy/Cool攝像頭的CMOS SENSOR類(lèi)型應(yīng)該就是SENSOR_HV7131R或SENSOR_HV7131C。
    在源程序gspca_core.c的spcaDetectCamera()函數(shù)的相應(yīng)部分修改如下:
case 0x08af: //added by aaron
            spca50x->desc = LogitechQC_EasyCool;
            spca50x->bridge = BRIDGE_ZC3XX;
            spca50x->sensor =
SENSOR_HV7131R;  
                            //
SENSOR_HV7131C;
            break;
    卸載gspca驅(qū)動(dòng)模塊,再重新編譯安裝gspca驅(qū)動(dòng)即可。
    由此也可知,在gspca攝像頭驅(qū)動(dòng)中最重要的是要正確識(shí)別DSP控制芯片的型號(hào),而CMOS傳感器的型號(hào)并不是必須的。所以,只要攝像頭使用了gspca所支持的DSP控制芯片,就可以很容易地按照上面的方法,添加gspca對(duì)新的攝像頭的支持。即使使用了別的DSP控制芯片,也可以利用gspca的程序架構(gòu),為新的DSP芯片添加頭文件等信息,來(lái)擴(kuò)展gspca對(duì)更多系列的USB攝像頭的支持。
   
    不管你的攝像頭是ANC奧尼,還是環(huán)宇飛揚(yáng),或是戀影雙雙,如果你發(fā)現(xiàn)它的DSP芯片是gspca所支持的,不妨都來(lái)一試,相信你的攝像頭也不會(huì)讓你失望。


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/94311/showart_2073531.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP