Re: 2.6.36/2.6.37: broken compatibility with userspace input-utils ?
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2011-01-25 04:56:07
Also in:
lkml
On Mon, Jan 24, 2011 at 11:37:06PM -0500, Mark Lord wrote:
On 11-01-24 11:20 PM, Dmitry Torokhov wrote:quoted
On Mon, Jan 24, 2011 at 11:13:05PM -0500, Mark Lord wrote:quoted
On 11-01-24 07:55 PM, Dmitry Torokhov wrote:quoted
No, as far as I know we kept ABI intact.Okay, I hacked lsinput and input-kbd to ignore the protocol number. input-kbd is still broken: it thinks my remote control (Hauppauge) has only ten buttons, and won't allow me to remap codes larger than 10. I've now hacked around that too, but without determining exactly where the interface got broken. Ugh.Where are the sources? I can take a look...I used "apt-get source input-utils" under Ubuntu-10.10. The problem seems to be here somewhere: static struct kbd_map* kbd_map_read(int fd) { struct kbd_entry entry; struct kbd_map *map; int rc; 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) { break; } 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) map->keys++; } if (map->keys) { printf("map: %d keys, size: %d/%d\n", map->keys, map->size, map->alloc); return map; } else { free(map); return NULL; } } This results in (map->size==10) for 2.6.36+ (wrong), and a much larger map->size for 2.6.35 and earlier. So perhaps EVIOCGKEYCODE has changed?
So the utility expects that all devices have flat scancode space and driver might have changed so it does not recognize scancode 10 as valid scancode anymore. The options are: 1. Convert to EVIOCGKEYCODE2 2. Ignore errors from EVIOCGKEYCODE and go through all 65536 iterations. Thanks. -- Dmitry