2 * LEGO USB Tower driver
4 * Copyright (C) 2003 David Glance <davidgsf@sourceforge.net>
5 * 2001 Juergen Stuber <stuber@loria.fr>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 * derived from USB Skeleton driver - 0.5
13 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
20 * - simplified buffering, one-shot URBs for writing
22 * - removed IOCTL (setting power/mode is more complicated, postponed)
24 * - added vendor commands for mode of operation and power level in open
26 * - set IR mode by default (by oversight 0.4 set VLL mode)
27 * 2002-01-11 - 0.5? pcchan
28 * - make read buffer reusable and work around bytes_to_write issue between
29 * uhci and legusbtower
30 * 2002-09-23 - 0.52 david (david@csse.uwa.edu.au)
31 * - imported into lejos project
32 * - changed wake_up to wake_up_interruptible
33 * - changed to use lego0 rather than tower0
34 * - changed dbg() to use __func__ rather than deprecated __FUNCTION__
35 * 2003-01-12 - 0.53 david (david@csse.uwa.edu.au)
36 * - changed read and write to write everything or timeout (from a patch by Chris Riesen and
37 * Brett Thaeler driver)
38 * - added ioctl functionality to set timeouts
39 * 2003-07-18 - 0.54 davidgsf (david@csse.uwa.edu.au)
40 * - initial import into LegoUSB project
41 * - merge of existing LegoUSB.c driver
42 * 2003-07-18 - 0.56 davidgsf (david@csse.uwa.edu.au)
43 * - port to 2.6 style driver
46 #include <linux/config.h>
47 #include <linux/kernel.h>
48 #include <linux/errno.h>
49 #include <linux/init.h>
50 #include <linux/slab.h>
51 #include <linux/module.h>
52 #include <linux/smp_lock.h>
53 #include <linux/completion.h>
54 #include <asm/uaccess.h>
55 #include <linux/usb.h>
58 #ifdef CONFIG_USB_DEBUG
64 /* Use our own dbg macro */
66 #define dbg(lvl, format, arg...) do { if (debug >= lvl) printk(KERN_DEBUG __FILE__ " : " format " \n", ## arg); } while (0)
69 /* Version Information */
70 #define DRIVER_VERSION "v0.56"
71 #define DRIVER_AUTHOR "David Glance, davidgsf@sourceforge.net"
72 #define DRIVER_DESC "LEGO USB Tower Driver"
74 /* Module paramaters */
75 MODULE_PARM(debug, "i");
76 MODULE_PARM_DESC(debug, "Debug enabled or not");
79 /* Define these values to match your device */
80 #define LEGO_USB_TOWER_VENDOR_ID 0x0694
81 #define LEGO_USB_TOWER_PRODUCT_ID 0x0001
83 /* table of devices that work with this driver */
84 static struct usb_device_id tower_table [] = {
85 { USB_DEVICE(LEGO_USB_TOWER_VENDOR_ID, LEGO_USB_TOWER_PRODUCT_ID) },
86 { } /* Terminating entry */
89 MODULE_DEVICE_TABLE (usb, tower_table);
91 #define LEGO_USB_TOWER_MINOR_BASE 160
93 /* we can have up to this number of device plugged in at once */
94 #define MAX_DEVICES 16
96 #define COMMAND_TIMEOUT (2*HZ) /* 2 second timeout for a command */
98 /* Structure to hold all of our device specific stuff */
99 struct lego_usb_tower {
100 struct semaphore sem; /* locks this structure */
101 struct usb_device* udev; /* save off the usb device pointer */
102 struct usb_interface* interface;
103 unsigned char minor; /* the starting minor number for this device */
105 int open_count; /* number of times this port has been opened */
108 int read_buffer_length;
110 wait_queue_head_t read_wait;
111 wait_queue_head_t write_wait;
113 char* interrupt_in_buffer;
114 struct usb_endpoint_descriptor* interrupt_in_endpoint;
115 struct urb* interrupt_in_urb;
117 char* interrupt_out_buffer;
118 struct usb_endpoint_descriptor* interrupt_out_endpoint;
119 struct urb* interrupt_out_urb;
123 /* Note that no locking is needed:
124 * read_buffer is arbitrated by read_buffer_length == 0
125 * interrupt_out_buffer is arbitrated by interrupt_out_urb->status == -EINPROGRESS
126 * interrupt_in_buffer belongs to urb alone and is overwritten on overflow
129 /* local function prototypes */
130 static ssize_t tower_read (struct file *file, char *buffer, size_t count, loff_t *ppos);
131 static ssize_t tower_write (struct file *file, const char *buffer, size_t count, loff_t *ppos);
132 static inline void tower_delete (struct lego_usb_tower *dev);
133 static int tower_open (struct inode *inode, struct file *file);
134 static int tower_release (struct inode *inode, struct file *file);
135 static int tower_release_internal (struct lego_usb_tower *dev);
136 static void tower_abort_transfers (struct lego_usb_tower *dev);
137 static void tower_interrupt_in_callback (struct urb *urb, struct pt_regs *regs);
138 static void tower_interrupt_out_callback (struct urb *urb, struct pt_regs *regs);
140 static int tower_probe (struct usb_interface *interface, const struct usb_device_id *id);
141 static void tower_disconnect (struct usb_interface *interface);
144 /* prevent races between open() and disconnect */
145 static DECLARE_MUTEX (disconnect_sem);
147 /* file operations needed when we register this driver */
148 static struct file_operations tower_fops = {
149 .owner = THIS_MODULE,
151 .write = tower_write,
153 .release = tower_release,
157 * usb class driver info in order to get a minor number from the usb core,
158 * and to have the device registered with devfs and the driver core
160 static struct usb_class_driver tower_class = {
161 .name = "usb/legousbtower%d",
163 .mode = S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
164 .minor_base = LEGO_USB_TOWER_MINOR_BASE,
168 /* usb specific object needed to register this driver with the usb subsystem */
169 static struct usb_driver tower_driver = {
170 .owner = THIS_MODULE,
171 .name = "legousbtower",
172 .probe = tower_probe,
173 .disconnect = tower_disconnect,
174 .id_table = tower_table,
179 * lego_usb_tower_debug_data
181 static inline void lego_usb_tower_debug_data (int level, const char *function, int size, const unsigned char *data)
188 printk (KERN_DEBUG __FILE__": %s - length = %d, data = ", function, size);
189 for (i = 0; i < size; ++i) {
190 printk ("%.2x ", data[i]);
199 static inline void tower_delete (struct lego_usb_tower *dev)
201 dbg(2, "%s enter", __func__);
203 tower_abort_transfers (dev);
205 /* free data structures */
206 if (dev->interrupt_in_urb != NULL) {
207 usb_free_urb (dev->interrupt_in_urb);
209 if (dev->interrupt_out_urb != NULL) {
210 usb_free_urb (dev->interrupt_out_urb);
212 kfree (dev->read_buffer);
213 kfree (dev->interrupt_in_buffer);
214 kfree (dev->interrupt_out_buffer);
217 dbg(2, "%s : leave", __func__);
224 static int tower_open (struct inode *inode, struct file *file)
226 struct lego_usb_tower *dev = NULL;
229 struct usb_interface *interface;
231 dbg(2,"%s : enter", __func__);
233 subminor = iminor(inode);
235 down (&disconnect_sem);
237 interface = usb_find_interface (&tower_driver, subminor);
240 err ("%s - error, can't find device for minor %d",
241 __FUNCTION__, subminor);
246 dev = usb_get_intfdata(interface);
253 /* lock this device */
257 /* increment our usage count for the device */
260 /* save device in the file's private structure */
261 file->private_data = dev;
264 /* initialize in direction */
265 dev->read_buffer_length = 0;
271 up (&disconnect_sem);
273 dbg(2,"%s : leave, return value %d ", __func__, retval);
281 static int tower_release (struct inode *inode, struct file *file)
283 struct lego_usb_tower *dev;
286 dbg(2," %s : enter", __func__);
288 dev = (struct lego_usb_tower *)file->private_data;
291 dbg(1," %s : object is NULL", __func__);
297 /* lock our device */
300 if (dev->open_count <= 0) {
301 dbg(1," %s : device not opened", __func__);
307 retval = tower_release_internal (dev);
311 dbg(2," %s : leave, return value %d", __func__, retval);
317 * tower_release_internal
319 static int tower_release_internal (struct lego_usb_tower *dev)
323 dbg(2," %s : enter", __func__);
325 if (dev->udev == NULL) {
326 /* the device was unplugged before the file was released */
331 /* decrement our usage count for the device */
333 if (dev->open_count <= 0) {
334 tower_abort_transfers (dev);
339 dbg(2," %s : leave", __func__);
345 * tower_abort_transfers
346 * aborts transfers and frees associated data structures
348 static void tower_abort_transfers (struct lego_usb_tower *dev)
350 dbg(2," %s : enter", __func__);
353 dbg(1," %s : dev is null", __func__);
357 /* shutdown transfer */
358 if (dev->interrupt_in_urb != NULL) {
359 usb_unlink_urb (dev->interrupt_in_urb);
361 if (dev->interrupt_out_urb != NULL) {
362 usb_unlink_urb (dev->interrupt_out_urb);
366 dbg(2," %s : leave", __func__);
373 static ssize_t tower_read (struct file *file, char *buffer, size_t count, loff_t *ppos)
375 struct lego_usb_tower *dev;
376 size_t bytes_read = 0;
377 size_t bytes_to_read;
382 dbg(2," %s : enter, count = %Zd", __func__, count);
384 dev = (struct lego_usb_tower *)file->private_data;
386 /* lock this object */
389 /* verify that the device wasn't unplugged */
390 if (dev->udev == NULL) {
392 err("No device or device unplugged %d", retval);
396 /* verify that we actually have some data to read */
398 dbg(1," %s : read request of 0 bytes", __func__);
403 timeout = COMMAND_TIMEOUT;
406 if (dev->read_buffer_length == 0) {
409 usb_fill_int_urb (dev->interrupt_in_urb,dev->udev,
410 usb_rcvintpipe(dev->udev, dev->interrupt_in_endpoint->bEndpointAddress),
411 dev->interrupt_in_buffer,
412 dev->interrupt_in_endpoint->wMaxPacketSize,
413 tower_interrupt_in_callback,
415 dev->interrupt_in_endpoint->bInterval);
417 retval = usb_submit_urb (dev->interrupt_in_urb, GFP_KERNEL);
420 err("Couldn't submit interrupt_in_urb");
429 if (signal_pending(current)) {
435 timeout = interruptible_sleep_on_timeout (&dev->read_wait, timeout);
439 /* copy the data from read_buffer into userspace */
440 bytes_to_read = count > dev->read_buffer_length ? dev->read_buffer_length : count;
441 if (copy_to_user (buffer, dev->read_buffer, bytes_to_read) != 0) {
445 dev->read_buffer_length -= bytes_to_read;
446 for (i=0; i<dev->read_buffer_length; i++) {
447 dev->read_buffer[i] = dev->read_buffer[i+bytes_to_read];
450 buffer += bytes_to_read;
451 count -= bytes_to_read;
452 bytes_read += bytes_to_read;
462 /* unlock the device */
465 dbg(2," %s : leave, return value %d", __func__, retval);
473 static ssize_t tower_write (struct file *file, const char *buffer, size_t count, loff_t *ppos)
475 struct lego_usb_tower *dev;
476 size_t bytes_written = 0;
477 size_t bytes_to_write;
482 dbg(2," %s : enter, count = %Zd", __func__, count);
484 dev = (struct lego_usb_tower *)file->private_data;
486 /* lock this object */
489 /* verify that the device wasn't unplugged */
490 if (dev->udev == NULL) {
492 err("No device or device unplugged %d", retval);
496 /* verify that we actually have some data to write */
498 dbg(1," %s : write request of 0 bytes", __func__);
504 if (dev->interrupt_out_urb->status == -EINPROGRESS) {
505 timeout = COMMAND_TIMEOUT;
507 while (timeout > 0) {
508 if (signal_pending(current)) {
509 dbg(1," %s : interrupted", __func__);
514 timeout = interruptible_sleep_on_timeout (&dev->write_wait, timeout);
519 dbg(1," %s : interrupted timeout: %d", __func__, timeout);
523 dbg(1," %s : final timeout: %d", __func__, timeout);
526 dbg(1, "%s - command timed out.", __func__);
531 dbg(4," %s : in progress, count = %Zd", __func__, count);
533 dbg(4," %s : sending, count = %Zd", __func__, count);
535 /* write the data into interrupt_out_buffer from userspace */
536 buffer_size = dev->interrupt_out_endpoint->wMaxPacketSize;
537 bytes_to_write = count > buffer_size ? buffer_size : count;
538 dbg(4," %s : buffer_size = %Zd, count = %Zd, bytes_to_write = %Zd", __func__, buffer_size, count, bytes_to_write);
540 if (copy_from_user (dev->interrupt_out_buffer, buffer, bytes_to_write) != 0) {
545 /* send off the urb */
546 usb_fill_int_urb(dev->interrupt_out_urb,
548 usb_sndintpipe(dev->udev, dev->interrupt_out_endpoint->bEndpointAddress),
549 dev->interrupt_out_buffer,
551 tower_interrupt_out_callback,
553 dev->interrupt_in_endpoint->bInterval);
555 dev->interrupt_out_urb->actual_length = bytes_to_write;
556 retval = usb_submit_urb (dev->interrupt_out_urb, GFP_KERNEL);
559 err("Couldn't submit interrupt_out_urb %d", retval);
563 buffer += bytes_to_write;
564 count -= bytes_to_write;
566 bytes_written += bytes_to_write;
570 retval = bytes_written;
573 /* unlock the device */
576 dbg(2," %s : leave, return value %d", __func__, retval);
583 * tower_interrupt_in_callback
585 static void tower_interrupt_in_callback (struct urb *urb, struct pt_regs *regs)
587 struct lego_usb_tower *dev = (struct lego_usb_tower *)urb->context;
589 dbg(4," %s : enter, status %d", __func__, urb->status);
591 lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
593 if (urb->status != 0) {
594 if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)) {
595 dbg(1," %s : nonzero status received: %d", __func__, urb->status);
602 if (urb->actual_length > 0) {
603 if (dev->read_buffer_length < (4 * dev->interrupt_in_endpoint->wMaxPacketSize) - (urb->actual_length)) {
605 memcpy (dev->read_buffer+dev->read_buffer_length, dev->interrupt_in_buffer, urb->actual_length);
607 dev->read_buffer_length += urb->actual_length;
608 dbg(1," %s reading %d ", __func__, urb->actual_length);
609 wake_up_interruptible (&dev->read_wait);
612 dbg(1," %s : read_buffer overflow", __func__);
619 lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
620 dbg(4," %s : leave, status %d", __func__, urb->status);
625 * tower_interrupt_out_callback
627 static void tower_interrupt_out_callback (struct urb *urb, struct pt_regs *regs)
629 struct lego_usb_tower *dev = (struct lego_usb_tower *)urb->context;
631 dbg(4," %s : enter, status %d", __func__, urb->status);
632 lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
634 if (urb->status != 0) {
635 if ((urb->status != -ENOENT) &&
636 (urb->status != -ECONNRESET)) {
637 dbg(1, " %s :nonzero status received: %d", __func__, urb->status);
642 wake_up_interruptible(&dev->write_wait);
645 lego_usb_tower_debug_data(5,__func__, urb->actual_length, urb->transfer_buffer);
646 dbg(4," %s : leave, status %d", __func__, urb->status);
653 * Called by the usb core when a new device is connected that it thinks
654 * this driver might be interested in.
656 static int tower_probe (struct usb_interface *interface, const struct usb_device_id *id)
658 struct usb_device *udev = interface_to_usbdev(interface);
659 struct lego_usb_tower *dev = NULL;
660 struct usb_host_interface *iface_desc;
661 struct usb_endpoint_descriptor* endpoint;
663 int retval = -ENOMEM;
665 dbg(2," %s : enter", __func__);
668 info ("udev is NULL.");
671 /* See if the device offered us matches what we can accept */
672 if ((udev->descriptor.idVendor != LEGO_USB_TOWER_VENDOR_ID) ||
673 (udev->descriptor.idProduct != LEGO_USB_TOWER_PRODUCT_ID)) {
678 /* allocate memory for our device state and intialize it */
680 dev = kmalloc (sizeof(struct lego_usb_tower), GFP_KERNEL);
683 err ("Out of memory");
687 init_MUTEX (&dev->sem);
692 dev->read_buffer = NULL;
693 dev->read_buffer_length = 0;
695 init_waitqueue_head (&dev->read_wait);
696 init_waitqueue_head (&dev->write_wait);
698 dev->interrupt_in_buffer = NULL;
699 dev->interrupt_in_endpoint = NULL;
700 dev->interrupt_in_urb = NULL;
702 dev->interrupt_out_buffer = NULL;
703 dev->interrupt_out_endpoint = NULL;
704 dev->interrupt_out_urb = NULL;
707 iface_desc = &interface->altsetting[0];
709 /* set up the endpoint information */
710 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
711 endpoint = &iface_desc->endpoint[i].desc;
713 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) &&
714 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
715 dev->interrupt_in_endpoint = endpoint;
718 if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) &&
719 ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) {
720 dev->interrupt_out_endpoint = endpoint;
723 if(dev->interrupt_in_endpoint == NULL) {
724 err("interrupt in endpoint not found");
727 if (dev->interrupt_out_endpoint == NULL) {
728 err("interrupt out endpoint not found");
732 dev->read_buffer = kmalloc ((4*dev->interrupt_in_endpoint->wMaxPacketSize), GFP_KERNEL);
733 if (!dev->read_buffer) {
734 err("Couldn't allocate read_buffer");
737 dev->interrupt_in_buffer = kmalloc (dev->interrupt_in_endpoint->wMaxPacketSize, GFP_KERNEL);
738 if (!dev->interrupt_in_buffer) {
739 err("Couldn't allocate interrupt_in_buffer");
742 dev->interrupt_in_urb = usb_alloc_urb(0, GFP_KERNEL);
743 if (!dev->interrupt_in_urb) {
744 err("Couldn't allocate interrupt_in_urb");
747 dev->interrupt_out_buffer = kmalloc (dev->interrupt_out_endpoint->wMaxPacketSize, GFP_KERNEL);
748 if (!dev->interrupt_out_buffer) {
749 err("Couldn't allocate interrupt_out_buffer");
752 dev->interrupt_out_urb = usb_alloc_urb(0, GFP_KERNEL);
753 if (!dev->interrupt_out_urb) {
754 err("Couldn't allocate interrupt_out_urb");
758 /* we can register the device now, as it is ready */
759 usb_set_intfdata (interface, dev);
761 retval = usb_register_dev (interface, &tower_class);
764 /* something prevented us from registering this driver */
765 err ("Not able to get a minor for this device.");
766 usb_set_intfdata (interface, NULL);
770 dev->minor = interface->minor;
772 /* let the user know what node this device is now attached to */
773 info ("LEGO USB Tower device now attached to /dev/usb/lego%d", (dev->minor - LEGO_USB_TOWER_MINOR_BASE));
778 dbg(2," %s : leave, return value 0x%.8lx (dev)", __func__, (long) dev);
791 * Called by the usb core when the device is removed from the system.
793 static void tower_disconnect (struct usb_interface *interface)
795 struct lego_usb_tower *dev;
798 dbg(2," %s : enter", __func__);
800 down (&disconnect_sem);
802 dev = usb_get_intfdata (interface);
803 usb_set_intfdata (interface, NULL);
810 /* give back our minor */
811 usb_deregister_dev (interface, &tower_class);
813 /* if the device is not opened, then we clean up right now */
814 if (!dev->open_count) {
822 up (&disconnect_sem);
824 info("LEGO USB Tower #%d now disconnected", (minor - LEGO_USB_TOWER_MINOR_BASE));
826 dbg(2," %s : leave", __func__);
832 * lego_usb_tower_init
834 static int __init lego_usb_tower_init(void)
839 dbg(2," %s : enter", __func__);
841 /* register this driver with the USB subsystem */
842 result = usb_register(&tower_driver);
844 err("usb_register failed for the "__FILE__" driver. Error number %d", result);
849 info(DRIVER_DESC " " DRIVER_VERSION);
852 dbg(2," %s : leave, return value %d", __func__, retval);
859 * lego_usb_tower_exit
861 static void __exit lego_usb_tower_exit(void)
863 dbg(2," %s : enter", __func__);
865 /* deregister this driver with the USB subsystem */
866 usb_deregister (&tower_driver);
868 dbg(2," %s : leave", __func__);
871 module_init (lego_usb_tower_init);
872 module_exit (lego_usb_tower_exit);
874 MODULE_AUTHOR(DRIVER_AUTHOR);
875 MODULE_DESCRIPTION(DRIVER_DESC);
876 #ifdef MODULE_LICENSE
877 MODULE_LICENSE("GPL");