Re: Xorg (latest from ports) and no mouse movement

Vladimir Kondratyev <[email protected]>
Newsgroups gmane.os.freebsd.devel.x11
Message-ID <[email protected]>
On 05.12.2020 14:58, Matthias Apitz wrote:
> El día sábado, diciembre 05, 2020 a las 12:43:54p. m. +0100, Matthias Apitz escribió:
> 
>>
>> Hello,
>>
>> I'm setting up a new system on amd64 CURRENT (r368166) with ports from
>> November 30, compiled all with poudriere.
>>
>> The Xorg is started with 'startx' and .xserverrc has:
>>
>>   exec X -retro -logverbose 6
>>
>> and .xinitrc says only (to simplify the problem):
>>
>>   xterm -fn 10x20
>>
>> X11 comes up, starts the xterm but no mouse movement is working.
>>
>> Without X11 the mouse moves fine by the moused as:
>>
>> /usr/sbin/moused -p /dev/cyapa0 -t ps/2
>>
>> About the mouse the Xorg log has:
> 
> Additional information: attaching an USB mouse works fine, i.e. the
> problem is only with the touchpad.
> 
> 	matthias
> 
>> root@c720-r368166:~ # grep mouse /var/log/Xorg.0.log
>> [  6260.470] (II) config/udev: Adding input device System mouse (/dev/input/event0)
>> [  6260.470] (**) System mouse: Applying InputClass "evdev pointer catchall"
>> [  6260.470] (**) System mouse: Applying InputClass "libinput pointer catchall"
>> [  6260.474] (II) Using input driver 'libinput' for 'System mouse'
>> [  6260.474] 	Option "name" "System mouse"
>> [  6260.475] (**) System mouse: always reports core events
>> [  6260.479] (II) event0  - System mouse: is tagged by udev as: Mouse
>> [  6260.479] (II) event0  - System mouse: device is a pointer
>> [  6260.480] (II) event0  - System mouse: device removed
>> [  6260.480] (II) XINPUT: Adding extended input device "System mouse" (type: MOUSE, id 6)
>> [  6260.481] (**) System mouse: (accel) selected scheme none/0
>> [  6260.481] (**) System mouse: (accel) acceleration factor: 2.000
>> [  6260.481] (**) System mouse: (accel) acceleration threshold: 4
>> [  6260.482] (II) event0  - System mouse: is tagged by udev as: Mouse
>> [  6260.482] (II) event0  - System mouse: device is a pointer
>> [  6278.765] (II) event0  - System mouse: device removed
>>
>> What is missing?
>>
Try attached untested patch.

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-x11
To unsubscribe, send any mail to "[email protected]"
cyapa.patch (text/x-patch, 4.5 KB)
diff --git a/sys/dev/cyapa/cyapa.c b/sys/dev/cyapa/cyapa.c
index 293d68e9abdc..ca9f3d5b602d 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 <sys/param.h>
 #include <sys/bus.h>
 #include <sys/conf.h>
@@ -126,6 +128,11 @@ __FBSDID("$FreeBSD$");
 #include <dev/iicbus/iicbus.h>
 #include <dev/cyapa/cyapa.h>
 
+#ifdef EVDEV_SUPPORT
+#include <dev/evdev/input.h>
+#include <dev/evdev/evdev.h>
+#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;
@@ -561,8 +571,46 @@ 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 (cap.buttons & CYAPA_FNGR_LEFT)
+		evdev_support_key(sc->evdev, BTN_LEFT);
+	if (cap.buttons & CYAPA_FNGR_RIGHT)
+		evdev_support_key(sc->evdev, BTN_RIGHT);
+	if (cap.buttons & CYAPA_FNGR_MIDDLE)
+		evdev_support_key(sc->evdev, BTN_MIDDLE);
+	if (CYAPA_FNGR_LEFT == (cap.buttons &
+	    (CYAPA_FNGR_LEFT | CYAPA_FNGR_RIGHT | CYAPA_FNGR_MIDDLE)))
+		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_resx / sc->cap_phyx);
+	evdev_support_abs(sc->evdev, ABS_MT_POSITION_Y,
+	    0, 0, sc->cap_resy, 0, 0, sc->cap_resy / sc->cap_phyy);
+	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) {
+		evdev_free(sc->evdev);
 		mtx_destroy(&sc->mutex);
 		return (ENOMEM);
 	}
@@ -596,6 +644,10 @@ cyapa_detach(device_t dev)
 	seldrain(&sc->selinfo);
 	knlist_destroy(&sc->selinfo.si_note);
 
+#ifdef EVDEV_SUPPORT
+	evdev_free(sc->evdev);
+#endif
+
 	mtx_destroy(&sc->mutex);
 
 	return (0);
@@ -1321,6 +1373,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) {
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 <bsd.kmod.mk>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.