Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.29 569 lines 16 kB view raw
1/* 2 * drivers/input/tablet/wacom_sys.c 3 * 4 * USB Wacom Graphire and Wacom Intuos tablet support - system specific code 5 */ 6 7/* 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 */ 13 14#include "wacom.h" 15#include "wacom_wac.h" 16 17/* defines to get HID report descriptor */ 18#define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) 19#define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) 20#define HID_USAGE_UNDEFINED 0x00 21#define HID_USAGE_PAGE 0x05 22#define HID_USAGE_PAGE_DIGITIZER 0x0d 23#define HID_USAGE_PAGE_DESKTOP 0x01 24#define HID_USAGE 0x09 25#define HID_USAGE_X 0x30 26#define HID_USAGE_Y 0x31 27#define HID_USAGE_X_TILT 0x3d 28#define HID_USAGE_Y_TILT 0x3e 29#define HID_USAGE_FINGER 0x22 30#define HID_USAGE_STYLUS 0x20 31#define HID_COLLECTION 0xc0 32 33enum { 34 WCM_UNDEFINED = 0, 35 WCM_DESKTOP, 36 WCM_DIGITIZER, 37}; 38 39struct hid_descriptor { 40 struct usb_descriptor_header header; 41 __le16 bcdHID; 42 u8 bCountryCode; 43 u8 bNumDescriptors; 44 u8 bDescriptorType; 45 __le16 wDescriptorLength; 46} __attribute__ ((packed)); 47 48/* defines to get/set USB message */ 49#define USB_REQ_GET_REPORT 0x01 50#define USB_REQ_SET_REPORT 0x09 51#define WAC_HID_FEATURE_REPORT 0x03 52 53static int usb_get_report(struct usb_interface *intf, unsigned char type, 54 unsigned char id, void *buf, int size) 55{ 56 return usb_control_msg(interface_to_usbdev(intf), 57 usb_rcvctrlpipe(interface_to_usbdev(intf), 0), 58 USB_REQ_GET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 59 (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber, 60 buf, size, 100); 61} 62 63static int usb_set_report(struct usb_interface *intf, unsigned char type, 64 unsigned char id, void *buf, int size) 65{ 66 return usb_control_msg(interface_to_usbdev(intf), 67 usb_sndctrlpipe(interface_to_usbdev(intf), 0), 68 USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 69 (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber, 70 buf, size, 1000); 71} 72 73static struct input_dev * get_input_dev(struct wacom_combo *wcombo) 74{ 75 return wcombo->wacom->dev; 76} 77 78static void wacom_sys_irq(struct urb *urb) 79{ 80 struct wacom *wacom = urb->context; 81 struct wacom_combo wcombo; 82 int retval; 83 84 switch (urb->status) { 85 case 0: 86 /* success */ 87 break; 88 case -ECONNRESET: 89 case -ENOENT: 90 case -ESHUTDOWN: 91 /* this urb is terminated, clean up */ 92 dbg("%s - urb shutting down with status: %d", __func__, urb->status); 93 return; 94 default: 95 dbg("%s - nonzero urb status received: %d", __func__, urb->status); 96 goto exit; 97 } 98 99 wcombo.wacom = wacom; 100 wcombo.urb = urb; 101 102 if (wacom_wac_irq(wacom->wacom_wac, (void *)&wcombo)) 103 input_sync(get_input_dev(&wcombo)); 104 105 exit: 106 usb_mark_last_busy(wacom->usbdev); 107 retval = usb_submit_urb (urb, GFP_ATOMIC); 108 if (retval) 109 err ("%s - usb_submit_urb failed with result %d", 110 __func__, retval); 111} 112 113void wacom_report_key(void *wcombo, unsigned int key_type, int key_data) 114{ 115 input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data); 116} 117 118void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data) 119{ 120 input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data); 121} 122 123void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data) 124{ 125 input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data); 126} 127 128void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value) 129{ 130 input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value); 131} 132 133__u16 wacom_be16_to_cpu(unsigned char *data) 134{ 135 __u16 value; 136 value = be16_to_cpu(*(__be16 *) data); 137 return value; 138} 139 140__u16 wacom_le16_to_cpu(unsigned char *data) 141{ 142 __u16 value; 143 value = le16_to_cpu(*(__le16 *) data); 144 return value; 145} 146 147void wacom_input_sync(void *wcombo) 148{ 149 input_sync(get_input_dev((struct wacom_combo *)wcombo)); 150} 151 152static int wacom_open(struct input_dev *dev) 153{ 154 struct wacom *wacom = input_get_drvdata(dev); 155 156 mutex_lock(&wacom->lock); 157 158 wacom->irq->dev = wacom->usbdev; 159 160 if (usb_autopm_get_interface(wacom->intf) < 0) { 161 mutex_unlock(&wacom->lock); 162 return -EIO; 163 } 164 165 if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { 166 usb_autopm_put_interface(wacom->intf); 167 mutex_unlock(&wacom->lock); 168 return -EIO; 169 } 170 171 wacom->open = 1; 172 wacom->intf->needs_remote_wakeup = 1; 173 174 mutex_unlock(&wacom->lock); 175 return 0; 176} 177 178static void wacom_close(struct input_dev *dev) 179{ 180 struct wacom *wacom = input_get_drvdata(dev); 181 182 mutex_lock(&wacom->lock); 183 usb_kill_urb(wacom->irq); 184 wacom->open = 0; 185 wacom->intf->needs_remote_wakeup = 0; 186 mutex_unlock(&wacom->lock); 187} 188 189void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 190{ 191 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_1) | 192 BIT_MASK(BTN_5); 193 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 194} 195 196void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 197{ 198 input_dev->evbit[0] |= BIT_MASK(EV_MSC); 199 input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); 200 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); 201 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | 202 BIT_MASK(BTN_4); 203} 204 205void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 206{ 207 input_dev->evbit[0] |= BIT_MASK(EV_REL); 208 input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); 209 input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | 210 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); 211 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | 212 BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2); 213 input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0); 214} 215 216void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 217{ 218 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER); 219 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_0) | 220 BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3); 221 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); 222 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); 223} 224 225void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 226{ 227 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_4) | 228 BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7); 229 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); 230} 231 232void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 233{ 234 input_dev->keybit[BIT_WORD(BTN_MISC)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9); 235} 236 237void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 238{ 239 input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL); 240 input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL); 241 input_dev->relbit[0] |= BIT_MASK(REL_WHEEL); 242 input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_LEFT) | 243 BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) | 244 BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); 245 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) | 246 BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) | 247 BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) | 248 BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2); 249 input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0); 250 input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); 251 input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); 252 input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); 253 input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0); 254 input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); 255} 256 257void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 258{ 259 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2); 260} 261 262void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac) 263{ 264 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER); 265} 266 267static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc, 268 struct wacom_wac *wacom_wac) 269{ 270 struct usb_device *dev = interface_to_usbdev(intf); 271 struct wacom_features *features = wacom_wac->features; 272 char limit = 0, result = 0; 273 int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; 274 unsigned char *report; 275 276 report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); 277 if (!report) 278 return -ENOMEM; 279 280 /* retrive report descriptors */ 281 do { 282 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 283 USB_REQ_GET_DESCRIPTOR, 284 USB_RECIP_INTERFACE | USB_DIR_IN, 285 HID_DEVICET_REPORT << 8, 286 intf->altsetting[0].desc.bInterfaceNumber, /* interface */ 287 report, 288 hid_desc->wDescriptorLength, 289 5000); /* 5 secs */ 290 } while (result < 0 && limit++ < 5); 291 292 if (result < 0) 293 goto out; 294 295 for (i = 0; i < hid_desc->wDescriptorLength; i++) { 296 297 switch (report[i]) { 298 case HID_USAGE_PAGE: 299 switch (report[i + 1]) { 300 case HID_USAGE_PAGE_DIGITIZER: 301 usage = WCM_DIGITIZER; 302 i++; 303 break; 304 305 case HID_USAGE_PAGE_DESKTOP: 306 usage = WCM_DESKTOP; 307 i++; 308 break; 309 } 310 break; 311 312 case HID_USAGE: 313 switch (report[i + 1]) { 314 case HID_USAGE_X: 315 if (usage == WCM_DESKTOP) { 316 if (finger) { 317 features->touch_x_max = 318 features->touch_y_max = 319 wacom_le16_to_cpu(&report[i + 3]); 320 features->x_max = 321 wacom_le16_to_cpu(&report[i + 6]); 322 i += 7; 323 } else if (pen) { 324 features->x_max = 325 wacom_le16_to_cpu(&report[i + 3]); 326 i += 4; 327 } 328 } else if (usage == WCM_DIGITIZER) { 329 /* max pressure isn't reported 330 features->pressure_max = (unsigned short) 331 (report[i+4] << 8 | report[i + 3]); 332 */ 333 features->pressure_max = 255; 334 i += 4; 335 } 336 break; 337 338 case HID_USAGE_Y: 339 if (usage == WCM_DESKTOP) 340 features->y_max = 341 wacom_le16_to_cpu(&report[i + 3]); 342 i += 4; 343 break; 344 345 case HID_USAGE_FINGER: 346 finger = 1; 347 i++; 348 break; 349 350 case HID_USAGE_STYLUS: 351 pen = 1; 352 i++; 353 break; 354 355 case HID_USAGE_UNDEFINED: 356 if (usage == WCM_DESKTOP && finger) /* capacity */ 357 features->pressure_max = 358 wacom_le16_to_cpu(&report[i + 3]); 359 i += 4; 360 break; 361 } 362 break; 363 364 case HID_COLLECTION: 365 /* reset UsagePage ans Finger */ 366 finger = usage = 0; 367 break; 368 } 369 } 370 371 result = 0; 372 373 out: 374 kfree(report); 375 return result; 376} 377 378static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) 379{ 380 struct usb_device *dev = interface_to_usbdev(intf); 381 struct usb_host_interface *interface = intf->cur_altsetting; 382 struct usb_endpoint_descriptor *endpoint; 383 struct wacom *wacom; 384 struct wacom_wac *wacom_wac; 385 struct wacom_features *features; 386 struct input_dev *input_dev; 387 int error = -ENOMEM; 388 char rep_data[2], limit = 0; 389 struct hid_descriptor *hid_desc; 390 391 wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); 392 wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL); 393 input_dev = input_allocate_device(); 394 if (!wacom || !input_dev || !wacom_wac) 395 goto fail1; 396 397 wacom_wac->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma); 398 if (!wacom_wac->data) 399 goto fail1; 400 401 wacom->irq = usb_alloc_urb(0, GFP_KERNEL); 402 if (!wacom->irq) 403 goto fail2; 404 405 wacom->usbdev = dev; 406 wacom->dev = input_dev; 407 wacom->intf = intf; 408 mutex_init(&wacom->lock); 409 usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); 410 strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); 411 412 wacom_wac->features = features = get_wacom_feature(id); 413 BUG_ON(features->pktlen > 10); 414 415 input_dev->name = wacom_wac->features->name; 416 wacom->wacom_wac = wacom_wac; 417 usb_to_input_id(dev, &input_dev->id); 418 419 input_dev->dev.parent = &intf->dev; 420 421 input_set_drvdata(input_dev, wacom); 422 423 input_dev->open = wacom_open; 424 input_dev->close = wacom_close; 425 426 endpoint = &intf->cur_altsetting->endpoint[0].desc; 427 428 /* TabletPC need to retrieve the physical and logical maximum from report descriptor */ 429 if (wacom_wac->features->type == TABLETPC) { 430 if (usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc)) { 431 if (usb_get_extra_descriptor(&interface->endpoint[0], 432 HID_DEVICET_REPORT, &hid_desc)) { 433 printk("wacom: can not retrive extra class descriptor\n"); 434 goto fail2; 435 } 436 } 437 error = wacom_parse_hid(intf, hid_desc, wacom_wac); 438 if (error) 439 goto fail2; 440 } 441 442 input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 443 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) | 444 BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS); 445 input_set_abs_params(input_dev, ABS_X, 0, features->x_max, 4, 0); 446 input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, 4, 0); 447 input_set_abs_params(input_dev, ABS_PRESSURE, 0, features->pressure_max, 0, 0); 448 if (features->type == TABLETPC) { 449 input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_DOUBLETAP); 450 input_set_abs_params(input_dev, ABS_RX, 0, features->touch_x_max, 4, 0); 451 input_set_abs_params(input_dev, ABS_RY, 0, features->touch_y_max, 4, 0); 452 } 453 input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC); 454 455 wacom_init_input_dev(input_dev, wacom_wac); 456 457 usb_fill_int_urb(wacom->irq, dev, 458 usb_rcvintpipe(dev, endpoint->bEndpointAddress), 459 wacom_wac->data, wacom_wac->features->pktlen, 460 wacom_sys_irq, wacom, endpoint->bInterval); 461 wacom->irq->transfer_dma = wacom->data_dma; 462 wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 463 464 error = input_register_device(wacom->dev); 465 if (error) 466 goto fail3; 467 468 /* 469 * Ask the tablet to report tablet data if it is not a Tablet PC. 470 * Repeat until it succeeds 471 */ 472 if (wacom_wac->features->type != TABLETPC) { 473 do { 474 rep_data[0] = 2; 475 rep_data[1] = 2; 476 error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, 477 2, rep_data, 2); 478 if (error >= 0) 479 error = usb_get_report(intf, 480 WAC_HID_FEATURE_REPORT, 2, 481 rep_data, 2); 482 } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); 483 } 484 485 usb_set_intfdata(intf, wacom); 486 return 0; 487 488 fail3: usb_free_urb(wacom->irq); 489 fail2: usb_buffer_free(dev, 10, wacom_wac->data, wacom->data_dma); 490 fail1: input_free_device(input_dev); 491 kfree(wacom); 492 kfree(wacom_wac); 493 return error; 494} 495 496static void wacom_disconnect(struct usb_interface *intf) 497{ 498 struct wacom *wacom = usb_get_intfdata(intf); 499 500 usb_set_intfdata(intf, NULL); 501 502 usb_kill_urb(wacom->irq); 503 input_unregister_device(wacom->dev); 504 usb_free_urb(wacom->irq); 505 usb_buffer_free(interface_to_usbdev(intf), 10, 506 wacom->wacom_wac->data, wacom->data_dma); 507 kfree(wacom->wacom_wac); 508 kfree(wacom); 509} 510 511static int wacom_suspend(struct usb_interface *intf, pm_message_t message) 512{ 513 struct wacom *wacom = usb_get_intfdata(intf); 514 515 mutex_lock(&wacom->lock); 516 usb_kill_urb(wacom->irq); 517 mutex_unlock(&wacom->lock); 518 519 return 0; 520} 521 522static int wacom_resume(struct usb_interface *intf) 523{ 524 struct wacom *wacom = usb_get_intfdata(intf); 525 int rv; 526 527 mutex_lock(&wacom->lock); 528 if (wacom->open) 529 rv = usb_submit_urb(wacom->irq, GFP_NOIO); 530 else 531 rv = 0; 532 mutex_unlock(&wacom->lock); 533 534 return rv; 535} 536 537static int wacom_reset_resume(struct usb_interface *intf) 538{ 539 return wacom_resume(intf); 540} 541 542static struct usb_driver wacom_driver = { 543 .name = "wacom", 544 .probe = wacom_probe, 545 .disconnect = wacom_disconnect, 546 .suspend = wacom_suspend, 547 .resume = wacom_resume, 548 .reset_resume = wacom_reset_resume, 549 .supports_autosuspend = 1, 550}; 551 552static int __init wacom_init(void) 553{ 554 int result; 555 wacom_driver.id_table = get_device_table(); 556 result = usb_register(&wacom_driver); 557 if (result == 0) 558 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" 559 DRIVER_DESC "\n"); 560 return result; 561} 562 563static void __exit wacom_exit(void) 564{ 565 usb_deregister(&wacom_driver); 566} 567 568module_init(wacom_init); 569module_exit(wacom_exit);