usbtouchscreen.c revision f7370699fbbb18f97442d6f47cc2d478a911ad6f
1/****************************************************************************** 2 * usbtouchscreen.c 3 * Driver for USB Touchscreens, supporting those devices: 4 * - eGalax Touchkit 5 * includes eTurboTouch CT-410/510/700 6 * - 3M/Microtouch EX II series 7 * - ITM 8 * - PanJit TouchSet 9 * - eTurboTouch 10 * - Gunze AHL61 11 * - DMC TSC-10/25 12 * - IRTOUCHSYSTEMS/UNITOP 13 * - IdealTEK URTC1000 14 * - General Touch 15 * - GoTop Super_Q2/GogoPen/PenPower tablets 16 * - JASTEC USB touch controller/DigiTech DTR-02U 17 * 18 * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz@gmx.ch> 19 * Copyright (C) by Todd E. Johnson (mtouchusb.c) 20 * 21 * This program is free software; you can redistribute it and/or 22 * modify it under the terms of the GNU General Public License as 23 * published by the Free Software Foundation; either version 2 of the 24 * License, or (at your option) any later version. 25 * 26 * This program is distributed in the hope that it will be useful, but 27 * WITHOUT ANY WARRANTY; without even the implied warranty of 28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 29 * General Public License for more details. 30 * 31 * You should have received a copy of the GNU General Public License 32 * along with this program; if not, write to the Free Software 33 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 34 * 35 * Driver is based on touchkitusb.c 36 * - ITM parts are from itmtouch.c 37 * - 3M parts are from mtouchusb.c 38 * - PanJit parts are from an unmerged driver by Lanslott Gish 39 * - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged 40 * driver from Marius Vollmer 41 * 42 *****************************************************************************/ 43 44//#define DEBUG 45 46#include <linux/kernel.h> 47#include <linux/slab.h> 48#include <linux/input.h> 49#include <linux/module.h> 50#include <linux/init.h> 51#include <linux/usb.h> 52#include <linux/usb/input.h> 53#include <linux/hid.h> 54 55 56#define DRIVER_VERSION "v0.6" 57#define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" 58#define DRIVER_DESC "USB Touchscreen Driver" 59 60static int swap_xy; 61module_param(swap_xy, bool, 0644); 62MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); 63 64static int hwcalib_xy; 65module_param(hwcalib_xy, bool, 0644); 66MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available"); 67 68/* device specifc data/functions */ 69struct usbtouch_usb; 70struct usbtouch_device_info { 71 int min_xc, max_xc; 72 int min_yc, max_yc; 73 int min_press, max_press; 74 int rept_size; 75 76 void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); 77 78 /* 79 * used to get the packet len. possible return values: 80 * > 0: packet len 81 * = 0: skip one byte 82 * < 0: -return value more bytes needed 83 */ 84 int (*get_pkt_len) (unsigned char *pkt, int len); 85 86 int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); 87 int (*init) (struct usbtouch_usb *usbtouch); 88}; 89 90/* a usbtouch device */ 91struct usbtouch_usb { 92 unsigned char *data; 93 dma_addr_t data_dma; 94 unsigned char *buffer; 95 int buf_len; 96 struct urb *irq; 97 struct usb_device *udev; 98 struct input_dev *input; 99 struct usbtouch_device_info *type; 100 char name[128]; 101 char phys[64]; 102 103 int x, y; 104 int touch, press; 105}; 106 107 108/* device types */ 109enum { 110 DEVTYPE_IGNORE = -1, 111 DEVTYPE_EGALAX, 112 DEVTYPE_PANJIT, 113 DEVTYPE_3M, 114 DEVTYPE_ITM, 115 DEVTYPE_ETURBO, 116 DEVTYPE_GUNZE, 117 DEVTYPE_DMC_TSC10, 118 DEVTYPE_IRTOUCH, 119 DEVTYPE_IDEALTEK, 120 DEVTYPE_GENERAL_TOUCH, 121 DEVTYPE_GOTOP, 122 DEVTYPE_JASTEC, 123}; 124 125#define USB_DEVICE_HID_CLASS(vend, prod) \ 126 .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \ 127 | USB_DEVICE_ID_MATCH_INT_PROTOCOL \ 128 | USB_DEVICE_ID_MATCH_DEVICE, \ 129 .idVendor = (vend), \ 130 .idProduct = (prod), \ 131 .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ 132 .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE 133 134static struct usb_device_id usbtouch_devices[] = { 135#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX 136 /* ignore the HID capable devices, handled by usbhid */ 137 {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE}, 138 {USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE}, 139 140 /* normal device IDs */ 141 {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, 142 {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX}, 143 {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, 144 {USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX}, 145 {USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX}, 146 {USB_DEVICE(0x1234, 0x0001), .driver_info = DEVTYPE_EGALAX}, 147 {USB_DEVICE(0x1234, 0x0002), .driver_info = DEVTYPE_EGALAX}, 148#endif 149 150#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT 151 {USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT}, 152 {USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT}, 153 {USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT}, 154 {USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT}, 155#endif 156 157#ifdef CONFIG_TOUCHSCREEN_USB_3M 158 {USB_DEVICE(0x0596, 0x0001), .driver_info = DEVTYPE_3M}, 159#endif 160 161#ifdef CONFIG_TOUCHSCREEN_USB_ITM 162 {USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM}, 163#endif 164 165#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO 166 {USB_DEVICE(0x1234, 0x5678), .driver_info = DEVTYPE_ETURBO}, 167#endif 168 169#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE 170 {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, 171#endif 172 173#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 174 {USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10}, 175#endif 176 177#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH 178 {USB_DEVICE(0x595a, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, 179 {USB_DEVICE(0x6615, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, 180#endif 181 182#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK 183 {USB_DEVICE(0x1391, 0x1000), .driver_info = DEVTYPE_IDEALTEK}, 184#endif 185 186#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH 187 {USB_DEVICE(0x0dfc, 0x0001), .driver_info = DEVTYPE_GENERAL_TOUCH}, 188#endif 189 190#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP 191 {USB_DEVICE(0x08f2, 0x007f), .driver_info = DEVTYPE_GOTOP}, 192 {USB_DEVICE(0x08f2, 0x00ce), .driver_info = DEVTYPE_GOTOP}, 193 {USB_DEVICE(0x08f2, 0x00f4), .driver_info = DEVTYPE_GOTOP}, 194#endif 195 196#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC 197 {USB_DEVICE(0x0f92, 0x0001), .driver_info = DEVTYPE_JASTEC}, 198#endif 199 200 {} 201}; 202 203 204/***************************************************************************** 205 * eGalax part 206 */ 207 208#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX 209 210#ifndef MULTI_PACKET 211#define MULTI_PACKET 212#endif 213 214#define EGALAX_PKT_TYPE_MASK 0xFE 215#define EGALAX_PKT_TYPE_REPT 0x80 216#define EGALAX_PKT_TYPE_DIAG 0x0A 217 218static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 219{ 220 if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) 221 return 0; 222 223 dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F); 224 dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); 225 dev->touch = pkt[0] & 0x01; 226 227 return 1; 228} 229 230static int egalax_get_pkt_len(unsigned char *buf, int len) 231{ 232 switch (buf[0] & EGALAX_PKT_TYPE_MASK) { 233 case EGALAX_PKT_TYPE_REPT: 234 return 5; 235 236 case EGALAX_PKT_TYPE_DIAG: 237 if (len < 2) 238 return -1; 239 240 return buf[1] + 2; 241 } 242 243 return 0; 244} 245#endif 246 247 248/***************************************************************************** 249 * PanJit Part 250 */ 251#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT 252static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 253{ 254 dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1]; 255 dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3]; 256 dev->touch = pkt[0] & 0x01; 257 258 return 1; 259} 260#endif 261 262 263/***************************************************************************** 264 * 3M/Microtouch Part 265 */ 266#ifdef CONFIG_TOUCHSCREEN_USB_3M 267 268#define MTOUCHUSB_ASYNC_REPORT 1 269#define MTOUCHUSB_RESET 7 270#define MTOUCHUSB_REQ_CTRLLR_ID 10 271 272static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 273{ 274 if (hwcalib_xy) { 275 dev->x = (pkt[4] << 8) | pkt[3]; 276 dev->y = 0xffff - ((pkt[6] << 8) | pkt[5]); 277 } else { 278 dev->x = (pkt[8] << 8) | pkt[7]; 279 dev->y = (pkt[10] << 8) | pkt[9]; 280 } 281 dev->touch = (pkt[2] & 0x40) ? 1 : 0; 282 283 return 1; 284} 285 286static int mtouch_init(struct usbtouch_usb *usbtouch) 287{ 288 int ret, i; 289 290 ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), 291 MTOUCHUSB_RESET, 292 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 293 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); 294 dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d", 295 __func__, ret); 296 if (ret < 0) 297 return ret; 298 msleep(150); 299 300 for (i = 0; i < 3; i++) { 301 ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), 302 MTOUCHUSB_ASYNC_REPORT, 303 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 304 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); 305 dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", 306 __func__, ret); 307 if (ret >= 0) 308 break; 309 if (ret != -EPIPE) 310 return ret; 311 } 312 313 /* Default min/max xy are the raw values, override if using hw-calib */ 314 if (hwcalib_xy) { 315 input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0); 316 input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0); 317 } 318 319 return 0; 320} 321#endif 322 323 324/***************************************************************************** 325 * ITM Part 326 */ 327#ifdef CONFIG_TOUCHSCREEN_USB_ITM 328static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 329{ 330 int touch; 331 /* 332 * ITM devices report invalid x/y data if not touched. 333 * if the screen was touched before but is not touched any more 334 * report touch as 0 with the last valid x/y data once. then stop 335 * reporting data until touched again. 336 */ 337 dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F); 338 339 touch = ~pkt[7] & 0x20; 340 if (!touch) { 341 if (dev->touch) { 342 dev->touch = 0; 343 return 1; 344 } 345 346 return 0; 347 } 348 349 dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); 350 dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); 351 dev->touch = touch; 352 353 return 1; 354} 355#endif 356 357 358/***************************************************************************** 359 * eTurboTouch part 360 */ 361#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO 362#ifndef MULTI_PACKET 363#define MULTI_PACKET 364#endif 365static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 366{ 367 unsigned int shift; 368 369 /* packets should start with sync */ 370 if (!(pkt[0] & 0x80)) 371 return 0; 372 373 shift = (6 - (pkt[0] & 0x03)); 374 dev->x = ((pkt[3] << 7) | pkt[4]) >> shift; 375 dev->y = ((pkt[1] << 7) | pkt[2]) >> shift; 376 dev->touch = (pkt[0] & 0x10) ? 1 : 0; 377 378 return 1; 379} 380 381static int eturbo_get_pkt_len(unsigned char *buf, int len) 382{ 383 if (buf[0] & 0x80) 384 return 5; 385 if (buf[0] == 0x01) 386 return 3; 387 return 0; 388} 389#endif 390 391 392/***************************************************************************** 393 * Gunze part 394 */ 395#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE 396static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 397{ 398 if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80)) 399 return 0; 400 401 dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F); 402 dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F); 403 dev->touch = pkt[0] & 0x20; 404 405 return 1; 406} 407#endif 408 409/***************************************************************************** 410 * DMC TSC-10/25 Part 411 * 412 * Documentation about the controller and it's protocol can be found at 413 * http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf 414 * http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf 415 */ 416#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 417 418/* supported data rates. currently using 130 */ 419#define TSC10_RATE_POINT 0x50 420#define TSC10_RATE_30 0x40 421#define TSC10_RATE_50 0x41 422#define TSC10_RATE_80 0x42 423#define TSC10_RATE_100 0x43 424#define TSC10_RATE_130 0x44 425#define TSC10_RATE_150 0x45 426 427/* commands */ 428#define TSC10_CMD_RESET 0x55 429#define TSC10_CMD_RATE 0x05 430#define TSC10_CMD_DATA1 0x01 431 432static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) 433{ 434 struct usb_device *dev = usbtouch->udev; 435 int ret = -ENOMEM; 436 unsigned char *buf; 437 438 buf = kmalloc(2, GFP_KERNEL); 439 if (!buf) 440 goto err_nobuf; 441 /* reset */ 442 buf[0] = buf[1] = 0xFF; 443 ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), 444 TSC10_CMD_RESET, 445 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 446 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 447 if (ret < 0) 448 goto err_out; 449 if (buf[0] != 0x06) { 450 ret = -ENODEV; 451 goto err_out; 452 } 453 454 /* set coordinate output rate */ 455 buf[0] = buf[1] = 0xFF; 456 ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), 457 TSC10_CMD_RATE, 458 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 459 TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); 460 if (ret < 0) 461 goto err_out; 462 if ((buf[0] != 0x06) && (buf[0] != 0x15 || buf[1] != 0x01)) { 463 ret = -ENODEV; 464 goto err_out; 465 } 466 467 /* start sending data */ 468 ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), 469 TSC10_CMD_DATA1, 470 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 471 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); 472err_out: 473 kfree(buf); 474err_nobuf: 475 return ret; 476} 477 478 479static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 480{ 481 dev->x = ((pkt[2] & 0x03) << 8) | pkt[1]; 482 dev->y = ((pkt[4] & 0x03) << 8) | pkt[3]; 483 dev->touch = pkt[0] & 0x01; 484 485 return 1; 486} 487#endif 488 489 490/***************************************************************************** 491 * IRTOUCH Part 492 */ 493#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH 494static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 495{ 496 dev->x = (pkt[3] << 8) | pkt[2]; 497 dev->y = (pkt[5] << 8) | pkt[4]; 498 dev->touch = (pkt[1] & 0x03) ? 1 : 0; 499 500 return 1; 501} 502#endif 503 504 505/***************************************************************************** 506 * IdealTEK URTC1000 Part 507 */ 508#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK 509#ifndef MULTI_PACKET 510#define MULTI_PACKET 511#endif 512static int idealtek_get_pkt_len(unsigned char *buf, int len) 513{ 514 if (buf[0] & 0x80) 515 return 5; 516 if (buf[0] == 0x01) 517 return len; 518 return 0; 519} 520 521static int idealtek_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 522{ 523 switch (pkt[0] & 0x98) { 524 case 0x88: 525 /* touch data in IdealTEK mode */ 526 dev->x = (pkt[1] << 5) | (pkt[2] >> 2); 527 dev->y = (pkt[3] << 5) | (pkt[4] >> 2); 528 dev->touch = (pkt[0] & 0x40) ? 1 : 0; 529 return 1; 530 531 case 0x98: 532 /* touch data in MT emulation mode */ 533 dev->x = (pkt[2] << 5) | (pkt[1] >> 2); 534 dev->y = (pkt[4] << 5) | (pkt[3] >> 2); 535 dev->touch = (pkt[0] & 0x40) ? 1 : 0; 536 return 1; 537 538 default: 539 return 0; 540 } 541} 542#endif 543 544/***************************************************************************** 545 * General Touch Part 546 */ 547#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH 548static int general_touch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 549{ 550 dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1] ; 551 dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3] ; 552 dev->press = pkt[5] & 0xff; 553 dev->touch = pkt[0] & 0x01; 554 555 return 1; 556} 557#endif 558 559/***************************************************************************** 560 * GoTop Part 561 */ 562#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP 563static int gotop_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 564{ 565 dev->x = ((pkt[1] & 0x38) << 4) | pkt[2]; 566 dev->y = ((pkt[1] & 0x07) << 7) | pkt[3]; 567 dev->touch = pkt[0] & 0x01; 568 569 return 1; 570} 571#endif 572 573/***************************************************************************** 574 * JASTEC Part 575 */ 576#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC 577static int jastec_read_data(struct usbtouch_usb *dev, unsigned char *pkt) 578{ 579 dev->x = ((pkt[0] & 0x3f) << 6) | (pkt[2] & 0x3f); 580 dev->y = ((pkt[1] & 0x3f) << 6) | (pkt[3] & 0x3f); 581 dev->touch = (pkt[0] & 0x40) >> 6; 582 583 return 1; 584} 585#endif 586 587 588/***************************************************************************** 589 * the different device descriptors 590 */ 591#ifdef MULTI_PACKET 592static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, 593 unsigned char *pkt, int len); 594#endif 595 596static struct usbtouch_device_info usbtouch_dev_info[] = { 597#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX 598 [DEVTYPE_EGALAX] = { 599 .min_xc = 0x0, 600 .max_xc = 0x07ff, 601 .min_yc = 0x0, 602 .max_yc = 0x07ff, 603 .rept_size = 16, 604 .process_pkt = usbtouch_process_multi, 605 .get_pkt_len = egalax_get_pkt_len, 606 .read_data = egalax_read_data, 607 }, 608#endif 609 610#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT 611 [DEVTYPE_PANJIT] = { 612 .min_xc = 0x0, 613 .max_xc = 0x0fff, 614 .min_yc = 0x0, 615 .max_yc = 0x0fff, 616 .rept_size = 8, 617 .read_data = panjit_read_data, 618 }, 619#endif 620 621#ifdef CONFIG_TOUCHSCREEN_USB_3M 622 [DEVTYPE_3M] = { 623 .min_xc = 0x0, 624 .max_xc = 0x4000, 625 .min_yc = 0x0, 626 .max_yc = 0x4000, 627 .rept_size = 11, 628 .read_data = mtouch_read_data, 629 .init = mtouch_init, 630 }, 631#endif 632 633#ifdef CONFIG_TOUCHSCREEN_USB_ITM 634 [DEVTYPE_ITM] = { 635 .min_xc = 0x0, 636 .max_xc = 0x0fff, 637 .min_yc = 0x0, 638 .max_yc = 0x0fff, 639 .max_press = 0xff, 640 .rept_size = 8, 641 .read_data = itm_read_data, 642 }, 643#endif 644 645#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO 646 [DEVTYPE_ETURBO] = { 647 .min_xc = 0x0, 648 .max_xc = 0x07ff, 649 .min_yc = 0x0, 650 .max_yc = 0x07ff, 651 .rept_size = 8, 652 .process_pkt = usbtouch_process_multi, 653 .get_pkt_len = eturbo_get_pkt_len, 654 .read_data = eturbo_read_data, 655 }, 656#endif 657 658#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE 659 [DEVTYPE_GUNZE] = { 660 .min_xc = 0x0, 661 .max_xc = 0x0fff, 662 .min_yc = 0x0, 663 .max_yc = 0x0fff, 664 .rept_size = 4, 665 .read_data = gunze_read_data, 666 }, 667#endif 668 669#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 670 [DEVTYPE_DMC_TSC10] = { 671 .min_xc = 0x0, 672 .max_xc = 0x03ff, 673 .min_yc = 0x0, 674 .max_yc = 0x03ff, 675 .rept_size = 5, 676 .init = dmc_tsc10_init, 677 .read_data = dmc_tsc10_read_data, 678 }, 679#endif 680 681#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH 682 [DEVTYPE_IRTOUCH] = { 683 .min_xc = 0x0, 684 .max_xc = 0x0fff, 685 .min_yc = 0x0, 686 .max_yc = 0x0fff, 687 .rept_size = 8, 688 .read_data = irtouch_read_data, 689 }, 690#endif 691 692#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK 693 [DEVTYPE_IDEALTEK] = { 694 .min_xc = 0x0, 695 .max_xc = 0x0fff, 696 .min_yc = 0x0, 697 .max_yc = 0x0fff, 698 .rept_size = 8, 699 .process_pkt = usbtouch_process_multi, 700 .get_pkt_len = idealtek_get_pkt_len, 701 .read_data = idealtek_read_data, 702 }, 703#endif 704 705#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH 706 [DEVTYPE_GENERAL_TOUCH] = { 707 .min_xc = 0x0, 708 .max_xc = 0x0500, 709 .min_yc = 0x0, 710 .max_yc = 0x0500, 711 .rept_size = 7, 712 .read_data = general_touch_read_data, 713 }, 714#endif 715 716#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP 717 [DEVTYPE_GOTOP] = { 718 .min_xc = 0x0, 719 .max_xc = 0x03ff, 720 .min_yc = 0x0, 721 .max_yc = 0x03ff, 722 .rept_size = 4, 723 .read_data = gotop_read_data, 724 }, 725#endif 726 727#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC 728 [DEVTYPE_JASTEC] = { 729 .min_xc = 0x0, 730 .max_xc = 0x0fff, 731 .min_yc = 0x0, 732 .max_yc = 0x0fff, 733 .rept_size = 4, 734 .read_data = jastec_read_data, 735 }, 736#endif 737}; 738 739 740/***************************************************************************** 741 * Generic Part 742 */ 743static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, 744 unsigned char *pkt, int len) 745{ 746 struct usbtouch_device_info *type = usbtouch->type; 747 748 if (!type->read_data(usbtouch, pkt)) 749 return; 750 751 input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch); 752 753 if (swap_xy) { 754 input_report_abs(usbtouch->input, ABS_X, usbtouch->y); 755 input_report_abs(usbtouch->input, ABS_Y, usbtouch->x); 756 } else { 757 input_report_abs(usbtouch->input, ABS_X, usbtouch->x); 758 input_report_abs(usbtouch->input, ABS_Y, usbtouch->y); 759 } 760 if (type->max_press) 761 input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press); 762 input_sync(usbtouch->input); 763} 764 765 766#ifdef MULTI_PACKET 767static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, 768 unsigned char *pkt, int len) 769{ 770 unsigned char *buffer; 771 int pkt_len, pos, buf_len, tmp; 772 773 /* process buffer */ 774 if (unlikely(usbtouch->buf_len)) { 775 /* try to get size */ 776 pkt_len = usbtouch->type->get_pkt_len( 777 usbtouch->buffer, usbtouch->buf_len); 778 779 /* drop? */ 780 if (unlikely(!pkt_len)) 781 goto out_flush_buf; 782 783 /* need to append -pkt_len bytes before able to get size */ 784 if (unlikely(pkt_len < 0)) { 785 int append = -pkt_len; 786 if (unlikely(append > len)) 787 append = len; 788 if (usbtouch->buf_len + append >= usbtouch->type->rept_size) 789 goto out_flush_buf; 790 memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, append); 791 usbtouch->buf_len += append; 792 793 pkt_len = usbtouch->type->get_pkt_len( 794 usbtouch->buffer, usbtouch->buf_len); 795 if (pkt_len < 0) 796 return; 797 } 798 799 /* append */ 800 tmp = pkt_len - usbtouch->buf_len; 801 if (usbtouch->buf_len + tmp >= usbtouch->type->rept_size) 802 goto out_flush_buf; 803 memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, tmp); 804 usbtouch_process_pkt(usbtouch, usbtouch->buffer, pkt_len); 805 806 buffer = pkt + tmp; 807 buf_len = len - tmp; 808 } else { 809 buffer = pkt; 810 buf_len = len; 811 } 812 813 /* loop over the received packet, process */ 814 pos = 0; 815 while (pos < buf_len) { 816 /* get packet len */ 817 pkt_len = usbtouch->type->get_pkt_len(buffer + pos, 818 buf_len - pos); 819 820 /* unknown packet: skip one byte */ 821 if (unlikely(!pkt_len)) { 822 pos++; 823 continue; 824 } 825 826 /* full packet: process */ 827 if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) { 828 usbtouch_process_pkt(usbtouch, buffer + pos, pkt_len); 829 } else { 830 /* incomplete packet: save in buffer */ 831 memcpy(usbtouch->buffer, buffer + pos, buf_len - pos); 832 usbtouch->buf_len = buf_len - pos; 833 return; 834 } 835 pos += pkt_len; 836 } 837 838out_flush_buf: 839 usbtouch->buf_len = 0; 840 return; 841} 842#endif 843 844 845static void usbtouch_irq(struct urb *urb) 846{ 847 struct usbtouch_usb *usbtouch = urb->context; 848 int retval; 849 850 switch (urb->status) { 851 case 0: 852 /* success */ 853 break; 854 case -ETIME: 855 /* this urb is timing out */ 856 dbg("%s - urb timed out - was the device unplugged?", 857 __func__); 858 return; 859 case -ECONNRESET: 860 case -ENOENT: 861 case -ESHUTDOWN: 862 /* this urb is terminated, clean up */ 863 dbg("%s - urb shutting down with status: %d", 864 __func__, urb->status); 865 return; 866 default: 867 dbg("%s - nonzero urb status received: %d", 868 __func__, urb->status); 869 goto exit; 870 } 871 872 usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length); 873 874exit: 875 retval = usb_submit_urb(urb, GFP_ATOMIC); 876 if (retval) 877 err("%s - usb_submit_urb failed with result: %d", 878 __func__, retval); 879} 880 881static int usbtouch_open(struct input_dev *input) 882{ 883 struct usbtouch_usb *usbtouch = input_get_drvdata(input); 884 885 usbtouch->irq->dev = usbtouch->udev; 886 887 if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) 888 return -EIO; 889 890 return 0; 891} 892 893static void usbtouch_close(struct input_dev *input) 894{ 895 struct usbtouch_usb *usbtouch = input_get_drvdata(input); 896 897 usb_kill_urb(usbtouch->irq); 898} 899 900 901static void usbtouch_free_buffers(struct usb_device *udev, 902 struct usbtouch_usb *usbtouch) 903{ 904 usb_buffer_free(udev, usbtouch->type->rept_size, 905 usbtouch->data, usbtouch->data_dma); 906 kfree(usbtouch->buffer); 907} 908 909 910static int usbtouch_probe(struct usb_interface *intf, 911 const struct usb_device_id *id) 912{ 913 struct usbtouch_usb *usbtouch; 914 struct input_dev *input_dev; 915 struct usb_host_interface *interface; 916 struct usb_endpoint_descriptor *endpoint; 917 struct usb_device *udev = interface_to_usbdev(intf); 918 struct usbtouch_device_info *type; 919 int err = -ENOMEM; 920 921 /* some devices are ignored */ 922 if (id->driver_info == DEVTYPE_IGNORE) 923 return -ENODEV; 924 925 interface = intf->cur_altsetting; 926 endpoint = &interface->endpoint[0].desc; 927 928 usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); 929 input_dev = input_allocate_device(); 930 if (!usbtouch || !input_dev) 931 goto out_free; 932 933 type = &usbtouch_dev_info[id->driver_info]; 934 usbtouch->type = type; 935 if (!type->process_pkt) 936 type->process_pkt = usbtouch_process_pkt; 937 938 usbtouch->data = usb_buffer_alloc(udev, type->rept_size, 939 GFP_KERNEL, &usbtouch->data_dma); 940 if (!usbtouch->data) 941 goto out_free; 942 943 if (type->get_pkt_len) { 944 usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); 945 if (!usbtouch->buffer) 946 goto out_free_buffers; 947 } 948 949 usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); 950 if (!usbtouch->irq) { 951 dbg("%s - usb_alloc_urb failed: usbtouch->irq", __func__); 952 goto out_free_buffers; 953 } 954 955 usbtouch->udev = udev; 956 usbtouch->input = input_dev; 957 958 if (udev->manufacturer) 959 strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name)); 960 961 if (udev->product) { 962 if (udev->manufacturer) 963 strlcat(usbtouch->name, " ", sizeof(usbtouch->name)); 964 strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name)); 965 } 966 967 if (!strlen(usbtouch->name)) 968 snprintf(usbtouch->name, sizeof(usbtouch->name), 969 "USB Touchscreen %04x:%04x", 970 le16_to_cpu(udev->descriptor.idVendor), 971 le16_to_cpu(udev->descriptor.idProduct)); 972 973 usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); 974 strlcat(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); 975 976 input_dev->name = usbtouch->name; 977 input_dev->phys = usbtouch->phys; 978 usb_to_input_id(udev, &input_dev->id); 979 input_dev->dev.parent = &intf->dev; 980 981 input_set_drvdata(input_dev, usbtouch); 982 983 input_dev->open = usbtouch_open; 984 input_dev->close = usbtouch_close; 985 986 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); 987 input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); 988 input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0); 989 input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0); 990 if (type->max_press) 991 input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, 992 type->max_press, 0, 0); 993 994 usb_fill_int_urb(usbtouch->irq, usbtouch->udev, 995 usb_rcvintpipe(usbtouch->udev, endpoint->bEndpointAddress), 996 usbtouch->data, type->rept_size, 997 usbtouch_irq, usbtouch, endpoint->bInterval); 998 999 usbtouch->irq->dev = usbtouch->udev; 1000 usbtouch->irq->transfer_dma = usbtouch->data_dma; 1001 usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1002 1003 /* device specific init */ 1004 if (type->init) { 1005 err = type->init(usbtouch); 1006 if (err) { 1007 dbg("%s - type->init() failed, err: %d", __func__, err); 1008 goto out_free_buffers; 1009 } 1010 } 1011 1012 err = input_register_device(usbtouch->input); 1013 if (err) { 1014 dbg("%s - input_register_device failed, err: %d", __func__, err); 1015 goto out_free_buffers; 1016 } 1017 1018 usb_set_intfdata(intf, usbtouch); 1019 1020 return 0; 1021 1022out_free_buffers: 1023 usbtouch_free_buffers(udev, usbtouch); 1024out_free: 1025 input_free_device(input_dev); 1026 kfree(usbtouch); 1027 return err; 1028} 1029 1030static void usbtouch_disconnect(struct usb_interface *intf) 1031{ 1032 struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); 1033 1034 dbg("%s - called", __func__); 1035 1036 if (!usbtouch) 1037 return; 1038 1039 dbg("%s - usbtouch is initialized, cleaning up", __func__); 1040 usb_set_intfdata(intf, NULL); 1041 usb_kill_urb(usbtouch->irq); 1042 input_unregister_device(usbtouch->input); 1043 usb_free_urb(usbtouch->irq); 1044 usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); 1045 kfree(usbtouch); 1046} 1047 1048MODULE_DEVICE_TABLE(usb, usbtouch_devices); 1049 1050static struct usb_driver usbtouch_driver = { 1051 .name = "usbtouchscreen", 1052 .probe = usbtouch_probe, 1053 .disconnect = usbtouch_disconnect, 1054 .id_table = usbtouch_devices, 1055}; 1056 1057static int __init usbtouch_init(void) 1058{ 1059 return usb_register(&usbtouch_driver); 1060} 1061 1062static void __exit usbtouch_cleanup(void) 1063{ 1064 usb_deregister(&usbtouch_driver); 1065} 1066 1067module_init(usbtouch_init); 1068module_exit(usbtouch_cleanup); 1069 1070MODULE_AUTHOR(DRIVER_AUTHOR); 1071MODULE_DESCRIPTION(DRIVER_DESC); 1072MODULE_LICENSE("GPL"); 1073 1074MODULE_ALIAS("touchkitusb"); 1075MODULE_ALIAS("itmtouch"); 1076MODULE_ALIAS("mtouchusb"); 1077