patch-linux-2.4.22-qcamvc-1.0.6
来自「VC编写的USB QuickCam驱动程序,实现四种视频格式在linux下的编码」· 6 代码 · 共 2,111 行 · 第 1/5 页
6
2,111 行
+ up(&qcamvc->busy);+ return -EFAULT;+ }+ + if (vm.frame<0||vm.frame>QUICKCAM_NUMFRAMES)+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + if (vm.format != VIDEO_PALETTE_YUV422)+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + if (qcamvc->frame[vm.frame].state == FRAME_UNUSED)+ {+ up(&qcamvc->busy);+ return capture_frame(qcamvc, &vm);+ }+ }+#else /* USE_MMAP */ + case VIDIOCGMBUF:+ case VIDIOCSYNC:+ case VIDIOCMCAPTURE:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+#endif/* USE_MMAP */+ + /* No overlay support */+ case VIDIOCCAPTURE:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + case VIDIOCSFBUF:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }++ case VIDIOCGFBUF:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + case VIDIOCKEY:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ /* No tuner interface */+ case VIDIOCGTUNER:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }++ case VIDIOCSTUNER:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + case VIDIOCGFREQ:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + case VIDIOCSFREQ:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + /* No audio interface */+ case VIDIOCGAUDIO:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + case VIDIOCSAUDIO:+ {+ up(&qcamvc->busy);+ return -EINVAL;+ }+ + default:+ {+ up(&qcamvc->busy);+ return -ENOIOCTLCMD;+ }+ }+ up(&qcamvc->busy);+ return 0;+}+++static int qcamvc_vopen(struct video_device *dev, int flags)+{+ struct qcamvc *qcamvc = dev->priv;+#ifdef DBG_CAM+ printk("USB QuickCam Open:\n");+#endif++#ifdef USE_MMAP+ /* Set the frames */+ qcamvc->current_frame = 0;+ for (i = 0; i < QUICKCAM_NUMFRAMES; i++) {+ qcamvc->frame[i].state = FRAME_UNUSED;+ qcamvc->frame[i].data = NULL;+ }+#endif+ qcamvc->ops->qcamvc_open(qcamvc->lowlevel_data);+ qcamvc->open_count++;+ return 0;+}+++static void qcamvc_vclose(struct video_device *dev)+{+ struct qcamvc *qcamvc = dev->priv;+#ifdef USE_MMAP+ free_frame_buf(qcamvc);+#endif + qcamvc->ops->qcamvc_close(qcamvc->lowlevel_data);+ qcamvc->open_count--;+ + +}++/*****************************************************************************/+/* */+/* QuickCam Video Camera layer */+/* This layer want be indipendent from the camera structure (PP/USB) */+/* */+/*****************************************************************************/+static void qcamvc_video_init(struct qcamvc *qcamvc)+{+ if (qcamvc == NULL)+ return;++ /* Set the video capability */+ memset(&qcamvc->vcap, 0, sizeof(struct video_capability));+ strcpy(qcamvc->vcap.name, qcamvc->camtype);++ qcamvc->vcap.type = VID_TYPE_CAPTURE;+ qcamvc->vcap.channels = 1;+ qcamvc->vcap.audios = 0;+ qcamvc->vcap.maxwidth = MAX_WIDTH;+ qcamvc->vcap.maxheight = MAX_HEIGHT;+ qcamvc->vcap.minwidth = MIN_WIDTH;+ qcamvc->vcap.minheight = MIN_HEIGHT;+ qcamvc->res = R352x288;++ /* Set the video channel structure */+ memset(&qcamvc->vchan, 0, sizeof(struct video_channel));+ qcamvc->vchan.flags = 0;+ qcamvc->vchan.tuners = 0;+ qcamvc->vchan.channel = 0;+ qcamvc->vchan.type = VIDEO_TYPE_CAMERA;+ strcpy(qcamvc->vchan.name, "Camera");++ /* Set the video picture structure */+ memset(&qcamvc->vpic, 0, sizeof(struct video_picture));++ qcamvc->bpc=bpc6;+ qcamvc->brightness = 175;+ qcamvc->exposure = 150;+ qcamvc->hue_calc = 0;+ qcamvc->blue_hue = 132;+ qcamvc->red_hue = 52;+ qcamvc->santrast = 50;++ qcamvc->vpic.colour = qcamvc->santrast * 0xff;+ qcamvc->vpic.hue = qcamvc->red_hue * 0xff;+ qcamvc->vpic.brightness = qcamvc->brightness * 0xff;+ qcamvc->vpic.contrast = qcamvc->blue_hue * 0xff;+ qcamvc->vpic.whiteness = qcamvc->exposure * 0xff;+ qcamvc->vpic.depth = 24;+ qcamvc->vpic.palette = VIDEO_PALETTE_RGB24;+ + init_MUTEX(&qcamvc->busy);++ memcpy(&qcamvc->vdev, &qcamvc_template, sizeof(qcamvc_template));+ qcamvc->vdev.priv = qcamvc;++#if LINUX_VERSION_CODE >= 0x020405+ if (video_register_device(&qcamvc->vdev, VFL_TYPE_GRABBER, -1) == -1) {+#else+ if (video_register_device(&qcamvc->vdev, VFL_TYPE_GRABBER) == -1) {+#endif+ printk("Quickcam VC: video_register_device failed.\n"); + memset (qcamvc, 0, sizeof(struct qcamvc));+ }++ qcamvc_camera_init(qcamvc);+}++struct qcamvc *qcamvc_register_camera(struct qcamvc_camera_ops *ops, void *lowlevel, char *camtype)+{+ struct qcamvc *qcamvc;++ if ((qcamvc = kmalloc(sizeof(struct qcamvc), GFP_KERNEL)) == NULL) {+ printk("QuickCam VC:Error allocating memory in qcamvc_register_camera\n");+ return NULL;+ }+ qcamvc->lowlevel_data = lowlevel;+ qcamvc->ops = ops;+ qcamvc->open_count = 0;+ qcamvc->camtype=kmalloc(strlen(camtype), GFP_KERNEL);+ strcpy(qcamvc->camtype, camtype);++ qcamvc_video_init(qcamvc);+ MOD_INC_USE_COUNT;+ printk("Camera sucessfull registered\n");+ return qcamvc;+}++void qcamvc_unregister_camera(struct qcamvc *qcamvc)+{+ if (!qcamvc->open_count){+ #if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)+ destroy_proc_qcamvc (qcamvc); + #endif+ printk("QuickCam VC: unregistering video\n");+ video_unregister_device(&qcamvc->vdev);+ kfree(qcamvc->camtype);+ qcamvc->camtype=NULL;+ } else {+ qcamvc->ops=NULL;+ }++ if(!qcamvc->open_count){+ kfree(qcamvc);+ }+ MOD_DEC_USE_COUNT;+}++/*****************************************************************************/+/* */+/* QuickCam Video Camera layer */+/* Module subs */+/* */+/*****************************************************************************/++static int __init qcamvc_driver_init(void)+{+ printk("QuickCam VC: (C) 2001 by De Marchi Daniele, <demarchidaniele@libero.it>\n");+ printk("QuickCam VC: v4l level driver version %s registered.\n",QCAMVCVERSION);+#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)+ proc_qcamvc_create();+#endif++#ifdef CONFIG_KMOD+#ifdef CONFIG_VIDEO_QCAMVC_USB_MODULE+ request_module("qcamvc_usb");+#endif+#ifdef CONFIG_VIDEO_QCAMVC_PP_MODULE+ request_module("qcamvc_pp");+#endif+#endif++#ifdef CONFIG_VIDEO_QCAMVC_PP+ qcamvc_pp_init();+#endif+#ifdef CONFIG_VIDEO_QCAMVC_USB+ qcamvc_usb_init();+#endif+++return 0;+}++static void __exit qcamvc_driver_exit(void)+{+#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)+ proc_quickcam_destroy();+#endif+ printk("QuickCam VC: v4l driver unregistered\n");+}++module_init(qcamvc_driver_init);+module_exit(qcamvc_driver_exit);++/* Exported symbols for modules. */++EXPORT_SYMBOL(qcamvc_register_camera);+EXPORT_SYMBOL(qcamvc_unregister_camera);diff -urN -X dontdiff linux-2.4.22/drivers/media/video/qcamvc.h linux-2.4.22qcamvc/drivers/media/video/qcamvc.h--- linux-2.4.22/drivers/media/video/qcamvc.h 1970-01-01 01:00:00.000000000 +0100+++ linux-2.4.22qcamvc/drivers/media/video/qcamvc.h 2003-08-28 20:16:40.000000000 +0200@@ -0,0 +1,308 @@+/*+ * Connectix 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.+ *+ */++#ifdef MODVERSIONS+#include <linux/modversions.h>+#endif++#include <linux/version.h>+#include <linux/init.h>+#include <linux/module.h>+#include <linux/videodev.h>++#if LINUX_VERSION_CODE >= 0x020407+#include <linux/slab.h>+#else+#include <linux/malloc.h>+#endif++#ifndef QCAMVCVERSION+#define QCAMVCVERSION "1.0.generic"+#endif++#define BIGBUFFER_SIZE 0x20000+#define MAX_CAMS 0x04++#define CAM_DEBUG+#undef V4L_DEBUG+#undef USB_DEBUG+#undef PP_DEBUG++#undef USE_MMAP+++/* For color conversion */++enum {+ FRAME_READY, /* Ready to grab into */+ FRAME_GRABBING, /* In the process of being grabbed into */+ FRAME_DONE, /* Finished grabbing, but not been synced yet */+ FRAME_UNUSED, /* Unused (no MCAPTURE) */+};++/* Bits per pixel */+enum {+ bpc6, + bpc8, +};++struct qcamvc_camera_ops +{+ int (*qcamvc_open)(void *privdata);+ int (*qcamvc_close)(void *privdata);+ int (*qcamvc_write)(void *privdata, void *buffer, size_t len);+ size_t (*qcamvc_read)(void *privdata, void *buffer, size_t len);+ int (*qcamvc_set_reg)(void *privdata, unsigned char reg, void *buffer, size_t len);+ size_t (*qcamvc_get_reg)(void *privdata, unsigned char reg, void *buffer, size_t len);+ int (*qcamvc_strem_start)(void *privdata);+ int (*qcamvc_strem_stop)(void *privdata);+ size_t (*qcamvc_stream_read)(void *privdata, void *buffer, size_t len);+};++#define MAX_WIDTH 352+#define MAX_HEIGHT 288+#define MIN_WIDTH 160+#define MIN_HEIGHT 120+#define MAX_IMAGE_MEM (MAX_WIDTH * MAX HEIGHT * 3)+#define MAX_ISO_PKTS 1++#ifdef USE_MMAP+#define QUICKCAM_NUMFRAMES 2+#define QUICKCAM_MAX_SIZE MAX_WIDTH * MAX_HEIGHT * 8+#endif++#define DEBUG+#define QCAM_VC_SET_EXPOSURE 0x04+#define QCAM_VC_GET_FRAME 0x0d+#define QCAM_VC_SET_TOPMOST_ROW 0x08+#define QCAM_VC_SET_BOTTOMMOST_ROW 0x09+#define QCAM_VC_SET_LEFTMOST_COLUMN 0x06+#define QCAM_VC_SET_RIGHTMOST_COLUMN 0x07+#define QCAM_VC_SET_BRIGHTNESS 0x0f+#define QCAM_VC_SET_MISC 0x0a++#define QCAM_VC_MISC_CONFIG 0x01+#define QCAM_VC_MISC_MULT_FACT 0x02++/*+ Bit 0 = Config Mode; + Bit 1 = Image Mult. Factor; + Bit 2-3 UNKNOWN Set to 0; + Bit 4 = UNKNOWN set to 1; + Bit 5-6 UNKNOWN set to 0; + Bit 7 = UNKNOWN Can be 0 or 1+*/++#ifdef USE_MMAP+struct qcamvc_frame {+ u8 *data;+ volatile int state;+};+#endif+
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?