svn commit: r266705 - user/jceel/soc2014_evdev/head/sys/dev/evdev
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon May 26 17:06:28 UTC 2014
Author: jceel
Date: Mon May 26 17:06:27 2014
New Revision: 266705
URL: http://svnweb.freebsd.org/changeset/base/266705
Log:
Add early support for EVIOCGKEY, EVIOCGLED, EVIOCGSND and EVIOCGSW ioctls.
Modified:
user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c
user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c
Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c
==============================================================================
--- user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c Mon May 26 16:01:45 2014 (r266704)
+++ user/jceel/soc2014_evdev/head/sys/dev/evdev/cdev.c Mon May 26 17:06:27 2014 (r266705)
@@ -293,7 +293,7 @@ evdev_ioctl(struct cdev *dev, u_long cmd
{
struct evdev_cdev_softc *sc = dev->si_drv1;
struct evdev_dev *evdev = sc->ecs_evdev;
- int len, num;
+ int len, num, limit;
len = IOCPARM_LEN(cmd);
cmd = IOCBASECMD(cmd);
@@ -345,16 +345,25 @@ evdev_ioctl(struct cdev *dev, u_long cmd
break;
case EVIOCGKEY(0):
- memcpy(data, evdev->ev_key_flags, len);
+ limit = MAX(len, howmany(KEY_CNT, 8));
+ memcpy(data, evdev->ev_key_states, limit);
break;
case EVIOCGLED(0):
+ limit = MAX(len, howmany(LED_CNT, 8));
+ memcpy(data, evdev->ev_led_states, limit);
+
break;
case EVIOCGSND(0):
+ limit = MAX(len, howmany(SND_CNT, 8));
+ memcpy(data, evdev->ev_snd_states, limit);
+
break;
case EVIOCGSW(0):
+ limit = MAX(len, howmany(SW_CNT, 8));
+ memcpy(data, evdev->ev_sw_states, limit);
break;
}
Modified: user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c
==============================================================================
--- user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c Mon May 26 16:01:45 2014 (r266704)
+++ user/jceel/soc2014_evdev/head/sys/dev/evdev/evdev.c Mon May 26 17:06:27 2014 (r266705)
@@ -46,10 +46,20 @@
MALLOC_DEFINE(M_EVDEV, "evdev", "evdev memory");
+static inline void changebit(uint32_t *array, int, int);
static struct evdev_client *evdev_client_alloc(void);
static void evdev_client_push(struct evdev_client *, uint16_t, uint16_t,
int32_t);
+static inline void
+changebit(uint32_t *array, int bit, int value)
+{
+ if (value)
+ setbit(array, bit);
+ else
+ clrbit(array, bit);
+}
+
struct evdev_dev *
evdev_alloc(void)
{
@@ -181,6 +191,19 @@ evdev_push_event(struct evdev_dev *evdev
debugf("%s pushed event %d/%d/%d",
device_get_nameunit(evdev->ev_dev), type, code, value);
+ /* For certain event types, update device state bits */
+ if (type == EV_KEY)
+ changebit(evdev->ev_key_states, code, value);
+
+ if (type == EV_LED)
+ changebit(evdev->ev_led_states, code, value);
+
+ if (type == EV_SND)
+ changebit(evdev->ev_snd_states, code, value);
+
+ if (type == EV_SW)
+ changebit(evdev->ev_sw_states, code, value);
+
/* Propagate event through all clients */
LIST_FOREACH(client, &evdev->ev_clients, ec_link) {
evdev_client_push(client, type, code, value);
More information about the svn-src-user
mailing list