35 #include <linux/kernel.h>
36 #include <linux/errno.h>
38 #include <linux/slab.h>
39 #include <linux/module.h>
43 #include <linux/input.h>
45 #include <linux/poll.h>
48 #define VENDOR_ID 0x165b
49 #define PRODUCT_ID 0x8101
51 #ifdef CONFIG_USB_DYNAMIC_MINORS
52 #define USB_TRANZPORT_MINOR_BASE 0
54 #define USB_TRANZPORT_MINOR_BASE 177
70 #define SUPPRESS_EXTRA_OFFLINE_EVENTS 1
71 #define COMPRESS_WHEEL_EVENTS 1
72 #define BUFFERED_READS 1
73 #define RING_BUFFER_SIZE 1000
74 #define WRITE_BUFFER_SIZE 34
75 #define TRANZPORT_USB_TIMEOUT 10
76 #define TRANZPORT_DEBUG 0
81 #define dbg_info(dev, format, arg...) do \
82 { if (debug) dev_info(dev , format , ## arg); } while (0)
112 "Minimum interrupt in interval in ms");
117 "Minimum interrupt out interval in ms");
158 static struct usb_driver usb_tranzport_driver;
177 #define show_int(value) \
178 static ssize_t show_##value(struct device *dev, \
179 struct device_attribute *attr, char *buf) \
181 struct usb_interface *intf = to_usb_interface(dev); \
182 struct usb_tranzport *t = usb_get_intfdata(intf); \
183 return sprintf(buf, "%d\n", t->value); \
185 static DEVICE_ATTR(value, S_IRUGO, show_##value, NULL);
187 #define show_set_int(value) \
188 static ssize_t show_##value(struct device *dev, \
189 struct device_attribute *attr, char *buf) \
191 struct usb_interface *intf = to_usb_interface(dev); \
192 struct usb_tranzport *t = usb_get_intfdata(intf); \
193 return sprintf(buf, "%d\n", t->value); \
195 static ssize_t set_##value(struct device *dev, \
196 struct device_attribute *attr, \
197 const char *buf, size_t count) \
199 struct usb_interface *intf = to_usb_interface(dev); \
200 struct usb_tranzport *t = usb_get_intfdata(intf); \
201 unsigned long temp; \
202 if (kstrtoul(buf, 10, &temp)) \
207 static DEVICE_ATTR(value, S_IWUSR | S_IRUGO, show_##value, set_##value);
218 usb_tranzport_abort_transfers(dev);
238 static void usb_tranzport_interrupt_in_callback(
struct urb *
urb)
241 unsigned int next_ring_head;
245 if (urb->status == -
ENOENT ||
251 "%s: nonzero status received: %d\n",
252 __func__, urb->status);
257 if (urb->actual_length != 8) {
259 "Urb length was %d bytes!!"
260 "Do something intelligent\n",
264 "%s: received: %02x%02x%02x%02x%02x%02x%02x%02x\n",
273 #if SUPPRESS_EXTRA_OFFLINE_EVENTS
288 dbg_info(&dev->
intf->dev,
"%s: head, tail are %x, %x\n",
291 next_ring_head = (dev->
ring_head + 1) % ring_buffer_size;
301 "Ring buffer overflow, %d bytes dropped\n",
313 "usb_submit_urb failed (%d)\n", retval);
324 static void usb_tranzport_interrupt_out_callback(
struct urb *urb)
328 if (urb->status && !(urb->status == -
ENOENT ||
332 "%s - nonzero write interrupt status received: %d\n",
333 __func__, urb->status);
349 subminor = iminor(inode);
356 pr_err(
"%s - error, can't find device for minor %d\n",
359 goto unlock_disconnect_exit;
362 dev = usb_get_intfdata(interface);
366 goto unlock_disconnect_exit;
372 goto unlock_disconnect_exit;
386 interface_to_usbdev(interface),
387 usb_rcvintpipe(interface_to_usbdev(interface),
392 usb_tranzport_interrupt_in_callback, dev,
404 "Couldn't submit interrupt_in_urb %d\n", retval);
416 unlock_disconnect_exit:
425 static int usb_tranzport_release(
struct inode *inode,
struct file *file)
451 usb_tranzport_delete(dev);
461 usb_tranzport_abort_transfers(dev);
474 static unsigned int usb_tranzport_poll(
struct file *file,
poll_table *
wait)
477 unsigned int mask = 0;
491 static ssize_t usb_tranzport_read(
struct file *file,
char __user *
buffer,
492 size_t count, loff_t *ppos)
499 #if COMPRESS_WHEEL_EVENTS
500 signed char oldwheel;
501 signed char newwheel;
523 pr_err(
"%s: No device or device unplugged %d\n",
544 "%s: copying to userspace: "
545 "%02x%02x%02x%02x%02x%02x%02x%02x\n",
560 #if COMPRESS_WHEEL_EVENTS
561 next_tail = (dev->
ring_tail+1) % ring_buffer_size;
564 while (dev->
ring_head != next_tail && cancompress == 1) {
572 "%s: trying to compress: "
573 "%02x%02x%02x%02x%02x%02x%02x%02x\n",
586 ((newwheel > 0 && oldwheel > 0) ||
587 (newwheel < 0 && oldwheel < 0)) &&
597 "%s: should compress: "
598 "%02x%02x%02x%02x%02x%02x%02x%02x\n",
616 newwheel += oldwheel;
617 if (oldwheel > 0 && !(newwheel > 0)) {
621 if (oldwheel < 0 && !(newwheel < 0)) {
645 "%s: head, tail are %x, %x\n",
657 dbg_info(&dev->
intf->dev,
"%s: head, tail are %x, %x\n",
674 static ssize_t usb_tranzport_write(
struct file *file,
675 const char __user *buffer,
size_t count,
679 size_t bytes_to_write;
696 pr_err(
"%s: No device or device unplugged %d\n",
714 bytes_to_write =
min(count,
717 if (bytes_to_write < count)
719 "Write buffer overflow, %zd bytes dropped\n",
720 count - bytes_to_write);
723 "%s: count = %zd, bytes_to_write = %zd\n", __func__,
724 count, bytes_to_write);
732 dev_err(&dev->
intf->dev,
"Endpoint should not be be null!\n");
738 interface_to_usbdev(dev->
intf),
739 usb_sndintpipe(interface_to_usbdev(dev->
intf),
743 usb_tranzport_interrupt_out_callback, dev,
753 "Couldn't submit interrupt_out_urb %d\n", retval);
756 retval = bytes_to_write;
769 .read = usb_tranzport_read,
770 .write = usb_tranzport_write,
771 .open = usb_tranzport_open,
772 .release = usb_tranzport_release,
773 .poll = usb_tranzport_poll,
781 static struct usb_class_driver usb_tranzport_class = {
782 .name =
"tranzport%d",
783 .fops = &usb_tranzport_fops,
795 struct usb_device *
udev = interface_to_usbdev(intf);
797 struct usb_host_interface *iface_desc;
807 dev_err(&intf->dev,
"Out of memory\n");
815 iface_desc = intf->cur_altsetting;
818 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++
i) {
819 endpoint = &iface_desc->endpoint[
i].desc;
821 if (usb_endpoint_is_int_in(endpoint))
824 if (usb_endpoint_is_int_out(endpoint))
828 dev_err(&intf->dev,
"Interrupt in endpoint not found\n");
833 "Interrupt out endpoint not found"
834 "(using control endpoint instead)\n");
840 dev_warn(&intf->dev,
"Interrupt in endpoint size is not 8!\n");
842 if (ring_buffer_size == 0)
854 "Couldn't allocate ring_buffer size %d\n", true_size);
860 dev_err(&intf->dev,
"Couldn't allocate interrupt_in_buffer\n");
865 dev_err(&intf->dev,
"Couldn't allocate interrupt_in_urb\n");
875 "Interrupt out endpoint size is not 8!)\n");
881 dev_err(&intf->dev,
"Couldn't allocate interrupt_out_buffer\n");
886 dev_err(&intf->dev,
"Couldn't allocate interrupt_out_urb\n");
890 min_interrupt_in_interval >
896 min_interrupt_out_interval >
898 min_interrupt_out_interval :
903 usb_set_intfdata(intf, dev);
909 "Not able to get a minor for this device.\n");
910 usb_set_intfdata(intf,
NULL);
926 "Tranzport Device #%d now attached to major %d minor %d\n",
934 usb_tranzport_delete(dev);
943 static void usb_tranzport_disconnect(
struct usb_interface *intf)
948 dev = usb_get_intfdata(intf);
949 usb_set_intfdata(intf,
NULL);
958 usb_tranzport_delete(dev);
966 dev_info(&intf->dev,
"Tranzport Surface #%d now disconnected\n",
971 static struct usb_driver usb_tranzport_driver = {
973 .probe = usb_tranzport_probe,
974 .disconnect = usb_tranzport_disconnect,
975 .id_table = usb_tranzport_table,