[package] input-utils: update to make it works with new kernels.
authorFlorian Fainelli <florian@openwrt.org>
Sun, 20 Feb 2011 16:04:10 +0000 (16:04 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Sun, 20 Feb 2011 16:04:10 +0000 (16:04 +0000)
Signed-off-by: Jochen Friedrich <jochen@scram.de>
SVN-Revision: 25615

utils/input-utils/Makefile
utils/input-utils/patches/001-EVIOCGKEYCODE2.patch [new file with mode: 0644]
utils/input-utils/patches/002-version-check.patch [new file with mode: 0644]

index 015ddde..dca3330 100644 (file)
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=input-utils
 PKG_VERSION:=20081014-101501
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/input/
 PKG_SOURCE:=input-$(PKG_VERSION).tar.gz
diff --git a/utils/input-utils/patches/001-EVIOCGKEYCODE2.patch b/utils/input-utils/patches/001-EVIOCGKEYCODE2.patch
new file mode 100644 (file)
index 0000000..d282f6b
--- /dev/null
@@ -0,0 +1,220 @@
+From 52f533a6c32f8e1e376c5a335cc067da16d59b61 Mon Sep 17 00:00:00 2001
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Date: Wed, 26 Jan 2011 15:49:39 +0100
+Subject: [PATCH] input-kbd - switch to using EVIOCGKEYCODE2 when available
+
+[mchehab@redhat.com: Ported it to the -git version]
+
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+---
+ input-kbd.c |  110 +++++++++++++++++++++++++++++++++++++++--------------------
+ input.c     |    4 +-
+ 2 files changed, 75 insertions(+), 39 deletions(-)
+
+diff --git a/input-kbd.c b/input-kbd.c
+index c432d0d..aaf23b9 100644
+--- a/input-kbd.c
++++ b/input-kbd.c
+@@ -9,9 +9,22 @@
+ #include "input.h"
++struct input_keymap_entry_v2 {
++#define KEYMAP_BY_INDEX       (1 << 0)
++      uint8_t  flags;
++      uint8_t  len;
++      uint16_t index;
++      uint32_t keycode;
++      uint8_t  scancode[32];
++};
++
++#ifndef EVIOCGKEYCODE_V2
++#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry_v2)
++#endif
++
+ struct kbd_entry {
+-      int scancode;
+-      int keycode;
++      unsigned int scancode;
++      unsigned int keycode;
+ };
+ struct kbd_map {
+@@ -23,7 +36,7 @@ struct kbd_map {
+ /* ------------------------------------------------------------------ */
+-static struct kbd_map* kbd_map_read(int fd)
++static struct kbd_map* kbd_map_read(int fd, unsigned int version)
+ {
+       struct kbd_entry entry;
+       struct kbd_map *map;
+@@ -32,17 +45,35 @@ static struct kbd_map* kbd_map_read(int fd)
+       map = malloc(sizeof(*map));
+       memset(map,0,sizeof(*map));
+       for (map->size = 0; map->size < 65536; map->size++) {
+-              entry.scancode = map->size;
+-              entry.keycode  = KEY_RESERVED;
+-              rc = ioctl(fd, EVIOCGKEYCODE, &entry);
+-              if (rc < 0) {
+-                      map->size--;
+-                      break;
++              if (version < 0x10001) {
++                      entry.scancode = map->size;
++                      entry.keycode  = KEY_RESERVED;
++                      rc = ioctl(fd, EVIOCGKEYCODE, &entry);
++                      if (rc < 0) {
++                              map->size--;
++                              break;
++                      }
++              } else {
++                      struct input_keymap_entry_v2 ke = {
++                              .index = map->size,
++                              .flags = KEYMAP_BY_INDEX,
++                              .len = sizeof(uint32_t),
++                              .keycode = KEY_RESERVED,
++                      };
++
++                      rc = ioctl(fd, EVIOCGKEYCODE_V2, &ke);
++                      if (rc < 0)
++                              break;
++                      memcpy(&entry.scancode, ke.scancode,
++                              sizeof(entry.scancode));
++                      entry.keycode = ke.keycode;
+               }
++
+               if (map->size >= map->alloc) {
+                       map->alloc += 64;
+                       map->map = realloc(map->map, map->alloc * sizeof(entry));
+               }
++
+               map->map[map->size] = entry;
+               if (KEY_RESERVED != entry.keycode)
+@@ -156,37 +187,25 @@ static void kbd_print_bits(int fd)
+       }
+ }
+-static void show_kbd(int nr)
++static void show_kbd(int fd, unsigned int protocol_version)
+ {
+       struct kbd_map *map;
+-      int fd;
+-      fd = device_open(nr,1);
+-      if (-1 == fd)
+-              return;
+       device_info(fd);
+-      map = kbd_map_read(fd);
+-      if (NULL != map) {
+-              kbd_map_print(stdout,map,0);
+-      } else {
++      map = kbd_map_read(fd, protocol_version);
++      if (map)
++              kbd_map_print(stdout, map, 0);
++      else
+               kbd_print_bits(fd);
+-      }
+-
+-      close(fd);
+ }
+-static int set_kbd(int nr, char *mapfile)
++static int set_kbd(int fd, unsigned int protocol_version, char *mapfile)
+ {
+       struct kbd_map *map;
+       FILE *fp;
+-      int fd;
+-      fd = device_open(nr,1);
+-      if (-1 == fd)
+-              return -1;
+-
+-      map = kbd_map_read(fd);
++      map = kbd_map_read(fd, protocol_version);
+       if (NULL == map) {
+               fprintf(stderr,"device has no map\n");
+               close(fd);
+@@ -203,14 +222,12 @@ static int set_kbd(int nr, char *mapfile)
+                       return -1;
+               }
+       }
+-      
++
+       if (0 != kbd_map_parse(fp,map) ||
+           0 != kbd_map_write(fd,map)) {
+-              close(fd);
+               return -1;
+       }
+-      close(fd);
+       return 0;
+ }
+@@ -224,8 +241,10 @@ static int usage(char *prog, int error)
+ int main(int argc, char *argv[])
+ {
+-      int c,devnr;
++      int c, devnr, fd;
+       char *mapfile = NULL;
++      unsigned int protocol_version;
++      int rc = EXIT_FAILURE;
+       for (;;) {
+               if (-1 == (c = getopt(argc, argv, "hf:")))
+@@ -245,12 +264,29 @@ int main(int argc, char *argv[])
+               usage(argv[0],1);
+       devnr = atoi(argv[optind]);
+-      if (mapfile) {
+-              set_kbd(devnr,mapfile);
+-      } else {
+-              show_kbd(devnr);
++
++      fd = device_open(devnr, 1);
++      if (fd < 0)
++              goto out;
++
++      if (ioctl(fd, EVIOCGVERSION, &protocol_version) < 0) {
++              fprintf(stderr,
++                      "Unable to query evdev protocol version: %s\n",
++                      strerror(errno));
++              goto out_close;
+       }
+-      return 0;
++
++      if (mapfile)
++              set_kbd(fd, protocol_version, mapfile);
++      else
++              show_kbd(fd, protocol_version);
++
++      rc = EXIT_SUCCESS;
++
++out_close:
++      close(fd);
++out:
++      return rc;
+ }
+ /* ---------------------------------------------------------------------
+diff --git a/input.c b/input.c
+index d57a31e..a9bd5e8 100644
+--- a/input.c
++++ b/input.c
+@@ -101,8 +101,8 @@ int device_open(int nr, int verbose)
+               close(fd);
+               return -1;
+       }
+-      if (EV_VERSION != version) {
+-              fprintf(stderr, "protocol version mismatch (expected %d, got %d)\n",
++      if (EV_VERSION > version) {
++              fprintf(stderr, "protocol version mismatch (expected >= %d, got %d)\n",
+                       EV_VERSION, version);
+               close(fd);
+               return -1;
+-- 
+1.7.2.3
+
diff --git a/utils/input-utils/patches/002-version-check.patch b/utils/input-utils/patches/002-version-check.patch
new file mode 100644 (file)
index 0000000..03358eb
--- /dev/null
@@ -0,0 +1,34 @@
+From d99f056745e53cd2518ca169af474f8c45c1436d Mon Sep 17 00:00:00 2001
+From: Gerd Hoffmann <kraxel@redhat.com>
+Date: Wed, 26 Jan 2011 21:01:05 +0100
+Subject: [PATCH] remove version check
+
+---
+ input.c |   11 -----------
+ 1 files changed, 0 insertions(+), 11 deletions(-)
+
+diff --git a/input.c b/input.c
+index a9bd5e8..9a6a810 100644
+--- a/input.c
++++ b/input.c
+@@ -96,17 +96,6 @@ int device_open(int nr, int verbose)
+       if (verbose)
+               fprintf(stderr,"%s\n",filename);
+-      if (-1 == ioctl(fd,EVIOCGVERSION,&version)) {
+-              perror("ioctl EVIOCGVERSION");
+-              close(fd);
+-              return -1;
+-      }
+-      if (EV_VERSION > version) {
+-              fprintf(stderr, "protocol version mismatch (expected >= %d, got %d)\n",
+-                      EV_VERSION, version);
+-              close(fd);
+-              return -1;
+-      }
+       return fd;
+ }
+-- 
+1.7.2.3
+