mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* Linux problems with USB HID keyboards and patches
@ 2003-07-29 11:37 Diego SANTA CRUZ
  0 siblings, 0 replies; only message in thread
From: Diego SANTA CRUZ @ 2003-07-29 11:37 UTC (permalink / raw)
  To: vojtech, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 4432 bytes --]

[Not subscribed to l-k, so please CC me]

Hi,

I've been experiencing some problems with a Logitech iTouch Internet
Navigator USB connected keyboard (model Y-BF37). I solved some of them
by patching the kernel, while others I don't know how to handle. Kernel
is an ACPI enabled version of RH 2.4.20-19.9.

They problems are:

* Problem 1. Pressing Shift+Alt_R generates a fake Cltr_R key press
event with no Ctrl_R key up event, so the Ctrl key gets stuck. Pressing
the Ctrl_R key just after generates only a key release event and then
everything gets back to normal. I added some printk messages to keybdev,
hid-input and hid-core and this is what I got:

# ---> Press Right Shift
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe5, code 54
hidinput_hid_event: key 54 (0x36), down = 1
hid_core.c:hid_input_field: count = 6
hidinput_hid_event: key 54 (0x36), down = 2
# ---> Press Right Alt
#    but Right Ctrl synthetized in HW or hid_input_field()
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe4, code 97
keybdev event key 97 (0x61), down = 1
hidinput_hid_event: page 0x7, usage 0xe6, code 100
keybdev event key 100 (0x64), down = 1
hid_core.c:hid_input_field: count = 6
# ---> Release Right Alt
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe6, code 100
keybdev event key 100 (0x64), down = 0
hid_core.c:hid_input_field: count = 6
# ---> Release Right Shift
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe5, code 54
hidinput_hid_event: key 54 (0x36), down = 0
hid_core.c:hid_input_field: count = 6
# ---> Press Right Shift
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe5, code 54
keybdev event key 54 (0x36), down = 1
hid_core.c:hid_input_field: count = 6
keybdev event key 54 (0x36), down = 2
# ---> Press Right Alt
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe6, code 100
keybdev event key 100 (0x64), down = 1
hid_core.c:hid_input_field: count = 6
# ---> Release Right Alt
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe6, code 100
keybdev event key 100 (0x64), down = 0
hid_core.c:hid_input_field: count = 6
# ---> Release Right Shift
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe5, code 54
keybdev event key 54 (0x36), down = 0
hid_core.c:hid_input_field: count = 6
# ---> Press and Release Right Ctrl, but only release reported
hid_core.c:hid_input_field: count = 8
hidinput_hid_event: page 0x7, usage 0xe4, code 97
keybdev event key 97 (0x61), down = 0
hid_core.c:hid_input_field: count = 6

In the above count is the count variable in hid_input_field(), page and
usage the page and usage parts of the usage->hid value in
hidinput_hid_event() and code is the usage->code value in the same
function. Finally key is the value of code in keybdev_event(), decimal
and hex.

Any ideas what's going wrong? Is it a buggy keyboard? Or a problem in
hid_input_field()? Or something else?

* Problem 2: The mapping of HID keys to event keys and from event keys
to PS/2 scancodes are not very nice for "internet" keyboards. I reworked
them to recognize many more HID keys and use the standard MS scancodes,
supplemented by the MS Office keyboard mappings too. That is implemented
by the patch linux-2.4.20-18.9.acpi.4-input.patch. These mappings could
be worth having in 2.4 and also in 2.6 (2.6 has better mappings, but
many are still non-standard).

* Problem 3: My keyboard (and I guess some others too) report some of
the special keys as buttons. They get assigned the BTN_* event keys.
However, these are interpreted by mousedev as regular mouse buttons and
are ignored by keybdev, which is quite annoying. The attached
linux-2.4.20-18.9.acpi.4-keyb-but.patch makes mousedev ignore those and
assigns KEY_PROG* event keys to those in keybdev, so that they behave as
programmable keys.

Any feedback about the patches is appreciated.

Best,

Diego


-- 
-------------------------------------------------------
Diego Santa Cruz - PhD
Publications available at http://ltswww.epfl.ch/~dsanta
Signal Processing Institute (LTS1 / ITS / STI)
Swiss Federal Institute of Technology (EPFL)
EPFL - STI - ITS, CH-1015 Lausanne, Switzerland
E-mail:     Diego.SantaCruz@epfl.ch
Phone:      +41 - 21 - 693 26 57
Fax:        +41 - 21 - 693 76 00
-------------------------------------------------------

[-- Attachment #2: linux-2.4.20-18.9.acpi.4-input.patch --]
[-- Type: text/plain, Size: 22823 bytes --]

D Recognize more keys on USB keyboards, in particular many keys
D defined in the HID consumer page.
D Use MS standard and MS Office keyboard USB HID to PS/2 scancode
D mapping, plus custom mapping for other keys, this makes the scancodes
D for USB keyboards compatible with most PS/2 keyboards.
D
--- linux-2.4.20-18.9.acpi.4/include/linux/input.h.orig	2003-07-24 13:06:49.000000000 +0200
+++ linux-2.4.20-18.9.acpi.4/include/linux/input.h	2003-07-28 08:14:48.000000000 +0200
@@ -7,6 +7,9 @@
  *  Copyright (c) 1999-2000 Vojtech Pavlik
  *
  *  Sponsored by SuSE
+ *
+ * 2003.07.29, Diego Santa Cruz <Diego.SantaCruz@epfl.ch>
+ *      Updated USB HID to event keycode mapping
  */
 
 /*
@@ -305,11 +308,58 @@
 #define KEY_SUSPEND		205
 #define KEY_CLOSE		206
 
-#define KEY_UNKNOWN		220
+/* #define KEY_UNKNOWN		220 */
 
 #define KEY_BRIGHTNESSDOWN	224
 #define KEY_BRIGHTNESSUP	225
 
+/* Extra key definitions from kernel 2.6 */
+#define KEY_PLAY		207
+#define KEY_FASTFORWARD		208
+#define KEY_BASSBOOST		209
+#define KEY_PRINT		210
+#define KEY_HP			211
+#define KEY_CAMERA		212
+#define KEY_SOUND		213
+#define KEY_QUESTION		214
+#define KEY_EMAIL		215
+#define KEY_CHAT		216
+#define KEY_SEARCH		217
+#define KEY_CONNECT		218
+#define KEY_FINANCE		219
+#define KEY_SPORT		220
+#define KEY_SHOP		221
+#define KEY_ALTERASE		222
+#define KEY_CANCEL		223
+#define KEY_MEDIA		226
+
+/* Extra key definitions (private) */
+#define KEY_SELECT		199
+#define KEY_WORDPROCESSOR	227
+#define KEY_SPREADSHEET		228
+#define KEY_CALENDAR		229
+#define KEY_LANBROWSER		230
+#define KEY_LOGOFF		231
+#define KEY_NEXTTASK		232
+#define KEY_PREVTASK		233
+#define KEY_DOCUMENTS		234
+#define KEY_DESKTOP		235
+#define KEY_SPELLCHECK		236
+#define KEY_PICTURES		237
+#define KEY_MUSIC		238
+#define KEY_NEW			239
+#define KEY_SAVE		240
+#define KEY_HISTORY		241
+#define KEY_REPLY		242
+#define KEY_FORWARDMSG		243
+#define KEY_SEND		244
+#define KEY_ZOOMIN		245
+#define KEY_ZOOMOUT		246
+#define KEY_ZOOM		247
+#define KEY_SCROLL		248
+
+#define KEY_UNKNOWN		255
+
 #define BTN_MISC		0x100
 #define BTN_0			0x100
 #define BTN_1			0x101
--- linux-2.4.20-18.9.acpi.4/drivers/usb/hid-input.c.orig	2003-07-21 15:09:26.000000000 +0200
+++ linux-2.4.20-18.9.acpi.4/drivers/usb/hid-input.c	2003-07-28 08:15:01.000000000 +0200
@@ -6,6 +6,9 @@
  *  USB HID to Linux Input mapping module
  *
  *  Sponsored by SuSE
+ *
+ * 2003.07.29, Diego Santa Cruz <Diego.SantaCruz@epfl.ch>
+ *	Updated USB HID to event keycode mapping
  */
 
 /*
@@ -37,25 +40,37 @@
 
 #include "hid.h"
 
-#define unk	KEY_UNKNOWN
-
 static unsigned char hid_keyboard[256] = {
-	  0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
-	 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
-	  4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
-	 27, 43, 84, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
-	 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
-	105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
-	 72, 73, 82, 83, 86,127,116,117, 85, 89, 90, 91, 92, 93, 94, 95,
-	120,121,122,123,134,138,130,132,128,129,131,137,133,135,136,113,
-	115,114,unk,unk,unk,124,unk,181,182,183,184,185,186,187,188,189,
-	190,191,192,193,194,195,196,197,198,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,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,
-	150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
+  /* 0x00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_A, KEY_B, KEY_C, KEY_D,
+  /* 0x08 */ KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
+  /* 0x10 */ KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
+  /* 0x18 */ KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2,
+  /* 0x20 */ KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
+  /* 0x28 */ KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_MINUS, KEY_EQUAL, KEY_LEFTBRACE,
+  /* 0x30 */ KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_103RD, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT,
+  /* 0x38 */ KEY_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
+  /* 0x40 */ KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_SYSRQ, KEY_SCROLLLOCK,
+  /* 0x48 */ KEY_PAUSE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_RIGHT,
+  /* 0x50 */ KEY_LEFT, KEY_DOWN, KEY_UP, KEY_NUMLOCK, KEY_KPSLASH, KEY_KPASTERISK, KEY_KPMINUS, KEY_KPPLUS,
+  /* 0x58 */ KEY_KPENTER, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7,
+  /* 0x60 */ KEY_KP8, KEY_KP9, KEY_KP0, KEY_KPDOT, KEY_102ND, KEY_COMPOSE, KEY_RESERVED, KEY_KPEQUAL,
+  /* 0x68 */ KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20,
+  /* 0x70 */ KEY_F21, KEY_F22, KEY_F23, KEY_F24, KEY_MACRO, KEY_HELP, KEY_MENU, KEY_SELECT,
+  /* 0x78 */ KEY_STOP, KEY_AGAIN, KEY_UNDO, KEY_CUT, KEY_COPY, KEY_PASTE, KEY_FIND, KEY_MUTE,
+  /* 0x80 */ KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_KPCOMMA, KEY_UNKNOWN, KEY_INTL1,
+  /* 0x88 */ KEY_INTL2, KEY_INTL3, KEY_INTL4, KEY_INTL5, KEY_INTL6, KEY_INTL7, KEY_INTL8, KEY_INTL9,
+  /* 0x90 */ KEY_LANG1, KEY_LANG2, KEY_LANG3, KEY_LANG4, KEY_LANG5, KEY_LANG6, KEY_LANG7, KEY_LANG8,
+  /* 0x98 */ KEY_LANG9, KEY_ALTERASE, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_CANCEL, KEY_UNKNOWN, KEY_UNKNOWN,
+  /* 0xA0 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+  /* 0xA8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED,
+  /* 0xB0 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_KPLEFTPAREN, KEY_KPRIGHTPAREN,
+  /* 0xB8 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+  /* 0xC0 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+  /* 0xC8 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+  /* 0xD0 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_KPPLUSMINUS,
+  /* 0xD8 */ KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_RESERVED, KEY_RESERVED,
+  /* 0xE0 */ KEY_LEFTCTRL, KEY_LEFTSHIFT, KEY_LEFTALT, KEY_LEFTMETA, KEY_RIGHTCTRL, KEY_RIGHTSHIFT, KEY_RIGHTALT, KEY_RIGHTMETA
+  /* 0xE8-0xFFFF */ /* reserved (KEY_RESERVED == 0) */
 };
 
 static struct {
@@ -200,11 +215,13 @@
 
 			switch (usage->hid & HID_USAGE) {
 				case 0x000: usage->code = 0; break;
-				case 0x034: usage->code = KEY_SLEEP;		break;
-				case 0x036: usage->code = BTN_MISC;		break;
+
 				case 0x08a: usage->code = KEY_WWW;		break;
-				case 0x095: usage->code = KEY_HELP;		break;
 
+				case 0x0b0: usage->code = KEY_PLAYCD;		break;
+				case 0x0b1: usage->code = KEY_PAUSECD;		break;
+				case 0x0b2: usage->code = KEY_RECORD;		break;
+				case 0x0b3: usage->code = KEY_FASTFORWARD;	break;
 				case 0x0b4: usage->code = KEY_REWIND;		break;
 				case 0x0b5: usage->code = KEY_NEXTSONG;		break;
 				case 0x0b6: usage->code = KEY_PREVIOUSSONG;	break;
@@ -213,26 +230,78 @@
 				case 0x0cd: usage->code = KEY_PLAYPAUSE;	break;
 
 				case 0x0e2: usage->code = KEY_MUTE;		break;
+				case 0x0e5: usage->code = KEY_BASSBOOST;	break;
 				case 0x0e9: usage->code = KEY_VOLUMEUP;		break;
 				case 0x0ea: usage->code = KEY_VOLUMEDOWN;	break;
 
 				case 0x183: usage->code = KEY_CONFIG;		break;
+				case 0x184: usage->code = KEY_WORDPROCESSOR;	break;
+				case 0x186: usage->code = KEY_SPREADSHEET;	break;
 				case 0x18a: usage->code = KEY_MAIL;		break;
+				case 0x18e: usage->code = KEY_CALENDAR;		break;
+				case 0x191: usage->code = KEY_FINANCE;		break;
 				case 0x192: usage->code = KEY_CALC;		break;
-				case 0x194: usage->code = KEY_FILE;		break;
+				case 0x194: usage->code = KEY_COMPUTER;		break;
+				case 0x195: usage->code = KEY_LANBROWSER;	break;
+				case 0x196: usage->code = KEY_WWW;		break;
+				case 0x197: usage->code = KEY_CONNECT;		break;
+				case 0x198: usage->code = KEY_CAMERA;		break;
+				case 0x199: usage->code = KEY_CHAT;		break;
+				case 0x19a: usage->code = KEY_PHONE;		break;
+				case 0x19C: usage->code = KEY_LOGOFF;		break;
+				case 0x19f: usage->code = KEY_SETUP;		break;
+				case 0x1a0: usage->code = KEY_MSDOS;		break;
+
+				case 0x1a2: usage->code = KEY_CYCLEWINDOWS;	break;
+				case 0x1a3: usage->code = KEY_NEXTTASK;		break;
+				case 0x1a4: usage->code = KEY_PREVTASK;		break;
+
+				case 0x1a7: usage->code = KEY_DOCUMENTS;	break;
+				case 0x1aa: usage->code = KEY_DESKTOP;		break;
+				case 0x1ab: usage->code = KEY_SPELLCHECK;	break;
+				case 0x1b4: usage->code = KEY_FILE;		break;
+				case 0x1b6: usage->code = KEY_PICTURES;		break;
+				case 0x1b7: usage->code = KEY_MUSIC;		break;
+
+				case 0x201: usage->code = KEY_NEW;		break;
+				case 0x202: usage->code = KEY_OPEN;		break;
+				case 0x203: usage->code = KEY_CLOSE;		break;
+				case 0x204: usage->code = KEY_EXIT;		break;
+				case 0x207: usage->code = KEY_SAVE;		break;
+				case 0x208: usage->code = KEY_PRINT;		break;
+				case 0x209: usage->code = KEY_PROPS;		break;
 
 				case 0x21a: usage->code = KEY_UNDO;		break;
 				case 0x21b: usage->code = KEY_COPY;		break;
 				case 0x21c: usage->code = KEY_CUT;		break;
 				case 0x21d: usage->code = KEY_PASTE;		break;
+				case 0x21f: usage->code = KEY_FIND;		break;
 
-				case 0x221: usage->code = KEY_FIND;		break;
+				case 0x221: usage->code = KEY_SEARCH;		break;
 				case 0x223: usage->code = KEY_HOMEPAGE;		break;
 				case 0x224: usage->code = KEY_BACK;		break;
 				case 0x225: usage->code = KEY_FORWARD;		break;
 				case 0x226: usage->code = KEY_STOP;		break;
 				case 0x227: usage->code = KEY_REFRESH;		break;
 				case 0x22a: usage->code = KEY_BOOKMARKS;	break;
+				case 0x22b: usage->code = KEY_HISTORY;		break;
+
+				case 0x22d: usage->code = KEY_ZOOMIN;		break;
+				case 0x22e: usage->code = KEY_ZOOMOUT;		break;
+				case 0x22f: usage->code = KEY_ZOOM;		break;
+				case 0x233: usage->code = KEY_SCROLLUP;		break;
+				case 0x234: usage->code = KEY_SCROLLDOWN;	break;
+				case 0x235: usage->code = KEY_SCROLL;		break;
+
+				case 0x260: usage->code = KEY_SHOP;		break;
+				case 0x279: usage->code = KEY_AGAIN;		break;
+
+				case 0x289: usage->code = KEY_REPLY;		break;
+				case 0x28b: usage->code = KEY_FORWARDMSG;	break;
+				case 0x28c: usage->code = KEY_SEND;		break;
+
+				case 0x28e: usage->code = KEY_SENDFILE;		break;
+				case 0x28f: usage->code = KEY_XFER;		break;
 
 				default:    usage->code = KEY_UNKNOWN;		break;
 
--- linux-2.4.20-18.9.acpi.4/drivers/input/keybdev.c.orig	2003-07-25 19:15:55.000000000 +0200
+++ linux-2.4.20-18.9.acpi.4/drivers/input/keybdev.c	2003-07-28 08:11:30.000000000 +0200
@@ -6,6 +6,10 @@
  *  Input driver to keyboard driver binding.
  *
  *  Sponsored by SuSE
+ *
+ * 2003.07.29, Diego Santa Cruz <Diego.SantaCruz@epfl.ch>
+ *	Use MS std. USB HID to PS/2 scancode mappings, supplemented
+ *	with MS Office keyboard and custom mappings for other keys.
  */
 
 /*
@@ -50,22 +54,184 @@
 
 static int jp_kbd_109 = 1;	/* Yes, .jp is the default. See 51142. */
 
-static unsigned short x86_keycodes[256] =
-	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-	 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-	 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
-	 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
-	 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
-	 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90,
-	284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
-	367,294,293,286,350, 92,334,512,116,377,109,111,373,347,348,349,
-	360, 93, 94, 95, 98,376,100,101,357,316,354,304,289,102,351,355,
-	103,104,105,275,281,272,306,106,274,107,288,364,358,363,362,361,
-	291,108,381,290,287,292,279,305,280, 99,112,257,258,113,270,114,
-	118,117,125,374,379,259,260,261,262,263,264,265,266,267,268,269,
-	271,273,276,277,278,282,283,295,296,297,299,300,301,302,303,307,
-	308,310,313,314,315,317,318,319,320,321,322,323,324,325,326,330,
-	332,340,341,342,343,344,345,346,356,359,365,368,369,370,371,372 };
+/* Based on Microsoft HID to PS/2 scancode mapping from
+ * <http://www.microsoft.com/hwdev/download/tech/input/translate.pdf>
+ * with addition of MS Office keyboard scancodes from
+ * <http://www.chipx86.com/linuxstuff/officekb/> (X scancodes converted
+ * to PS/2 scancodes using XFree86 source code).
+ *
+ * Exceptions:
+ *
+ * LANG1 72 (MS says f2 for make, no code for break)
+ * LANG2 71 (MS says f1 for make, no code for break)
+ * SYSRQ special handling in emulate_raw()
+ * PAUSE special handling in emulate_raw()
+ *
+ * Additions:
+ *
+ * F16            e0 11
+ * F17            e0 12
+ * F18            e0 77
+ * F19            e0 1f
+ * F20            5a
+ * MACRO          e0 6f
+ * KPPLUSMINUS    e0 4e
+ * F21            74
+ * F22            67
+ * F23            6d
+ * F24            6f
+ * FRONT          5b
+ * HELP           e0 3b (MS Office keyb.)
+ * MENU           e0 4c
+ * DELETEFILE     69
+ * COFFEE         e0 36
+ * DIRECTION      6b
+ * CLOSECD        e0 59
+ * EJECTCLOSECD   e0 5a
+ * ISO            68
+ * MOVE           72
+ * EDIT           6a
+ * KPLEFTPAREN    e0 76
+ * KPRIGHTPAREN   e0 62
+ * INTL7          62
+ * INTL8          63
+ * INTL9          64
+ * LANG6          65
+ * LANG7          66
+ * LANG8          6c
+ * LANG9          6e
+ * SUSPEND        e0 6e
+ * HP             e0 3c (Office Home in MS Office keyb.)
+ * SOUND          55
+ * QUESTION       e0 3b (same as HELP)
+ * SPORT          e0 2a
+ * ALTERASE       e0 79
+ * CANCEL         71
+ * BRIGHTNESSDOWN e0 74
+ * BRIGHTNESSUP   e0 75
+ * SELECT         75
+ *
+ * PROG1          e0 70
+ * PROG2          e0 71
+ * PROG3          e0 72
+ * PROG4          e0 73
+ *
+ * UNKNOWN        e0 79 (same as ALTERASE) 
+ * 
+ * Special keys associated to HID functions in consumer page (0x0c):
+ *
+ * KEY              HID name                     HID code    Scancode
+ *
+ * MUTE             Mute                          e2         e0 20 (MS std.)
+ * VOLUMEDOWN       Volume Decrement              ea         e0 2e (MS std.)
+ * VOLUMEUP         Volume Increment              e9         e0 30 (MS std.)
+ * STOP             AC Stop                      226         e0 68 (MS std.)
+ * AGAIN            AC Redo/Repeat               279         e0 07 (MS Office keyb.)
+ * PROPS            AC Properties                209         e0 56
+ * UNDO             AC Undo                      21a         e0 08 (MS Office keyb.)
+ * COPY             AC Copy                      21b         e0 18 (MS Office keyb.)
+ * OPEN             AC Open                      202         e0 3f (MS Office keyb.)
+ * PASTE            AC Paste                     21d         e0 0a (MS Office keyb.)
+ * FIND             AC Find                      21f         e0 78
+ * CUT              AC Cut                       21c         e0 17 (MS Office keyb.)
+ * CALC             AL Calculator                192         e0 21 (MS std.)
+ * SETUP            AL Control Panel             19f         e0 55
+ * FILE             AL File Browser              1b4         e0 05 (MS Office keyb.)
+ * SENDFILE         AC Upload                    28e         e0 01
+ * XFER             AC Download                  28f         e0 02
+ * WWW              AL Internet Browser          196         e0 03
+ * MSDOS            AL Command line processor    1a0         e0 04
+ * CYCLEWINDOWS     AL Select Task / Application 1a4         e0 3d (MS Office keyb.)
+ * MAIL / EMAIL     AL Email Reader              18a         e0 6c (MS std.)
+ * BOOKMARKS        AC Bookmarks                 22a         e0 66 (MS std.)
+ * COMPUTER         AL Local Machine Browser     194         e0 6b (MS std.)
+ * BACK             AC Back                      224         e0 6a (MS std.)
+ * FORWARD          AC Forward                   225         e0 69 (MS std.)
+ * EJECTCD          Eject                         b8         e0 29
+ * NEXTSONG         Scan Next Track               b5         e0 19 (MS std.)
+ * PLAYPAUSE        Play/Pause                    cd         e0 22 (MS std.)
+ * PREVIOUSSONG     Scan Previous Track           b6         e0 10 (MS std.)
+ * STOPCD           Stop                          b7         e0 24 (MS std.)
+ * RECORD           Record                        b2         e0 2b
+ * REWIND           Rewind                        b4         e0 2c
+ * PHONE            AL Telephony/Dialer          19a         e0 54
+ * CONFIG / MEDIA   AL Consumer Control Conf.    183         e0 6d (MS std.)
+ * HOMEPAGE         AC Home                      223         e0 32 (MS std.)
+ * REFRESH          AC Refresh                   227         e0 67 (MS std.)
+ * EXIT             AC Exit                      204         e0 34
+ * SCROLLUP         AC Scroll Up                 233         e0 39
+ * SCROLLDOWN       AC Scroll Down               234         e0 3a
+ * PLAYCD / PLAY    Play                          b0         e0 2d
+ * PAUSECD          Pause                         b1         e0 2f
+ * CLOSE            AC Close                     203         e0 40 (MS Office keyb.)
+ * FASTFORWARD      Fast Forward                  b3         e0 31
+ * BASSBOOST        Bass Boost                    e5         e0 33
+ * PRINT            AC Print                     208         e0 58 (MS Office keyb.)
+ * CAMERA           AL Network Conference        198         e0 06
+ * CHAT             AL Network Chat              199         e0 28
+ * SEARCH           AC Search                    221         e0 65 (MS std.)
+ * CONNECT          AL ISP Connect               197         e0 25
+ * FINANCE          AL Checkbook/Finance         191         e0 26
+ * SHOP             AC Catalog                   260         e0 27
+ * WORDPROCESSOR    AL Word Processor            184         e0 13 (MS Office keyb.)
+ * SPREADSHEET      AL Spreadsheet               186         e0 14 (MS Office keyb.)
+ * CALENDAR         AL Calendar/Schedule         18e         e0 15 (MS Office keyb.)
+ * LANBROWSER       AL LAN/WAN Browser           195         e0 1b
+ * LOGOFF           AL Logoff                    19c         e0 16 (MS Office keyb.)
+ * NEXTTASK         AL Next Task/Application     1a3         e0 1e (MS Office keyb.)
+ * PREVTASK         AL Previous Task/Application 1a4         e0 09 (MS Office keyb.)
+ * DOCUMENTS        AL Documents                 1a7         e0 0c
+ * DESKTOP          AL Desktop                   1aa         e0 0d
+ * SPELLCHECK       AL Spell Check               1ab         e0 23 (MS Office keyb.)
+ * PICTURES         AL Pictures (non-std.)       1b6         e0 0e
+ * MUSIC            AL Music (non-std.)          1b7         e0 0f
+ * NEW              AC New                       201         e0 3e (MS Office keyb.)
+ * SAVE             AC Save                      207         e0 57 (MS Office keyb.)
+ * HISTORY          AC History                   22b         e0 1a
+ * REPLY            AC Reply                     289         e0 41 (MS Office keyb.)
+ * FORWARDMSG       AC Forward Msg               28b         e0 42 (MS Office keyb.)
+ * SEND             AC Send                      28c         e0 43 (MS Office keyb.)
+ * ZOOMIN           AC Zoom in                   22d         e0 44
+ * ZOOMOUT          AC Zoom out                  22e         e0 45
+ * ZOOM             AC Zoom                      22f         e0 4a
+ * SCROLL           AC Scroll                    235         e0 0b (MS Office keyb.)
+ * 
+ **/
+
+static unsigned short x86_keycodes[256] = {
+  /* 0x00 */ 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007,
+  /* 0x08 */ 0x008, 0x009, 0x00A, 0x00B, 0x00C, 0x00D, 0x00E, 0x00F,
+  /* 0x10 */ 0x010, 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017,
+  /* 0x18 */ 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F,
+  /* 0x20 */ 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x027,
+  /* 0x28 */ 0x028, 0x029, 0x02A, 0x02B, 0x02C, 0x02D, 0x02E, 0x02F,
+  /* 0x30 */ 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037,
+  /* 0x38 */ 0x038, 0x039, 0x03A, 0x03B, 0x03C, 0x03D, 0x03E, 0x03F,
+  /* 0x40 */ 0x040, 0x041, 0x042, 0x043, 0x044, 0x045, 0x046, 0x047,
+  /* 0x48 */ 0x048, 0x049, 0x04A, 0x04B, 0x04C, 0x04D, 0x04E, 0x04F,
+  /* 0x50 */ 0x050, 0x051, 0x052, 0x053, 0x02B, 0x05D, 0x056, 0x057,
+  /* 0x58 */ 0x058, 0x05E, 0x05F, 0x111, 0x112, 0x177, 0x17F, 0x05A,
+  /* 0x60 */ 0x11C, 0x11D, 0x135, 0x12A, 0x138, 0x000, 0x147, 0x148,
+  /* 0x68 */ 0x149, 0x14B, 0x14D, 0x14F, 0x150, 0x151, 0x152, 0x153,
+  /* 0x70 */ 0x16F, 0x120, 0x12E, 0x130, 0x15E, 0x059, 0x14E, 0x200,
+  /* 0x78 */ 0x074, 0x067, 0x06D, 0x06F, 0x07E, 0x15B, 0x15C, 0x15D,
+  /* 0x80 */ 0x168, 0x107, 0x156, 0x108, 0x05B, 0x118, 0x13F, 0x10A,
+  /* 0x88 */ 0x178, 0x117, 0x13B, 0x14C, 0x121, 0x155, 0x15F, 0x163,
+  /* 0x90 */ 0x105, 0x101, 0x069, 0x102, 0x170, 0x171, 0x103, 0x104,
+  /* 0x98 */ 0x136, 0x06B, 0x13D, 0x16C, 0x166, 0x16B, 0x16A, 0x169,
+  /* 0xA0 */ 0x159, 0x129, 0x15A, 0x119, 0x122, 0x110, 0x124, 0x12B,
+  /* 0xA8 */ 0x12C, 0x154, 0x068, 0x16D, 0x132, 0x167, 0x134, 0x072,
+  /* 0xB0 */ 0x06A, 0x139, 0x13A, 0x176, 0x162, 0x073, 0x070, 0x07D,
+  /* 0xB8 */ 0x079, 0x07B, 0x05C, 0x062, 0x063, 0x064, 0x072, 0x071,
+  /* 0xC0 */ 0x078, 0x077, 0x076, 0x065, 0x066, 0x06C, 0x06E, 0x075,
+  /* 0xC8 */ 0x12D, 0x12F, 0x172, 0x173, 0x000, 0x16E, 0x140, 0x12D,
+  /* 0xD0 */ 0x131, 0x133, 0x158, 0x13C, 0x106, 0x055, 0x13B, 0x16C,
+  /* 0xD8 */ 0x128, 0x165, 0x125, 0x126, 0x12A, 0x127, 0x179, 0x71,
+  /* 0xE0 */ 0x174, 0x175, 0x16D, 0x113, 0x114, 0x115, 0x11B, 0x116,
+  /* 0xE8 */ 0x11E, 0x109, 0x10C, 0x10D, 0x123, 0x10E, 0x10F, 0x13E,
+  /* 0xF0 */ 0x157, 0x11A, 0x141, 0x142, 0x143, 0x144, 0x145, 0x14A,
+  /* 0xF8 */ 0x10B, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x179
+};
 
 #ifdef CONFIG_MAC_EMUMOUSEBTN
 extern int mac_hid_mouse_emulate_buttons(int, int, int);
@@ -225,13 +391,8 @@
 	kbd_ledfunc = keybdev_ledfunc;
 	kbd_refresh_leds();
 
-	if (jp_kbd_109) {
-		x86_keycodes[0xb5] = 0x73;	/* backslash, underscore */
-		x86_keycodes[0xb6] = 0x70;
-		x86_keycodes[0xb7] = 0x7d;	/* Yen, pipe */
-		x86_keycodes[0xb8] = 0x79;
-		x86_keycodes[0xb9] = 0x7b;
-	}
+        if (!jp_kbd_109)
+          printk(KERN_WARNING "keybdev: legacy jp_kbd_109 option = 0 ignored (jp_kbd_109 always enabled)\n");
 
 	return 0;
 }

[-- Attachment #3: linux-2.4.20-18.9.acpi.4-keyb-but.patch --]
[-- Type: text/plain, Size: 1367 bytes --]

D Do not map keyboard buttons to PS/2 mouse buttons but to
D programmable keys.
D
--- linux-2.4.20-18.9.acpi.4/drivers/input/keybdev.c.orig	2003-07-28 08:11:30.000000000 +0200
+++ linux-2.4.20-18.9.acpi.4/drivers/input/keybdev.c	2003-07-28 08:11:21.000000000 +0200
@@ -337,6 +337,13 @@
 {
 	if (type != EV_KEY) return;
 
+	switch (code) { /* map keyboard buttons to programmable keys */
+	case BTN_0: code = KEY_PROG1;	break;
+	case BTN_1: code = KEY_PROG2;	break;
+	case BTN_2: code = KEY_PROG3;	break;
+	case BTN_3: code = KEY_PROG4;	break;
+	}
+
 	if (emulate_raw(code, down))
 		printk(KERN_WARNING "keyboard.c: can't emulate rawmode for keycode %d\n", code);
 
--- linux-2.4.20-18.9.acpi.4/drivers/input/mousedev.c.orig	2003-07-25 19:15:36.000000000 +0200
+++ linux-2.4.20-18.9.acpi.4/drivers/input/mousedev.c	2003-07-25 19:17:42.000000000 +0200
@@ -122,17 +122,12 @@
 
 				case EV_KEY:
 					switch (code) {
-						case BTN_0:
 						case BTN_TOUCH:
 						case BTN_LEFT:   index = 0; break;
-						case BTN_4:
 						case BTN_EXTRA:  if (list->mode == 2) { index = 4; break; }
 						case BTN_STYLUS:
-						case BTN_1:
 						case BTN_RIGHT:  index = 1; break;
-						case BTN_3:
 						case BTN_SIDE:   if (list->mode == 2) { index = 3; break; }
-						case BTN_2:
 						case BTN_STYLUS2:
 						case BTN_MIDDLE: index = 2; break;	
 						default: return;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-07-29 11:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-29 11:37 Linux problems with USB HID keyboards and patches Diego SANTA CRUZ

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®