Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107284167
D11156.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D11156.diff
View Options
Index: head/share/man/man4/uep.4
===================================================================
--- head/share/man/man4/uep.4
+++ head/share/man/man4/uep.4
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 25, 2010
+.Dd August 5, 2018
.Dt UEP 4
.Os
.Sh NAME
@@ -44,28 +44,46 @@
.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 @@
.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.
Index: head/sys/dev/usb/input/uep.c
===================================================================
--- head/sys/dev/usb/input/uep.c
+++ head/sys/dev/usb/input/uep.c
@@ -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 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_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 @@
.f_stop_read = &uep_stop_read,
.basename[0] = "uep",
};
+#endif /* !EVDEV_SUPPORT */
static int
get_pkt_len(u_char *buf)
@@ -154,6 +178,9 @@
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 @@
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 @@
}
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 @@
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 @@
DPRINTF("usb_fifo_attach error=%s\n", usbd_errstr(error));
goto detach;
}
+#endif /* !EVDEV_SUPPORT */
sc->buf_len = 0;
@@ -354,7 +415,11 @@
{
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 @@
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 @@
usb_fifo_free_buffer(fifo);
}
}
+#endif /* !EVDEV_SUPPORT */
static devclass_t uep_devclass;
@@ -442,5 +532,8 @@
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);
Index: head/sys/modules/usb/uep/Makefile
===================================================================
--- head/sys/modules/usb/uep/Makefile
+++ head/sys/modules/usb/uep/Makefile
@@ -5,7 +5,7 @@
.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>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jan 12, 11:27 PM (21 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15773755
Default Alt Text
D11156.diff (7 KB)
Attached To
Mode
D11156: uep(4): add evdev support
Attached
Detach File
Event Timeline
Log In to Comment