Hello, currently I try to switch my laptop to kernel 2.6.12. One of the problems I encountered is, that the fn-key does not work properly under X11 any more. I use plain 2.6.12 with the appended patch applied. This patch is my attempt to port Johannes Berg's fn-key patch to the kernel version 2.6.12. I also use my xkb keybindings from http://seehuhn.de/comp/powerbook/ . Under 2.6.11 this made fn-up produce pageup etc. The problem: under 2.6.12 fn-up does no longer give pageup. xev shows that something weird is going on. If I press fn, press up, release up, and release fn I get the following sequence of X events (obtained with xev) under 2.6.11. Note that Super_L is what I map the fn-key to. KeyPress event, serial 27, synthetic NO, window 0x2200001, ..., state 0x0, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyPress event, serial 27, synthetic NO, window 0x2200001, ..., state 0x4000, keycode 98 (keysym 0xff55, Prior), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ..., state 0x4000, keycode 98 (keysym 0xff55, Prior), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ..., state 0x4000, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... This is what I would expect. When I boot the machine with 2.6.12 but change nothing else, the same sequence of key presses leads to the following weird sequence of X events: KeyPress event, serial 27, synthetic NO, window 0x2200001, ... state 0x0, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ... state 0x4000, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyPress event, serial 27, synthetic NO, window 0x2200001, ... state 0x0, keycode 98 (keysym 0xff52, Up), same_screen YES, ... KeyPress event, serial 27, synthetic NO, window 0x2200001, ... state 0x0, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ... state 0x4000, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ... state 0x0, keycode 98 (keysym 0xff52, Up), same_screen YES, ... KeyPress event, serial 27, synthetic NO, window 0x2200001, ... state 0x0, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... KeyRelease event, serial 27, synthetic NO, window 0x2200001, ... state 0x4000, keycode 109 (keysym 0xffeb, Super_L), same_screen YES, ... Since the X server wrongly believes that fn is released while I press up, I do not get pageup any more. Has anybody an idea what is going on here? Help would be very much appreciated. All the best, Jochen ====================================================================== diff -ur linux-2.6.12.tmp/drivers/usb/input/hid-core.c linux-2.6.12/drivers/usb/input/hid-core.c --- linux-2.6.12.tmp/drivers/usb/input/hid-core.c 2005-06-21 21:00:26.000000000 +0100 +++ linux-2.6.12/drivers/usb/input/hid-core.c 2005-06-21 21:27:30.000000000 +0100 @@ -1421,6 +1421,9 @@ #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 +#define USB_VENDOR_ID_APPLE 0x05AC +#define USB_DEVICE_ID_POWERBOOK_KB_US 0x020E +#define USB_DEVICE_ID_POWERBOOK_KB_UK 0x020F /* * Alphabetically sorted blacklist by quirk type. @@ -1523,6 +1526,9 @@ { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_POWERBOOK_KB_UK, HID_QUIRK_POWERBOOK_FN_BUTTON }, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_POWERBOOK_KB_US, HID_QUIRK_POWERBOOK_FN_BUTTON }, + { 0, 0 } }; diff -ur linux-2.6.12.tmp/drivers/usb/input/hid-input.c linux-2.6.12/drivers/usb/input/hid-input.c --- linux-2.6.12.tmp/drivers/usb/input/hid-input.c 2005-06-21 21:00:26.000000000 +0100 +++ linux-2.6.12/drivers/usb/input/hid-input.c 2005-06-21 21:24:50.000000000 +0100 @@ -408,6 +408,11 @@ if (!usage->type) return; + if ((hid->quirks & HID_QUIRK_POWERBOOK_FN_BUTTON) && (usage->type == EV_ABS) && (usage->code == 40)) { + input_event(input, EV_KEY, 0x61 /* seems to be Control_R in X which this KB doesn't have */, value); + return; + } + if (((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005)) || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) { if (value) hid->quirks |= HID_QUIRK_2WHEEL_MOUSE_HACK_ON; diff -ur linux-2.6.12.tmp/drivers/usb/input/hid.h linux-2.6.12/drivers/usb/input/hid.h --- linux-2.6.12.tmp/drivers/usb/input/hid.h 2005-06-21 21:00:26.000000000 +0100 +++ linux-2.6.12/drivers/usb/input/hid.h 2005-06-21 21:24:52.000000000 +0100 @@ -242,6 +242,7 @@ #define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x080 #define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x100 #define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x200 +#define HID_QUIRK_POWERBOOK_FN_BUTTON 0x400 /* * This is the global environment of the parser. This information is ======================================================================
Attachment:
signature.asc
Description: Digital signature