diff options
Diffstat (limited to 'drivers/usb/misc/ldusb.c')
| -rw-r--r-- | drivers/usb/misc/ldusb.c | 132 | 
1 files changed, 65 insertions, 67 deletions
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index edffef64233..82503a7ff6c 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c @@ -20,16 +20,10 @@   * Derived from Lego USB Tower driver   * Copyright (C) 2003 David Glance <advidgsf@sourceforge.net>   *		 2001-2004 Juergen Stuber <starblue@users.sourceforge.net> - * - * V0.1  (mh) Initial version - * V0.11 (mh) Added raw support for HID 1.0 devices (no interrupt out endpoint) - * V0.12 (mh) Added kmalloc check for string buffer - * V0.13 (mh) Added support for LD X-Ray and Machine Test System   */  #include <linux/kernel.h>  #include <linux/errno.h> -#include <linux/init.h>  #include <linux/slab.h>  #include <linux/module.h>  #include <linux/mutex.h> @@ -41,20 +35,39 @@  /* Define these values to match your devices */  #define USB_VENDOR_ID_LD		0x0f11	/* USB Vendor ID of LD Didactic GmbH */ -#define USB_DEVICE_ID_LD_CASSY		0x1000	/* USB Product ID of CASSY-S */ +#define USB_DEVICE_ID_LD_CASSY		0x1000	/* USB Product ID of CASSY-S modules with 8 bytes endpoint size */ +#define USB_DEVICE_ID_LD_CASSY2		0x1001	/* USB Product ID of CASSY-S modules with 64 bytes endpoint size */  #define USB_DEVICE_ID_LD_POCKETCASSY	0x1010	/* USB Product ID of Pocket-CASSY */ +#define USB_DEVICE_ID_LD_POCKETCASSY2	0x1011	/* USB Product ID of Pocket-CASSY 2 (reserved) */  #define USB_DEVICE_ID_LD_MOBILECASSY	0x1020	/* USB Product ID of Mobile-CASSY */ +#define USB_DEVICE_ID_LD_MOBILECASSY2	0x1021	/* USB Product ID of Mobile-CASSY 2 (reserved) */ +#define USB_DEVICE_ID_LD_MICROCASSYVOLTAGE	0x1031	/* USB Product ID of Micro-CASSY Voltage */ +#define USB_DEVICE_ID_LD_MICROCASSYCURRENT	0x1032	/* USB Product ID of Micro-CASSY Current */ +#define USB_DEVICE_ID_LD_MICROCASSYTIME		0x1033	/* USB Product ID of Micro-CASSY Time (reserved) */ +#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE	0x1035	/* USB Product ID of Micro-CASSY Temperature */ +#define USB_DEVICE_ID_LD_MICROCASSYPH		0x1038	/* USB Product ID of Micro-CASSY pH */  #define USB_DEVICE_ID_LD_JWM		0x1080	/* USB Product ID of Joule and Wattmeter */  #define USB_DEVICE_ID_LD_DMMP		0x1081	/* USB Product ID of Digital Multimeter P (reserved) */  #define USB_DEVICE_ID_LD_UMIP		0x1090	/* USB Product ID of UMI P */ -#define USB_DEVICE_ID_LD_XRAY1		0x1100	/* USB Product ID of X-Ray Apparatus */ -#define USB_DEVICE_ID_LD_XRAY2		0x1101	/* USB Product ID of X-Ray Apparatus */ +#define USB_DEVICE_ID_LD_UMIC		0x10A0	/* USB Product ID of UMI C */ +#define USB_DEVICE_ID_LD_UMIB		0x10B0	/* USB Product ID of UMI B */ +#define USB_DEVICE_ID_LD_XRAY		0x1100	/* USB Product ID of X-Ray Apparatus 55481 */ +#define USB_DEVICE_ID_LD_XRAY2		0x1101	/* USB Product ID of X-Ray Apparatus 554800 */ +#define USB_DEVICE_ID_LD_XRAYCT		0x1110	/* USB Product ID of X-Ray Apparatus CT 554821*/  #define USB_DEVICE_ID_LD_VIDEOCOM	0x1200	/* USB Product ID of VideoCom */ +#define USB_DEVICE_ID_LD_MOTOR		0x1210	/* USB Product ID of Motor (reserved) */  #define USB_DEVICE_ID_LD_COM3LAB	0x2000	/* USB Product ID of COM3LAB */  #define USB_DEVICE_ID_LD_TELEPORT	0x2010	/* USB Product ID of Terminal Adapter */  #define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020	/* USB Product ID of Network Analyser */  #define USB_DEVICE_ID_LD_POWERCONTROL	0x2030	/* USB Product ID of Converter Control Unit */  #define USB_DEVICE_ID_LD_MACHINETEST	0x2040	/* USB Product ID of Machine Test System */ +#define USB_DEVICE_ID_LD_MOSTANALYSER	0x2050	/* USB Product ID of MOST Protocol Analyser */ +#define USB_DEVICE_ID_LD_MOSTANALYSER2	0x2051	/* USB Product ID of MOST Protocol Analyser 2 */ +#define USB_DEVICE_ID_LD_ABSESP		0x2060	/* USB Product ID of ABS ESP */ +#define USB_DEVICE_ID_LD_AUTODATABUS	0x2070	/* USB Product ID of Automotive Data Buses */ +#define USB_DEVICE_ID_LD_MCT		0x2080	/* USB Product ID of Microcontroller technique */ +#define USB_DEVICE_ID_LD_HYBRID		0x2090	/* USB Product ID of Automotive Hybrid */ +#define USB_DEVICE_ID_LD_HEATCONTROL	0x20A0	/* USB Product ID of Heat control */  #define USB_VENDOR_ID_VERNIER		0x08f7  #define USB_DEVICE_ID_VERNIER_GOTEMP	0x0002 @@ -71,19 +84,37 @@  /* table of devices that work with this driver */  static const struct usb_device_id ld_usb_table[] = {  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) }, -	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) },  	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) }, +	{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },  	{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },  	{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },  	{ USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, @@ -91,25 +122,12 @@ static const struct usb_device_id ld_usb_table[] = {  	{ }					/* Terminating entry */  };  MODULE_DEVICE_TABLE(usb, ld_usb_table); -MODULE_VERSION("V0.13"); +MODULE_VERSION("V0.14");  MODULE_AUTHOR("Michael Hund <mhund@ld-didactic.de>");  MODULE_DESCRIPTION("LD USB Driver");  MODULE_LICENSE("GPL");  MODULE_SUPPORTED_DEVICE("LD USB Devices"); -#ifdef CONFIG_USB_DEBUG -	static int debug = 1; -#else -	static int debug = 0; -#endif - -/* Use our own dbg macro */ -#define dbg_info(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0) - -/* Module parameters */ -module_param(debug, int, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug enabled or not"); -  /* All interrupt in transfers are collected in a ring buffer to   * avoid racing conditions and get better performance of the driver.   */ @@ -224,8 +242,9 @@ static void ld_usb_interrupt_in_callback(struct urb *urb)  		    status == -ESHUTDOWN) {  			goto exit;  		} else { -			dbg_info(&dev->intf->dev, "%s: nonzero status received: %d\n", -				 __func__, status); +			dev_dbg(&dev->intf->dev, +				"%s: nonzero status received: %d\n", __func__, +				status);  			spin_lock(&dev->rbsl);  			goto resubmit; /* maybe we can recover */  		} @@ -240,8 +259,8 @@ static void ld_usb_interrupt_in_callback(struct urb *urb)  			*actual_buffer = urb->actual_length;  			memcpy(actual_buffer+1, dev->interrupt_in_buffer, urb->actual_length);  			dev->ring_head = next_ring_head; -			dbg_info(&dev->intf->dev, "%s: received %d bytes\n", -				 __func__, urb->actual_length); +			dev_dbg(&dev->intf->dev, "%s: received %d bytes\n", +				__func__, urb->actual_length);  		} else {  			dev_warn(&dev->intf->dev,  				 "Ring buffer overflow, %d bytes dropped\n", @@ -278,9 +297,9 @@ static void ld_usb_interrupt_out_callback(struct urb *urb)  	if (status && !(status == -ENOENT ||  			status == -ECONNRESET ||  			status == -ESHUTDOWN)) -		dbg_info(&dev->intf->dev, -			 "%s - nonzero write interrupt status received: %d\n", -			 __func__, status); +		dev_dbg(&dev->intf->dev, +			"%s - nonzero write interrupt status received: %d\n", +			__func__, status);  	dev->interrupt_out_busy = 0;  	wake_up_interruptible(&dev->write_wait); @@ -302,8 +321,8 @@ static int ld_usb_open(struct inode *inode, struct file *file)  	interface = usb_find_interface(&ld_usb_driver, subminor);  	if (!interface) { -		err("%s - error, can't find device for minor %d\n", -		     __func__, subminor); +		printk(KERN_ERR "%s - error, can't find device for minor %d\n", +		       __func__, subminor);  		return -ENODEV;  	} @@ -453,7 +472,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count,  	/* verify that the device wasn't unplugged */  	if (dev->intf == NULL) {  		retval = -ENODEV; -		err("No device or device unplugged %d\n", retval); +		printk(KERN_ERR "ldusb: No device or device unplugged %d\n", retval);  		goto unlock_exit;  	} @@ -533,7 +552,7 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,  	/* verify that the device wasn't unplugged */  	if (dev->intf == NULL) {  		retval = -ENODEV; -		err("No device or device unplugged %d\n", retval); +		printk(KERN_ERR "ldusb: No device or device unplugged %d\n", retval);  		goto unlock_exit;  	} @@ -553,7 +572,8 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,  	bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size);  	if (bytes_to_write < count)  		dev_warn(&dev->intf->dev, "Write buffer overflow, %zd bytes dropped\n",count-bytes_to_write); -	dbg_info(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", __func__, count, bytes_to_write); +	dev_dbg(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", +		__func__, count, bytes_to_write);  	if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) {  		retval = -EFAULT; @@ -571,7 +591,9 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,  					 bytes_to_write,  					 USB_CTRL_SET_TIMEOUT * HZ);  		if (retval < 0) -			err("Couldn't submit HID_REQ_SET_REPORT %d\n", retval); +			dev_err(&dev->intf->dev, +				"Couldn't submit HID_REQ_SET_REPORT %d\n", +				retval);  		goto unlock_exit;  	} @@ -592,7 +614,8 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,  	retval = usb_submit_urb(dev->interrupt_out_urb, GFP_KERNEL);  	if (retval) {  		dev->interrupt_out_busy = 0; -		err("Couldn't submit interrupt_out_urb %d\n", retval); +		dev_err(&dev->intf->dev, +			"Couldn't submit interrupt_out_urb %d\n", retval);  		goto unlock_exit;  	}  	retval = bytes_to_write; @@ -642,7 +665,7 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id *  	int i;  	int retval = -ENOMEM; -	/* allocate memory for our device state and intialize it */ +	/* allocate memory for our device state and initialize it */  	dev = kzalloc(sizeof(*dev), GFP_KERNEL);  	if (dev == NULL) { @@ -689,7 +712,7 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id *  	if (dev->interrupt_out_endpoint == NULL)  		dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n"); -	dev->interrupt_in_endpoint_size = le16_to_cpu(dev->interrupt_in_endpoint->wMaxPacketSize); +	dev->interrupt_in_endpoint_size = usb_endpoint_maxp(dev->interrupt_in_endpoint);  	dev->ring_buffer = kmalloc(ring_buffer_size*(sizeof(size_t)+dev->interrupt_in_endpoint_size), GFP_KERNEL);  	if (!dev->ring_buffer) {  		dev_err(&intf->dev, "Couldn't allocate ring_buffer\n"); @@ -705,7 +728,7 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id *  		dev_err(&intf->dev, "Couldn't allocate interrupt_in_urb\n");  		goto error;  	} -	dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? le16_to_cpu(dev->interrupt_out_endpoint->wMaxPacketSize) : +	dev->interrupt_out_endpoint_size = dev->interrupt_out_endpoint ? usb_endpoint_maxp(dev->interrupt_out_endpoint) :  									 udev->descriptor.bMaxPacketSize0;  	dev->interrupt_out_buffer = kmalloc(write_buffer_size*dev->interrupt_out_endpoint_size, GFP_KERNEL);  	if (!dev->interrupt_out_buffer) { @@ -789,30 +812,5 @@ static struct usb_driver ld_usb_driver = {  	.id_table =	ld_usb_table,  }; -/** - *	ld_usb_init - */ -static int __init ld_usb_init(void) -{ -	int retval; - -	/* register this driver with the USB subsystem */ -	retval = usb_register(&ld_usb_driver); -	if (retval) -		err("usb_register failed for the %s driver. Error number %d\n", __FILE__, retval); - -	return retval; -} - -/** - *	ld_usb_exit - */ -static void __exit ld_usb_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&ld_usb_driver); -} - -module_init(ld_usb_init); -module_exit(ld_usb_exit); +module_usb_driver(ld_usb_driver);  | 
