git: 12061cf60579 - stable/13 - hmt(4): Add support for serial packet reporting mode

Vladimir Kondratyev wulf at FreeBSD.org
Tue Sep 21 23:43:43 UTC 2021


The branch stable/13 has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=12061cf605795036a43d9d72be4aef4650b425d9

commit 12061cf605795036a43d9d72be4aef4650b425d9
Author:     Vladimir Kondratyev <wulf at FreeBSD.org>
AuthorDate: 2021-09-02 19:31:17 +0000
Commit:     Vladimir Kondratyev <wulf at FreeBSD.org>
CommitDate: 2021-09-21 23:39:58 +0000

    hmt(4): Add support for serial packet reporting mode
    
    In Serial mode, each packet contains information that describes a
    single physical contact point. Multiple contacts are streamed
    serially. In this mode, devices report all contact information in a
    series of packets. The device sends a separate packet for each
    concurrent contact.
    
    Serial packet reporting mode is used by post-2014 eGalax touchscreens.
    
    Tested by:      Mark Kane <mark_AT_kane_DOT_mn>
    
    (cherry picked from commit 0075742d1834d52b5e24a606aca63ad7e67e81f3)
---
 sys/dev/hid/hmt.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/sys/dev/hid/hmt.c b/sys/dev/hid/hmt.c
index d1b36c424ba8..cb7afe7290d0 100644
--- a/sys/dev/hid/hmt.c
+++ b/sys/dev/hid/hmt.c
@@ -204,6 +204,8 @@ struct hmt_softc {
 	uint8_t			report_id;
 	uint32_t		max_button;
 	bool			has_int_button;
+	bool			has_cont_count;
+	bool			has_scan_time;
 	bool			is_clickpad;
 	bool			do_timestamps;
 #ifdef IICHID_SAMPLING
@@ -371,7 +373,8 @@ hmt_attach(device_t dev)
 		sc->cont_count_max = MAX_MT_SLOTS;
 	}
 
-	if (hid_test_quirk(hw, HQ_MT_TIMESTAMP) || hmt_timestamps)
+	if (sc->has_scan_time &&
+	    (hid_test_quirk(hw, HQ_MT_TIMESTAMP) || hmt_timestamps))
 		sc->do_timestamps = true;
 #ifdef IICHID_SAMPLING
 	if (hid_test_quirk(hw, HQ_IICHID_SAMPLING))
@@ -438,13 +441,14 @@ hmt_attach(device_t dev)
 	}
 
 	/* Announce information about the touch device */
-	device_printf(sc->dev, "Multitouch %s with %d external button%s%s\n",
+	device_printf(sc->dev, "%s %s with %d external button%s%s\n",
+	    sc->cont_count_max > 1 ? "Multitouch" : "Singletouch",
 	    sc->type == HMT_TYPE_TOUCHSCREEN ? "touchscreen" : "touchpad",
 	    nbuttons, nbuttons != 1 ? "s" : "",
 	    sc->is_clickpad ? ", click-pad" : "");
 	device_printf(sc->dev,
-	    "%d contacts with [%s%s%s%s%s] properties. Report range [%d:%d] - [%d:%d]\n",
-	    (int)sc->cont_count_max,
+	    "%d contact%s with [%s%s%s%s%s] properties. Report range [%d:%d] - [%d:%d]\n",
+	    (int)sc->cont_count_max, sc->cont_count_max != 1 ? "s" : "",
 	    isset(sc->caps, HMT_IN_RANGE) ? "R" : "",
 	    isset(sc->caps, HMT_CONFIDENCE) ? "C" : "",
 	    isset(sc->caps, HMT_WIDTH) ? "W" : "",
@@ -513,6 +517,12 @@ hmt_intr(void *context, void *buf, hid_size_t len)
 	}
 
 	/*
+	 * "In Serial mode, each packet contains information that describes a
+	 * single physical contact point. Multiple contacts are streamed
+	 * serially. In this mode, devices report all contact information in a
+	 * series of packets. The device sends a separate packet for each
+	 * concurrent contact."
+	 *
 	 * "In Parallel mode, devices report all contact information in a
 	 * single packet. Each physical contact is represented by a logical
 	 * collection that is embedded in the top-level collection."
@@ -521,7 +531,10 @@ hmt_intr(void *context, void *buf, hid_size_t len)
 	 * report with contactid=0 but contactids are zero-based, find
 	 * contactcount first.
 	 */
-	cont_count = hid_get_udata(buf, len, &sc->cont_count_loc);
+	if (sc->has_cont_count)
+		cont_count = hid_get_udata(buf, len, &sc->cont_count_loc);
+	else
+		cont_count = 1;
 	/*
 	 * "In Hybrid mode, the number of contacts that can be reported in one
 	 * report is less than the maximum number of contacts that the device
@@ -753,7 +766,6 @@ hmt_hid_parse(struct hmt_softc *sc, const void *d_ptr, hid_size_t d_len,
 				sc->cont_count_loc = hi.loc;
 				break;
 			}
-			/* Scan time is required but clobbered by evdev */
 			if (hi.collevel == 1 && hi.usage ==
 			    HID_USAGE2(HUP_DIGITIZERS, HUD_SCAN_TIME)) {
 				scan_time_found = true;
@@ -804,7 +816,7 @@ hmt_hid_parse(struct hmt_softc *sc, const void *d_ptr, hid_size_t d_len,
 	hid_end_parse(hd);
 
 	/* Check for required HID Usages */
-	if (!cont_count_found || !scan_time_found || cont == 0)
+	if ((!cont_count_found && cont != 1) || cont == 0)
 		return (HMT_TYPE_UNSUPPORTED);
 	for (i = 0; i < HMT_N_USAGES; i++) {
 		if (hmt_hid_map[i].required && isclr(sc->caps, i))
@@ -842,6 +854,8 @@ hmt_hid_parse(struct hmt_softc *sc, const void *d_ptr, hid_size_t d_len,
 	sc->cont_count_max = cont_count_max;
 	sc->nconts_per_report = cont;
 	sc->has_int_button = has_int_button;
+	sc->has_cont_count = cont_count_found;
+	sc->has_scan_time = scan_time_found;
 
 	return (type);
 }


More information about the dev-commits-src-all mailing list