⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patch-linux-2.4.22-qcamvc-1.0.6

📁 VC编写的USB QuickCam驱动程序,实现四种视频格式在linux下的编码,信号来自摄像源
💻 6
📖 第 1 页 / 共 5 页
字号:
+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, &reg, 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, &reg, 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 + -