acecad.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2001-2005 Edouard TISSERANT <[email protected]>
  4. * Copyright (c) 2004-2005 Stephane VOLTZ <[email protected]>
  5. *
  6. * USB Acecad "Acecad Flair" tablet support
  7. *
  8. * Changelog:
  9. * v3.2 - Added sysfs support
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/slab.h>
  13. #include <linux/module.h>
  14. #include <linux/usb/input.h>
  15. MODULE_AUTHOR("Edouard TISSERANT <[email protected]>");
  16. MODULE_DESCRIPTION("USB Acecad Flair tablet driver");
  17. MODULE_LICENSE("GPL");
  18. #define USB_VENDOR_ID_ACECAD 0x0460
  19. #define USB_DEVICE_ID_FLAIR 0x0004
  20. #define USB_DEVICE_ID_302 0x0008
  21. struct usb_acecad {
  22. char name[128];
  23. char phys[64];
  24. struct usb_interface *intf;
  25. struct input_dev *input;
  26. struct urb *irq;
  27. unsigned char *data;
  28. dma_addr_t data_dma;
  29. };
  30. static void usb_acecad_irq(struct urb *urb)
  31. {
  32. struct usb_acecad *acecad = urb->context;
  33. unsigned char *data = acecad->data;
  34. struct input_dev *dev = acecad->input;
  35. struct usb_interface *intf = acecad->intf;
  36. struct usb_device *udev = interface_to_usbdev(intf);
  37. int prox, status;
  38. switch (urb->status) {
  39. case 0:
  40. /* success */
  41. break;
  42. case -ECONNRESET:
  43. case -ENOENT:
  44. case -ESHUTDOWN:
  45. /* this urb is terminated, clean up */
  46. dev_dbg(&intf->dev, "%s - urb shutting down with status: %d\n",
  47. __func__, urb->status);
  48. return;
  49. default:
  50. dev_dbg(&intf->dev, "%s - nonzero urb status received: %d\n",
  51. __func__, urb->status);
  52. goto resubmit;
  53. }
  54. prox = (data[0] & 0x04) >> 2;
  55. input_report_key(dev, BTN_TOOL_PEN, prox);
  56. if (prox) {
  57. int x = data[1] | (data[2] << 8);
  58. int y = data[3] | (data[4] << 8);
  59. /* Pressure should compute the same way for flair and 302 */
  60. int pressure = data[5] | (data[6] << 8);
  61. int touch = data[0] & 0x01;
  62. int stylus = (data[0] & 0x10) >> 4;
  63. int stylus2 = (data[0] & 0x20) >> 5;
  64. input_report_abs(dev, ABS_X, x);
  65. input_report_abs(dev, ABS_Y, y);
  66. input_report_abs(dev, ABS_PRESSURE, pressure);
  67. input_report_key(dev, BTN_TOUCH, touch);
  68. input_report_key(dev, BTN_STYLUS, stylus);
  69. input_report_key(dev, BTN_STYLUS2, stylus2);
  70. }
  71. /* event termination */
  72. input_sync(dev);
  73. resubmit:
  74. status = usb_submit_urb(urb, GFP_ATOMIC);
  75. if (status)
  76. dev_err(&intf->dev,
  77. "can't resubmit intr, %s-%s/input0, status %d\n",
  78. udev->bus->bus_name,
  79. udev->devpath, status);
  80. }
  81. static int usb_acecad_open(struct input_dev *dev)
  82. {
  83. struct usb_acecad *acecad = input_get_drvdata(dev);
  84. acecad->irq->dev = interface_to_usbdev(acecad->intf);
  85. if (usb_submit_urb(acecad->irq, GFP_KERNEL))
  86. return -EIO;
  87. return 0;
  88. }
  89. static void usb_acecad_close(struct input_dev *dev)
  90. {
  91. struct usb_acecad *acecad = input_get_drvdata(dev);
  92. usb_kill_urb(acecad->irq);
  93. }
  94. static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_id *id)
  95. {
  96. struct usb_device *dev = interface_to_usbdev(intf);
  97. struct usb_host_interface *interface = intf->cur_altsetting;
  98. struct usb_endpoint_descriptor *endpoint;
  99. struct usb_acecad *acecad;
  100. struct input_dev *input_dev;
  101. int pipe, maxp;
  102. int err;
  103. if (interface->desc.bNumEndpoints != 1)
  104. return -ENODEV;
  105. endpoint = &interface->endpoint[0].desc;
  106. if (!usb_endpoint_is_int_in(endpoint))
  107. return -ENODEV;
  108. pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
  109. maxp = usb_maxpacket(dev, pipe);
  110. acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL);
  111. input_dev = input_allocate_device();
  112. if (!acecad || !input_dev) {
  113. err = -ENOMEM;
  114. goto fail1;
  115. }
  116. acecad->data = usb_alloc_coherent(dev, 8, GFP_KERNEL, &acecad->data_dma);
  117. if (!acecad->data) {
  118. err= -ENOMEM;
  119. goto fail1;
  120. }
  121. acecad->irq = usb_alloc_urb(0, GFP_KERNEL);
  122. if (!acecad->irq) {
  123. err = -ENOMEM;
  124. goto fail2;
  125. }
  126. acecad->intf = intf;
  127. acecad->input = input_dev;
  128. if (dev->manufacturer)
  129. strscpy(acecad->name, dev->manufacturer, sizeof(acecad->name));
  130. if (dev->product) {
  131. if (dev->manufacturer)
  132. strlcat(acecad->name, " ", sizeof(acecad->name));
  133. strlcat(acecad->name, dev->product, sizeof(acecad->name));
  134. }
  135. usb_make_path(dev, acecad->phys, sizeof(acecad->phys));
  136. strlcat(acecad->phys, "/input0", sizeof(acecad->phys));
  137. input_dev->name = acecad->name;
  138. input_dev->phys = acecad->phys;
  139. usb_to_input_id(dev, &input_dev->id);
  140. input_dev->dev.parent = &intf->dev;
  141. input_set_drvdata(input_dev, acecad);
  142. input_dev->open = usb_acecad_open;
  143. input_dev->close = usb_acecad_close;
  144. input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
  145. input_dev->keybit[BIT_WORD(BTN_DIGI)] = BIT_MASK(BTN_TOOL_PEN) |
  146. BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS) |
  147. BIT_MASK(BTN_STYLUS2);
  148. switch (id->driver_info) {
  149. case 0:
  150. input_set_abs_params(input_dev, ABS_X, 0, 5000, 4, 0);
  151. input_set_abs_params(input_dev, ABS_Y, 0, 3750, 4, 0);
  152. input_set_abs_params(input_dev, ABS_PRESSURE, 0, 512, 0, 0);
  153. if (!strlen(acecad->name))
  154. snprintf(acecad->name, sizeof(acecad->name),
  155. "USB Acecad Flair Tablet %04x:%04x",
  156. le16_to_cpu(dev->descriptor.idVendor),
  157. le16_to_cpu(dev->descriptor.idProduct));
  158. break;
  159. case 1:
  160. input_set_abs_params(input_dev, ABS_X, 0, 53000, 4, 0);
  161. input_set_abs_params(input_dev, ABS_Y, 0, 2250, 4, 0);
  162. input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1024, 0, 0);
  163. if (!strlen(acecad->name))
  164. snprintf(acecad->name, sizeof(acecad->name),
  165. "USB Acecad 302 Tablet %04x:%04x",
  166. le16_to_cpu(dev->descriptor.idVendor),
  167. le16_to_cpu(dev->descriptor.idProduct));
  168. break;
  169. }
  170. usb_fill_int_urb(acecad->irq, dev, pipe,
  171. acecad->data, maxp > 8 ? 8 : maxp,
  172. usb_acecad_irq, acecad, endpoint->bInterval);
  173. acecad->irq->transfer_dma = acecad->data_dma;
  174. acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  175. err = input_register_device(acecad->input);
  176. if (err)
  177. goto fail3;
  178. usb_set_intfdata(intf, acecad);
  179. return 0;
  180. fail3: usb_free_urb(acecad->irq);
  181. fail2: usb_free_coherent(dev, 8, acecad->data, acecad->data_dma);
  182. fail1: input_free_device(input_dev);
  183. kfree(acecad);
  184. return err;
  185. }
  186. static void usb_acecad_disconnect(struct usb_interface *intf)
  187. {
  188. struct usb_acecad *acecad = usb_get_intfdata(intf);
  189. struct usb_device *udev = interface_to_usbdev(intf);
  190. usb_set_intfdata(intf, NULL);
  191. input_unregister_device(acecad->input);
  192. usb_free_urb(acecad->irq);
  193. usb_free_coherent(udev, 8, acecad->data, acecad->data_dma);
  194. kfree(acecad);
  195. }
  196. static const struct usb_device_id usb_acecad_id_table[] = {
  197. { USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_FLAIR), .driver_info = 0 },
  198. { USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_302), .driver_info = 1 },
  199. { }
  200. };
  201. MODULE_DEVICE_TABLE(usb, usb_acecad_id_table);
  202. static struct usb_driver usb_acecad_driver = {
  203. .name = "usb_acecad",
  204. .probe = usb_acecad_probe,
  205. .disconnect = usb_acecad_disconnect,
  206. .id_table = usb_acecad_id_table,
  207. };
  208. module_usb_driver(usb_acecad_driver);