📄 vicam.c
字号:
/* * USB ViCam WebCam driver * Copyright (c) 2002 Joe Burks (jburks@wavicle.org) * * 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 * */#include <linux/kernel.h>#include <linux/wrapper.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#ifndef MODULE_LICENSE#define MODULE_LICENSE(a)#endif#ifndef bool#define bool int#endif#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/* Version Information */#define DRIVER_VERSION "v1.0"#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/* 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};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 struct video_device vdev; // v4l video device struct usb_device *udev; // usb device struct semaphore busy_lock; // guard against SMP multithreading bool is_initialized; u8 open_count; u8 bulkEndpoint; bool needsDummyRead; u32 framebuf_size; // # of valid bytes in framebuf u32 framebuf_read_start; // position in frame buf that a read is happening at.#ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_entry;#endif};static void *vicam_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);static void vicam_disconnect(struct usb_device *dev, void *ptr);static void read_frame(struct vicam_camera *cam, int framenum);static intsend_control_msg(struct usb_device *udev, u8 request, u16 value, u16 index, unsigned char *cp, u16 size){ int status; // for reasons not yet known to me, you can't send USB control messages // with data in the module (if you are compiled as a module). Whatever // the reason, copying it to memory allocated as kernel memory then // doing the usb control message fixes the problem. unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL); memcpy(transfer_buffer, cp, size); status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), request, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value, index, transfer_buffer, size, HZ); kfree(transfer_buffer); if (status < 0) { printk(KERN_INFO "Failed sending control message, error %d.\n", status); } return status;}static intinitialize_camera(struct vicam_camera *cam){ struct usb_device *udev = cam->udev; int status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup1, sizeof (setup1))) < 0) return status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup2, sizeof (setup2))) < 0) return status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup3, sizeof (setup3))) < 0) return status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup4, sizeof (setup4))) < 0) return status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup5, sizeof (setup5))) < 0) return status; if ((status = send_control_msg(udev, 0xff, 0, 0, setup3, sizeof (setup3))) < 0) return status; return 0;}static intset_camera_power(struct vicam_camera *cam, int state){ int status; if ((status = send_control_msg(cam->udev, 0x50, state, 0, NULL, 0)) < 0) return status; if (state) { send_control_msg(cam->udev, 0x55, 1, 0, NULL, 0); } return 0;}static intvicam_ioctl(struct video_device *dev, unsigned int ioctlnr, void *arg)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -