Support Graphire 4x5. From Dave Huang in kern/23965.

This commit is contained in:
augustss 2004-01-04 01:29:11 +00:00
parent 0daa8ba196
commit 956a88bd1e
2 changed files with 117 additions and 9 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ugraphire_rdesc.h,v 1.1 2000/12/29 01:47:49 augustss Exp $ */
/* $NetBSD: ugraphire_rdesc.h,v 1.2 2004/01/04 01:29:11 augustss Exp $ */
/*
* Copyright (c) 2000 Nick Hibma <n_hibma@freebsd.org>
* All rights reserved.
@ -89,3 +89,87 @@ static uByte uhid_graphire_report_descr[] = {
0xb1, 0x02, /* FEATURE (Data,Var,Abs) */
0xc0, /* END_COLLECTION */
};
static uByte uhid_graphire3_4x5_report_descr[] = {
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x02, /* USAGE (Mouse) */
0xa1, 0x01, /* COLLECTION (Application) */
0x85, 0x01, /* REPORT_ID (1) */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x00, /* COLLECTION (Physical) */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x75, 0x05, /* REPORT_SIZE (5) */
0x81, 0x01, /* INPUT (Cnst,Ary,Abs) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x30, /* USAGE (X) */
0x09, 0x31, /* USAGE (Y) */
0x09, 0x38, /* USAGE (Wheel) */
0x15, 0x81, /* LOGICAL_MINIMUM (-127) */
0x25, 0x7f, /* LOGICAL_MAXIMUM (127) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x81, 0x06, /* INPUT (Data,Var,Rel) */
0xc0, /* END_COLLECTION */
0xc0, /* END_COLLECTION */
0x05, 0x0d, /* USAGE_PAGE (Digitizers) */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x01, /* COLLECTION (Applicaption) */
0x85, 0x02, /* REPORT_ID (2) */
0x05, 0x0d, /* USAGE_PAGE (Digitizers) */
0x09, 0x01, /* USAGE (Digitizer) */
0xa1, 0x00, /* COLLECTION (Physical) */
0x09, 0x33, /* USAGE (Touch) */
0x09, 0x44, /* USAGE (Barrel Switch) */
0x09, 0x44, /* USAGE (Barrel Switch) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x02, /* REPORT_COUNT (2) */
0x81, 0x01, /* INPUT (Cnst,Ary,Abs) */
0x09, 0x3c, /* USAGE (Invert) */
0x09, 0x38, /* USAGE (Transducer Index) */
0x09, 0x32, /* USAGE (In Range) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x30, /* USAGE (X) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x26, 0xde, 0x27, /* LOGICAL_MAXIMUM (10206) */
0x75, 0x10, /* REPORT_SIZE (16) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x09, 0x31, /* USAGE (Y) */
0x26, 0xfe, 0x1c, /* LOGICAL_MAXIMUM (7422) */
0x75, 0x10, /* REPORT_SIZE (16) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x05, 0x0d, /* USAGE_PAGE (Digitizers) */
0x09, 0x30, /* USAGE (Tip Pressure) */
0x26, 0xff, 0x01, /* LOGICAL_MAXIMUM (511) */
0x75, 0x10, /* REPORT_SIZE (16) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xc0, /* END_COLLECTION */
0x05, 0x0d, /* USAGE_PAGE (Digitizers) */
0x09, 0x00, /* USAGE (Undefined) */
0x85, 0x02, /* REPORT_ID (2) */
0x95, 0x01, /* REPORT_COUNT (1) */
0xb1, 0x02, /* FEATURE (Data,Var,Abs) */
0x09, 0x00, /* USAGE (Undefined) */
0x85, 0x03, /* REPORT_ID (3) */
0x95, 0x01, /* REPORT_COUNT (1) */
0xb1, 0x02, /* FEATURE (Data,Var,Abs) */
0xc0 /* END_COLLECTION */
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: uhidev.c,v 1.16 2003/10/25 18:28:31 christos Exp $ */
/* $NetBSD: uhidev.c,v 1.17 2004/01/04 01:29:11 augustss Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.16 2003/10/25 18:28:31 christos Exp $");
__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.17 2004/01/04 01:29:11 augustss Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -109,7 +109,7 @@ USB_ATTACH(uhidev)
struct uhidev *dev;
int size, nrepid, repid, repsz;
int repsizes[256];
void *desc;
void *desc, *descptr = NULL;
usbd_status err;
char devinfo[1024];
@ -157,21 +157,45 @@ USB_ATTACH(uhidev)
sc->sc_ep_addr = ed->bEndpointAddress;
/* XXX need to extend this */
if (uaa->vendor == USB_VENDOR_WACOM &&
uaa->product == USB_PRODUCT_WACOM_GRAPHIRE /* &&
if (uaa->vendor == USB_VENDOR_WACOM /* &&
uaa->revision == 0x???? */) { /* XXX should use revision */
char reportbuf[] = {2, 2, 2};
/* The report descriptor for the Wacom Graphire is broken. */
size = sizeof uhid_graphire_report_descr;
switch (uaa->product) {
case USB_PRODUCT_WACOM_GRAPHIRE:
size = sizeof uhid_graphire_report_descr;
descptr = uhid_graphire_report_descr;
break;
case USB_PRODUCT_WACOM_GRAPHIRE3_4X5: /* The 6x8 too? */
/*
* The Graphire3 needs 0x0202 to be written to
* feature report ID 2 before it'll start
* returning digitizer data.
*/
usbd_set_report(uaa->iface, UHID_FEATURE_REPORT, 2,
&reportbuf, sizeof(reportbuf));
size = sizeof uhid_graphire3_4x5_report_descr;
descptr = uhid_graphire3_4x5_report_descr;
break;
}
}
if (descptr) {
desc = malloc(size, M_USBDEV, M_NOWAIT);
if (desc == NULL)
err = USBD_NOMEM;
else {
err = USBD_NORMAL_COMPLETION;
memcpy(desc, uhid_graphire_report_descr, size);
memcpy(desc, descptr, size);
}
} else {
desc = NULL;
err = usbd_read_report_desc(uaa->iface, &desc, &size, M_USBDEV);
err = usbd_read_report_desc(uaa->iface, &desc, &size,
M_USBDEV);
}
if (err) {
printf("%s: no report descriptor\n", USBDEVNAME(sc->sc_dev));