📄 patch-linux-2.4.22-qcamvc-1.0.6
字号:
+struct qcamvc {+ struct qcamvc **previous;+ struct qcamvc *next;++ struct video_device vdev;+ void *lowlevel_data;+ struct qcamvc_camera_ops *ops;++ struct semaphore busy;+ int open_count;+ int streaming;++ size_t packet_len;+ + /* Video structure */+ struct video_picture vpic;+ struct video_capability vcap;+ struct video_channel vchan;+#ifdef USE_MMAP+ u8 *frame_buf;+ struct qcamvc_frame frame[QUICKCAM_NUMFRAMES];+ unsigned int current_frame;+#endif+ int res;+ struct proc_dir_entry *proc_entry;+ char *camtype;+ + /* Video configuration */+ int width;+ int height;+ int bpc;+ unsigned char brightness;+ unsigned char exposure;++ /* Codec */+ float blue_hue;+ float red_hue;+ float santrast;+ float hue_calc;+ float VAR_A,VAR_B,VAR_C,VAR_D;+ float table_a[0xFF],table_b[0xFF];+ + +};++#ifdef USE_MMAP+int capture_frame(struct qcamvc *qcamvc, struct video_mmap *vm);+static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr);+static inline unsigned long kvirt_to_pa(unsigned long adr);+static int allocate_frame_buf(struct qcamvc *qcamvc);+static int free_frame_buf(struct qcamvc *qcamvc);+static void rvfree(void *mem, unsigned long size);+static void *rvmalloc(unsigned long size);+#endif++struct qcamvc *qcamvc_register_camera(struct qcamvc_camera_ops *ops, void *lowlevel, char *camtype);+void qcamvc_unregister_camera(struct qcamvc *qcamvc);++/* Video Layer */+/* void qcamvc_video_init(struct qcamvc *qcamvc); */+++enum { R160x120, R176x144, R320x240, R352x288 };+#define FIRST_ROW unsigned char firstrow[4]= { 0x0e, 0x02, 0x0e, 0x02 }+#define LAST_ROW unsigned char lastrow[4]= { 0x86, 0x92, 0x86, 0x92 }+#define FIRST_COL unsigned char firstcolumn[4]= { 0x0f, 0x07, 0x0f, 0x07 }+#define LAST_COL unsigned char lastcolumn[4]= { 0xaf, 0xb7, 0xaf, 0xb7 }+#define MUL_FACTOR unsigned char mulfactor[4]= { 0x13, 0x13, 0x11, 0x11 }+#define ISO_LEN size_t iso_len[2][4]= {{ 0xe140, 0x12940, 0xe140, 0x12940 }, \+ { 0xe140, 0x12940, 0xe140, 0x12940 }}+++#define MAX_PACKET_SIZE 0x12940+#define MAX_PACKETS 1+++/* When i will found the function i'll substitute this amount of data */+#define GET_VALUES(buffer,val)\+ {\+ unsigned char exposure_values[256][2]={\+ {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01},\+ {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01},\+ {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01},\+ {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x25,0x01}, {0x24,0x01}, {0x24,0x01}, {0x24,0x01}, {0x24,0x01},\+ {0x24,0x01}, {0x24,0x01}, {0x24,0x01}, {0x24,0x01}, {0x24,0x01}, {0x24,0x01}, {0x23,0x01}, {0x23,0x01},\+ {0x23,0x01}, {0x23,0x01}, {0x23,0x01}, {0x23,0x01}, {0x22,0x01}, {0x22,0x01}, {0x22,0x01}, {0x22,0x01},\+ {0x22,0x01}, {0x21,0x01}, {0x21,0x01}, {0x21,0x01}, {0x21,0x01}, {0x21,0x01}, {0x20,0x01}, {0x20,0x01},\+ {0x20,0x01}, {0x1f,0x01}, {0x1f,0x01}, {0x1f,0x01}, {0x1e,0x01}, {0x1e,0x01}, {0x1e,0x01}, {0x1d,0x01},\+ {0x1d,0x01}, {0x1c,0x01}, {0x1c,0x01}, {0x1c,0x01}, {0x1b,0x01}, {0x1b,0x01}, {0x1a,0x01}, {0x19,0x01},\+ {0x19,0x01}, {0x18,0x01}, {0x18,0x01}, {0x17,0x01}, {0x16,0x01}, {0x16,0x01}, {0x16,0x01}, {0x15,0x01},\+ {0x14,0x01}, {0x13,0x01}, {0x12,0x01}, {0x12,0x01}, {0x11,0x01}, {0x10,0x01}, {0x0f,0x01}, {0x0e,0x01},\+ {0x0c,0x01}, {0x0b,0x01}, {0x0a,0x01}, {0x09,0x01}, {0x07,0x01}, {0x06,0x01}, {0x05,0x01}, {0x03,0x01},\+ {0x02,0x01}, {0x00,0x01}, {0xfe,0x00}, {0xfd,0x00}, {0xfb,0x00}, {0xf9,0x00}, {0xf7,0x00}, {0xf5,0x00},\+ {0xf2,0x00}, {0xf0,0x00}, {0xee,0x00}, {0xeb,0x00}, {0xe8,0x00}, {0xe6,0x00}, {0xe3,0x00}, {0xe0,0x00},\+ {0xdd,0x00}, {0xd9,0x00}, {0xd6,0x00}, {0xd3,0x00}, {0xcf,0x00}, {0xcb,0x00}, {0xc7,0x00}, {0xc3,0x00},\+ {0xbe,0x00}, {0xba,0x00}, {0xb5,0x00}, {0xb0,0x00}, {0xaa,0x00}, {0xa5,0x00}, {0x9f,0x00}, {0x99,0x00},\+ {0x93,0x00}, {0x8c,0x00}, {0x86,0x00}, {0x7f,0x00}, {0x77,0x00}, {0x6f,0x00}, {0x67,0x00}, {0x5f,0x00},\+ {0x56,0x00}, {0x4d,0x00}, {0x43,0x00}, {0x39,0x00}, {0x2e,0x00}, {0x23,0x00}, {0x18,0x00}, {0x0c,0x00},\+ {0x27,0x01}, {0x34,0x01}, {0x41,0x01}, {0x4f,0x01}, {0x5e,0x01}, {0x6e,0x01}, {0x7e,0x01}, {0x8f,0x01},\+ {0xa1,0x01}, {0xb3,0x01}, {0xc6,0x01}, {0xdb,0x01}, {0xf0,0x01}, {0x06,0x02}, {0x1d,0x02}, {0x34,0x02},\+ {0x43,0x02}, {0x68,0x02}, {0x83,0x02}, {0x9f,0x02}, {0xbd,0x02}, {0xdc,0x02}, {0xfd,0x02}, {0x1f,0x03},\+ {0x42,0x03}, {0x67,0x03}, {0x8d,0x03}, {0xb6,0x03}, {0xe0,0x03}, {0x0c,0x04}, {0x3a,0x04}, {0x96,0x04},\+ {0x9c,0x04}, {0xd0,0x04}, {0x06,0x05}, {0x3f,0x05}, {0x7b,0x05}, {0xb9,0x05}, {0xfa,0x05}, {0x3e,0x06},\+ {0x84,0x06}, {0xce,0x06}, {0x1b,0x07}, {0x6c,0x07}, {0xc0,0x07}, {0x18,0x08}, {0x74,0x08}, {0xd3,0x08},\+ {0x38,0x09}, {0xa0,0x09}, {0x0d,0x0a}, {0x7f,0x0a}, {0xf6,0x0a}, {0x72,0x0b}, {0xf4,0x0b}, {0x7c,0x0c},\+ {0x09,0x0d}, {0x9d,0x0d}, {0x37,0x0e}, {0xd8,0x0e}, {0x81,0x0f}, {0x30,0x10}, {0xe8,0x10}, {0xa7,0x11},\+ {0x70,0x12}, {0x40,0x13}, {0x1b,0x14}, {0xff,0x14}, {0xed,0x15}, {0xe5,0x16}, {0xe9,0x17}, {0xf8,0x18},\+ {0x13,0x1a}, {0x3a,0x1b}, {0x6f,0x1c}, {0xb1,0x1d}, {0x02,0x1f}, {0x61,0x20}, {0x40,0x21}, {0x4f,0x23},\+ {0xe0,0x24}, {0x81,0x26}, {0x36,0x28}, {0xfe,0x29}, {0xda,0x2b}, {0xcb,0x2d}, {0xd2,0x2f}, {0xf0,0x31},\+ {0x26,0x34}, {0x75,0x36}, {0xde,0x38}, {0x63,0x3b}, {0x04,0x3e}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f},\+ {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f},\+ {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}, {0xff,0x3f}\+ };\+ buffer[0]=exposure_values[val][0];\+ buffer[1]=exposure_values[val][1];\+ }+++#define DUMP_BUFFER(buffer) \+ {\+ unsigned long cnta,cntb;\+ if (buffer!=NULL)\+ { \+ for (cnta=0,cntb=0; cnta<((sizeof(buffer)<0x60)?sizeof(buffer):0x60);cnta++,cntb++) \+ {\+ if(cntb == 0x10) {printk("\n"); cntb=0;}\+ printk (" %02x ", *((unsigned char *)buffer + cnta ));\+ }\+ printk("\n");\+ } \+ }+ +#define ADD_TO_LIST(l, drv) \+ {\+ lock_kernel();\+ (drv)->next = l;\+ (drv)->previous = &(l);\+ (l) = drv;\+ unlock_kernel();\+ } while(0)++#define REMOVE_FROM_LIST(drv) \+ {\+ if ((drv)->previous != NULL) {\+ lock_kernel();\+ if ((drv)->next != NULL)\+ (drv)->next->previous = (drv)->previous;\+ *((drv)->previous) = (drv)->next;\+ (drv)->previous = NULL;\+ (drv)->next = NULL;\+ unlock_kernel();\+ }\+ } while (0)+++#define ALOG(lineno,fmt,args...) printk(fmt,lineno,##args)+#define LOG(fmt,args...) ALOG((__LINE__),KERN_INFO __FILE__":"__FUNCTION__"(%d):"fmt,##args)++#ifdef CAM_DEBUG+#define CAM__DBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args)+#define CAM_DBG(fmt,args...) CAM__DBG((__LINE__),KERN_DEBUG __FILE__"(%ld):"__FUNCTION__"(%d):"fmt,##args)+#else+#define CAM_DBG(fmn,args...) do {} while(0)+#endif++#ifdef PP_DEBUG+#define PP__DBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args)+#define PP_DBG(fmt,args...) PP__DBG((__LINE__),KERN_DEBUG __FILE__"(%ld):"__FUNCTION__"(%d):"fmt,##args)+#else+#define PP_DBG(fmn,args...) do {} while(0)+#endif++#ifdef USB_DEBUG+#define USB__DBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args)+#define USB_DBG(fmt,args...) USB__DBG((__LINE__),KERN_DEBUG __FILE__"(%ld):"__FUNCTION__"(%d):"fmt,##args)+#else+#define USB_DBG(fmn,args...) do {} while(0)+#endif++#ifdef V4L_DEBUG+#define V4L__DBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args)+#define V4L_DBG(fmt,args...) V4L__DBG((__LINE__),KERN_DEBUG __FILE__"(%ld):"__FUNCTION__"(%d):"fmt,##args)+#else+#define V4L_DBG(fmn,args...) do {} while(0)+#endifdiff -urN -X dontdiff linux-2.4.22/drivers/media/video/qcamvc_pp.c linux-2.4.22qcamvc/drivers/media/video/qcamvc_pp.c--- linux-2.4.22/drivers/media/video/qcamvc_pp.c 1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.22qcamvc/drivers/media/video/qcamvc_pp.c 2003-08-28 20:16:40.000000000 +0200@@ -0,0 +1,426 @@+/*+ *+ * Connectix USB QuickCam VC Video Camera driver+ *+ * (C) Copyright 2001 De Marchi Daniele+ *+ * 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.+ *+ * Jan 2001 This driver develop started on the linux + * kernel 2.4.0.+ *+ */++#include "qcamvc.h"+#include <linux/parport.h>+#include <linux/delay.h>+#include <linux/smp_lock.h>++static struct qcamvc *cam_list;++struct pp_cam_entry{+ struct parport *port;+ struct pardevice *pdev;+ + wait_queue_head_t wq_stream;++ int open_count;+};+++/* Magic numbers for defining port-device mappings */+#define QCAMVC_PARPORT_UNSPEC -4+#define QCAMVC_PARPORT_AUTO -3+#define QCAMVC_PARPORT_OFF -2+#define QCAMVC_PARPORT_NONE -1++#ifdef MODULE+static int parport_nr[PARPORT_MAX] = {[0 ... PARPORT_MAX - 1] = QCAMVC_PARPORT_UNSPEC};+static char *parport[PARPORT_MAX] = {NULL,};+MODULE_AUTHOR("De Marchi Daniele <demarchidaniele@libero.it>");+MODULE_DESCRIPTION("Connectix QuickCam VC(PP) Driver");+MODULE_PARM(parport, "1-" __MODULE_STRING(PARPORT_MAX) "s");+MODULE_PARM_DESC(parport, "'auto' or a list of parallel port numbers. Just like lp.");+#else+static int parport_nr[PARPORT_MAX] __initdata =+ {[0 ... PARPORT_MAX - 1] = QCAMVC_PARPORT_UNSPEC};+static int parport_ptr = 0;+#endif++/*****************************************************************************/+/* */+/* Lowlevel driver for Connectix QuickCam VC(PP) */+/* */+/*****************************************************************************/+static int qcamvc_open(void *privdata);+static int qcamvc_close(void *privdata);+static size_t qcamvc_get_reg(void *privdata, unsigned char reg, void *buffer, size_t len);+static int qcamvc_set_reg(void *privdata, unsigned char reg, void *buffer, size_t len);+static size_t qcamvc_read(void *privdata, void *buffer, size_t len);+static int qcamvc_write(void *privdata, void *buffer, size_t len);+static int qcamvc_stream_start(void *privdata);+static int qcamvc_stream_stop(void *privdata);+static size_t qcamvc_stream_read(void *privdata, void *buffer, size_t len);++static struct qcamvc_camera_ops qcamvc_pp_ops = {+ qcamvc_open,+ qcamvc_close,+ qcamvc_write,+ qcamvc_read,+ qcamvc_set_reg,+ qcamvc_get_reg,+ qcamvc_stream_start,+ qcamvc_stream_stop,+ qcamvc_stream_read+};++static int qcamvc_open(void *privdata)+{+ struct pp_cam_entry *cam = privdata;+ size_t ret=0;++ parport_claim_or_block(cam->pdev);+ parport_enable_irq(cam->port);+ mdelay(10);++ MOD_INC_USE_COUNT;+ return ret;+}+++static int qcamvc_close(void *privdata)+{+ struct pp_cam_entry *cam = privdata;+ size_t ret=0;++ parport_release(cam->pdev);+ parport_disable_irq(cam->port);+ mdelay(10);++ MOD_DEC_USE_COUNT;+ return ret;+}++static int qcamvc_stream_start(void *privdata)+{+ int ret = 0;+ return ret;+}++static int qcamvc_stream_stop(void *privdata)+{+ int ret = 0;+ return ret;+}++static size_t qcamvc_stream_read(void *privdata, void *buffer, size_t len)+{+ struct pp_cam_entry *cam = privdata;+ struct parport *parport = cam->port;+ size_t ret=0;+ unsigned char a = 0;+ unsigned long counter=0;+ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_write_data (parport, (void *) &a, 1, 0);+ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }++ for (counter=0;counter<len;counter++)+ {+ if (current->need_resched) schedule();+ parport_ieee1284_ecp_read_data(parport, buffer + counter, 1, 0);+ }+ return ret=len;+}++static size_t qcamvc_read(void *privdata, void *buffer, size_t len)+{+ struct pp_cam_entry *cam = privdata;+ struct parport *parport = cam->port;+ size_t ret=0;+ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_read_data (parport, buffer, len, 0);++ return ret = len;+}++static int qcamvc_write(void *privdata, void *buffer, size_t len)+{+ struct pp_cam_entry *cam = privdata;+ struct parport *parport = cam->port; + int ret=0;+ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_write_data (parport, buffer, len, 0);++ return ret = len;+}++static int qcamvc_set_reg(void *privdata, unsigned char reg, void *buffer, size_t len)+{+ struct pp_cam_entry *cam = privdata;+ struct parport *parport = cam->port;+ int ret=0;++ if(parport_negotiate(cam->port, IEEE1284_ADDR | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC:WCN1 ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_write_addr(parport, ®, 1, 0);++ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_write_data (parport, buffer, len, 0);+ return ret = len;+}++static size_t qcamvc_get_reg(void *privdata, unsigned char reg, void *buffer, size_t len)+{+ struct pp_cam_entry *cam = privdata;+ struct parport *parport = cam->port;++ if(parport_negotiate(cam->port, IEEE1284_ADDR | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC:WCN1 ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_write_addr(parport, ®, 1, 0);++ if(parport_negotiate(parport, IEEE1284_DATA | IEEE1284_MODE_ECP) != 0)+ {+ printk(KERN_INFO "QuickCamVC: ieee1284 failed negotiation\n");+ return -1;+ }+ parport_ieee1284_ecp_read_data (parport, buffer, len, 0);+ return len;+}++static int qcamvc_pp_close(void *privdata)+{+ s
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -