diff -uNr linux-2.6.20-hardened-r2.orig/drivers/hid/hid-input.c linux-2.6.20-hardened-r2/drivers/hid/hid-input.c --- linux-2.6.20-hardened-r2.orig/drivers/hid/hid-input.c 2007-05-03 18:46:07.000000000 +0300 +++ linux-2.6.20-hardened-r2/drivers/hid/hid-input.c 2007-05-06 20:40:03.000000000 +0300 @@ -54,7 +54,7 @@ 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk, 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, - unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, + unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, @@ -476,6 +476,7 @@ case 0x0e5: map_key_clear(KEY_BASSBOOST); break; case 0x0e9: map_key_clear(KEY_VOLUMEUP); break; case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break; + case 0x182: map_key_clear(KEY_FAVORITES); break; case 0x183: map_key_clear(KEY_CONFIG); break; case 0x184: map_key_clear(KEY_WORDPROCESSOR); break; case 0x185: map_key_clear(KEY_EDITOR); break; @@ -495,6 +496,7 @@ case 0x19e: map_key_clear(KEY_COFFEE); break; case 0x1a6: map_key_clear(KEY_HELP); break; case 0x1a7: map_key_clear(KEY_DOCUMENTS); break; + case 0x1ab: map_key_clear(KEY_SPELL); break; case 0x1bc: map_key_clear(KEY_MESSENGER); break; case 0x1bd: map_key_clear(KEY_INFO); break; case 0x201: map_key_clear(KEY_NEW); break; @@ -557,8 +559,23 @@ } break; - case HID_UP_MSVENDOR: - goto ignore; + case HID_UP_MSVENDOR: /* Reported on MS Natural Ergonomic 4000 USB keyboard */ + + set_bit(EV_REP, input->evbit); + switch(usage->hid & HID_USAGE) { + case 0xff05: + /* The Favourites 1-5 keys */ + map_key_clear(KEY_FN); + set_bit(KEY_FN_F1, input->keybit); + set_bit(KEY_FN_F2, input->keybit); + set_bit(KEY_FN_F3, input->keybit); + set_bit(KEY_FN_F4, input->keybit); + set_bit(KEY_FN_F5, input->keybit); + break; + + default: goto ignore; + } + break; case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */ @@ -728,6 +745,41 @@ if ((hid->quirks & HID_QUIRK_POWERBOOK_HAS_FN) && hidinput_pb_event(hid, input, usage, value)) return; + if (usage->hid == (HID_UP_MSVENDOR | 0xff05)) { + unsigned int code = 0; + + switch (value) { + case 0x01: code = KEY_FN_F1; break; + case 0x02: code = KEY_FN_F2; break; + case 0x04: code = KEY_FN_F3; break; + case 0x08: code = KEY_FN_F4; break; + case 0x10: code = KEY_FN_F5; break; + default: code = 0; break; + } + if (code) { + input_event(input, usage->type, code, 1); + input_event(input, usage->type, code, 0); + return; + } + } + /* + * Convert FLock's F-keys to normal F-keys + * Probably this code isn't universal and will work only for: + * Microsoft Natural Ergonomic Keyboard 4000 v1.0 + */ + if (usage->code==138) usage->code=59; + if (usage->code==131) usage->code=60; + if (usage->code==182) usage->code=61; + if (usage->code==181) usage->code=62; + if (usage->code==134) usage->code=63; + if (usage->code==206) usage->code=64; + if (usage->code==232) usage->code=65; + if (usage->code==233) usage->code=66; + if (usage->code==231) usage->code=67; + if (usage->code==431) usage->code=68; + if (usage->code==234) usage->code=87; + if (usage->code==210) usage->code=88; + if (usage->hat_min < usage->hat_max || usage->hat_dir) { int hat_dir = usage->hat_dir; if (!hat_dir) diff -uNr linux-2.6.20-hardened-r2.orig/drivers/usb/input/usbkbd.c linux-2.6.20-hardened-r2/drivers/usb/input/usbkbd.c --- linux-2.6.20-hardened-r2.orig/drivers/usb/input/usbkbd.c 2007-05-03 18:46:07.000000000 +0300 +++ linux-2.6.20-hardened-r2/drivers/usb/input/usbkbd.c 2007-05-06 19:17:13.000000000 +0300 @@ -56,7 +56,7 @@ 115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0, 122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,179,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, diff -uNr linux-2.6.20-hardened-r2.orig/include/linux/input.h linux-2.6.20-hardened-r2/include/linux/input.h --- linux-2.6.20-hardened-r2.orig/include/linux/input.h 2007-05-06 19:36:43.000000000 +0300 +++ linux-2.6.20-hardened-r2/include/linux/input.h 2007-05-06 19:36:58.000000000 +0300 @@ -506,6 +506,7 @@ #define KEY_VOICEMAIL 0x1ac #define KEY_ADDRESSBOOK 0x1ad #define KEY_MESSENGER 0x1ae +#define KEY_SPELL 0x1af #define KEY_DEL_EOL 0x1c0 #define KEY_DEL_EOS 0x1c1