kbtab.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include <linux/kernel.h>
  2. #include <linux/slab.h>
  3. #include <linux/module.h>
  4. #include <linux/init.h>
  5. #include <linux/usb/input.h>
  6. #include <asm/unaligned.h>
  7. /*
  8. * Version Information
  9. * v0.0.1 - Original, extremely basic version, 2.4.xx only
  10. * v0.0.2 - Updated, works with 2.5.62 and 2.4.20;
  11. * - added pressure-threshold modules param code from
  12. * Alex Perry <alex.perry@ieee.org>
  13. */
  14. #define DRIVER_VERSION "v0.0.2"
  15. #define DRIVER_AUTHOR "Josh Myer <josh@joshisanerd.com>"
  16. #define DRIVER_DESC "USB KB Gear JamStudio Tablet driver"
  17. #define DRIVER_LICENSE "GPL"
  18. MODULE_AUTHOR(DRIVER_AUTHOR);
  19. MODULE_DESCRIPTION(DRIVER_DESC);
  20. MODULE_LICENSE(DRIVER_LICENSE);
  21. #define USB_VENDOR_ID_KBGEAR 0x084e
  22. static int kb_pressure_click = 0x10;
  23. module_param(kb_pressure_click, int, 0);
  24. MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks");
  25. struct kbtab {
  26. signed char *data;
  27. dma_addr_t data_dma;
  28. struct input_dev *dev;
  29. struct usb_device *usbdev;
  30. struct urb *irq;
  31. int x, y;
  32. int button;
  33. int pressure;
  34. __u32 serial[2];
  35. char phys[32];
  36. };
  37. static void kbtab_irq(struct urb *urb)
  38. {
  39. struct kbtab *kbtab = urb->context;
  40. unsigned char *data = kbtab->data;
  41. struct input_dev *dev = kbtab->dev;
  42. int retval;
  43. switch (urb->status) {
  44. case 0:
  45. /* success */
  46. break;
  47. case -ECONNRESET:
  48. case -ENOENT:
  49. case -ESHUTDOWN:
  50. /* this urb is terminated, clean up */
  51. dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
  52. return;
  53. default:
  54. dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
  55. goto exit;
  56. }
  57. kbtab->x = le16_to_cpu(get_unaligned((__le16 *) &data[1]));
  58. kbtab->y = le16_to_cpu(get_unaligned((__le16 *) &data[3]));
  59. kbtab->pressure = (data[5]);
  60. input_report_key(dev, BTN_TOOL_PEN, 1);
  61. input_report_abs(dev, ABS_X, kbtab->x);
  62. input_report_abs(dev, ABS_Y, kbtab->y);
  63. /*input_report_key(dev, BTN_TOUCH , data[0] & 0x01);*/
  64. input_report_key(dev, BTN_RIGHT, data[0] & 0x02);
  65. if (-1 == kb_pressure_click) {
  66. input_report_abs(dev, ABS_PRESSURE, kbtab->pressure);
  67. } else {
  68. input_report_key(dev, BTN_LEFT, (kbtab->pressure > kb_pressure_click) ? 1 : 0);
  69. };
  70. input_sync(dev);
  71. exit:
  72. retval = usb_submit_urb (urb, GFP_ATOMIC);
  73. if (retval)
  74. err ("%s - usb_submit_urb failed with result %d",
  75. __FUNCTION__, retval);
  76. }
  77. static struct usb_device_id kbtab_ids[] = {
  78. { USB_DEVICE(USB_VENDOR_ID_KBGEAR, 0x1001), .driver_info = 0 },
  79. { }
  80. };
  81. MODULE_DEVICE_TABLE(usb, kbtab_ids);
  82. static int kbtab_open(struct input_dev *dev)
  83. {
  84. struct kbtab *kbtab = dev->private;
  85. kbtab->irq->dev = kbtab->usbdev;
  86. if (usb_submit_urb(kbtab->irq, GFP_KERNEL))
  87. return -EIO;
  88. return 0;
  89. }
  90. static void kbtab_close(struct input_dev *dev)
  91. {
  92. struct kbtab *kbtab = dev->private;
  93. usb_kill_urb(kbtab->irq);
  94. }
  95. static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *id)
  96. {
  97. struct usb_device *dev = interface_to_usbdev(intf);
  98. struct usb_endpoint_descriptor *endpoint;
  99. struct kbtab *kbtab;
  100. struct input_dev *input_dev;
  101. kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
  102. input_dev = input_allocate_device();
  103. if (!kbtab || !input_dev)
  104. goto fail1;
  105. kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma);
  106. if (!kbtab->data)
  107. goto fail1;
  108. kbtab->irq = usb_alloc_urb(0, GFP_KERNEL);
  109. if (!kbtab->irq)
  110. goto fail2;
  111. kbtab->usbdev = dev;
  112. kbtab->dev = input_dev;
  113. usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys));
  114. strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys));
  115. input_dev->name = "KB Gear Tablet";
  116. input_dev->phys = kbtab->phys;
  117. usb_to_input_id(dev, &input_dev->id);
  118. input_dev->cdev.dev = &intf->dev;
  119. input_dev->private = kbtab;
  120. input_dev->open = kbtab_open;
  121. input_dev->close = kbtab_close;
  122. input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
  123. input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
  124. input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
  125. input_dev->mscbit[0] |= BIT(MSC_SERIAL);
  126. input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0);
  127. input_set_abs_params(input_dev, ABS_Y, 0, 0x1750, 4, 0);
  128. input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0);
  129. endpoint = &intf->cur_altsetting->endpoint[0].desc;
  130. usb_fill_int_urb(kbtab->irq, dev,
  131. usb_rcvintpipe(dev, endpoint->bEndpointAddress),
  132. kbtab->data, 8,
  133. kbtab_irq, kbtab, endpoint->bInterval);
  134. kbtab->irq->transfer_dma = kbtab->data_dma;
  135. kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  136. input_register_device(kbtab->dev);
  137. usb_set_intfdata(intf, kbtab);
  138. return 0;
  139. fail2: usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma);
  140. fail1: input_free_device(input_dev);
  141. kfree(kbtab);
  142. return -ENOMEM;
  143. }
  144. static void kbtab_disconnect(struct usb_interface *intf)
  145. {
  146. struct kbtab *kbtab = usb_get_intfdata(intf);
  147. usb_set_intfdata(intf, NULL);
  148. if (kbtab) {
  149. usb_kill_urb(kbtab->irq);
  150. input_unregister_device(kbtab->dev);
  151. usb_free_urb(kbtab->irq);
  152. usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma);
  153. kfree(kbtab);
  154. }
  155. }
  156. static struct usb_driver kbtab_driver = {
  157. .name = "kbtab",
  158. .probe = kbtab_probe,
  159. .disconnect = kbtab_disconnect,
  160. .id_table = kbtab_ids,
  161. };
  162. static int __init kbtab_init(void)
  163. {
  164. int retval;
  165. retval = usb_register(&kbtab_driver);
  166. if (retval)
  167. goto out;
  168. info(DRIVER_VERSION ":" DRIVER_DESC);
  169. out:
  170. return retval;
  171. }
  172. static void __exit kbtab_exit(void)
  173. {
  174. usb_deregister(&kbtab_driver);
  175. }
  176. module_init(kbtab_init);
  177. module_exit(kbtab_exit);