If there is an i2c HID device that has a Digitizers/Touchscreen
collection and an X report, attach ims to it. hidms already has
support for touchscreens.
This may help if you have a newer laptop with a touchscreen.
Also limit the logical min/max finding in hidms to the first
non-zero result. The HID descriptor for these touchscreens have
lots of complicated reports which may produce false positives.
Index: sys/dev/i2c/ims.c
===================================================================
RCS file: /cvs/src/sys/dev/i2c/ims.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 ims.c
--- sys/dev/i2c/ims.c 12 Jan 2016 01:11:15 -0000 1.1
+++ sys/dev/i2c/ims.c 31 Aug 2018 21:42:30 -0000
@@ -85,6 +85,12 @@ ims_match(struct device *parent, void *m
HID_USAGE2(HUP_DIGITIZERS, HUD_PEN)))
return (IMATCH_IFACECLASS);
+ if (hid_is_collection(desc, size, iha->reportid,
+ HID_USAGE2(HUP_DIGITIZERS, HUD_TOUCHSCREEN)) &&
+ hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
+ iha->reportid, hid_input, NULL, NULL))
+ return (IMATCH_IFACECLASS);
+
return (IMATCH_NONE);
}
Index: sys/dev/hid/hidms.c
===================================================================
RCS file: /cvs/src/sys/dev/hid/hidms.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 hidms.c
--- sys/dev/hid/hidms.c 22 May 2016 22:06:11 -0000 1.3
+++ sys/dev/hid/hidms.c 31 Aug 2018 21:42:30 -0000
@@ -241,13 +241,15 @@ hidms_setup(struct device *self, struct
h.usage, h.logical_minimum, h.logical_maximum));
switch (HID_GET_USAGE(h.usage)) {
case HUG_X:
- if (ms->sc_flags & HIDMS_ABSX) {
+ if (ms->sc_flags & HIDMS_ABSX &&
+ !ms->sc_tsscale.minx && !ms->sc_tsscale.maxy) {
ms->sc_tsscale.minx = h.logical_minimum;
ms->sc_tsscale.maxx = h.logical_maximum;
}
break;
case HUG_Y:
- if (ms->sc_flags & HIDMS_ABSY) {
+ if (ms->sc_flags & HIDMS_ABSY &&
+ !ms->sc_tsscale.miny && !ms->sc_tsscale.maxy) {
ms->sc_tsscale.miny = h.logical_minimum;
ms->sc_tsscale.maxy = h.logical_maximum;
}