📄 patch-linux-2.4.22-qcamvc-1.0.6
字号:
diff -urN -X dontdiff linux-2.4.22/CREDITS linux-2.4.22qcamvc/CREDITS--- linux-2.4.22/CREDITS 2003-08-28 19:26:06.000000000 +0200+++ linux-2.4.22qcamvc/CREDITS 2003-08-28 20:20:17.000000000 +0200@@ -689,6 +689,12 @@ S: D-69231 Rauenberg S: Germany +N: Daniele De Marchi+E: demarchidaniele@libero.it+W: sf.net/projects/usb-quickcam-vc+D: QuickCam VC driver+S: Italy+ N: Peter Denison E: peterd@pnd-pc.demon.co.uk W: http://www.pnd-pc.demon.co.uk/promise/diff -urN -X dontdiff linux-2.4.22/Documentation/Configure.help linux-2.4.22qcamvc/Documentation/Configure.help--- linux-2.4.22/Documentation/Configure.help 2003-08-28 19:26:06.000000000 +0200+++ linux-2.4.22qcamvc/Documentation/Configure.help 2003-08-28 20:21:53.000000000 +0200@@ -24107,6 +24107,32 @@ otherwise say N. This will not work with the Creative Webcam III. It is also available as a module (cpia_usb.o). +QuickCam VC Video For Linux+CONFIG_VIDEO_QCAMVC+ This is the video4linux driver for Connectix QuickCam VC cameras.+ If you have one of these cameras (PP or usb), say Y here and + select parallel port and/or USB lowlevel support below, + otherwise say N. + This will not work with any othen QuickCam camera( pro, color, etc).++ This driver is also available as a module (qcamvc.o).++QuickCam VC Parallel Port Lowlevel Support+CONFIG_VIDEO_QCAMVC_PP+ This is the lowlevel parallel port support for the Connectix + QuickCam VC. If you have the parallel port version of this camera,+ say Y here, otherwise say N. ++ It is also available as a module (qcamvc_pp.o).++QuickCam VC USB Lowlevel Support+CONFIG_VIDEO_QCAMVC_USB+ This is the lowlevel usb support for the Connectix QuickCam VC. + If you have the parallel port version of this camera,+ say Y here, otherwise say N. ++ It is also available as a module (qcamvc_usb.o).+ Mediavision Pro Movie Studio Video For Linux CONFIG_VIDEO_PMS Say Y if you have such a thing. This driver is also available as adiff -urN -X dontdiff linux-2.4.22/drivers/media/video/Config.in linux-2.4.22qcamvc/drivers/media/video/Config.in--- linux-2.4.22/drivers/media/video/Config.in 2003-08-28 19:26:10.000000000 +0200+++ linux-2.4.22qcamvc/drivers/media/video/Config.in 2003-08-28 20:26:32.000000000 +0200@@ -36,6 +36,17 @@ dep_tristate ' CPiA USB Lowlevel Support' CONFIG_VIDEO_CPIA_USB $CONFIG_VIDEO_CPIA $CONFIG_USB fi fi+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then+ dep_tristate ' QuickCam VC Video for Linux (EXPERIMENTAL)' CONFIG_VIDEO_QCAMVC $CONFIG_VIDEO_DEV+ if [ "$CONFIG_VIDEO_QCAMVC" != "n" ]; then+ if [ "$CONFIG_PARPORT_1284" != "n" ]; then+ dep_tristate ' QuickCam VC Parallel Port Lowlevel Support' CONFIG_VIDEO_QCAMVC_PP $CONFIG_VIDEO_QCAMVC $CONFIG_PARPORT+ fi+ if [ "$CONFIG_USB" != "n" ]; then+ dep_tristate ' QuickCam VC USB Lowlevel Support' CONFIG_VIDEO_QCAMVC_USB $CONFIG_VIDEO_QCAMVC $CONFIG_USB+ fi+ fi+fi dep_tristate ' SAA5249 Teletext processor' CONFIG_VIDEO_SAA5249 $CONFIG_VIDEO_DEV $CONFIG_I2C dep_tristate ' SAB3036 tuner' CONFIG_TUNER_3036 $CONFIG_VIDEO_DEV $CONFIG_I2C if [ "$CONFIG_EXPERIMENTAL" = "y" ]; thendiff -urN -X dontdiff linux-2.4.22/drivers/media/video/Makefile linux-2.4.22qcamvc/drivers/media/video/Makefile--- linux-2.4.22/drivers/media/video/Makefile 2003-08-28 19:26:10.000000000 +0200+++ linux-2.4.22qcamvc/drivers/media/video/Makefile 2003-08-28 20:17:40.000000000 +0200@@ -25,7 +25,7 @@ # All of the (potential) objects that export symbols. # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. -export-objs := i2c-old.o videodev.o bttv-if.o cpia.o+export-objs := i2c-old.o videodev.o bttv-if.o cpia.o qcamvc.o list-multi := bttv.o zoran.o bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o@@ -56,6 +56,9 @@ obj-$(CONFIG_VIDEO_CPIA) += cpia.o obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o+obj-$(CONFIG_VIDEO_QCAMVC) += qcamvc.o+obj-$(CONFIG_VIDEO_QCAMVC_PP) += qcamvc_pp.o+obj-$(CONFIG_VIDEO_QCAMVC_USB) += qcamvc_usb.o obj-$(CONFIG_VIDEO_MEYE) += meye.o obj-$(CONFIG_VIDEO_SWARM_7114H) += swarm_saa7114h.o obj-$(CONFIG_TUNER_3036) += tuner-3036.odiff -urN -X dontdiff linux-2.4.22/drivers/media/video/qcamvc.c linux-2.4.22qcamvc/drivers/media/video/qcamvc.c--- linux-2.4.22/drivers/media/video/qcamvc.c 1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.22qcamvc/drivers/media/video/qcamvc.c 2003-08-28 20:16:40.000000000 +0200@@ -0,0 +1,1466 @@+/*+ *+ * 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"+#ifdef CONFIG_KMOD+#include <linux/kmod.h>+#endif+#include <linux/proc_fs.h>+#include <linux/vmalloc.h>+#include <linux/wrapper.h>++#ifdef MODULE+MODULE_AUTHOR("De Marchi Daniele <demarchidaniele@libero.it>");+MODULE_DESCRIPTION("V4L-driver for QuickCam VC cameras");+MODULE_LICENSE("GPL");+MODULE_SUPPORTED_DEVICE("video");+#endif++#ifdef CONFIG_VIDEO_QCAMVC_PP+extern int qcamvc_pp_init(void);+#endif+#ifdef CONFIG_VIDEO_QCAMVC_USB+extern int qcamvc_usb_init(void);+#endif+++static long qcamvc_vread(struct video_device *dev, char *buf, unsigned long count, int noblock);+static long qcamvc_vwrite(struct video_device *dev, const char *buf, unsigned long count, int noblock);+static int qcamvc_vioctl(struct video_device *dev, unsigned int cmd, void *arg);+static int qcamvc_vopen(struct video_device *dev, int flags);+static void qcamvc_vclose(struct video_device *dev);+static int qcamvc_init_done(struct video_device *dev);+#ifdef USE_MMAP+static int qcamvc_vmmap(struct video_device *dev, const char *adr, unsigned long size);+#endif++static struct video_device qcamvc_template = {+ name: "QuickCam VC",+ type: VID_TYPE_CAPTURE,+ hardware: VID_HARDWARE_QCAM_C,+ open: qcamvc_vopen,+ close: qcamvc_vclose,+ read: qcamvc_vread,+ write: qcamvc_vwrite,+ ioctl: qcamvc_vioctl,+ initialize: qcamvc_init_done,+#ifdef USE_MMAP+ mmap: qcamvc_vmmap,+#endif+};++/*****************************************************************************/+/* */+/* QuickCam Video CODEC */+/* */+/*****************************************************************************/+static void hue_reg(struct qcamvc *qcamvc)+{+ float a,b;+ int cnt;+ + if (qcamvc->hue_calc == 1) return;+ + a = (qcamvc->blue_hue * 1.12) / 128;+ b = (qcamvc->red_hue * 1.39999999999) / 128; ++ for (cnt = 0 ; cnt < 0xff ; cnt++)+ {+ qcamvc->table_a[cnt] = (float) cnt * b;+ qcamvc->table_b[cnt] = (float) cnt * a;+ + if(qcamvc->table_a[cnt] > 0xff) qcamvc->table_a[cnt] = 0xff; if(qcamvc->table_a[cnt] < 0 ) qcamvc->table_a[cnt] = 0;+ if(qcamvc->table_b[cnt] > 0xff) qcamvc->table_b[cnt] = 0xff; if(qcamvc->table_b[cnt] < 0 ) qcamvc->table_b[cnt] = 0;+ }+ + a = qcamvc->santrast / 100;+ + qcamvc->VAR_A = a * 1.731999999999999;+ qcamvc->VAR_B = a * 0.336;+ qcamvc->VAR_C = a * 0.697999999999999;+ qcamvc->VAR_D = a * 1.370999999999999;+ + qcamvc->hue_calc = 1;+}++static void get_pixel(struct qcamvc *qcamvc, float pix_a, float pix_b, unsigned char pix_c, \+ unsigned char pix_d, float pix_e, \+ unsigned char *pred, unsigned char *pgreen, unsigned char *pblue)+{+ + float a,b;+ float blue,green,red;++ a = pix_b - qcamvc->table_a[pix_c];+ b = qcamvc->table_b[pix_d] - pix_e;+ + if(pix_a >= 0) {if(pix_a > 0xff) {pix_a = 0xff;}} else {pix_a = 0;}+ if(a <= 112) {if(a < -112) {a = -112;}} else {a = 112;}+ if(b <= 112) {if(b < -112) {b = -112;}} else {b = 112;}+ + blue = ( b * qcamvc->VAR_A ) + pix_a;+ green = ( a * qcamvc->VAR_C ) - (( b * qcamvc->VAR_B) - pix_a );+ red = ( a * qcamvc->VAR_D ) + pix_a;+ + if(red >= 0) {if(red > 0xff) red = 0xff;} else {red = 0;}+ if(green >= 0) {if(green > 0xff) green = 0xff;} else {green = 0;} + if(blue >= 0) {if(blue > 0xff) blue = 0xff;} else {blue = 0;}+ + *pred = (unsigned char) red; + *pgreen = (unsigned char) green; + *pblue = (unsigned char) blue;+ +}+++static void codec(struct qcamvc *qcamvc, unsigned char *inbuf, unsigned char *outbuf)+{+ int width=qcamvc->width;+ int height=qcamvc->height;+ unsigned char red=0, green=0, blue=0;+ int x,y;+ unsigned char pix1, pix2, pix3, pix4;+ unsigned char *pointer1, *pointer2;+ unsigned char *table = (unsigned char *) kmalloc(width * height, GFP_KERNEL);+ unsigned char *pointer_last_line =(unsigned char *) kmalloc(width, GFP_KERNEL);++ pointer1 = inbuf;+ pointer2 = table;+ + for (y = 0 ; y < height ; y ++ ){+ for (x = width - 1 ; x >= 0 ; x--){+ *(pointer2 + x) = *(pointer1);+ pointer1 ++;+ }+ pointer2 = pointer2 + width;+ }+ + pointer1 = inbuf;+ pointer2 = (outbuf + qcamvc->width * qcamvc->height * 3) - 1;+ if (qcamvc->hue_calc == 0 ) hue_reg(qcamvc);+ memcpy( pointer_last_line, pointer1, width);+ for(y = 0 ; y < height ; y++) { + if (current->need_resched) schedule();+ + if((y & 1) == 0) { + for (x = 0 ; x < width ; x++){+ if((x & 1) != 0) {+ pix1 = (( *(width + pointer1)) + (*(x + pointer_last_line))) / 2; + pix2 = (((*(width + pointer1 + 1)) + (*(x + pointer_last_line)) )) / 2 ; + pix3 = *pointer1;+ pix4 = *(pointer1 + 1); + } else { + pix1 = ((*(width + pointer1 + 1)) + (*(x + 1 + pointer_last_line))) / 2;+ pix2 = ((*(width + pointer1)) + (*(x + pointer_last_line))) / 2; + pix3 = *(pointer1 + 1);+ pix4 = *pointer1; + } + get_pixel(qcamvc, (pix4 + pix3) / 2, pix4, pix3, pix1, pix2, &blue, &green, &red);+ (unsigned char)*(pointer2) = blue; + (unsigned char)*(pointer2 - 1) = green; + (unsigned char)*(pointer2 - 2) = red; + pointer2-=3;+ pointer1++; + } + } else {++ for (x = 0 ; x < width ; x++){+ if((x & 1) != 0) {+ pix3 = (*(width + pointer1) + *(x + pointer_last_line)) / 2; + pix4 = (*(width + pointer1 + 1) + *(x + 1 + pointer_last_line)) / 2; + pix1 = *pointer1 & 0xff;+ pix2 = *(pointer1 + 1); + } else { + pix3 = (*(width + pointer1 + 1) + *(x + 1 + pointer_last_line)) / 2;+ pix4 = (*(width + pointer1) + *(x + pointer_last_line)) / 2;+ pix1 = *(pointer1 + 1);+ pix2 = *pointer1;+ } + get_pixel(qcamvc, (pix1 + pix2) / 2, pix4, pix3, pix1, pix2, &blue, &green, &red);+ (unsigned char)*(pointer2) = blue; + (unsigned char)*(pointer2 - 1) = green; + (unsigned char)*(pointer2 - 2) = red; + pointer2-=3;+ pointer1++;+ } + }+ memcpy(pointer_last_line, pointer1 - width, width);+ } + kfree(table);+ kfree(pointer_last_line);+}++static void qcamvc_set_topmost_row(struct qcamvc *qcamvc, unsigned char val)+{+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_TOPMOST_ROW, &val, sizeof(val));+}++static void qcamvc_set_bottommost_row(struct qcamvc *qcamvc, unsigned char val)+{+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_BOTTOMMOST_ROW, &val, sizeof(val));+}++static void qcamvc_set_leftmost_column(struct qcamvc *qcamvc, unsigned char val)+{+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_LEFTMOST_COLUMN, &val, sizeof(val));+}++static void qcamvc_set_rightmost_column(struct qcamvc *qcamvc, unsigned char val)+{+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_RIGHTMOST_COLUMN, &val, sizeof(val));+}++static void qcamvc_set_exposure(struct qcamvc *qcamvc, unsigned char val)+{+ unsigned char buffer[2];+ GET_VALUES(buffer,val);+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_EXPOSURE, buffer, sizeof(buffer));+ if(qcamvc->streaming) qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_GET_FRAME, NULL, 0);+}++static void qcamvc_set_brightness(struct qcamvc *qcamvc, unsigned char val)+{+ short i,j;+ unsigned char buffer[21]={+ 0x58, 0xd8, 0x58, 0xd8, 0x58,+ 0xd8, 0x58, 0xd8, 0x58, 0xd8,+ 0x58, 0xd8, 0x58, 0xd8, 0x58,+ 0xd8, 0x58, 0xd8, 0x58, 0xd8, 0x5c};++ for(i=1, j=18 ; i<=0x80 ; i*=2 , j-=2)+ {+ if( val & i) {+ buffer[j] = buffer[j] | 1;+ buffer[j+1] = buffer[j+1] | 1;}+ }++ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_BRIGHTNESS, buffer, sizeof(buffer));+ if(qcamvc->streaming) qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_GET_FRAME, NULL, 0);+}++static int bpc6_init(struct qcamvc *qcamvc)+{+ int ret=0;+ long i,q;+ unsigned char buffer[0x40];+ unsigned char *bigbuffer;++ FIRST_ROW; LAST_ROW;+ FIRST_COL; LAST_COL;+ MUL_FACTOR;++ bigbuffer=kmalloc(BIGBUFFER_SIZE , GFP_KERNEL);+ if (bigbuffer==NULL) + {+ printk("QuickCam VC: Init bigbuffer kmalloc error.\n");+ return -1;+ }+ + for(i=0; i<BIGBUFFER_SIZE ; i+=2)+ {+ q=i;+ *(bigbuffer + i ) = (unsigned char )(q >> 11);+ *(bigbuffer + i + 1) = (unsigned char) 0xc0;+ }++ buffer[0]=0x78; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+ buffer[0]=0x58; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+ buffer[0]=0x18; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);++ qcamvc_set_topmost_row (qcamvc, 0x0e);+ qcamvc_set_leftmost_column (qcamvc, 0x0f);+ qcamvc_set_bottommost_row (qcamvc, 0x86);+ qcamvc_set_rightmost_column(qcamvc, 0xaf);++ qcamvc_set_brightness(qcamvc, qcamvc->brightness);++ buffer[0]=0x7f;buffer[1]=0x81;+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x02, buffer, 2);++ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);+ qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0d, bigbuffer, BIGBUFFER_SIZE);+ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);++ buffer[0]=0x01; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0e, buffer, 1);+ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+ buffer[0]=0x78; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);+ buffer[0]=0x00; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, QCAM_VC_SET_MISC, buffer, 1);+ buffer[0]=0x58; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0f, buffer, 1);++ qcamvc_set_brightness(qcamvc, qcamvc->brightness);+ qcamvc_set_exposure(qcamvc, qcamvc->exposure);++ buffer[0]=0x11; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0a, buffer, 1);+ buffer[0]=0x11; qcamvc->ops->qcamvc_set_reg(qcamvc->lowlevel_data, 0x0a, buffer, 1);++ qcamvc_set_topmost_row (qcamvc, firstrow[qcamvc->res]);+ qcamvc_set_leftmost_column (qcamvc, firstcolumn[qcamvc->res]);+ qcamvc_set_bottommost_row (qcamvc, lastrow[qcamvc->res]);+ qcamvc_set_rightmost_column(qcamvc, lastcolumn[qcamvc->res]);+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -