📄 qcamvc_usb.c
字号:
/* * * Connectix USB QuickCam VC Video Camera driver * * (C) Copyright 2001 De Marchi Daniele * (C) Copyright 2004 Terry Mohan * * 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 <linux/usb.h>#include <linux/smp_lock.h>#include <linux/spinlock.h>#include "qcamvc.h"MODULE_AUTHOR("De Marchi Daniele <demarchidaniele@libero.it>");MODULE_DESCRIPTION("Connectix QuickCam VC(USB) Driver");/*****************************************************************************//* *//* Da portare in qcamvc.h *//* *//*****************************************************************************//* USS 720 requests type */#define REQT_GET_DEVICE_ID 0xA1#define REQT_GET_PORT_STATUS 0xA1#define REQT_SOFT_RESET 0x23#define REQT_GET_1284_REG 0xC0#define REQT_SET_1284_REG 0x40/* USS 720 bRequest */#define BREQ_GET_DEVICE_ID 0x00#define BREQ_GET_PORT_STATUS 0x01#define BREQ_SOFT_RESET 0x02#define BREQ_GET_1284_REG 0x03#define BREQ_SET_1284_REG 0x04/* USS 720 registers */#define SET_USS720_DATA 0x00#define SET_USS720_STATUS 0x01#define SET_USS720_CONTROL 0x02#define SET_USS720_EPPADDR 0x03#define SET_USS720_EPPDATA 0x04#define SET_USS720_ECPCMD 0x05#define SET_USS720_EXTCTRL 0x06#define SET_USS720_USSCTRL 0x07#define GET_USS720_STATUS 0x00#define GET_USS720_CONTROL 0x01#define GET_USS720_EXTCTRL 0x02#define GET_USS720_USSCTRL 0x03#define GET_USS720_DATA 0x04#define GET_USS720_EPP 0x05#define GET_USS720_SETUP 0x06/* USS 720 register 1 STATUS */#define EPP_TIMEOUT 0x01 /*Timeout 10us during EPP read/write */#define PLH 0x02#define RESERVED 0x04#define NFAULT 0x08#define SELECT 0x10#define PERROR 0x20#define NACK 0x40#define NBUSY 0x80/* USS 720 register 2 CONTROL */#define STROBE 0x01#define AUTO_FD 0x02#define NINIT 0x04#define SELECT_IN 0x08#define INT_ENABLE 0x10#define DIRECTION 0x20#define EPP_MASK 0x40#define HLH 0x80/* USS 720 register 6 EXTCTRL */#define BULK_OUT_EMPTY 0x01#define BULK_IN_EMPTY 0x02#define BULK_IN_INT 0x04#define NFAULT_INT 0x08#define NACK_INT 0x10#define MODE_MASK 0xe0#define ECR_SPP 0x00#define ECR_PS2 0x20#define ECR_PPF 0x40#define ECR_ECP 0x60#define ECR_EPP 0x80/* USS 720 register 7 USSCTRL */#define AUTO_MODE 0x01#define COMPRESS_ENABLE 0x02#define NFAULT_INT_MASK 0x08#define BULK_OUT_INT_MASK 0x10#define BULK_IN_INT_MASK 0x20#define CHANGE_INT_MASK 0x40#define DISCONN_INT_MASK 0x80#define ALL_INT_MASK 0xf8struct usb_qcamvc{ struct usb_device *udev; unsigned char iface; int open; int present;};/*****************************************************************************//* *//* Lowlevel driver for Connectix QuickCam VC(USB) *//* *//*****************************************************************************/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 int get_1284_register(struct usb_device *usbdev, unsigned char reg, unsigned char *val);static int set_1284_register(struct usb_device *usbdev, unsigned char reg, unsigned char val);static size_t qcamvc_bulk_read(struct usb_device *usbdev, void *buffer, size_t len);static size_t qcamvc_bulk_write(struct usb_device *usbdev, void *buffer, size_t len );static int reset_uss(struct usb_device *usbdev);static struct qcamvc_camera_ops qcamvc_usb_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 probe_qcamvc(struct usb_interface *intf, const struct usb_device_id *id);static void disconnect_qcamvc(struct usb_interface *intf);static LIST_HEAD(cam_list);static spinlock_t cam_list_lock_usb;#if LINUX_VERSION_CODE >= 0x020400static struct usb_device_id qcamvc_device_ids [] ={ { USB_DEVICE(0x0478, 0x0001) }, { }};MODULE_DEVICE_TABLE(usb,qcamvc_device_ids);MODULE_LICENSE("GPL");#endif /* LINUX_VERSION_CODE >= 0x020400 */static struct usb_driver qcamvc_driver ={ .owner = THIS_MODULE, .name = "Connectix QuickCam VC", .probe = probe_qcamvc, .disconnect = disconnect_qcamvc,#if LINUX_VERSION_CODE >= 0x020400 .id_table = qcamvc_device_ids,#else { NULL, NULL}#endif};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 int qcamvc_open(void *privdata){ /*struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; if (!usb_qcamvc) return -EINVAL; usb_qcamvc->open = 1;*/ return 0;}static int qcamvc_close(void *privdata){ /*struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; if (!usb_qcamvc) return -EINVAL; usb_qcamvc->open = 0;*/ return 0;}static int qcamvc_write(void *privdata, void *buffer, size_t len){ struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; struct usb_device *udev = usb_qcamvc->udev; return qcamvc_bulk_write(udev, buffer, len);}static size_t qcamvc_read(void *privdata, void *buffer, size_t len){ struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; struct usb_device *udev = usb_qcamvc->udev; return qcamvc_bulk_read(udev, buffer, len);}static int qcamvc_set_reg(void *privdata, unsigned char cmd, void *buffer, size_t len){ struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; struct usb_device *udev = usb_qcamvc->udev; int written = 0; reset_uss(udev); set_1284_register(udev, SET_USS720_USSCTRL, ALL_INT_MASK); set_1284_register(udev, SET_USS720_CONTROL, SELECT_IN | NINIT); set_1284_register(udev, SET_USS720_DATA, 0x10); set_1284_register(udev, SET_USS720_CONTROL, AUTO_FD | NINIT); set_1284_register(udev, SET_USS720_CONTROL, AUTO_FD | NINIT | STROBE); set_1284_register(udev, SET_USS720_CONTROL, NINIT); set_1284_register(udev, SET_USS720_CONTROL, AUTO_FD | NINIT); set_1284_register(udev, SET_USS720_DATA, cmd); set_1284_register(udev, SET_USS720_CONTROL, AUTO_FD | NINIT | STROBE); set_1284_register(udev, SET_USS720_CONTROL, AUTO_FD | NINIT); reset_uss(udev); if ((len > 0)&(buffer!=NULL)) written = qcamvc_bulk_write(udev, buffer, len); USB_DBG("Send CMD reg=0x%02x,\n", cmd); return written;}static size_t qcamvc_get_reg(void *privdata, unsigned char reg, void *buffer, size_t len){ struct usb_qcamvc *usb_qcamvc = (struct usb_qcamvc*)privdata; struct usb_device *udev = usb_qcamvc->udev;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -