svn commit: r267024 - user/jceel/soc2014_evdev/head/sys/dev/evdev

Jakub Wojciech Klama jceel at FreeBSD.org
Tue Jun 3 20:09:40 UTC 2014


Author: jceel
Date: Tue Jun  3 20:09:39 2014
New Revision: 267024
URL: http://svnweb.freebsd.org/changeset/base/267024

Log:
  Add support for EVIOCGABS and EVIOCSABS ioctls.

Modified:
  user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c
  user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c
  user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.h

Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c
==============================================================================
--- user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c	Tue Jun  3 19:45:08 2014	(r267023)
+++ user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c	Tue Jun  3 20:09:39 2014	(r267024)
@@ -73,6 +73,7 @@ static struct cdevsw evdev_cdevsw = {
 	.d_poll = evdev_poll,
 	.d_kqfilter = evdev_kqfilter,
 	.d_name = "evdev",
+	.d_flags = D_TRACKCLOSE
 };
 
 static struct filterops evdev_cdev_filterops = {
@@ -293,6 +294,7 @@ evdev_ioctl(struct cdev *dev, u_long cmd
 {
 	struct evdev_cdev_softc *sc = dev->si_drv1;
 	struct evdev_dev *evdev = sc->ecs_evdev;
+	//struct input_id id;
 	int len, num, limit;
 
 	len = IOCPARM_LEN(cmd);
@@ -341,7 +343,8 @@ evdev_ioctl(struct cdev *dev, u_long cmd
 		break;
 
 	case EVIOCGPROP(0):
-		memcpy(data, evdev->ev_type_flags, len);
+		limit = MIN(len, howmany(EV_CNT, 8));
+		memcpy(data, evdev->ev_type_flags, limit);
 		break;
 
 	case EVIOCGKEY(0):
@@ -378,6 +381,18 @@ evdev_ioctl(struct cdev *dev, u_long cmd
 		return (evdev_ioctl_eviocgbit(evdev, type_num, len, data));
 	}
 
+	/* Handle EVIOCGABS variants */
+	if (num >= IOCNUM(EVIOCGABS(0)) && num < IOCNUM(EVIOCGABS(ABS_CNT))) {
+		int index = num - IOCNUM(EVIOCGABS(0));
+		memcpy(data, &evdev->ev_absinfo[index], len);
+	}
+
+	/* Handle EVIOCSABS variants */
+	if (num >= IOCNUM(EVIOCSABS(0)) && num < IOCNUM(EVIOCSABS(ABS_CNT))) {
+		int index = num - IOCNUM(EVIOCSABS(0));
+		memcpy(&evdev->ev_absinfo[index], data, len);
+	}
+
 	return (0);
 }
 

Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c
==============================================================================
--- user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c	Tue Jun  3 19:45:08 2014	(r267023)
+++ user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c	Tue Jun  3 20:09:39 2014	(r267024)
@@ -182,6 +182,14 @@ evdev_support_sw(struct evdev_dev *evdev
 	setbit(&evdev->ev_sw_flags, code);
 }
 
+inline void
+evdev_set_absinfo(struct evdev_dev *evdev, uint16_t axis,
+    struct input_absinfo *absinfo)
+{
+
+	memcpy(&evdev->ev_absinfo[axis], absinfo, sizeof(struct input_absinfo));
+}
+
 int
 evdev_push_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
     int32_t value)
@@ -204,6 +212,10 @@ evdev_push_event(struct evdev_dev *evdev
 	if (type == EV_SW)
 		changebit(evdev->ev_sw_states, code, value);
 
+	/* For EV_ABS, save last value in absinfo */
+	if (type == EV_ABS)
+		evdev->ev_absinfo[code].value = value;
+
 	/* Propagate event through all clients */
 	LIST_FOREACH(client, &evdev->ev_clients, ec_link) {
 		evdev_client_push(client, type, code, value);

Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.h
==============================================================================
--- user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.h	Tue Jun  3 19:45:08 2014	(r267023)
+++ user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.h	Tue Jun  3 20:09:39 2014	(r267024)
@@ -70,7 +70,7 @@ struct evdev_dev
 	uint32_t		ev_led_flags[howmany(LED_CNT, 32)];
 	uint32_t		ev_snd_flags[howmany(SND_CNT, 32)];
 	uint32_t		ev_sw_flags[howmany(SW_CNT, 32)];
-	struct input_absinfo *	ev_abs_info;
+	struct input_absinfo	ev_absinfo[ABS_CNT];
 
 	/* State: */
 	uint32_t		ev_key_states[howmany(KEY_CNT, 32)];
@@ -131,6 +131,7 @@ void evdev_support_msc(struct evdev_dev 
 void evdev_support_led(struct evdev_dev *, uint16_t);
 void evdev_support_snd(struct evdev_dev *, uint16_t);
 void evdev_support_sw(struct evdev_dev *, uint16_t);
+void evdev_set_absinfo(struct evdev_dev *, uint16_t, struct input_absinfo *);
 
 /* Client interface: */
 int evdev_register_client(struct evdev_dev *, struct evdev_client **);


More information about the svn-src-user mailing list