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

📄 qcamvc_usb.c

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