Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Aug 2018 11:14:13 +0000 (UTC)
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r337348 - in head: share/man/man4 sys/dev/usb/input sys/modules/usb/uep
Message-ID:  <201808051114.w75BED7N061975@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: wulf
Date: Sun Aug  5 11:14:13 2018
New Revision: 337348
URL: https://svnweb.freebsd.org/changeset/base/337348

Log:
  uep(4): add evdev support
  
  To compile this driver with evdev support enabled, place
  following lines into the kernel configuration file:
  
  options EVDEV_SUPPORT
  device evdev
  
  Note: Native and evdev modes are mutually exclusive.
  
  Reviewed by:	gonzo, wblock (docs)
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D11156

Modified:
  head/share/man/man4/uep.4
  head/sys/dev/usb/input/uep.c
  head/sys/modules/usb/uep/Makefile

Modified: head/share/man/man4/uep.4
==============================================================================
--- head/share/man/man4/uep.4	Sun Aug  5 06:16:36 2018	(r337347)
+++ head/share/man/man4/uep.4	Sun Aug  5 11:14:13 2018	(r337348)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 25, 2010
+.Dd August 5, 2018
 .Dt UEP 4
 .Os
 .Sh NAME
@@ -44,28 +44,46 @@ module at boot time, place the following line in
 .Bd -literal -offset indent
 uep_load="YES"
 .Ed
+.Pp
+To compile this driver with evdev support enabled, place the
+following lines into the kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "options EVDEV_SUPPORT"
+.Cd "device evdev"
+.Ed
 .Sh DESCRIPTION
 The
 .Nm
 driver provides support for the eGalax onscreen touch panels.
 .Pp
-The driver is stub.
-It just probes and attaches to USB device, creates device entry
+The driver is a stub.
+It just probes and attaches to USB device, creates a device entry
 and feeds reassembled packets from the hardware to it.
+Depending on compile-time kernel options it supports either native
+or evdev operation modes.
 .Pp
-To get mouse working in
-.Xr X 7 ,
-one needs to install
+To get the mouse working in
+.Xr X 7
+in native mode, install
 .Pa ports/x11-drivers/xf86-input-egalax .
+.Pp
+To get the mouse working in
+.Xr X 7
+in evdev mode, install
+.Pa ports/x11-drivers/xf86-input-evdev .
 .Sh FILES
 .Nm
-creates a blocking pseudo\-device file,
-.Pa /dev/uep0 .
+creates a blocking pseudo-device file,
+.Pa /dev/uep0
+in native mode or
+.Pa /dev/input/eventN
+in evdev mode.
 .Sh SEE ALSO
 .Xr usb 4 ,
 .Xr loader.conf 5 ,
 .Xr xorg.conf 5 Pq Pa ports/x11/xorg ,
-.Xr egalax 4 Pq Pa ports/x11-drivers/xf86-input-egalax .
+.Xr egalax 4 Pq Pa ports/x11-drivers/xf86-input-egalax ,
+.Xr evdev 4 Pq Pa ports/x11-drivers/xf86-input-evdev .
 .Sh AUTHORS
 .An -nosplit
 The
@@ -74,6 +92,8 @@ driver was written by
 .An Gleb Smirnoff Aq Mt glebius@FreeBSD.org .
 .Sh BUGS
 .Nm
-can't act like
+cannot act like
 .Xr sysmouse 4 ,
-since the latter does not support absolute motion events.
+as
+.Xr sysmouse 4
+does not support absolute motion events.

Modified: head/sys/dev/usb/input/uep.c
==============================================================================
--- head/sys/dev/usb/input/uep.c	Sun Aug  5 06:16:36 2018	(r337347)
+++ head/sys/dev/usb/input/uep.c	Sun Aug  5 11:14:13 2018	(r337348)
@@ -32,6 +32,8 @@
  *  http://www.eeti.com.tw/pdf/Software%20Programming%20Guide_v2.0.pdf
  */
 
+#include "opt_evdev.h"
+
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/callout.h>
@@ -49,9 +51,14 @@
 #include <dev/usb/usbhid.h>
 #include "usbdevs.h"
 
+#ifdef EVDEV_SUPPORT
+#include <dev/evdev/input.h>
+#include <dev/evdev/evdev.h>
+#else
 #include <sys/ioccom.h>
 #include <sys/fcntl.h>
 #include <sys/tty.h>
+#endif
 
 #define USB_DEBUG_VAR uep_debug
 #include <dev/usb/usb_debug.h>
@@ -90,11 +97,15 @@ struct uep_softc {
 	struct mtx mtx;
 
 	struct usb_xfer *xfer[UEP_N_TRANSFER];
+#ifdef EVDEV_SUPPORT
+	struct evdev_dev *evdev;
+#else
 	struct usb_fifo_sc fifo;
 
 	u_int		pollrate;
 	u_int		state;
 #define UEP_ENABLED	0x01
+#endif
 
 	/* Reassembling buffer. */
 	u_char		buf[UEP_PACKET_LEN_MAX];
@@ -107,6 +118,18 @@ static device_probe_t	uep_probe;
 static device_attach_t	uep_attach;
 static device_detach_t	uep_detach;
 
+#ifdef EVDEV_SUPPORT
+
+static evdev_open_t	uep_ev_open;
+static evdev_close_t	uep_ev_close;
+
+static const struct evdev_methods uep_evdev_methods = {
+	.ev_open = &uep_ev_open,
+	.ev_close = &uep_ev_close,
+};
+
+#else /* !EVDEV_SUPPORT */
+
 static usb_fifo_cmd_t	uep_start_read;
 static usb_fifo_cmd_t	uep_stop_read;
 static usb_fifo_open_t	uep_open;
@@ -121,6 +144,7 @@ static struct usb_fifo_methods uep_fifo_methods = {
 	.f_stop_read = &uep_stop_read,
 	.basename[0] = "uep",
 };
+#endif /* !EVDEV_SUPPORT */
 
 static int
 get_pkt_len(u_char *buf)
@@ -154,6 +178,9 @@ static void
 uep_process_pkt(struct uep_softc *sc, u_char *buf)
 {
 	int32_t x, y;
+#ifdef EVDEV_SUPPORT
+	int touch;
+#endif
 
 	if ((buf[0] & 0xFE) != 0x80) {
 		DPRINTF("bad input packet format 0x%.2x\n", buf[0]);
@@ -186,7 +213,17 @@ uep_process_pkt(struct uep_softc *sc, u_char *buf)
 
 	DPRINTFN(2, "x %u y %u\n", x, y);
 
+#ifdef EVDEV_SUPPORT
+	touch = buf[0] & (1 << 0);
+	if (touch) {
+		evdev_push_abs(sc->evdev, ABS_X, x);
+		evdev_push_abs(sc->evdev, ABS_Y, y);
+	}
+	evdev_push_key(sc->evdev, BTN_TOUCH, touch);
+	evdev_sync(sc->evdev);
+#else
 	uep_put_queue(sc, buf);
+#endif
 }
 
 static void
@@ -261,12 +298,13 @@ uep_intr_callback(struct usb_xfer *xfer, usb_error_t e
 	    }
 	case USB_ST_SETUP:
 	tr_setup:
+#ifndef EVDEV_SUPPORT
 		/* check if we can put more data into the FIFO */
-		if (usb_fifo_put_bytes_max(sc->fifo.fp[USB_FIFO_RX]) != 0) {
-			usbd_xfer_set_frame_len(xfer, 0,
-			    usbd_xfer_max_len(xfer));
-			usbd_transfer_submit(xfer);
-                }
+		if (usb_fifo_put_bytes_max(sc->fifo.fp[USB_FIFO_RX]) == 0)
+			break;
+#endif
+		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
+		usbd_transfer_submit(xfer);
 		break;
 
 	default:
@@ -330,6 +368,28 @@ uep_attach(device_t dev)
 		goto detach;
 	}
 
+#ifdef EVDEV_SUPPORT
+	sc->evdev = evdev_alloc();
+	evdev_set_name(sc->evdev, device_get_desc(dev));
+	evdev_set_phys(sc->evdev, device_get_nameunit(dev));
+	evdev_set_id(sc->evdev, BUS_USB, uaa->info.idVendor,
+	    uaa->info.idProduct, 0);
+	evdev_set_serial(sc->evdev, usb_get_serial(uaa->device));
+	evdev_set_methods(sc->evdev, sc, &uep_evdev_methods);
+	evdev_support_prop(sc->evdev, INPUT_PROP_DIRECT);
+	evdev_support_event(sc->evdev, EV_SYN);
+	evdev_support_event(sc->evdev, EV_ABS);
+	evdev_support_event(sc->evdev, EV_KEY);
+	evdev_support_key(sc->evdev, BTN_TOUCH);
+	evdev_support_abs(sc->evdev, ABS_X, 0, 0, UEP_MAX_X, 0, 0, 0);
+	evdev_support_abs(sc->evdev, ABS_Y, 0, 0, UEP_MAX_Y, 0, 0, 0);
+
+	error = evdev_register_mtx(sc->evdev, &sc->mtx);
+	if (error) {
+		DPRINTF("evdev_register_mtx error=%s\n", usbd_errstr(error));
+		goto detach;
+	}
+#else /* !EVDEV_SUPPORT */
 	error = usb_fifo_attach(uaa->device, sc, &sc->mtx, &uep_fifo_methods,
 	    &sc->fifo, device_get_unit(dev), -1, uaa->info.bIfaceIndex,
 	    UID_ROOT, GID_OPERATOR, 0644);
@@ -338,6 +398,7 @@ uep_attach(device_t dev)
 		DPRINTF("usb_fifo_attach error=%s\n", usbd_errstr(error));
                 goto detach;
         }
+#endif /* !EVDEV_SUPPORT */
 
 	sc->buf_len = 0;
 
@@ -354,7 +415,11 @@ uep_detach(device_t dev)
 {
 	struct uep_softc *sc = device_get_softc(dev);
 
+#ifdef EVDEV_SUPPORT
+	evdev_free(sc->evdev);
+#else
 	usb_fifo_detach(&sc->fifo);
+#endif
 
 	usbd_transfer_unsetup(sc->xfer, UEP_N_TRANSFER);
 
@@ -363,7 +428,31 @@ uep_detach(device_t dev)
 	return (0);
 }
 
+#ifdef EVDEV_SUPPORT
+
 static void
+uep_ev_close(struct evdev_dev *evdev, void *ev_softc)
+{
+	struct uep_softc *sc = (struct uep_softc *)ev_softc;
+
+	mtx_assert(&sc->mtx, MA_OWNED);
+	usbd_transfer_stop(sc->xfer[UEP_INTR_DT]);
+}
+
+static int
+uep_ev_open(struct evdev_dev *evdev, void *ev_softc)
+{
+	struct uep_softc *sc = (struct uep_softc *)ev_softc;
+
+	mtx_assert(&sc->mtx, MA_OWNED);
+	usbd_transfer_start(sc->xfer[UEP_INTR_DT]);
+
+	return (0);
+}
+
+#else /* !EVDEV_SUPPORT */
+
+static void
 uep_start_read(struct usb_fifo *fifo)
 {
 	struct uep_softc *sc = usb_fifo_softc(fifo);
@@ -424,6 +513,7 @@ uep_close(struct usb_fifo *fifo, int fflags)
 		usb_fifo_free_buffer(fifo);
 	}
 }
+#endif /* !EVDEV_SUPPORT */
 
 static devclass_t uep_devclass;
 
@@ -442,5 +532,8 @@ static driver_t uep_driver = {
 
 DRIVER_MODULE(uep, uhub, uep_driver, uep_devclass, NULL, NULL);
 MODULE_DEPEND(uep, usb, 1, 1, 1);
+#ifdef EVDEV_SUPPORT
+MODULE_DEPEND(uep, evdev, 1, 1, 1);
+#endif
 MODULE_VERSION(uep, 1);
 USB_PNP_HOST_INFO(uep_devs);

Modified: head/sys/modules/usb/uep/Makefile
==============================================================================
--- head/sys/modules/usb/uep/Makefile	Sun Aug  5 06:16:36 2018	(r337347)
+++ head/sys/modules/usb/uep/Makefile	Sun Aug  5 11:14:13 2018	(r337348)
@@ -5,7 +5,7 @@ S=     ${SRCTOP}/sys
 .PATH: $S/dev/usb/input
 
 KMOD=	uep
-SRCS=	opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h vnode_if.h usbdevs.h \
-	uep.c
+SRCS=	opt_bus.h opt_evdev.h opt_usb.h device_if.h bus_if.h usb_if.h \
+	vnode_if.h usbdevs.h uep.c
 
 .include <bsd.kmod.mk>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201808051114.w75BED7N061975>