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 + -
显示快捷键?