From owner-dev-commits-src-branches@freebsd.org Tue Sep 21 23:43:39 2021 Return-Path: Delivered-To: dev-commits-src-branches@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 156CF67F5ED; Tue, 21 Sep 2021 23:43:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4HDdKk6kwVz4qFL; Tue, 21 Sep 2021 23:43:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C917F5536; Tue, 21 Sep 2021 23:43:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 18LNhcRo047888; Tue, 21 Sep 2021 23:43:38 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 18LNhc51047886; Tue, 21 Sep 2021 23:43:38 GMT (envelope-from git) Date: Tue, 21 Sep 2021 23:43:38 GMT Message-Id: <202109212343.18LNhc51047886@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Vladimir Kondratyev Subject: git: 3f03cc9a8e20 - stable/13 - wmt(4): Adapt to recent KPI changes MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: wulf X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 3f03cc9a8e209b5906d8d35491faaf6df28aa8f0 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-branches@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commits to the stable branches of the FreeBSD src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Sep 2021 23:43:39 -0000 The branch stable/13 has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=3f03cc9a8e209b5906d8d35491faaf6df28aa8f0 commit 3f03cc9a8e209b5906d8d35491faaf6df28aa8f0 Author: Vladimir Kondratyev AuthorDate: 2021-09-02 19:27:02 +0000 Commit: Vladimir Kondratyev CommitDate: 2021-09-21 23:36:18 +0000 wmt(4): Adapt to recent KPI changes (cherry picked from commit 527b6d60f86953a40136abcf2f38cc4e70118954) --- sys/dev/usb/input/wmt.c | 136 ++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 75 deletions(-) diff --git a/sys/dev/usb/input/wmt.c b/sys/dev/usb/input/wmt.c index 8191c6ff9369..661fa622433f 100644 --- a/sys/dev/usb/input/wmt.c +++ b/sys/dev/usb/input/wmt.c @@ -94,105 +94,101 @@ enum wmt_input_mode { }; enum { - WMT_TIP_SWITCH, -#define WMT_SLOT WMT_TIP_SWITCH - WMT_WIDTH, -#define WMT_MAJOR WMT_WIDTH - WMT_HEIGHT, -#define WMT_MINOR WMT_HEIGHT - WMT_ORIENTATION, - WMT_X, - WMT_Y, - WMT_CONTACTID, - WMT_PRESSURE, - WMT_IN_RANGE, - WMT_CONFIDENCE, - WMT_TOOL_X, - WMT_TOOL_Y, - WMT_N_USAGES, + WMT_TIP_SWITCH = ABS_MT_INDEX(ABS_MT_TOOL_TYPE), + WMT_WIDTH = ABS_MT_INDEX(ABS_MT_TOUCH_MAJOR), + WMT_HEIGHT = ABS_MT_INDEX(ABS_MT_TOUCH_MINOR), + WMT_ORIENTATION = ABS_MT_INDEX(ABS_MT_ORIENTATION), + WMT_X = ABS_MT_INDEX(ABS_MT_POSITION_X), + WMT_Y = ABS_MT_INDEX(ABS_MT_POSITION_Y), + WMT_CONTACTID = ABS_MT_INDEX(ABS_MT_TRACKING_ID), + WMT_PRESSURE = ABS_MT_INDEX(ABS_MT_PRESSURE), + WMT_IN_RANGE = ABS_MT_INDEX(ABS_MT_DISTANCE), + WMT_CONFIDENCE = ABS_MT_INDEX(ABS_MT_BLOB_ID), + WMT_TOOL_X = ABS_MT_INDEX(ABS_MT_TOOL_X), + WMT_TOOL_Y = ABS_MT_INDEX(ABS_MT_TOOL_Y), }; -#define WMT_NO_CODE (ABS_MAX + 10) +#define WMT_N_USAGES MT_CNT #define WMT_NO_USAGE -1 struct wmt_hid_map_item { char name[5]; int32_t usage; /* HID usage */ - uint32_t code; /* Evdev event code */ + bool reported; /* Item value is passed to evdev */ bool required; /* Required for MT Digitizers */ }; static const struct wmt_hid_map_item wmt_hid_map[WMT_N_USAGES] = { - [WMT_TIP_SWITCH] = { /* WMT_SLOT */ + [WMT_TIP_SWITCH] = { .name = "TIP", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_TIP_SWITCH), - .code = ABS_MT_SLOT, + .reported = false, .required = true, }, - [WMT_WIDTH] = { /* WMT_MAJOR */ + [WMT_WIDTH] = { .name = "WDTH", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_WIDTH), - .code = ABS_MT_TOUCH_MAJOR, + .reported = true, .required = false, }, - [WMT_HEIGHT] = { /* WMT_MINOR */ + [WMT_HEIGHT] = { .name = "HGHT", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_HEIGHT), - .code = ABS_MT_TOUCH_MINOR, + .reported = true, .required = false, }, [WMT_ORIENTATION] = { .name = "ORIE", .usage = WMT_NO_USAGE, - .code = ABS_MT_ORIENTATION, + .reported = true, .required = false, }, [WMT_X] = { .name = "X", .usage = HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X), - .code = ABS_MT_POSITION_X, + .reported = true, .required = true, }, [WMT_Y] = { .name = "Y", .usage = HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y), - .code = ABS_MT_POSITION_Y, + .reported = true, .required = true, }, [WMT_CONTACTID] = { .name = "C_ID", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_CONTACTID), - .code = ABS_MT_TRACKING_ID, + .reported = true, .required = true, }, [WMT_PRESSURE] = { .name = "PRES", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_TIP_PRESSURE), - .code = ABS_MT_PRESSURE, + .reported = true, .required = false, }, [WMT_IN_RANGE] = { .name = "RANG", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_IN_RANGE), - .code = ABS_MT_DISTANCE, + .reported = true, .required = false, }, [WMT_CONFIDENCE] = { .name = "CONF", .usage = HID_USAGE2(HUP_DIGITIZERS, HUD_CONFIDENCE), - .code = WMT_NO_CODE, + .reported = false, .required = false, }, [WMT_TOOL_X] = { /* Shares HID usage with WMT_X */ .name = "TL_X", .usage = HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X), - .code = ABS_MT_TOOL_X, + .reported = true, .required = false, }, [WMT_TOOL_Y] = { /* Shares HID usage with WMT_Y */ .name = "TL_Y", .usage = HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y), - .code = ABS_MT_TOOL_Y, + .reported = true, .required = false, }, }; @@ -207,6 +203,7 @@ struct wmt_softc { device_t dev; enum wmt_type type; + int32_t cont_count_max; struct mtx mtx; struct wmt_absinfo ai[WMT_N_USAGES]; struct hid_location locs[MAX_MT_SLOTS][WMT_N_USAGES]; @@ -223,7 +220,7 @@ struct wmt_softc { struct usb_xfer *xfer[WMT_N_TRANSFER]; struct evdev_dev *evdev; - uint32_t slot_data[WMT_N_USAGES]; + union evdev_mt_slot slot_data; uint8_t caps[howmany(WMT_N_USAGES, 8)]; uint8_t buttons[howmany(WMT_BTN_MAX, 8)]; uint32_t isize; @@ -361,7 +358,7 @@ wmt_attach(device_t dev) * 'Contact Count Maximum' */ if (cont_count_max > 0) - sc->ai[WMT_SLOT].max = cont_count_max - 1; + sc->cont_count_max = cont_count_max; } else DPRINTF("usbd_req_get_report error=(%s)\n", usbd_errstr(err)); @@ -400,10 +397,10 @@ wmt_attach(device_t dev) } /* Cap contact count maximum to MAX_MT_SLOTS */ - if (sc->ai[WMT_SLOT].max >= MAX_MT_SLOTS) { + if (sc->cont_count_max > MAX_MT_SLOTS) { DPRINTF("Hardware reported %d contacts while only %d is " - "supported\n", (int)sc->ai[WMT_SLOT].max+1, MAX_MT_SLOTS); - sc->ai[WMT_SLOT].max = MAX_MT_SLOTS - 1; + "supported\n", (int)sc->cont_count_max, MAX_MT_SLOTS); + sc->cont_count_max = MAX_MT_SLOTS; } if (/*usb_test_quirk(hw, UQ_MT_TIMESTAMP) ||*/ wmt_timestamps) @@ -456,9 +453,11 @@ wmt_attach(device_t dev) } } } + evdev_support_abs(sc->evdev, + ABS_MT_SLOT, 0, sc->cont_count_max - 1, 0, 0, 0); WMT_FOREACH_USAGE(sc->caps, i) { - if (wmt_hid_map[i].code != WMT_NO_CODE) - evdev_support_abs(sc->evdev, wmt_hid_map[i].code, + if (wmt_hid_map[i].reported) + evdev_support_abs(sc->evdev, ABS_MT_FIRST + i, sc->ai[i].min, sc->ai[i].max, 0, 0, sc->ai[i].res); } @@ -473,7 +472,7 @@ wmt_attach(device_t dev) sc->is_clickpad ? ", click-pad" : ""); device_printf(sc->dev, "%d contacts and [%s%s%s%s%s]. Report range [%d:%d] - [%d:%d]\n", - (int)sc->ai[WMT_SLOT].max + 1, + (int)sc->cont_count_max, isset(sc->caps, WMT_IN_RANGE) ? "R" : "", isset(sc->caps, WMT_CONFIDENCE) ? "C" : "", isset(sc->caps, WMT_WIDTH) ? "W" : "", @@ -504,14 +503,14 @@ static void wmt_process_report(struct wmt_softc *sc, uint8_t *buf, int len) { size_t usage; - uint32_t *slot_data = sc->slot_data; + union evdev_mt_slot *slot_data; uint32_t cont, btn; uint32_t cont_count; uint32_t width; uint32_t height; uint32_t int_btn = 0; uint32_t left_btn = 0; - int32_t slot; + int slot; uint32_t scan_time; int32_t delta; @@ -558,56 +557,49 @@ wmt_process_report(struct wmt_softc *sc, uint8_t *buf, int len) /* Use protocol Type B for reporting events */ for (cont = 0; cont < cont_count; cont++) { + slot_data = &sc->slot_data; bzero(slot_data, sizeof(sc->slot_data)); WMT_FOREACH_USAGE(sc->caps, usage) { if (sc->locs[cont][usage].size > 0) - slot_data[usage] = hid_get_udata( + slot_data->val[usage] = hid_get_udata( buf, len, &sc->locs[cont][usage]); } - slot = evdev_get_mt_slot_by_tracking_id(sc->evdev, - slot_data[WMT_CONTACTID]); + slot = evdev_mt_id_to_slot(sc->evdev, slot_data->id); #ifdef USB_DEBUG DPRINTFN(6, "cont%01x: data = ", cont); if (wmt_debug >= 6) { WMT_FOREACH_USAGE(sc->caps, usage) { if (wmt_hid_map[usage].usage != WMT_NO_USAGE) - printf("%04x ", slot_data[usage]); + printf("%04x ", slot_data->val[usage]); } - printf("slot = %d\n", (int)slot); + printf("slot = %d\n", slot); } #endif if (slot == -1) { DPRINTF("Slot overflow for contact_id %u\n", - (unsigned)slot_data[WMT_CONTACTID]); + (unsigned)slot_data->id); continue; } - if (slot_data[WMT_TIP_SWITCH] != 0 && + if (slot_data->val[WMT_TIP_SWITCH] != 0 && !(isset(sc->caps, WMT_CONFIDENCE) && - slot_data[WMT_CONFIDENCE] == 0)) { + slot_data->val[WMT_CONFIDENCE] == 0)) { /* This finger is in proximity of the sensor */ sc->touch = true; - slot_data[WMT_SLOT] = slot; - slot_data[WMT_IN_RANGE] = !slot_data[WMT_IN_RANGE]; + slot_data->dist = !slot_data->val[WMT_IN_RANGE]; /* Divided by two to match visual scale of touch */ - width = slot_data[WMT_WIDTH] >> 1; - height = slot_data[WMT_HEIGHT] >> 1; - slot_data[WMT_ORIENTATION] = width > height; - slot_data[WMT_MAJOR] = MAX(width, height); - slot_data[WMT_MINOR] = MIN(width, height); - - WMT_FOREACH_USAGE(sc->caps, usage) - if (wmt_hid_map[usage].code != WMT_NO_CODE) - evdev_push_abs(sc->evdev, - wmt_hid_map[usage].code, - slot_data[usage]); - } else { - evdev_push_abs(sc->evdev, ABS_MT_SLOT, slot); - evdev_push_abs(sc->evdev, ABS_MT_TRACKING_ID, -1); - } + width = slot_data->val[WMT_WIDTH] >> 1; + height = slot_data->val[WMT_HEIGHT] >> 1; + slot_data->ori = width > height; + slot_data->maj = MAX(width, height); + slot_data->min = MIN(width, height); + } else + slot_data = NULL; + + evdev_mt_push_slot(sc->evdev, slot, slot_data); } sc->nconts_todo -= cont_count; @@ -948,13 +940,6 @@ wmt_hid_parse(struct wmt_softc *sc, const void *d_ptr, uint16_t d_len) if (cont_count_max < 1) cont_count_max = cont; - /* Set number of MT protocol type B slots */ - sc->ai[WMT_SLOT] = (struct wmt_absinfo) { - .min = 0, - .max = cont_count_max - 1, - .res = 0, - }; - /* Report touch orientation if both width and height are supported */ if (isset(sc->caps, WMT_WIDTH) && isset(sc->caps, WMT_HEIGHT)) { setbit(sc->caps, WMT_ORIENTATION); @@ -976,6 +961,7 @@ wmt_hid_parse(struct wmt_softc *sc, const void *d_ptr, uint16_t d_len) sc->report_id = report_id; sc->nconts_per_report = cont; sc->has_int_button = has_int_button; + sc->cont_count_max = cont_count_max; return (type); }