⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spca_core.c

📁 通用的摄像头驱动源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -