xref: /openbmc/linux/drivers/input/touchscreen/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 
60 static int swap_xy;
61 module_param(swap_xy, bool, 0644);
62 MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
63 
64 static int hwcalib_xy;
65 module_param(hwcalib_xy, bool, 0644);
66 MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available");
67 
68 /* device specifc data/functions */
69 struct usbtouch_usb;
70 struct 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 */
91 struct 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 */
109 enum {
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 
134 static 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 
218 static 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 
230 static 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
252 static 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 
272 static 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 
286 static 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
328 static 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
365 static 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 
381 static 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
396 static 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 
432 static 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);
472 err_out:
473 	kfree(buf);
474 err_nobuf:
475 	return ret;
476 }
477 
478 
479 static 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
494 static 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
512 static 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 
521 static 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
548 static 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
563 static 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
577 static 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
592 static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
593 				   unsigned char *pkt, int len);
594 #endif
595 
596 static 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  */
743 static 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
767 static 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 
838 out_flush_buf:
839 	usbtouch->buf_len = 0;
840 	return;
841 }
842 #endif
843 
844 
845 static 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 
874 exit:
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 
881 static 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 
893 static 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 
901 static 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 
910 static 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 
1022 out_free_buffers:
1023 	usbtouch_free_buffers(udev, usbtouch);
1024 out_free:
1025 	input_free_device(input_dev);
1026 	kfree(usbtouch);
1027 	return err;
1028 }
1029 
1030 static 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 
1048 MODULE_DEVICE_TABLE(usb, usbtouch_devices);
1049 
1050 static struct usb_driver usbtouch_driver = {
1051 	.name		= "usbtouchscreen",
1052 	.probe		= usbtouch_probe,
1053 	.disconnect	= usbtouch_disconnect,
1054 	.id_table	= usbtouch_devices,
1055 };
1056 
1057 static int __init usbtouch_init(void)
1058 {
1059 	return usb_register(&usbtouch_driver);
1060 }
1061 
1062 static void __exit usbtouch_cleanup(void)
1063 {
1064 	usb_deregister(&usbtouch_driver);
1065 }
1066 
1067 module_init(usbtouch_init);
1068 module_exit(usbtouch_cleanup);
1069 
1070 MODULE_AUTHOR(DRIVER_AUTHOR);
1071 MODULE_DESCRIPTION(DRIVER_DESC);
1072 MODULE_LICENSE("GPL");
1073 
1074 MODULE_ALIAS("touchkitusb");
1075 MODULE_ALIAS("itmtouch");
1076 MODULE_ALIAS("mtouchusb");
1077