📄 spca_core.c
字号:
/* * SPCA5xx based usb camera driver (currently supports * yuv native stream spca501a, spca501c, spca505, spca508, spca506 * jpeg native stream spca500, spca551, spca504a, spca504b, spca533a, spca536a, zc0301, zc0302, cx11646, sn9c102p * bayer native stream spca561a, sn9c101, sn9c102, tv8532 ). * Z-star Vimicro chips zc0301 zc0301P zc0302 * Sunplus spca501a, spca501c, spca505, spca508, spca506, spca500, spca551, spca504a, spca504b, spca533a, spca536a * Sonix sn9c101, sn9c102, sn9c102p sn9c105 sn9c120 * Conexant cx11646 * Transvision tv_8532 * Etoms Et61x151 Et61x251 * Pixat Pac207-BCA-32 * SPCA5xx version by Michel Xhaard <mxhaard@users.sourceforge.net> * Based on : * SPCA50x version by Joel Crisp <cydergoth@users.sourceforge.net> * OmniVision OV511 Camera-to-USB Bridge Driver * Copyright (c) 1999-2000 Mark W. McClelland * Kernel 2.6.x port Michel Xhaard && Reza Jelveh (feb 2004) * Based on the Linux CPiA driver written by Peter Pregler, * Scott J. Bertin and Johannes Erdfelt. * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#define SPCA5XX_VERSION "00.57.06LE"#define VID_HARDWARE_SPCA5XX 0xFFstatic const char version[] = SPCA5XX_VERSION;#include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/vmalloc.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/kernel.h>#include <linux/proc_fs.h>#include <linux/ctype.h>#include <linux/pagemap.h>#include <linux/usb.h>#include <asm/io.h>#include <asm/semaphore.h>#include <linux/videodev.h>#include <asm/page.h>#include <asm/uaccess.h>#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)#include <linux/wrapper.h>#endif#include <linux/param.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9)#include <linux/moduleparam.h>#endif#include "spca5xx.h"#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)# undef CONFIG_VIDEO_PROC_FS# undef CONFIG_PROC_FS#endif//#define RH9_REMAP 1#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)#include "spcaCompat.h"#ifndef pte_offset_kernel# define pte_offset_kernel(dir, address) pte_offset(dir, address)#endif#endif#include "spcadecoder.h"#define PROC_NAME_LEN 10 //length of the proc name/* Video Size 640 x 480 jpeg only */#define MAX_FRAME_SIZE (640 * 480)#define MAX_DATA_SIZE (MAX_FRAME_SIZE + sizeof(struct timeval))/* Hardware auto exposure / whiteness (PC-CAM 600) */static int autoexpo = 1;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,5)/* Video device number (-1 is first available) */static int video_nr = -1;#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,5) */#ifdef SPCA50X_ENABLE_DEBUG/* 0=no debug messages * 1=init/detection/unload and other significant messages, * 2=some warning messages * 3=config/control function calls * 4=most function calls and data parsing messages * 5=highly repetitive mesgs * NOTE: This should be changed to 0, 1, or 2 for production kernels */ static int debug = 0;#endif/* Force image to be read in RGB instead of BGR. This option allow * programs that expect RGB data (e.g. gqcam) to work with this driver. *//* Enable compression. This is for experimentation only; compressed images * still cannot be decoded yet. */static int compress = 0;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9)module_param (autoexpo, int, 0644);#ifdef SPCA50X_ENABLE_DEBUGmodule_param (debug, int, 0644);#endif#ifdef SPCA50X_ENABLE_COMPRESSIONmodule_param (compress, int, 0644);#endif /* SPCA50X_ENABLE_COMPRESSION */#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9) */MODULE_PARM (autoexpo, "i");#ifdef SPCA50X_ENABLE_DEBUGMODULE_PARM (debug, "i");#endif#ifdef SPCA50X_ENABLE_COMPRESSIONMODULE_PARM (compress, "i");#endif /* SPCA50X_ENABLE_COMPRESSION */#endif/***************/MODULE_PARM_DESC (autoexpo, "Enable/Disable hardware auto exposure / whiteness (default: enabled) (PC-CAM 600 only !!)");#ifdef SPCA50X_ENABLE_DEBUGMODULE_PARM_DESC (debug, "Debug level: 0=none, 1=init/detection, 2=warning, 3=config/control, 4=function call, 5=max");#endif#ifdef SPCA50X_ENABLE_COMPRESSIONMODULE_PARM_DESC (compress, "Turn on/off compression (not functional yet)");#endif /* SPCA50X_ENABLE_COMPRESSION *//****************/MODULE_AUTHOR ("Michel Xhaard <mxhaard@users.sourceforge.net> based on spca50x driver by Joel Crisp <cydergoth@users.sourceforge.net>,ov511 driver by Mark McClelland <mwm@i.am>");MODULE_DESCRIPTION ("SPCA5LE USB Camera Driver");MODULE_LICENSE ("GPL");static int spca50x_move_data (struct usb_spca50x *spca50x, struct urb *urb);static struct usb_driver spca5xx_driver;#ifndef maxstatic inline intmax (int a, int b){ return (a > b) ? a : b;}#endif /* max *//********************************************************************** * List of known SPCA50X-based cameras **********************************************************************/ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)/* Camera type jpeg yuvy yyuv yuyv grey gbrg*/static struct palette_list Plist[] = { {JPEG, "JPEG"}, {JPGH, "JPEG"}, {JPGC, "JPEG"}, {JPGS, "JPEG"}, {JPGM, "JPEG"}, {-1, NULL}};#endifstatic struct bridge_list Blist[] = { {BRIDGE_SPCA504, "SPCA504"}, {BRIDGE_SPCA504B, "SPCA504B"}, {BRIDGE_SPCA533, "SPCA533"}, {BRIDGE_SPCA504C, "SPCA504C"}, {BRIDGE_SPCA536, "SPCA536"}, {BRIDGE_ZC3XX, "ZC301-2"}, {BRIDGE_SN9CXXX,"SN9CXXX"}, {-1, NULL}};enum{ UnknownCamera = 0, // 0 MustekGsmartMini2, MustekGsmartMini3, CreativePCCam600, MaxellMaxPocket, AiptekMiniPenCam2, AiptekPocketDVII, AiptekPenCamSD, AiptekMiniPenCam13, MustekGsmartLCD3, MustekMDC5500Z, //10 MegapixV4, AiptekPocketDV3100, AiptekPocketCam3M, MustekGsmartLCD2, PureDigitalDakota, BenqDC1500, LogitechClickSmart420, BenqDC1300, MustekDV3000, CreativePccam750,//20 BenqDC3410, Jenoptikjdc21lcd, Terratec2move13, MustekDV4000, AiptekDV3500, LogitechClickSmart820, Enigma13, Epsilon13, AiptekPocketCam2M, PolaroidPDC2030,//30 CreativeNotebook, CreativeMobile, LabtecPro, MustekWcam300A, GeniusVideoCamV2, GeniusVideoCamV3, GeniusVideoCamExpressV2b, CreativeNxPro, Vimicro, Digitrex2110,//40 GsmartD30, CreativeNxPro2, Bs888e, Zc302, AiptekSlim3200, CreativeLive, MercuryDigital, Wcam300A, TyphoonWebshotIIUSB300k,//50 PolaroidPDC3070, QCim, WebCam320, AiptekPocketCam4M, AiptekPocketDV5100, AiptekPocketDV5300, SunplusGeneric536, QCimA1, QCchat, QCimB9,//60 SonixWC311P, Concord3045, Mercury21, CreativeNX, CreativeInstant1, CreativeInstant2, QuickCamNB, WCam300AN, GeniusDsc13, MustekMDC4000,//70 LogitechQCCommunicateSTX, Pccam168, Sn535, Pccam, Lic300, PolaroidIon80, Zc0305b, LogitechNotebookDeluxe, LabtecNotebook, JvcGcA50,//80 PcCam350, Vimicro303b, CyberpixS550V, LastCamera};static struct cam_list clist[] = { {UnknownCamera, "Unknown"}, {MustekGsmartMini2, "Mustek gSmart mini 2"}, {MustekGsmartMini3, "Mustek gSmart mini 3"}, {CreativePCCam600, "Creative PC-CAM 600"}, {MaxellMaxPocket, "Maxell Max Pocket LEdit. 1.3 MPixels"}, {AiptekMiniPenCam2, "Aiptek Mini PenCam 2 MPixels"}, {AiptekPocketDVII, "Aiptek PocketDVII 1.3 MPixels"}, {AiptekPenCamSD, "Aiptek Pencam SD 2 MPixels"}, {AiptekMiniPenCam13, "Aiptek mini PenCam 1.3 MPixels"}, {MustekGsmartLCD3, "Mustek Gsmart LCD 3"}, {MustekMDC5500Z, "Mustek MDC5500Z"}, {MegapixV4, "Megapix V4"}, {AiptekPocketDV3100, "Aiptek PocketDV3100+ "}, {AiptekPocketCam3M, "Aiptek PocketCam 3 M "}, {MustekGsmartLCD2, "Mustek Gsmart LCD 2"}, {PureDigitalDakota, "Pure Digital Dakota"}, {BenqDC1500, "Benq DC1500"}, {LogitechClickSmart420, "Logitech Inc. ClickSmart 420"}, {BenqDC1300, "Benq DC1300"}, {MustekDV3000, "Mustek DV 3000"}, {CreativePccam750, "Creative PCcam750"}, {BenqDC3410, "Benq DC3410"}, {Jenoptikjdc21lcd, "Jenoptik DC 21 LCD"}, {Terratec2move13, "Terratec 2 move 1.3"}, {MustekDV4000, "Mustek DV4000 Mpeg4"}, {AiptekDV3500, "Aiptek DV3500 Mpeg4"}, {LogitechClickSmart820, "Logitech ClickSmart 820"}, {Enigma13, "Digital Dream Enigma 1.3"}, {Epsilon13, "Digital Dream Epsilon 1.3"}, {AiptekPocketCam2M, "Aiptek PocketCam 2Mega"}, {PolaroidPDC2030, "Polaroid PDC2030"}, {CreativeNotebook, "Creative Notebook PD1171"}, {CreativeMobile, "Creative Mobile PD1090"}, {LabtecPro, "Labtec Webcam Pro"}, {MustekWcam300A, "Mustek Wcam300A"}, {GeniusVideoCamV2, "Genius Videocam V2"}, {GeniusVideoCamV3, "Genius Videocam V3"}, {GeniusVideoCamExpressV2b, "Genius Videocam Express V2 Firmware 2"}, {CreativeNxPro, "Creative Nx Pro"}, {Vimicro, "Z-star Vimicro zc0301p"}, {Digitrex2110, "ApexDigital Digitrex2110 spca533"}, {GsmartD30, "Mustek Gsmart D30 spca533"}, {CreativeNxPro2, "Creative NX Pro FW2"}, {Bs888e, "Kowa Bs888e MicroCamera"}, {Zc302, "Z-star Vimicro zc0302"}, {AiptekSlim3200, "Aiptek Slim 3200"}, {CreativeLive, "Creative Live! "}, {MercuryDigital, "Mercury Digital Pro 3.1Mp"}, {Wcam300A, "Mustek Wcamm300A 2"}, {TyphoonWebshotIIUSB300k, " Typhoon Webshot II"}, {PolaroidPDC3070, " Polaroid PDC3070"}, {QCim,"Logitech QuickCam IM"}, {WebCam320,"Micro Innovation WebCam 320"}, {AiptekPocketCam4M,"Aiptek Pocket Cam 4M"}, {AiptekPocketDV5100,"Aiptek Pocket DV5100"}, {AiptekPocketDV5300,"Aiptek Pocket DV5300"}, {SunplusGeneric536,"Sunplus Generic spca536a"}, {QCimA1,"Logitech QuickCam IM + sound"}, {QCchat,"Logitech QuickCam chat"}, {QCimB9,"Logitech QuickCam IM ???"}, {SonixWC311P,"Sonix sn9c102P Hv7131R"}, {Concord3045,"Concord 3045 spca536a"}, {Mercury21,"Mercury Peripherals Inc."}, {CreativeNX,"Creative NX"}, {CreativeInstant1,"Creative Instant P0620"}, {CreativeInstant2,"Creative Instant P0620D"}, {QuickCamNB,"Logitech QuickCam for Notebooks"}, {WCam300AN,"Mustek WCam300AN "}, {GeniusDsc13,"Genius Dsc 1.3 Smart spca504B-P3"}, {MustekMDC4000, "Mustek MDC4000"}, {LogitechQCCommunicateSTX,"Logitech QuickCam Communicate STX"}, {Pccam168,"Sonix PcCam"}, {Sn535,"Sangha 350k"}, {Pccam,"Sonix Pccam +"}, {Lic300,"LG Lic-300"}, {PolaroidIon80,"Polaroid Ion 80"}, {Zc0305b,"Generic Zc0305b"}, {LogitechNotebookDeluxe,"Logitech Notebook Deluxe"}, {LabtecNotebook,"Labtec Webcam Notebook"}, {JvcGcA50,"JVC GC-A50"}, {PcCam350,"PC-Cam350"}, {Vimicro303b,"Generic Vimicro 303b"}, {CyberpixS550V,"Mercury Cyberpix S550V"}, {-1, NULL}};#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)static __devinitdata struct usb_device_id device_table[] = { {USB_DEVICE (0x055f, 0xc420)}, /* Mustek gSmart Mini 2 */ {USB_DEVICE (0x055f, 0xc520)}, /* Mustek gSmart Mini 3 */ {USB_DEVICE (0x041E, 0x400B)}, /* Creative PC-CAM 600 */ {USB_DEVICE (0x04fc, 0x504b)}, /* Maxell MaxPocket LE 1.3 */ {USB_DEVICE (0x08ca, 0x2008)}, /* Aiptek Mini PenCam 2 M */ {USB_DEVICE (0x08ca, 0x0104)}, /* Aiptek PocketDVII 1.3 */ {USB_DEVICE (0x08ca, 0x2018)}, /* Aiptek Pencam SD 2M */ {USB_DEVICE (0x04fc, 0x504a)}, /* Aiptek Mini PenCam 1.3 */ {USB_DEVICE (0x055f, 0xc530)}, /* Mustek Gsmart LCD 3 */ {USB_DEVICE (0x055f, 0xc650)}, /* Mustek MDC5500Z */ {USB_DEVICE (0x052b, 0x1513)}, /* Megapix V4 */ {USB_DEVICE (0x08ca, 0x0106)}, /* Aiptek Pocket DV3100+ */ {USB_DEVICE (0x08ca, 0x2010)}, /* Aiptek PocketCam 3M */ {USB_DEVICE (0x055f, 0xc430)}, /* Mustek Gsmart LCD 2 */ {USB_DEVICE (0x04fc, 0xffff)}, /* Pure DigitalDakota */ {USB_DEVICE (0x04a5, 0x3008)}, /* Benq DC 1500 */ {USB_DEVICE (0x046d, 0x0960)}, /* Logitech Inc. ClickSmart 420 */ {USB_DEVICE (0x04a5, 0x3003)}, /* Benq DC 1300 */ {USB_DEVICE (0x055f, 0xc440)}, /* Mustek DV 3000 */ {USB_DEVICE (0x041e, 0x4013)}, /* Creative Pccam750 */ {USB_DEVICE (0x04a5, 0x300a)}, /* Benq DC3410 */ {USB_DEVICE (0x055f, 0xc220)}, /* Gsmart Mini */ {USB_DEVICE (0x0733, 0x2211)}, /* Jenoptik jdc 21 LCD */ {USB_DEVICE (0x055f, 0xc360)}, /* Mustek DV4000 Mpeg4 */ {USB_DEVICE (0x08ca, 0x2024)}, /* Aiptek DV3500 Mpeg4 */ {USB_DEVICE (0x046d, 0x0905)}, /* Logitech ClickSmart820 */ {USB_DEVICE (0x05da, 0x1018)}, /* Digital Dream Enigma 1.3 */ {USB_DEVICE (0x0733, 0x1311)}, /* Digital Dream Epsilon 1.3 */ {USB_DEVICE (0x041e, 0x401d)}, /* Creative Webcam NX ULTRA */ {USB_DEVICE (0x08ca, 0x2016)}, /* Aiptek PocketCam 2 Mega */ {USB_DEVICE (0x0546, 0x3273)}, /* Polaroid PDC2030 */ {USB_DEVICE (0x041e, 0x401f)}, /* Creative Webcam Notebook PD1171 */ {USB_DEVICE (0x041e, 0x4017)}, /* Creative Webcam Mobile PD1090 */ {USB_DEVICE (0x046d, 0x08a2)}, /* Labtec Webcam Pro */ {USB_DEVICE (0x055f, 0xd003)}, /* Mustek WCam300A */ {USB_DEVICE (0x0458, 0x7007)}, /* Genius VideoCam V2 */ {USB_DEVICE (0x0458, 0x700c)}, /* Genius VideoCam V3 */ {USB_DEVICE (0x0458, 0x700f)}, /* Genius VideoCam Web V2 */ {USB_DEVICE (0x041e, 0x401e)}, /* Creative Nx Pro */ {USB_DEVICE (0x04fc, 0x5330)}, /* Digitrex 2110 */ {USB_DEVICE (0x055f, 0xc540)}, /* Gsmart D30 */ {USB_DEVICE (0x0ac8, 0x301b)}, /* Asam Vimicro */ {USB_DEVICE (0x041e, 0x403a)}, /* Creative Nx Pro 2 */ {USB_DEVICE (0x055f, 0xc211)}, /* Kowa Bs888e Microcamera */ {USB_DEVICE (0x0ac8, 0x0302)}, /* Z-star Vimicro zc0302 */ {USB_DEVICE (0x08ca, 0x2022)}, /* Aiptek Slim 3200 */ {USB_DEVICE (0x0733, 0x2221)}, /* Mercury Digital Pro 3.1p */ {USB_DEVICE (0x041e, 0x4036)}, /* Creative Live ! */ {USB_DEVICE (0x055f, 0xc005)}, /* Mustek Wcam300A */ {USB_DEVICE (0x10fd, 0x8050)}, /* Typhoon Webshot II USB 300k */ {USB_DEVICE (0x0546, 0x3155)}, /* Polaroid PDC3070 */ {USB_DEVICE (0x046d, 0x08a0)}, /* Logitech QC IM */ {USB_DEVICE (0x0461, 0x0a00)}, /* MicroInnovation WebCam320 */ {USB_DEVICE (0x08ca, 0x2028)}, /* Aiptek PocketCam4M */ {USB_DEVICE (0x08ca, 0x2042)}, /* Aiptek PocketDV5100 */ {USB_DEVICE (0x08ca, 0x2060)}, /* Aiptek PocketDV5300 */ {USB_DEVICE (0x04fc, 0x5360)}, /* Sunplus Generic */ {USB_DEVICE (0x046d, 0x08a1)}, /* Logitech QC IM 0x08A1 +sound*/ {USB_DEVICE (0x046d, 0x08a3)}, /* Logitech QC Chat */ {USB_DEVICE (0x046d, 0x08b9)}, /* Logitech QC IM ??? */ {USB_DEVICE (0x10fd, 0x0128)}, /* Typhoon Webshot II USB 300k 0x0128 */ {USB_DEVICE (0x0c45, 0x607c)}, /* Sonix sn9c102p Hv7131R*/ {USB_DEVICE (0x0733, 0x3261)}, /* Concord 3045 spca536a*/ {USB_DEVICE (0x0733, 0x1314)}, /* Mercury 2.1MEG Deluxe Classic Cam*/ {USB_DEVICE (0x041e, 0x401c)}, /* Creative NX */ {USB_DEVICE (0x041e, 0x4034)}, /* Creative Instant P0620 */ {USB_DEVICE (0x041e, 0x4035)}, /* Creative Instant P0620D */ {USB_DEVICE (0x046d, 0x08ae)}, /* Logitech QuickCam for Notebooks */ {USB_DEVICE (0x055f, 0xd004)}, /* Mustek WCam300 AN */ {USB_DEVICE (0x0458, 0x7006)}, /* Genius Dsc 1.3 Smart */ {USB_DEVICE (0x055f, 0xc630)}, /* Mustek MDC4000 */ {USB_DEVICE (0x046d, 0x08ad)}, /* Logitech QCCommunicate STX*/ {USB_DEVICE (0x0c45, 0x613c)}, /* Sonix Pccam168 */ {USB_DEVICE (0x0c45, 0x6130)}, /* Sonix Pccam */ {USB_DEVICE (0x0c45, 0x60c0)}, /* Sangha Sn535 */ {USB_DEVICE (0x0c45, 0x60fc)}, /* LG-LIC300 */ {USB_DEVICE (0x0546, 0x3191)}, /* Polaroid Ion 80 */ {USB_DEVICE (0x0ac8, 0x305b)}, /* Z-star Vimicro zc0305b */ {USB_DEVICE (0x046d, 0x08a9)}, /* Logitech Notebook Deluxe*/ {USB_DEVICE (0x046d, 0x08aa)}, /* Labtec Webcam Notebook */ {USB_DEVICE (0x04f1, 0x1001)}, /* JVC GC A50*/ {USB_DEVICE (0x041e, 0x4012)}, /* PC-Cam350*/ {USB_DEVICE (0x0ac8, 0x303b)}, /* Vimicro 0x303b*/ {USB_DEVICE (0x0733, 0x3281)}, /* Cyberpix S550V*/ {} /* Terminating entry */};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -