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