svn commit: r224499 - head/sys/dev/usb/input
Alexander Motin
mav at FreeBSD.org
Fri Jul 29 20:38:07 UTC 2011
Author: mav
Date: Fri Jul 29 20:38:06 2011
New Revision: 224499
URL: http://svn.freebsd.org/changeset/base/224499
Log:
Make ums(4) driver more picky, not attaching to "mouses" with absolute
coordinates, such as digitizers and touch-screens, leaving these devices
to uhid(4) and user-level. Specially patched xf86-input-mouse driver can
handle them, that isn't done and can't be done properly with ums(4)
because of mouse(4) protocol limitations.
Approved by: re (kib)
Modified:
head/sys/dev/usb/input/ums.c
Modified: head/sys/dev/usb/input/ums.c
==============================================================================
--- head/sys/dev/usb/input/ums.c Fri Jul 29 20:35:23 2011 (r224498)
+++ head/sys/dev/usb/input/ums.c Fri Jul 29 20:38:06 2011 (r224499)
@@ -367,7 +367,9 @@ ums_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
void *d_ptr;
- int error;
+ struct hid_data *hd;
+ struct hid_item hi;
+ int error, mdepth, found;
uint16_t d_len;
DPRINTFN(11, "\n");
@@ -388,14 +390,44 @@ ums_probe(device_t dev)
if (error)
return (ENXIO);
- if (hid_is_collection(d_ptr, d_len,
- HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE)))
- error = BUS_PROBE_DEFAULT;
- else
- error = ENXIO;
-
+ hd = hid_start_parse(d_ptr, d_len, 1 << hid_input);
+ if (hd == NULL)
+ return (0);
+ mdepth = 0;
+ found = 0;
+ while (hid_get_item(hd, &hi)) {
+ switch (hi.kind) {
+ case hid_collection:
+ if (mdepth != 0)
+ mdepth++;
+ else if (hi.collection == 1 &&
+ hi.usage ==
+ HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE))
+ mdepth++;
+ break;
+ case hid_endcollection:
+ if (mdepth != 0)
+ mdepth--;
+ break;
+ case hid_input:
+ if (mdepth == 0)
+ break;
+ if (hi.usage ==
+ HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X) &&
+ (hi.flags & MOUSE_FLAGS_MASK) == MOUSE_FLAGS)
+ found++;
+ if (hi.usage ==
+ HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y) &&
+ (hi.flags & MOUSE_FLAGS_MASK) == MOUSE_FLAGS)
+ found++;
+ break;
+ default:
+ break;
+ }
+ }
+ hid_end_parse(hd);
free(d_ptr, M_TEMP);
- return (error);
+ return (found ? BUS_PROBE_DEFAULT : ENXIO);
}
static void
More information about the svn-src-head
mailing list