From owner-dev-commits-src-main@freebsd.org Wed Dec 23 08:11:56 2020 Return-Path: Delivered-To: dev-commits-src-main@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 682254B6FBC; Wed, 23 Dec 2020 08:11:56 +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 "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D15XD2S9kz4VVg; Wed, 23 Dec 2020 08:11:56 +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 472491ABD4; Wed, 23 Dec 2020 08:11:56 +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 0BN8BunM054508; Wed, 23 Dec 2020 08:11:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 0BN8Bu9M054507; Wed, 23 Dec 2020 08:11:56 GMT (envelope-from git) Date: Wed, 23 Dec 2020 08:11:56 GMT Message-Id: <202012230811.0BN8Bu9M054507@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Vladimir Kondratyev Subject: git: 54d2dfc4b24d - cyapa(4): Add support for evdev protocol 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/main X-Git-Reftype: branch X-Git-Commit: 54d2dfc4b24db110c8a4b75e2f02a2360fd9fc8c Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "Commit messages for the main branch of the src repository." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Dec 2020 08:11:56 -0000 The branch main has been updated by wulf: URL: https://cgit.FreeBSD.org/src/commit/?id=54d2dfc4b24db110c8a4b75e2f02a2360fd9fc8c commit 54d2dfc4b24db110c8a4b75e2f02a2360fd9fc8c Author: Vladimir Kondratyev AuthorDate: 2020-12-21 15:44:28 +0000 Commit: Vladimir Kondratyev CommitDate: 2020-12-23 08:10:49 +0000 cyapa(4): Add support for evdev protocol Tested-by: Matthias Apitz MFC-after: 2 weeks --- sys/dev/cyapa/cyapa.c | 89 ++++++++++++++++++++++++++++++++++++++++++ sys/modules/i2c/cyapa/Makefile | 3 +- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/sys/dev/cyapa/cyapa.c b/sys/dev/cyapa/cyapa.c index 644d59ae095f..caad161cb56a 100644 --- a/sys/dev/cyapa/cyapa.c +++ b/sys/dev/cyapa/cyapa.c @@ -99,6 +99,8 @@ __FBSDID("$FreeBSD$"); * below) the other two. */ +#include "opt_evdev.h" + #include #include #include @@ -126,6 +128,11 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef EVDEV_SUPPORT +#include +#include +#endif + #include "iicbus_if.h" #include "bus_if.h" #include "device_if.h" @@ -153,6 +160,9 @@ struct cyapa_softc { struct selinfo selinfo; struct mtx mutex; struct intr_config_hook intr_hook; +#ifdef EVDEV_SUPPORT + struct evdev_dev *evdev; +#endif int cap_resx; int cap_resy; @@ -562,8 +572,47 @@ cyapa_attach(device_t dev) sc->intr_hook.ich_func = cyapa_start; sc->intr_hook.ich_arg = sc->dev; +#ifdef EVDEV_SUPPORT + sc->evdev = evdev_alloc(); + evdev_set_name(sc->evdev, device_get_desc(sc->dev)); + evdev_set_phys(sc->evdev, device_get_nameunit(sc->dev)); + evdev_set_id(sc->evdev, BUS_I2C, 0, 0, 1); + evdev_set_flag(sc->evdev, EVDEV_FLAG_MT_STCOMPAT); + evdev_set_flag(sc->evdev, EVDEV_FLAG_MT_AUTOREL); + + evdev_support_event(sc->evdev, EV_SYN); + evdev_support_event(sc->evdev, EV_ABS); + evdev_support_event(sc->evdev, EV_KEY); + evdev_support_prop(sc->evdev, INPUT_PROP_POINTER); + if (sc->cap_buttons & CYAPA_FNGR_LEFT) + evdev_support_key(sc->evdev, BTN_LEFT); + if (sc->cap_buttons & CYAPA_FNGR_RIGHT) + evdev_support_key(sc->evdev, BTN_RIGHT); + if (sc->cap_buttons & CYAPA_FNGR_MIDDLE) + evdev_support_key(sc->evdev, BTN_MIDDLE); + if (sc->cap_buttons == CYAPA_FNGR_LEFT) + evdev_support_prop(sc->evdev, INPUT_PROP_BUTTONPAD); + + evdev_support_abs(sc->evdev, ABS_MT_SLOT, + 0, 0, CYAPA_MAX_MT - 1, 0, 0, 0); + evdev_support_abs(sc->evdev, ABS_MT_TRACKING_ID, 0, -1, 15, 0, 0, 0); + evdev_support_abs(sc->evdev, ABS_MT_POSITION_X, 0, 0, sc->cap_resx, + 0, 0, sc->cap_phyx != 0 ? sc->cap_resx / sc->cap_phyx : 0); + evdev_support_abs(sc->evdev, ABS_MT_POSITION_Y, 0, 0, sc->cap_resy, + 0, 0, sc->cap_phyy != 0 ? sc->cap_resy / sc->cap_phyy : 0); + evdev_support_abs(sc->evdev, ABS_MT_PRESSURE, 0, 0, 255, 0, 0, 0); + + if (evdev_register(sc->evdev) != 0) { + mtx_destroy(&sc->mutex); + return (ENOMEM); + } +#endif + /* Postpone start of the polling thread until sleep is available */ if (config_intrhook_establish(&sc->intr_hook) != 0) { +#ifdef EVDEV_SUPPORT + evdev_free(sc->evdev); +#endif mtx_destroy(&sc->mutex); return (ENOMEM); } @@ -596,6 +645,9 @@ cyapa_detach(device_t dev) knlist_clear(&sc->selinfo.si_note, 0); seldrain(&sc->selinfo); knlist_destroy(&sc->selinfo.si_note); +#ifdef EVDEV_SUPPORT + evdev_free(sc->evdev); +#endif mtx_destroy(&sc->mutex); @@ -1322,6 +1374,40 @@ cyapa_raw_input(struct cyapa_softc *sc, struct cyapa_regs *regs, int freq) nfingers); } +#ifdef EVDEV_SUPPORT + if (evdev_rcpt_mask & EVDEV_RCPT_HW_MOUSE) { + for (i = 0; i < nfingers; ++i) { + int32_t slot = evdev_get_mt_slot_by_tracking_id( + sc->evdev, regs->touch[i].id); + if (slot == -1) { + if (cyapa_debug) + printf("Slot overflow for i=%d\n", + regs->touch[i].id); + continue; + } + evdev_push_abs(sc->evdev, ABS_MT_SLOT, slot); + evdev_push_abs(sc->evdev, ABS_MT_TRACKING_ID, + regs->touch[i].id); + evdev_push_abs(sc->evdev, ABS_MT_POSITION_X, + CYAPA_TOUCH_X(regs, i)); + evdev_push_abs(sc->evdev, ABS_MT_POSITION_Y, + CYAPA_TOUCH_Y(regs, i)); + evdev_push_abs(sc->evdev, ABS_MT_PRESSURE, + CYAPA_TOUCH_P(regs, i)); + } + if (sc->cap_buttons & CYAPA_FNGR_LEFT) + evdev_push_key(sc->evdev, BTN_LEFT, + regs->fngr & CYAPA_FNGR_LEFT); + if (sc->cap_buttons & CYAPA_FNGR_RIGHT) + evdev_push_key(sc->evdev, BTN_RIGHT, + regs->fngr & CYAPA_FNGR_RIGHT); + if (sc->cap_buttons & CYAPA_FNGR_MIDDLE) + evdev_push_key(sc->evdev, BTN_MIDDLE, + regs->fngr & CYAPA_FNGR_MIDDLE); + evdev_sync(sc->evdev); + } +#endif + seen_thumb = 0; for (i = 0; i < afingers; ) { if (cyapa_debug) { @@ -1732,4 +1818,7 @@ cyapa_fuzz(int delta, int *fuzzp) DRIVER_MODULE(cyapa, iicbus, cyapa_driver, cyapa_devclass, NULL, NULL); MODULE_DEPEND(cyapa, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER); +#ifdef EVDEV_SUPPORT +MODULE_DEPEND(cyapa, evdev, 1, 1, 1); +#endif MODULE_VERSION(cyapa, 1); diff --git a/sys/modules/i2c/cyapa/Makefile b/sys/modules/i2c/cyapa/Makefile index 0f5b3aa26561..817c5ba68777 100644 --- a/sys/modules/i2c/cyapa/Makefile +++ b/sys/modules/i2c/cyapa/Makefile @@ -2,6 +2,7 @@ .PATH: ${SRCTOP}/sys/dev/cyapa KMOD = cyapa -SRCS = cyapa.c device_if.h bus_if.h iicbus_if.h vnode_if.h +SRCS = cyapa.c device_if.h bus_if.h iicbus_if.h vnode_if.h \ + opt_evdev.h .include