📄 vicam.c
字号:
/* * USB ViCam WebCam driver * Copyright (c) 2002 Joe Burks (jburks@wavicle.org), * Christopher L Cheney (ccheney@cheney.cx), * Pavel Machek (pavel@suse.cz), * John Tyner (jtyner@cs.ucr.edu), * Monroe Williams (monroe@pobox.com) * * Supports 3COM HomeConnect PC Digital WebCam * * 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. * * This source code is based heavily on the CPiA webcam driver which was * written by Peter Pregler, Scott J. Bertin and Johannes Erdfelt * * Portions of this code were also copied from usbvideo.c * * Special thanks to the the whole team at Sourceforge for help making * this driver become a reality. Notably: * Andy Armstrong who reverse engineered the color encoding and * Pavel Machek and Chris Cheney who worked on reverse engineering the * camera controls and wrote the first generation driver. */#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/videodev.h>#include <linux/usb.h>#include <linux/vmalloc.h>#include <linux/slab.h>#include <linux/proc_fs.h>#include "usbvideo.h"// #define VICAM_DEBUG#ifdef VICAM_DEBUG#define ADBG(lineno,fmt,args...) printk(fmt, jiffies, __FUNCTION__, lineno, ##args)#define DBG(fmt,args...) ADBG((__LINE__),KERN_DEBUG __FILE__"(%ld):%s (%d):"fmt,##args)#else#define DBG(fmn,args...) do {} while(0)#endif#define DRIVER_AUTHOR "Joe Burks, jburks@wavicle.org"#define DRIVER_DESC "ViCam WebCam Driver"/* Define these values to match your device */#define USB_VICAM_VENDOR_ID 0x04c1#define USB_VICAM_PRODUCT_ID 0x009d#define VICAM_BYTES_PER_PIXEL 3#define VICAM_MAX_READ_SIZE (512*242+128)#define VICAM_MAX_FRAME_SIZE (VICAM_BYTES_PER_PIXEL*320*240)#define VICAM_FRAMES 2#define VICAM_HEADER_SIZE 64#define clamp( x, l, h ) max_t( __typeof__( x ), \ ( l ), \ min_t( __typeof__( x ), \ ( h ), \ ( x ) ) )/* Not sure what all the bytes in these char * arrays do, but they're necessary to make * the camera work. */static unsigned char setup1[] = { 0xB6, 0xC3, 0x1F, 0x00, 0x02, 0x64, 0xE7, 0x67, 0xFD, 0xFF, 0x0E, 0xC0, 0xE7, 0x09, 0xDE, 0x00, 0x8E, 0x00, 0xC0, 0x09, 0x40, 0x03, 0xC0, 0x17, 0x44, 0x03, 0x4B, 0xAF, 0xC0, 0x07, 0x00, 0x00, 0x4B, 0xAF, 0x97, 0xCF, 0x00, 0x00};static unsigned char setup2[] = { 0xB6, 0xC3, 0x03, 0x00, 0x03, 0x64, 0x18, 0x00, 0x00, 0x00};static unsigned char setup3[] = { 0xB6, 0xC3, 0x01, 0x00, 0x06, 0x64, 0x00, 0x00};static unsigned char setup4[] = { 0xB6, 0xC3, 0x8F, 0x06, 0x02, 0x64, 0xE7, 0x07, 0x00, 0x00, 0x08, 0xC0, 0xE7, 0x07, 0x00, 0x00, 0x3E, 0xC0, 0xE7, 0x07, 0x54, 0x01, 0xAA, 0x00, 0xE7, 0x07, 0xC8, 0x05, 0xB6, 0x00, 0xE7, 0x07, 0x42, 0x01, 0xD2, 0x00, 0xE7, 0x07, 0x7C, 0x00, 0x16, 0x00, 0xE7, 0x07, 0x56, 0x00, 0x18, 0x00, 0xE7, 0x07, 0x06, 0x00, 0x92, 0xC0, 0xE7, 0x07, 0x00, 0x00, 0x1E, 0xC0, 0xE7, 0x07, 0xFF, 0xFF, 0x22, 0xC0, 0xE7, 0x07, 0x04, 0x00, 0x24, 0xC0, 0xE7, 0x07, 0xEC, 0x27, 0x28, 0xC0, 0xE7, 0x07, 0x16, 0x01, 0x8E, 0x00, 0xE7, 0x87, 0x01, 0x00, 0x0E, 0xC0, 0x97, 0xCF, 0xD7, 0x09, 0x00, 0xC0, 0xE7, 0x77, 0x01, 0x00, 0x92, 0xC0, 0x09, 0xC1, 0xE7, 0x09, 0xFE, 0x05, 0x24, 0x01, 0xE7, 0x09, 0x04, 0x06, 0x26, 0x01, 0xE7, 0x07, 0x07, 0x00, 0x92, 0xC0, 0xE7, 0x05, 0x00, 0xC0, 0xC0, 0xDF, 0x97, 0xCF, 0x17, 0x00, 0x57, 0x00, 0x17, 0x02, 0xD7, 0x09, 0x00, 0xC0, 0xE7, 0x77, 0x01, 0x00, 0x92, 0xC0, 0x0A, 0xC1, 0xE7, 0x57, 0xFF, 0xFF, 0xFA, 0x05, 0x0D, 0xC0, 0xE7, 0x57, 0x00, 0x00, 0xFA, 0x05, 0x0F, 0xC0, 0x9F, 0xAF, 0xC6, 0x00, 0xE7, 0x05, 0x00, 0xC0, 0xC8, 0x05, 0xC1, 0x05, 0xC0, 0x05, 0xC0, 0xDF, 0x97, 0xCF, 0x27, 0xDA, 0xFA, 0x05, 0xEF, 0x07, 0x01, 0x00, 0x0B, 0x06, 0x73, 0xCF, 0x9F, 0xAF, 0x78, 0x01, 0x9F, 0xAF, 0x1A, 0x03, 0x6E, 0xCF, 0xE7, 0x09, 0xFC, 0x05, 0x24, 0x01, 0xE7, 0x09, 0x02, 0x06, 0x26, 0x01, 0xE7, 0x07, 0x07, 0x00, 0x92, 0xC0, 0xE7, 0x09, 0xFC, 0x05, 0xFE, 0x05, 0xE7, 0x09, 0x02, 0x06, 0x04, 0x06, 0xE7, 0x09, 0x00, 0x06, 0xFC, 0x05, 0xE7, 0x09, 0xFE, 0x05, 0x00, 0x06, 0x27, 0xDA, 0xFA, 0x05, 0xE7, 0x57, 0x01, 0x00, 0xFA, 0x05, 0x02, 0xCA, 0x04, 0xC0, 0x97, 0xCF, 0x9F, 0xAF, 0x66, 0x05, 0x97, 0xCF, 0xE7, 0x07, 0x40, 0x00, 0x02, 0x06, 0xC8, 0x09, 0xFC, 0x05, 0x9F, 0xAF, 0xDA, 0x02, 0x97, 0xCF, 0xCF, 0x17, 0x02, 0x00, 0xEF, 0x57, 0x81, 0x00, 0x09, 0x06, 0x9F, 0xA0, 0xB6, 0x01, 0xEF, 0x57, 0x80, 0x00, 0x09, 0x06, 0x9F, 0xA0, 0x40, 0x02, 0xEF, 0x57, 0x01, 0x00, 0x0B, 0x06, 0x9F, 0xA0, 0x46, 0x03, 0xE7, 0x07, 0x01, 0x00, 0x0A, 0xC0, 0x46, 0xAF, 0x47, 0xAF, 0x9F, 0xAF, 0x40, 0x02, 0xE7, 0x07, 0x2E, 0x00, 0x0A, 0xC0, 0xEF, 0x87, 0x80, 0x00, 0x09, 0x06, 0x97, 0xCF, 0x00, 0x0E, 0x01, 0x00, 0xC0, 0x57, 0x51, 0x00, 0x9F, 0xC0, 0x9E, 0x02, 0xC0, 0x57, 0x50, 0x00, 0x20, 0xC0, 0xC0, 0x57, 0x55, 0x00, 0x12, 0xC0, 0xC0, 0x57, 0x56, 0x00, 0x9F, 0xC0, 0x72, 0x02, 0x9F, 0xCF, 0xD6, 0x02, 0xC1, 0x0B, 0x08, 0x06, 0x01, 0xD0, 0x6F, 0x90, 0x08, 0x06, 0xC0, 0x07, 0x08, 0x00, 0xC1, 0x0B, 0x08, 0x06, 0x9F, 0xAF, 0x28, 0x05, 0x97, 0xCF, 0x2F, 0x0E, 0x02, 0x00, 0x08, 0x06, 0xC0, 0x07, 0x08, 0x00, 0xC1, 0x0B, 0x08, 0x06, 0x9F, 0xAF, 0x28, 0x05, 0x9F, 0xCF, 0xD6, 0x02, 0x2F, 0x0E, 0x02, 0x00, 0x09, 0x06, 0xEF, 0x87, 0x80, 0x00, 0x09, 0x06, 0x9F, 0xCF, 0xD6, 0x02, 0xEF, 0x67, 0x7F, 0xFF, 0x09, 0x06, 0xE7, 0x67, 0xFF, 0xFD, 0x22, 0xC0, 0xE7, 0x67, 0xEF, 0xFF, 0x24, 0xC0, 0xE7, 0x87, 0x10, 0x00, 0x28, 0xC0, 0x9F, 0xAF, 0xB8, 0x05, 0xE7, 0x87, 0xE0, 0x21, 0x24, 0xC0, 0x9F, 0xAF, 0xA8, 0x05, 0xE7, 0x87, 0x08, 0x00, 0x24, 0xC0, 0xE7, 0x67, 0xDF, 0xFF, 0x24, 0xC0, 0xC8, 0x07, 0x0A, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xC1, 0x07, 0x01, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0x9F, 0xAF, 0xB8, 0x05, 0xC0, 0x07, 0x9E, 0x00, 0x9F, 0xAF, 0x44, 0x05, 0xE7, 0x67, 0xFF, 0xFE, 0x24, 0xC0, 0xC0, 0x09, 0x20, 0xC0, 0xE7, 0x87, 0x00, 0x01, 0x24, 0xC0, 0xC0, 0x77, 0x00, 0x02, 0x0F, 0xC1, 0xE7, 0x67, 0xF7, 0xFF, 0x24, 0xC0, 0xE7, 0x67, 0xF7, 0xFF, 0x24, 0xC0, 0xE7, 0x87, 0x08, 0x00, 0x24, 0xC0, 0x08, 0xDA, 0x5E, 0xC1, 0xEF, 0x07, 0x80, 0x00, 0x09, 0x06, 0x97, 0xCF, 0xEF, 0x07, 0x01, 0x00, 0x0A, 0x06, 0x97, 0xCF, 0xEF, 0x07, 0x00, 0x00, 0x0B, 0x06, 0xEF, 0x07, 0x00, 0x00, 0x0A, 0x06, 0xEF, 0x67, 0x7F, 0xFF, 0x09, 0x06, 0xEF, 0x07, 0x00, 0x00, 0x0D, 0x06, 0xE7, 0x67, 0xEF, 0xFF, 0x28, 0xC0, 0xE7, 0x67, 0x17, 0xD8, 0x24, 0xC0, 0xE7, 0x07, 0x00, 0x00, 0x1E, 0xC0, 0xE7, 0x07, 0xFF, 0xFF, 0x22, 0xC0, 0x97, 0xCF, 0xC8, 0x07, 0x0E, 0x06, 0x9F, 0xAF, 0xDA, 0x02, 0xE7, 0x07, 0x00, 0x00, 0xF2, 0x05, 0xE7, 0x07, 0x10, 0x00, 0xF6, 0x05, 0xE7, 0x07, 0x0E, 0x06, 0xF4, 0x05, 0xE7, 0x07, 0xD6, 0x02, 0xF8, 0x05, 0xC8, 0x07, 0xF2, 0x05, 0xC1, 0x07, 0x00, 0x80, 0x50, 0xAF, 0x97, 0xCF, 0x2F, 0x0C, 0x02, 0x00, 0x07, 0x06, 0x2F, 0x0C, 0x04, 0x00, 0x06, 0x06, 0xE7, 0x07, 0x00, 0x00, 0xF2, 0x05, 0xE7, 0x07, 0x10, 0x00, 0xF6, 0x05, 0xE7, 0x07, 0xE2, 0x05, 0xF4, 0x05, 0xE7, 0x07, 0xCE, 0x02, 0xF8, 0x05, 0xC8, 0x07, 0xF2, 0x05, 0xC1, 0x07, 0x00, 0x80, 0x51, 0xAF, 0x97, 0xCF, 0x9F, 0xAF, 0x66, 0x04, 0x9F, 0xAF, 0x1A, 0x03, 0x59, 0xAF, 0x97, 0xCF, 0xC0, 0x07, 0x0E, 0x00, 0xC1, 0x0B, 0x0C, 0x06, 0x41, 0xD1, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x3C, 0x00, 0x9F, 0xAF, 0x44, 0x05, 0x68, 0x00, 0xC0, 0x07, 0x3B, 0x00, 0x9F, 0xAF, 0x44, 0x05, 0x6F, 0x00, 0x0C, 0x06, 0x68, 0x00, 0xE0, 0x07, 0x04, 0x01, 0xE8, 0x0B, 0x0A, 0x06, 0xE8, 0x07, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x02, 0xE0, 0x07, 0xEC, 0x01, 0xE0, 0x07, 0xFC, 0xFF, 0x97, 0xCF, 0xE7, 0x07, 0xFF, 0xFF, 0xFA, 0x05, 0xEF, 0x07, 0x00, 0x00, 0x0B, 0x06, 0xE7, 0x07, 0x0E, 0x06, 0x24, 0x01, 0xE7, 0x07, 0x0E, 0x06, 0xFE, 0x05, 0xE7, 0x07, 0x40, 0x00, 0x26, 0x01, 0xE7, 0x07, 0x40, 0x00, 0x04, 0x06, 0xE7, 0x07, 0x07, 0x00, 0x92, 0xC0, 0x97, 0xCF, 0xEF, 0x07, 0x02, 0x00, 0x0B, 0x06, 0x9F, 0xAF, 0x78, 0x01, 0xEF, 0x77, 0x80, 0x00, 0x07, 0x06, 0x9F, 0xC0, 0x14, 0x04, 0xEF, 0x77, 0x01, 0x00, 0x07, 0x06, 0x37, 0xC0, 0xEF, 0x77, 0x01, 0x00, 0x0D, 0x06, 0x0F, 0xC1, 0xEF, 0x07, 0x01, 0x00, 0x0D, 0x06, 0xC0, 0x07, 0x02, 0x00, 0xC1, 0x07, 0x30, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x01, 0x00, 0xC1, 0x07, 0x02, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC8, 0x07, 0xFF, 0x4F, 0x9F, 0xAF, 0xA8, 0x05, 0xC0, 0x07, 0x38, 0x00, 0x9F, 0xAF, 0x44, 0x05, 0xC1, 0x77, 0x03, 0x00, 0x02, 0xC1, 0x08, 0xDA, 0x75, 0xC1, 0xC1, 0x77, 0x01, 0x00, 0x0A, 0xC1, 0xC0, 0x07, 0x01, 0x00, 0xC1, 0x07, 0x02, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xEF, 0x07, 0x01, 0x00, 0x06, 0x06, 0x2C, 0xCF, 0xC0, 0x07, 0x01, 0x00, 0xC1, 0x07, 0x04, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xEF, 0x07, 0x00, 0x00, 0x06, 0x06, 0x22, 0xCF, 0xEF, 0x07, 0x00, 0x00, 0x0D, 0x06, 0xEF, 0x57, 0x01, 0x00, 0x06, 0x06, 0x1B, 0xC0, 0xC0, 0x07, 0x01, 0x00, 0xC1, 0x07, 0x01, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x02, 0x00, 0xC1, 0x07, 0x30, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC8, 0x07, 0xFF, 0x4F, 0x9F, 0xAF, 0xA8, 0x05, 0xC0, 0x07, 0x38, 0x00, 0x9F, 0xAF, 0x44, 0x05, 0xC1, 0x67, 0x03, 0x00, 0xC1, 0x57, 0x03, 0x00, 0x02, 0xC0, 0x08, 0xDA, 0x73, 0xC1, 0xC0, 0x07, 0x02, 0x00, 0xC1, 0x07, 0x12, 0x00, 0xEF, 0x57, 0x00, 0x00, 0x06, 0x06, 0x02, 0xC0, 0xC1, 0x07, 0x23, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x14, 0x00, 0xC1, 0x0B, 0xEA, 0x05, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x3E, 0x00, 0x9F, 0xAF, 0x0A, 0x05, 0xE7, 0x09, 0xE4, 0x05, 0xFA, 0x05, 0x27, 0xD8, 0xFA, 0x05, 0xE7, 0x07, 0x0E, 0x06, 0xFC, 0x05, 0xE7, 0x07, 0x4E, 0x06, 0x00, 0x06, 0xE7, 0x07, 0x40, 0x00, 0x02, 0x06, 0x9F, 0xAF, 0x66, 0x05, 0x9F, 0xAF, 0xC6, 0x00, 0x97, 0xCF, 0xC1, 0x0B, 0xE2, 0x05, 0x41, 0xD0, 0x01, 0xD2, 0xC1, 0x17, 0x23, 0x00, 0x9F, 0xAF, 0xDC, 0x04, 0xC0, 0x07, 0x04, 0x00, 0xC1, 0x0B, 0xE3, 0x05, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x06, 0x00, 0xC1, 0x09, 0xE6, 0x05, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x07, 0x00, 0xC1, 0x09, 0xE6, 0x05, 0xC1, 0xD1, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x0B, 0x00, 0xC1, 0x09, 0xE8, 0x05, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x0C, 0x00, 0xC1, 0x09, 0xE8, 0x05, 0xC1, 0xD1, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x0D, 0x00, 0xC1, 0x07, 0x09, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x03, 0x00, 0xC1, 0x07, 0x32, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0xC0, 0x07, 0x0F, 0x00, 0xC1, 0x07, 0x00, 0x00, 0x9F, 0xAF, 0x28, 0x05, 0x97, 0xCF, 0xE7, 0x67, 0xFF, 0xD9, 0x24, 0xC0, 0xC8, 0x07, 0x0A, 0x00, 0x40, 0x00, 0xC0, 0x67, 0x00, 0x02, 0x27, 0x80, 0x24, 0xC0, 0xE7, 0x87, 0x00, 0x04, 0x24, 0xC0, 0xE7, 0x67, 0xFF, 0xF9, 0x24, 0xC0, 0x01, 0xD2, 0x08, 0xDA, 0x72, 0xC1, 0xE7, 0x87, 0x00, 0x20, 0x24, 0xC0, 0x97, 0xCF, 0x27, 0x00, 0x1E, 0xC0, 0xE7, 0x87, 0xFF, 0x00, 0x22, 0xC0, 0xE7, 0x67, 0x7F, 0xFF, 0x24, 0xC0, 0xE7, 0x87, 0x80, 0x00, 0x24, 0xC0, 0xE7, 0x87, 0x80, 0x00, 0x24, 0xC0, 0x97, 0xCF, 0x9F, 0xAF, 0x0A, 0x05, 0x67, 0x00, 0x1E, 0xC0, 0xE7, 0x67, 0xBF, 0xFF, 0x24, 0xC0, 0xE7, 0x87, 0x40, 0x00, 0x24, 0xC0, 0xE7, 0x87, 0x40, 0x00, 0x24, 0xC0, 0x97, 0xCF, 0x9F, 0xAF, 0x0A, 0x05, 0xE7, 0x67, 0x00, 0xFF, 0x22, 0xC0, 0xE7, 0x67, 0xFF, 0xFE, 0x24, 0xC0, 0xE7, 0x67, 0xFF, 0xFE, 0x24, 0xC0, 0xC1, 0x09, 0x20, 0xC0, 0xE7, 0x87, 0x00, 0x01, 0x24, 0xC0, 0x97, 0xCF, 0xC0, 0x07, 0x40, 0x00, 0xC8, 0x09, 0xFC, 0x05, 0xE7, 0x67, 0x00, 0xFF, 0x22, 0xC0, 0xE7, 0x67, 0xFF, 0xFE, 0x24, 0xC0, 0xE7, 0x67, 0xBF, 0xFF, 0x24, 0xC0, 0xE7, 0x67, 0xBF, 0xFF, 0x24, 0xC0, 0x00, 0xDA, 0xE8, 0x09, 0x20, 0xC0, 0xE7, 0x87, 0x40, 0x00, 0x24, 0xC0, 0xE7, 0x87, 0x40, 0x00, 0x24, 0xC0, 0x00, 0xDA, 0xE8, 0x09, 0x20, 0xC0, 0x6D, 0xC1, 0xE7, 0x87, 0x00, 0x01, 0x24, 0xC0, 0x97, 0xCF, 0xE7, 0x07, 0x32, 0x00, 0x12, 0xC0, 0xE7, 0x77, 0x00, 0x80, 0x12, 0xC0, 0x7C, 0xC0, 0x97, 0xCF, 0xE7, 0x07, 0x20, 0x4E, 0x12, 0xC0, 0xE7, 0x77, 0x00, 0x80, 0x12, 0xC0, 0x7C, 0xC0, 0x97, 0xCF, 0x09, 0x02, 0x19, 0x00, 0x01, 0x01, 0x00, 0x80, 0x96, 0x09, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};static unsigned char setup5[] = { 0xB6, 0xC3, 0x2F, 0x01, 0x03, 0x64, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x4A, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xB2, 0x00, 0xB8, 0x00, 0xBE, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xDC, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xE0, 0x00, 0xE8, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x01, 0x0A, 0x01, 0x0E, 0x01, 0x12, 0x01, 0x1E, 0x01, 0x22, 0x01, 0x28, 0x01, 0x2C, 0x01, 0x32, 0x01, 0x36, 0x01, 0x44, 0x01, 0x50, 0x01, 0x5E, 0x01, 0x72, 0x01, 0x76, 0x01, 0x7A, 0x01, 0x80, 0x01, 0x88, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA0, 0x01, 0xA4, 0x01, 0xAA, 0x01, 0xB0, 0x01, 0xB4, 0x01, 0xBA, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xF6, 0x01, 0xFA, 0x01, 0x02, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4A, 0x02, 0x50, 0x02, 0x56, 0x02, 0x74, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8A, 0x02, 0x88, 0x02, 0x90, 0x02, 0x8E, 0x02, 0x94, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xB8, 0x02, 0xC0, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xD0, 0x02, 0xD4, 0x02, 0xE0, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF8, 0x02, 0xFC, 0x02, 0x06, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x28, 0x03, 0x30, 0x03, 0x2E, 0x03, 0x3C, 0x03, 0x4A, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x58, 0x03, 0x5E, 0x03, 0x66, 0x03, 0x6E, 0x03, 0x7A, 0x03, 0x86, 0x03, 0x8E, 0x03, 0x96, 0x03, 0xB2, 0x03, 0xB8, 0x03, 0xC6, 0x03, 0xCC, 0x03, 0xD4, 0x03, 0xDA, 0x03, 0xE8, 0x03, 0xF4, 0x03, 0xFC, 0x03, 0x04, 0x04, 0x20, 0x04, 0x2A, 0x04, 0x32, 0x04, 0x36, 0x04, 0x3E, 0x04, 0x44, 0x04, 0x42, 0x04, 0x48, 0x04, 0x4E, 0x04, 0x4C, 0x04, 0x54, 0x04, 0x52, 0x04, 0x5A, 0x04, 0x5E, 0x04, 0x62, 0x04, 0x68, 0x04, 0x74, 0x04, 0x7C, 0x04, 0x80, 0x04, 0x88, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA6, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xC0, 0x04, 0xCC, 0x04, 0xD8, 0x04, 0x2A, 0x05, 0x46, 0x05, 0x6C, 0x05, 0x00, 0x00};/* rvmalloc / rvfree copied from usbvideo.c * * Not sure why these are not yet non-statics which I can reference through * usbvideo.h the same as it is in 2.4.20. I bet this will get fixed sometime * in the future. * */static void *rvmalloc(unsigned long size){ void *mem; unsigned long adr; size = PAGE_ALIGN(size); mem = vmalloc_32(size); if (!mem) return NULL; memset(mem, 0, size); /* Clear the ram out, no junk to the user */ adr = (unsigned long) mem; while (size > 0) { SetPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; size -= PAGE_SIZE; } return mem;}static void rvfree(void *mem, unsigned long size){ unsigned long adr; if (!mem) return; adr = (unsigned long) mem; while ((long) size > 0) { ClearPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; size -= PAGE_SIZE; } vfree(mem);}struct vicam_camera { u16 shutter_speed; // capture shutter speed u16 gain; // capture gain u8 *raw_image; // raw data captured from the camera u8 *framebuf; // processed data in RGB24 format u8 *cntrlbuf; // area used to send control msgs struct video_device vdev; // v4l video device struct usb_device *udev; // usb device /* guard against simultaneous accesses to the camera */ struct semaphore cam_lock; int is_initialized; u8 open_count; u8 bulkEndpoint; int needsDummyRead;#if defined(CONFIG_VIDEO_PROC_FS) struct proc_dir_entry *proc_dir;#endif};static int vicam_probe( struct usb_interface *intf, const struct usb_device_id *id);static void vicam_disconnect(struct usb_interface *intf);static void read_frame(struct vicam_camera *cam, int framenum);static void vicam_decode_color(const u8 *, u8 *);static int __send_control_msg(struct vicam_camera *cam, u8 request, u16 value, u16 index, unsigned char *cp, u16 size){ int status; /* cp must be memory that has been allocated by kmalloc */ status = usb_control_msg(cam->udev, usb_sndctrlpipe(cam->udev, 0), request, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, cp, size, 1000); status = min(status, 0); if (status < 0) { printk(KERN_INFO "Failed sending control message, error %d.\n", status); } return status;}static int send_control_msg(struct vicam_camera *cam, u8 request, u16 value, u16 index, unsigned char *cp, u16 size){ int status = -ENODEV; down(&cam->cam_lock); if (cam->udev) { status = __send_control_msg(cam, request, value, index, cp, size); } up(&cam->cam_lock); return status;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -