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

📄 spcausb.h

📁 网上下的该驱动没有中微星307b
💻 H
字号:
#ifndef SPCAUSB_H#define SPCAUSB_INIT_H#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 6)#define wait_ms(a) msleep((a))#endif#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 11)#define TimeOut 1000#else#define TimeOut HZ#endif/* Common functions prototype */static int spca50x_reg_read(struct usb_device *dev,			    __u16 reg, __u16 index, __u16 length);static int spca50x_reg_write(struct usb_device *dev,			     __u16 reg, __u16 index, __u16 value);static void spca5xxRegRead(struct usb_device *dev,			   __u16 reg,			   __u16 value,			   __u16 index, __u8 * buffer, __u16 length);static void spca5xxRegWrite(struct usb_device *dev,			    __u16 reg,			    __u16 value,			    __u16 index, __u8 * buffer, __u16 length);static void sonixRegRead(struct usb_device *dev,			 __u16 reg,			 __u16 value,			 __u16 index, __u8 * buffer, __u16 length);static void sonixRegWrite(struct usb_device *dev,			  __u16 reg,			  __u16 value,			  __u16 index, __u8 * buffer, __u16 length);static void Et_RegWrite(struct usb_device *dev,			__u16 reg,			__u16 value,			__u16 index, __u8 * buffer, __u16 length);static void Et_RegRead(struct usb_device *dev,		       __u16 reg,		       __u16 value,		       __u16 index, __u8 * buffer, __u16 length);static int spca_set_interface(struct usb_device *dev,			      int interface, int alternate);/*static int spca_clear_feature(struct usb_device *dev,				 int endpoint){	int inpipe;	inpipe = usb_rcvintpipe(dev,endpoint);	usb_clear_halt(dev, inpipe);	return 0;}*/static int spca50x_setup_qtable(struct usb_spca50x *spca50x,				unsigned int request,				unsigned int ybase,				unsigned int cbase,				unsigned char qtable[2][64]);/* Alias setting */#define pac207RegWrite(dev,req,value,index,buffer,length) sonixRegWrite(dev,req,value,index,buffer,length)#define pac207RegRead(dev,req,value,index,buffer,length) sonixRegRead(dev,req,value,index,buffer,length)/***************************** Implementation ****************************/static void spca5xxRegRead(struct usb_device *dev,			   __u16 reg,			   __u16 value,			   __u16 index, __u8 * buffer, __u16 length){    int rc;    __u8 *kbuffer = NULL;    __u16 RegType;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE;    rc = usb_control_msg(dev,			 usb_rcvctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg read: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg read: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType, reg,	       value, index);    }    return;}static void spca5xxRegWrite(struct usb_device *dev,			    __u16 reg,			    __u16 value,			    __u16 index, __u8 * buffer, __u16 length){    int rc;    __u16 RegType;    __u8 *kbuffer = NULL;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;    rc = usb_control_msg(dev,			 usb_sndctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg write: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg write: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType,	       reg, value, index);    }    return;}static void sonixRegRead(struct usb_device *dev,			 __u16 reg,			 __u16 value,			 __u16 index, __u8 * buffer, __u16 length){    int rc;    __u8 *kbuffer = NULL;    __u16 RegType;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;    rc = usb_control_msg(dev,			 usb_rcvctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg read: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg read: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType, reg,	       value, index);    }    return;}static void sonixRegWrite(struct usb_device *dev,			  __u16 reg,			  __u16 value,			  __u16 index, __u8 * buffer, __u16 length){    int rc;    __u16 RegType;    __u8 *kbuffer = NULL;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;    rc = usb_control_msg(dev,			 usb_sndctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg write: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg write: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType,	       reg, value, index);    }    return;}static void Et_RegRead(struct usb_device *dev,		       __u16 reg,		       __u16 value,		       __u16 index, __u8 * buffer, __u16 length){    int rc;    __u8 *kbuffer = NULL;    __u16 RegType;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;    rc = usb_control_msg(dev,			 usb_rcvctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg read: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg read: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType, reg,	       value, index);    }    return;}static void Et_RegWrite(struct usb_device *dev,			__u16 reg,			__u16 value,			__u16 index, __u8 * buffer, __u16 length){    int rc;    __u16 RegType;    __u8 *kbuffer = NULL;    if (length > 0) {	kbuffer = (__u8 *) kmalloc(length, GFP_KERNEL);	memcpy(kbuffer, buffer, length);    }    RegType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;    rc = usb_control_msg(dev,			 usb_sndctrlpipe(dev, 0),			 reg,			 RegType,			 (__u16) value, (__u16) index, kbuffer, length,			 TimeOut);    if (length > 0) {	memcpy(buffer, kbuffer, length);	kfree(kbuffer);    }    if (buffer) {	PDEBUG(5, "reg write: 0x%02X, 0x%02X, 0x%02X, 0x%02X: 0x%04X",	       RegType, reg, value, index, (int) *buffer);    } else {	PDEBUG(5, "reg write: 0x%02X, 0x%02X,0x%02X, 0x%02X ", RegType,	       reg, value, index);    }    return;}static int spca_set_interface(struct usb_device *dev, int interface,			      int alternate){    struct usb_interface *iface;    int ret;    iface = usb_ifnum_to_if(dev, interface);    if (!iface) {	warn("selecting invalid interface %d", interface);	return -EINVAL;    }    /* 9.4.10 says devices don't need this, if the interface       only has one alternate setting */    if (iface->num_altsetting == 1) {	dbg("ignoring set_interface for dev %d, iface %d, alt %d",	    dev->devnum, interface, alternate);	return 0;    }    if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),			       USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,			       alternate, interface, NULL, 0,			       TimeOut * 5)) < 0)	return ret;    return 0;}static int spca50x_reg_write(struct usb_device *dev,			     __u16 reg, __u16 index, __u16 value){    int rc;    rc = usb_control_msg(dev,			 usb_sndctrlpipe(dev, 0),			 reg,			 USB_TYPE_VENDOR | USB_RECIP_DEVICE,			 value, index, NULL, 0, TimeOut);    PDEBUG(5, "reg write: 0x%02X,0x%02X:0x%02X, 0x%x", reg, index, value,	   rc);    if (rc < 0)	err("reg write: error %d", rc);    return rc;}static int spca50x_reg_read_with_value(struct usb_device *dev, __u16 reg,	// bRequest				       __u16 value,	// wValue				       __u16 index,	// wIndex				       __u16 length)	// wLength{    int rc;    unsigned char buffer[4] = { 0, 0, 0, 0 };    /* Hope plp didn't ask for more */    rc = usb_control_msg(dev,			 usb_rcvctrlpipe(dev, 0),			 reg,			 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,			 (__u16) value, (__u16) index, buffer, length,			 TimeOut);    PDEBUG(5, "reg read: 0x%02X,0x%02X:0x%04X", reg, index,	   *(int *) &buffer[0]);    if (rc < 0) {	err("reg read: error %d", rc);	return rc;    } else {	return *(int *) &buffer[0];    }}/* returns: negative is error, pos or zero is data */static int spca50x_reg_read(struct usb_device *dev, __u16 reg,	// bRequest			    __u16 index,	// wIndex			    __u16 length)	// wLength{    return spca50x_reg_read_with_value(dev, reg, 0, index, length);}/* * Simple function to wait for a given 8-bit value to be returned from * a spca50x_reg_read call. * Returns: negative is error or timeout, zero is success. */static int spca50x_reg_readwait(struct usb_device *dev,				__u16 reg, __u16 index, __u16 value){    int count = 0;    int result = 0;    while (count < 20) {	result = spca50x_reg_read(dev, reg, index, 1);	if (result == value)	    return 0;	wait_ms(50);	count++;    }    PDEBUG(2, "spca50x_reg_readwait failed");    return -EIO;}static int spca50x_write_vector(struct usb_spca50x *spca50x,				__u16 data[][3]){    struct usb_device *dev = spca50x->dev;    int err_code;    int I = 0;    while ((data[I][0]) != (__u16) 0 || (data[I][1]) != (__u16) 0	   || (data[I][2]) != (__u16) 0) {	err_code =	    spca50x_reg_write(dev, data[I][0], (__u16) (data[I][2]),			      (__u16) (data[I][1]));	if (err_code < 0) {	    PDEBUG(1, "Register write failed for 0x%x,0x%x,0x%x",		   data[I][0], data[I][1], data[I][2]);	    return -1;	}	I++;    }    return 0;}static int spca50x_setup_qtable(struct usb_spca50x *spca50x,				unsigned int request,				unsigned int ybase,				unsigned int cbase,				unsigned char qtable[2][64]){    int i;    int err;    /* loop over y components */    for (i = 0; i < 64; i++) {	err =	    spca50x_reg_write(spca50x->dev, request, ybase + i,			      qtable[0][i]);	if (err < 0) {	    PDEBUG(2, "spca50x_reg_write failed");	    return err;	}    }    /* loop over c components */    for (i = 0; i < 64; i++) {	err =	    spca50x_reg_write(spca50x->dev, request, cbase + i,			      qtable[1][i]);	if (err < 0) {	    PDEBUG(2, "spca50x_reg_write failed");	    return err;	}    }    /* all ok */    return 0;}#endif				/* SPCAUSB_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -