gtco.c 26.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
/*    -*- linux-c -*-

GTCO digitizer USB driver

Use the err(), dbg() and info() macros from usb.h for system logging

TO CHECK:  Is pressure done right on report 5?

Copyright (C) 2006  GTCO CalComp

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2
of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of GTCO-CalComp not be used in advertising
or publicity pertaining to distribution of the software without specific,
written prior permission. GTCO-CalComp makes no representations about the
suitability of this software for any purpose.  It is provided "as is"
without express or implied warranty.

GTCO-CALCOMP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL GTCO-CALCOMP BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTIONS, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

GTCO CalComp, Inc.
7125 Riverwood Drive
Columbia, MD 21046

Jeremy Roberson jroberson@gtcocalcomp.com
Scott Hill shill@gtcocalcomp.com
*/



/*#define DEBUG*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/usb.h>
#include <asm/uaccess.h>
#include <asm/unaligned.h>
#include <asm/byteorder.h>


#include <linux/version.h>
#include <linux/usb/input.h>

/* Version with a Major number of 2 is for kernel inclusion only. */
#define  GTCO_VERSION   "2.00.0006"


/*   MACROS  */

#define VENDOR_ID_GTCO	      0x078C
#define PID_400               0x400
#define PID_401               0x401
#define PID_1000              0x1000
#define PID_1001              0x1001
#define PID_1002              0x1002

/* Max size of a single report */
#define REPORT_MAX_SIZE       10


/* Bitmask whether pen is in range */
#define MASK_INRANGE 0x20
#define MASK_BUTTON  0x01F

#define  PATHLENGTH     64

/* DATA STRUCTURES */

/* Device table */
static struct usb_device_id gtco_usbid_table [] = {
	{ USB_DEVICE(VENDOR_ID_GTCO, PID_400) },
	{ USB_DEVICE(VENDOR_ID_GTCO, PID_401) },
	{ USB_DEVICE(VENDOR_ID_GTCO, PID_1000) },
	{ USB_DEVICE(VENDOR_ID_GTCO, PID_1001) },
	{ USB_DEVICE(VENDOR_ID_GTCO, PID_1002) },
	{ }
};
MODULE_DEVICE_TABLE (usb, gtco_usbid_table);


/* Structure to hold all of our device specific stuff */
struct gtco {

	struct input_dev  *inputdevice; /* input device struct pointer  */
	struct usb_device *usbdev; /* the usb device for this device */
	struct urb        *urbinfo;	 /* urb for incoming reports      */
	dma_addr_t        buf_dma;  /* dma addr of the data buffer*/
	unsigned char *   buffer;   /* databuffer for reports */

	char  usbpath[PATHLENGTH];
	int   openCount;

	/* Information pulled from Report Descriptor */
	u32  usage;
	u32  min_X;
	u32  max_X;
	u32  min_Y;
	u32  max_Y;
	s8   mintilt_X;
	s8   maxtilt_X;
	s8   mintilt_Y;
	s8   maxtilt_Y;
	u32  maxpressure;
	u32  minpressure;
};



/*   Code for parsing the HID REPORT DESCRIPTOR          */

/* From HID1.11 spec */
struct hid_descriptor
{
	struct usb_descriptor_header header;
	__le16   bcdHID;
	u8       bCountryCode;
	u8       bNumDescriptors;
	u8       bDescriptorType;
	__le16   wDescriptorLength;
} __attribute__ ((packed));


#define HID_DESCRIPTOR_SIZE   9
#define HID_DEVICE_TYPE       33
#define REPORT_DEVICE_TYPE    34


#define PREF_TAG(x)     ((x)>>4)
#define PREF_TYPE(x)    ((x>>2)&0x03)
#define PREF_SIZE(x)    ((x)&0x03)

#define TYPE_MAIN       0
#define TYPE_GLOBAL     1
#define TYPE_LOCAL      2
#define TYPE_RESERVED   3

#define TAG_MAIN_INPUT        0x8
#define TAG_MAIN_OUTPUT       0x9
#define TAG_MAIN_FEATURE      0xB
#define TAG_MAIN_COL_START    0xA
#define TAG_MAIN_COL_END      0xC

#define TAG_GLOB_USAGE        0
#define TAG_GLOB_LOG_MIN      1
#define TAG_GLOB_LOG_MAX      2
#define TAG_GLOB_PHYS_MIN     3
#define TAG_GLOB_PHYS_MAX     4
#define TAG_GLOB_UNIT_EXP     5
#define TAG_GLOB_UNIT         6
#define TAG_GLOB_REPORT_SZ    7
#define TAG_GLOB_REPORT_ID    8
#define TAG_GLOB_REPORT_CNT   9
#define TAG_GLOB_PUSH         10
#define TAG_GLOB_POP          11

#define TAG_GLOB_MAX          12

#define DIGITIZER_USAGE_TIP_PRESSURE   0x30
#define DIGITIZER_USAGE_TILT_X         0x3D
#define DIGITIZER_USAGE_TILT_Y         0x3E


/*
 *   This is an abbreviated parser for the HID Report Descriptor.  We
 *   know what devices we are talking to, so this is by no means meant
 *   to be generic.  We can make some safe assumptions:
 *
 *   - We know there are no LONG tags, all short
 *   - We know that we have no MAIN Feature and MAIN Output items
 *   - We know what the IRQ reports are supposed to look like.
 *
 *   The main purpose of this is to use the HID report desc to figure
 *   out the mins and maxs of the fields in the IRQ reports.  The IRQ
 *   reports for 400/401 change slightly if the max X is bigger than 64K.
 *
 */
static void parse_hid_report_descriptor(struct gtco *device, char * report,
					int length)
{
206
	int   x, i = 0;
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

	/* Tag primitive vars */
	__u8   prefix;
	__u8   size;
	__u8   tag;
	__u8   type;
	__u8   data   = 0;
	__u16  data16 = 0;
	__u32  data32 = 0;

	/* For parsing logic */
	int   inputnum = 0;
	__u32 usage = 0;

	/* Global Values, indexed by TAG */
	__u32 globalval[TAG_GLOB_MAX];
	__u32 oldval[TAG_GLOB_MAX];

	/* Debug stuff */
226
	char  maintype = 'x';
227
	char  globtype[12];
228 229
	int   indent = 0;
	char  indentstr[10] = "";
230 231 232 233 234


	dbg("======>>>>>>PARSE<<<<<<======");

	/* Walk  this report and pull out the info we need */
235 236
	while (i < length) {
		prefix = report[i];
237 238 239 240 241 242

		/* Skip over prefix */
		i++;

		/* Determine data size and save the data in the proper variable */
		size = PREF_SIZE(prefix);
243
		switch (size) {
244 245 246 247
		case 1:
			data = report[i];
			break;
		case 2:
248
			data16 = get_unaligned_le16(&report[i]);
249 250 251
			break;
		case 3:
			size = 4;
252
			data32 = get_unaligned_le32(&report[i]);
253
			break;
254 255 256
		}

		/* Skip size of data */
257
		i += size;
258 259 260 261

		/* What we do depends on the tag type */
		tag  = PREF_TAG(prefix);
		type = PREF_TYPE(prefix);
262
		switch (type) {
263
		case TYPE_MAIN:
264 265
			strcpy(globtype, "");
			switch (tag) {
266 267 268 269 270 271 272 273 274

			case TAG_MAIN_INPUT:
				/*
				 * The INPUT MAIN tag signifies this is
				 * information from a report.  We need to
				 * figure out what it is and store the
				 * min/max values
				 */

275 276 277 278 279
				maintype = 'I';
				if (data == 2)
					strcpy(globtype, "Variable");
				else if (data == 3)
					strcpy(globtype, "Var|Const");
280 281

				dbg("::::: Saving Report: %d input #%d Max: 0x%X(%d) Min:0x%X(%d) of %d bits",
282 283 284 285
				    globalval[TAG_GLOB_REPORT_ID], inputnum,
				    globalval[TAG_GLOB_LOG_MAX], globalval[TAG_GLOB_LOG_MAX],
				    globalval[TAG_GLOB_LOG_MIN], globalval[TAG_GLOB_LOG_MIN],
				    globalval[TAG_GLOB_REPORT_SZ] * globalval[TAG_GLOB_REPORT_CNT]);
286 287 288 289 290 291 292 293


				/*
				  We can assume that the first two input items
				  are always the X and Y coordinates.  After
				  that, we look for everything else by
				  local usage value
				 */
294
				switch (inputnum) {
295
				case 0:  /* X coord */
296 297
					dbg("GER: X Usage: 0x%x", usage);
					if (device->max_X == 0) {
298 299 300 301
						device->max_X = globalval[TAG_GLOB_LOG_MAX];
						device->min_X = globalval[TAG_GLOB_LOG_MIN];
					}
					break;
302

303
				case 1:  /* Y coord */
304 305
					dbg("GER: Y Usage: 0x%x", usage);
					if (device->max_Y == 0) {
306 307 308 309
						device->max_Y = globalval[TAG_GLOB_LOG_MAX];
						device->min_Y = globalval[TAG_GLOB_LOG_MIN];
					}
					break;
310

311 312
				default:
					/* Tilt X */
313 314
					if (usage == DIGITIZER_USAGE_TILT_X) {
						if (device->maxtilt_X == 0) {
315 316 317 318 319 320
							device->maxtilt_X = globalval[TAG_GLOB_LOG_MAX];
							device->mintilt_X = globalval[TAG_GLOB_LOG_MIN];
						}
					}

					/* Tilt Y */
321 322
					if (usage == DIGITIZER_USAGE_TILT_Y) {
						if (device->maxtilt_Y == 0) {
323 324 325 326 327 328
							device->maxtilt_Y = globalval[TAG_GLOB_LOG_MAX];
							device->mintilt_Y = globalval[TAG_GLOB_LOG_MIN];
						}
					}

					/* Pressure */
329 330
					if (usage == DIGITIZER_USAGE_TIP_PRESSURE) {
						if (device->maxpressure == 0) {
331 332 333 334 335 336 337 338 339 340
							device->maxpressure = globalval[TAG_GLOB_LOG_MAX];
							device->minpressure = globalval[TAG_GLOB_LOG_MIN];
						}
					}

					break;
				}

				inputnum++;
				break;
341

342
			case TAG_MAIN_OUTPUT:
343
				maintype = 'O';
344
				break;
345

346
			case TAG_MAIN_FEATURE:
347
				maintype = 'F';
348
				break;
349

350
			case TAG_MAIN_COL_START:
351
				maintype = 'S';
352

353
				if (data == 0) {
354
					dbg("======>>>>>> Physical");
355 356
					strcpy(globtype, "Physical");
				} else
357 358 359 360
					dbg("======>>>>>>");

				/* Indent the debug output */
				indent++;
361 362 363
				for (x = 0; x < indent; x++)
					indentstr[x] = '-';
				indentstr[x] = 0;
364 365

				/* Save global tags */
366
				for (x = 0; x < TAG_GLOB_MAX; x++)
367 368 369
					oldval[x] = globalval[x];

				break;
370

371 372
			case TAG_MAIN_COL_END:
				dbg("<<<<<<======");
373
				maintype = 'E';
374
				indent--;
375 376 377
				for (x = 0; x < indent; x++)
					indentstr[x] = '-';
				indentstr[x] = 0;
378 379

				/* Copy global tags back */
380
				for (x = 0; x < TAG_GLOB_MAX; x++)
381 382 383 384 385
					globalval[x] = oldval[x];

				break;
			}

386
			switch (size) {
387 388
			case 1:
				dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
389
				    indentstr, tag, maintype, size, globtype, data);
390
				break;
391

392 393
			case 2:
				dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
394
				    indentstr, tag, maintype, size, globtype, data16);
395
				break;
396

397 398
			case 4:
				dbg("%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x",
399
				    indentstr, tag, maintype, size, globtype, data32);
400 401 402
				break;
			}
			break;
403

404
		case TYPE_GLOBAL:
405
			switch (tag) {
406 407 408 409 410
			case TAG_GLOB_USAGE:
				/*
				 * First time we hit the global usage tag,
				 * it should tell us the type of device
				 */
411
				if (device->usage == 0)
412
					device->usage = data;
413 414

				strcpy(globtype, "USAGE");
415
				break;
416 417 418

			case TAG_GLOB_LOG_MIN:
				strcpy(globtype, "LOG_MIN");
419
				break;
420 421 422

			case TAG_GLOB_LOG_MAX:
				strcpy(globtype, "LOG_MAX");
423
				break;
424 425 426

			case TAG_GLOB_PHYS_MIN:
				strcpy(globtype, "PHYS_MIN");
427
				break;
428 429 430

			case TAG_GLOB_PHYS_MAX:
				strcpy(globtype, "PHYS_MAX");
431
				break;
432 433 434

			case TAG_GLOB_UNIT_EXP:
				strcpy(globtype, "EXP");
435
				break;
436 437 438

			case TAG_GLOB_UNIT:
				strcpy(globtype, "UNIT");
439
				break;
440 441 442

			case TAG_GLOB_REPORT_SZ:
				strcpy(globtype, "REPORT_SZ");
443
				break;
444 445 446

			case TAG_GLOB_REPORT_ID:
				strcpy(globtype, "REPORT_ID");
447
				/* New report, restart numbering */
448
				inputnum = 0;
449
				break;
450

451
			case TAG_GLOB_REPORT_CNT:
452
				strcpy(globtype, "REPORT_CNT");
453
				break;
454 455 456

			case TAG_GLOB_PUSH:
				strcpy(globtype, "PUSH");
457
				break;
458

459
			case TAG_GLOB_POP:
460
				strcpy(globtype, "POP");
461 462 463 464 465
				break;
			}

			/* Check to make sure we have a good tag number
			   so we don't overflow array */
466 467
			if (tag < TAG_GLOB_MAX) {
				switch (size) {
468
				case 1:
469 470 471
					dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
					    indentstr, globtype, tag, size, data);
					globalval[tag] = data;
472
					break;
473

474
				case 2:
475 476 477
					dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
					    indentstr, globtype, tag, size, data16);
					globalval[tag] = data16;
478
					break;
479

480
				case 4:
481 482 483
					dbg("%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x",
					    indentstr, globtype, tag, size, data32);
					globalval[tag] = data32;
484 485
					break;
				}
486
			} else {
487
				dbg("%sGLOBALTAG: ILLEGAL TAG:%d SIZE: %d ",
488
				    indentstr, tag, size);
489 490 491 492
			}
			break;

		case TYPE_LOCAL:
493
			switch (tag) {
494
			case TAG_GLOB_USAGE:
495
				strcpy(globtype, "USAGE");
496 497 498
				/* Always 1 byte */
				usage = data;
				break;
499 500 501

			case TAG_GLOB_LOG_MIN:
				strcpy(globtype, "MIN");
502
				break;
503 504 505

			case TAG_GLOB_LOG_MAX:
				strcpy(globtype, "MAX");
506
				break;
507

508
			default:
509 510
				strcpy(globtype, "UNKNOWN");
				break;
511 512
			}

513
			switch (size) {
514 515
			case 1:
				dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
516
				    indentstr, tag, globtype, size, data);
517
				break;
518

519 520
			case 2:
				dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
521
				    indentstr, tag, globtype, size, data16);
522
				break;
523

524 525
			case 4:
				dbg("%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x",
526
				    indentstr, tag, globtype, size, data32);
527 528 529 530 531 532 533 534 535 536 537
				break;
			}

			break;
		}
	}
}

/*   INPUT DRIVER Routines                               */

/*
538 539
 * Called when opening the input device.  This will submit the URB to
 * the usb system so we start getting reports
540 541 542
 */
static int gtco_input_open(struct input_dev *inputdev)
{
543
	struct gtco *device = input_get_drvdata(inputdev);
544 545

	device->urbinfo->dev = device->usbdev;
546
	if (usb_submit_urb(device->urbinfo, GFP_KERNEL))
547
		return -EIO;
548

549 550 551
	return 0;
}

552 553 554
/*
 * Called when closing the input device.  This will unlink the URB
 */
555 556
static void gtco_input_close(struct input_dev *inputdev)
{
557
	struct gtco *device = input_get_drvdata(inputdev);
558 559 560 561 562 563 564 565 566 567 568 569 570

	usb_kill_urb(device->urbinfo);
}


/*
 *  Setup input device capabilities.  Tell the input system what this
 *  device is capable of generating.
 *
 *  This information is based on what is read from the HID report and
 *  placed in the struct gtco structure
 *
 */
571
static void gtco_setup_caps(struct input_dev *inputdev)
572
{
573
	struct gtco *device = input_get_drvdata(inputdev);
574 575

	/* Which events */
576 577
	inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
		BIT_MASK(EV_MSC);
578 579

	/* Misc event menu block */
580 581
	inputdev->mscbit[0] = BIT_MASK(MSC_SCAN) | BIT_MASK(MSC_SERIAL) |
		BIT_MASK(MSC_RAW);
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600

	/* Absolute values based on HID report info */
	input_set_abs_params(inputdev, ABS_X, device->min_X, device->max_X,
			     0, 0);
	input_set_abs_params(inputdev, ABS_Y, device->min_Y, device->max_Y,
			     0, 0);

	/* Proximity */
	input_set_abs_params(inputdev, ABS_DISTANCE, 0, 1, 0, 0);

	/* Tilt & pressure */
	input_set_abs_params(inputdev, ABS_TILT_X, device->mintilt_X,
			     device->maxtilt_X, 0, 0);
	input_set_abs_params(inputdev, ABS_TILT_Y, device->mintilt_Y,
			     device->maxtilt_Y, 0, 0);
	input_set_abs_params(inputdev, ABS_PRESSURE, device->minpressure,
			     device->maxpressure, 0, 0);

	/* Transducer */
601
	input_set_abs_params(inputdev, ABS_MISC, 0, 0xFF, 0, 0);
602 603 604 605 606 607 608 609 610 611 612 613 614
}

/*   USB Routines  */

/*
 * URB callback routine.  Called when we get IRQ reports from the
 *  digitizer.
 *
 *  This bridges the USB and input device worlds.  It generates events
 *  on the input device based on the USB reports.
 */
static void gtco_urb_callback(struct urb *urbinfo)
{
615
	struct gtco *device = urbinfo->context;
616 617 618 619 620 621 622 623 624
	struct input_dev  *inputdev;
	int               rc;
	u32               val = 0;
	s8                valsigned = 0;
	char              le_buffer[2];

	inputdev = device->inputdevice;

	/* Was callback OK? */
625 626 627
	if (urbinfo->status == -ECONNRESET ||
	    urbinfo->status == -ENOENT ||
	    urbinfo->status == -ESHUTDOWN) {
628 629 630 631 632

		/* Shutdown is occurring. Return and don't queue up any more */
		return;
	}

633 634 635 636 637
	if (urbinfo->status != 0) {
		/*
		 * Some unknown error.  Hopefully temporary. Just go and
		 * requeue an URB
		 */
638 639 640 641 642 643 644 645
		goto resubmit;
	}

	/*
	 * Good URB, now process
	 */

	/* PID dependent when we interpret the report */
646 647 648
	if (inputdev->id.product == PID_1000 ||
	    inputdev->id.product == PID_1001 ||
	    inputdev->id.product == PID_1002) {
649 650 651 652 653 654 655

		/*
		 * Switch on the report ID
		 * Conveniently, the reports have more information, the higher
		 * the report number.  We can just fall through the case
		 * statements if we start with the highest number report
		 */
656
		switch (device->buffer[0]) {
657 658
		case 5:
			/* Pressure is 9 bits */
659
			val = ((u16)(device->buffer[8]) << 1);
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
			val |= (u16)(device->buffer[7] >> 7);
			input_report_abs(inputdev, ABS_PRESSURE,
					 device->buffer[8]);

			/* Mask out the Y tilt value used for pressure */
			device->buffer[7] = (u8)((device->buffer[7]) & 0x7F);

			/* Fall thru */
		case 4:
			/* Tilt */

			/* Sign extend these 7 bit numbers.  */
			if (device->buffer[6] & 0x40)
				device->buffer[6] |= 0x80;

			if (device->buffer[7] & 0x40)
				device->buffer[7] |= 0x80;


			valsigned = (device->buffer[6]);
			input_report_abs(inputdev, ABS_TILT_X, (s32)valsigned);

			valsigned = (device->buffer[7]);
			input_report_abs(inputdev, ABS_TILT_Y, (s32)valsigned);

			/* Fall thru */
		case 2:
		case 3:
			/* Convert buttons, only 5 bits possible */
689
			val = (device->buffer[5]) & MASK_BUTTON;
690 691 692 693 694 695 696 697

			/* We don't apply any meaning to the bitmask,
			   just report */
			input_event(inputdev, EV_MSC, MSC_SERIAL, val);

			/*  Fall thru */
		case 1:
			/* All reports have X and Y coords in the same place */
698
			val = get_unaligned_le16(&device->buffer[1]);
699 700
			input_report_abs(inputdev, ABS_X, val);

701
			val = get_unaligned_le16(&device->buffer[3]);
702 703 704
			input_report_abs(inputdev, ABS_Y, val);

			/* Ditto for proximity bit */
705
			val = device->buffer[5] & MASK_INRANGE ? 1 : 0;
706 707 708 709
			input_report_abs(inputdev, ABS_DISTANCE, val);

			/* Report 1 is an exception to how we handle buttons */
			/* Buttons are an index, not a bitmask */
710
			if (device->buffer[0] == 1) {
711

712 713 714 715 716 717
				/*
				 * Convert buttons, 5 bit index
				 * Report value of index set as one,
				 * the rest as 0
				 */
				val = device->buffer[5] & MASK_BUTTON;
718
				dbg("======>>>>>>REPORT 1: val 0x%X(%d)",
719
				    val, val);
720 721 722 723 724 725 726 727

				/*
				 * We don't apply any meaning to the button
				 * index, just report it
				 */
				input_event(inputdev, EV_MSC, MSC_SERIAL, val);
			}
			break;
728

729 730 731 732 733 734 735
		case 7:
			/* Menu blocks */
			input_event(inputdev, EV_MSC, MSC_SCAN,
				    device->buffer[1]);
			break;
		}
	}
736

737
	/* Other pid class */
738 739
	if (inputdev->id.product == PID_400 ||
	    inputdev->id.product == PID_401) {
740 741

		/* Report 2 */
742
		if (device->buffer[0] == 2) {
743
			/* Menu blocks */
744
			input_event(inputdev, EV_MSC, MSC_SCAN, device->buffer[1]);
745 746 747
		}

		/*  Report 1 */
748
		if (device->buffer[0] == 1) {
749 750 751
			char buttonbyte;

			/*  IF X max > 64K, we still a bit from the y report */
752
			if (device->max_X > 0x10000) {
753

754 755
				val = (u16)(((u16)(device->buffer[2] << 8)) | (u8)device->buffer[1]);
				val |= (u32)(((u8)device->buffer[3] & 0x1) << 16);
756 757 758

				input_report_abs(inputdev, ABS_X, val);

759 760
				le_buffer[0]  = (u8)((u8)(device->buffer[3]) >> 1);
				le_buffer[0] |= (u8)((device->buffer[3] & 0x1) << 7);
761

762 763
				le_buffer[1]  = (u8)(device->buffer[4] >> 1);
				le_buffer[1] |= (u8)((device->buffer[5] & 0x1) << 7);
764

765
				val = get_unaligned_le16(le_buffer);
766 767 768 769 770 771
				input_report_abs(inputdev, ABS_Y, val);

				/*
				 * Shift the button byte right by one to
				 * make it look like the standard report
				 */
772 773
				buttonbyte = device->buffer[5] >> 1;
			} else {
774

775
				val = get_unaligned_le16(&device->buffer[1]);
776 777
				input_report_abs(inputdev, ABS_X, val);

778
				val = get_unaligned_le16(&device->buffer[3]);
779 780 781 782 783 784
				input_report_abs(inputdev, ABS_Y, val);

				buttonbyte = device->buffer[5];
			}

			/* BUTTONS and PROXIMITY */
785
			val = buttonbyte & MASK_INRANGE ? 1 : 0;
786 787 788
			input_report_abs(inputdev, ABS_DISTANCE, val);

			/* Convert buttons, only 4 bits possible */
789
			val = buttonbyte & 0x0F;
790
#ifdef USE_BUTTONS
791 792
			for (i = 0; i < 5; i++)
				input_report_key(inputdev, BTN_DIGI + i, val & (1 << i));
793 794 795 796
#else
			/* We don't apply any meaning to the bitmask, just report */
			input_event(inputdev, EV_MSC, MSC_SERIAL, val);
#endif
797

798 799 800 801 802 803 804 805 806 807 808 809 810
			/* TRANSDUCER */
			input_report_abs(inputdev, ABS_MISC, device->buffer[6]);
		}
	}

	/* Everybody gets report ID's */
	input_event(inputdev, EV_MSC, MSC_RAW,  device->buffer[0]);

	/* Sync it up */
	input_sync(inputdev);

 resubmit:
	rc = usb_submit_urb(urbinfo, GFP_ATOMIC);
811 812
	if (rc != 0)
		err("usb_submit_urb failed rc=0x%x", rc);
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
}

/*
 *  The probe routine.  This is called when the kernel find the matching USB
 *   vendor/product.  We do the following:
 *
 *    - Allocate mem for a local structure to manage the device
 *    - Request a HID Report Descriptor from the device and parse it to
 *      find out the device parameters
 *    - Create an input device and assign it attributes
 *   - Allocate an URB so the device can talk to us when the input
 *      queue is open
 */
static int gtco_probe(struct usb_interface *usbinterface,
		      const struct usb_device_id *id)
{

830 831
	struct gtco             *gtco;
	struct input_dev        *input_dev;
832
	struct hid_descriptor   *hid_desc;
833
	char                    *report;
834 835
	int                     result = 0, retry;
	int			error;
836 837 838
	struct usb_endpoint_descriptor *endpoint;

	/* Allocate memory for device structure */
839 840 841
	gtco = kzalloc(sizeof(struct gtco), GFP_KERNEL);
	input_dev = input_allocate_device();
	if (!gtco || !input_dev) {
842
		err("No more memory");
843 844
		error = -ENOMEM;
		goto err_free_devs;
845 846
	}

847 848
	/* Set pointer to the input device */
	gtco->inputdevice = input_dev;
849 850

	/* Save interface information */
851
	gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface));
852 853

	/* Allocate some data for incoming reports */
854 855 856 857 858 859
	gtco->buffer = usb_buffer_alloc(gtco->usbdev, REPORT_MAX_SIZE,
					GFP_KERNEL, &gtco->buf_dma);
	if (!gtco->buffer) {
		err("No more memory for us buffers");
		error = -ENOMEM;
		goto err_free_devs;
860 861 862
	}

	/* Allocate URB for reports */
863 864 865
	gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL);
	if (!gtco->urbinfo) {
		err("Failed to allocate URB");
866
		return -ENOMEM;
867
		goto err_free_buf;
868 869 870 871 872 873 874 875 876
	}

	/*
	 * The endpoint is always altsetting 0, we know this since we know
	 * this device only has one interrupt endpoint
	 */
	endpoint = &usbinterface->altsetting[0].endpoint[0].desc;

	/* Some debug */
877 878 879 880
	dbg("gtco # interfaces: %d", usbinterface->num_altsetting);
	dbg("num endpoints:     %d", usbinterface->cur_altsetting->desc.bNumEndpoints);
	dbg("interface class:   %d", usbinterface->cur_altsetting->desc.bInterfaceClass);
	dbg("endpoint: attribute:0x%x type:0x%x", endpoint->bmAttributes, endpoint->bDescriptorType);
881 882 883
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)
		dbg("endpoint: we have interrupt endpoint\n");

884
	dbg("endpoint extra len:%d ", usbinterface->altsetting[0].extralen);
885 886 887 888 889 890

	/*
	 * Find the HID descriptor so we can find out the size of the
	 * HID report descriptor
	 */
	if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
891
				     HID_DEVICE_TYPE, &hid_desc) != 0){
892
		err("Can't retrieve exta USB descriptor to get hid report descriptor length");
893 894
		error = -EIO;
		goto err_free_urb;
895 896 897 898 899
	}

	dbg("Extra descriptor success: type:%d  len:%d",
	    hid_desc->bDescriptorType,  hid_desc->wDescriptorLength);

900
	report = kzalloc(le16_to_cpu(hid_desc->wDescriptorLength), GFP_KERNEL);
901 902 903 904
	if (!report) {
		err("No more memory for report");
		error = -ENOMEM;
		goto err_free_urb;
905 906 907
	}

	/* Couple of tries to get reply */
908 909 910
	for (retry = 0; retry < 3; retry++) {
		result = usb_control_msg(gtco->usbdev,
					 usb_rcvctrlpipe(gtco->usbdev, 0),
911 912
					 USB_REQ_GET_DESCRIPTOR,
					 USB_RECIP_INTERFACE | USB_DIR_IN,
913
					 REPORT_DEVICE_TYPE << 8,
914 915
					 0, /* interface */
					 report,
916
					 le16_to_cpu(hid_desc->wDescriptorLength),
917 918
					 5000); /* 5 secs */

919 920 921
		dbg("usb_control_msg result: %d", result);
		if (result == le16_to_cpu(hid_desc->wDescriptorLength)) {
			parse_hid_report_descriptor(gtco, report, result);
922
			break;
923
		}
924 925
	}

926 927
	kfree(report);

928
	/* If we didn't get the report, fail */
929
	if (result != le16_to_cpu(hid_desc->wDescriptorLength)) {
930 931
		err("Failed to get HID Report Descriptor of size: %d",
		    hid_desc->wDescriptorLength);
932 933
		error = -EIO;
		goto err_free_urb;
934 935 936
	}

	/* Create a device file node */
937 938
	usb_make_path(gtco->usbdev, gtco->usbpath, sizeof(gtco->usbpath));
	strlcat(gtco->usbpath, "/input0", sizeof(gtco->usbpath));
939 940

	/* Set Input device functions */
941 942
	input_dev->open = gtco_input_open;
	input_dev->close = gtco_input_close;
943 944

	/* Set input device information */
945 946
	input_dev->name = "GTCO_CalComp";
	input_dev->phys = gtco->usbpath;
947 948

	input_set_drvdata(input_dev, gtco);
949 950

	/* Now set up all the input device capabilities */
951
	gtco_setup_caps(input_dev);
952 953

	/* Set input device required ID information */
954
	usb_to_input_id(gtco->usbdev, &input_dev->id);
955
	input_dev->dev.parent = &usbinterface->dev;
956 957 958 959

	/* Setup the URB, it will be posted later on open of input device */
	endpoint = &usbinterface->altsetting[0].endpoint[0].desc;

960 961 962
	usb_fill_int_urb(gtco->urbinfo,
			 gtco->usbdev,
			 usb_rcvintpipe(gtco->usbdev,
963
					endpoint->bEndpointAddress),
964
			 gtco->buffer,
965 966
			 REPORT_MAX_SIZE,
			 gtco_urb_callback,
967
			 gtco,
968 969
			 endpoint->bInterval);

970 971
	gtco->urbinfo->transfer_dma = gtco->buf_dma;
	gtco->urbinfo->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
972

973 974
	/* Save gtco pointer in USB interface gtco */
	usb_set_intfdata(usbinterface, gtco);
975 976

	/* All done, now register the input device */
977 978 979
	error = input_register_device(input_dev);
	if (error)
		goto err_free_urb;
980 981 982

	return 0;

983 984 985 986 987 988 989 990 991
 err_free_urb:
	usb_free_urb(gtco->urbinfo);
 err_free_buf:
	usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE,
			gtco->buffer, gtco->buf_dma);
 err_free_devs:
	input_free_device(input_dev);
	kfree(gtco);
	return error;
992 993 994 995 996 997 998 999 1000 1001
}

/*
 *  This function is a standard USB function called when the USB device
 *  is disconnected.  We will get rid of the URV, de-register the input
 *  device, and free up allocated memory
 */
static void gtco_disconnect(struct usb_interface *interface)
{
	/* Grab private device ptr */
1002
	struct gtco *gtco = usb_get_intfdata(interface);
1003 1004

	/* Now reverse all the registration stuff */
1005 1006 1007 1008 1009 1010 1011
	if (gtco) {
		input_unregister_device(gtco->inputdevice);
		usb_kill_urb(gtco->urbinfo);
		usb_free_urb(gtco->urbinfo);
		usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE,
				gtco->buffer, gtco->buf_dma);
		kfree(gtco);
1012 1013 1014 1015 1016 1017 1018 1019
	}

	info("gtco driver disconnected");
}

/*   STANDARD MODULE LOAD ROUTINES  */

static struct usb_driver gtco_driverinfo_table = {
1020 1021 1022 1023
	.name		= "gtco",
	.id_table	= gtco_usbid_table,
	.probe		= gtco_probe,
	.disconnect	= gtco_disconnect,
1024
};
1025

1026 1027 1028 1029 1030
/*
 *  Register this module with the USB subsystem
 */
static int __init gtco_init(void)
{
1031 1032 1033 1034 1035 1036
	int error;

	error = usb_register(&gtco_driverinfo_table);
	if (error) {
		err("usb_register() failed rc=0x%x", error);
		return error;
1037
	}
1038 1039 1040

	printk("GTCO usb driver version: %s", GTCO_VERSION);
	return 0;
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050
}

/*
 *   Deregister this module with the USB subsystem
 */
static void __exit gtco_exit(void)
{
	usb_deregister(&gtco_driverinfo_table);
}

1051 1052
module_init(gtco_init);
module_exit(gtco_exit);
1053 1054

MODULE_LICENSE("GPL");