kern/134005: Cannot type underscore and other key on JP106 USB
keyboard on Xorg
YAMASHIRO Jun
yamajun at ofug.net
Sat Apr 25 20:20:02 UTC 2009
>Number: 134005
>Category: kern
>Synopsis: Cannot type underscore and other key on JP106 USB keyboard on Xorg
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Apr 25 20:20:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: YAMASHIRO Jun
>Release: FreeBSD 8.0-CURRENT
>Organization:
Okinawa FreeBSD Users Group
>Environment:
CURRENT:
FreeBSD 8.0-CURRENT FreeBSD 8.0-CURRENT #36: Sat Apr 25 17:27:10 JST 2009 y
amajun@:/usr/obj/usr/src/sys/GENERIC i386
7.x:
FreeBSD 7.2-RC2 FreeBSD 7.2-RC2 #0: Sat Apr 26 03:09:34 JST 2009 yamajun@:/
usr/obj/usr/src/sys/GENERIC i386
>Description:
In Xorg on FreeBSD, these keys on 106/109 Japanese keyboard aren't work.
1) backslash / underscore (Keyboard International 1)
2) Hiragana_Katakana (Keyboard International 2)
3) Henkan (Keyboard International 4)
In past, two(or more) reports posted for this bug,
as ports bug(ports/116443 and ports/119037). But,
I found cause of this bug at ukbd(4). No necessary
change of x11-drivers/xf86-input-keyboard.
This bug make inconvenience to Japanese FreeBSD users
in several years. Please fix it rapidly.
Cause:
Add support for Sun Type 6 keyboard sys/dev/usb/ukbd.c in revision 1.46.
But, Type 6 support code caused crash keycode value of some keys
on Japanese keyboard.
This patch solved this bug without change behavior of Sun Type 6/7
support code.
This patch no harm US 101 keyboard layout. But, special key on
Sun Type 6/7 keyboard(Stop, Copy, etc.) cannot work with old and new ukbd.c
(Only work with SPARC architecture workstation?)
Tested with:
109 Japanese USB keyboard
101 US USB keyboard
Sun Type 7 Japanese USB keyboard
(Cannot work special key on Type 6/7 keyboard)
Note:
* Same problem reported in ports/116443 and ports/119037.
* On console, fixed similarly bug(Report in kern/99090 and kern/112214).
Reference:
USB HID to PS/2 Scan Code Translation Table
http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456
c/translate.pdf
>How-To-Repeat:
1. Run Xorg.
2. X keymap setting for Japanese keyboard
% setxkbmap -layout jp
% setxkbmap -model jp106
3. Type "backslash / underscore" key
>Fix:
1. Extract shar archive.
2. Apply patch in archive.
(Current)
# cd /usr/src/sys/dev/usb/input
# patch < /path/to/ukbd.c.diff.current
# cd /usr/src/sys/legacy/dev/usb
# patch < /path/to/ukbd.c.diff.7
(7.x)
# cd /usr/src/sys/dev/usb
# patch < /path/to/ukbd.c.diff.7
3. rebuild kernel and reboot
# cd /usr/src
# make buildkernel
# make installkernel
# shutdown -r now
Patch attached with submission follows:
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# ukbd.c.diff.7
# ukbd.c.diff.current
#
echo x - ukbd.c.diff.7
sed 's/^X//' >ukbd.c.diff.7 << 'f8be75896e0e3b4b145846774568e271'
X--- ukbd.c.orig 2009-04-26 00:30:53.000000000 +0900
X+++ ukbd.c 2009-04-26 00:30:41.000000000 +0900
X@@ -320,8 +320,8 @@
X NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
X NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
X 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
X- 121, 120, NN, NN, NN, NN, NN, 115, /* 80 - 87 */
X- 112, 125, 121, 123, NN, NN, NN, NN, /* 88 - 8F */
X+ 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
X+ 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
X NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
X NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
X NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
X@@ -1498,22 +1498,61 @@
X keycode2scancode(int keycode, int shift, int up)
X {
X static int scan[] = {
X- 0x1c, 0x1d, 0x35,
X- 0x37 | SCAN_PREFIX_SHIFT, /* PrintScreen */
X- 0x38, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f,
X- 0x50, 0x51, 0x52, 0x53,
X- 0x46, /* XXX Pause/Break */
X- 0x5b, 0x5c, 0x5d,
X- /* SUN TYPE 6 USB KEYBOARD */
X- 0x68, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
X- 0x64, 0x65, 0x66, 0x67, 0x25, 0x1f, 0x1e,
X- 0x20,
X+ /* 89 */
X+ 0x11c, /* Enter */
X+ /* 90-99 */
X+ 0x11d, /* Ctrl-R */
X+ 0x135, /* Divide */
X+ 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
X+ 0x138, /* Alt-R */
X+ 0x147, /* Home */
X+ 0x148, /* Up */
X+ 0x149, /* PageUp */
X+ 0x14b, /* Left */
X+ 0x14d, /* Right */
X+ 0x14f, /* End */
X+ /* 100-109 */
X+ 0x150, /* Down */
X+ 0x151, /* PageDown */
X+ 0x152, /* Insert */
X+ 0x153, /* Delete */
X+ 0x146, /* XXX Pause/Break */
X+ 0x15b, /* Win_L(Super_L) */
X+ 0x15c, /* Win_R(Super_R) */
X+ 0x15d, /* Application(Menu) */
X+
X+ /* SUN TYPE 6 USB KEYBOARD */
X+ 0x168, /* Sun Type 6 Help */
X+ 0x15e, /* Sun Type 6 Stop */
X+ /* 110 - 119 */
X+ 0x15f, /* Sun Type 6 Again */
X+ 0x160, /* Sun Type 6 Props */
X+ 0x161, /* Sun Type 6 Undo */
X+ 0x162, /* Sun Type 6 Front */
X+ 0x163, /* Sun Type 6 Copy */
X+ 0x164, /* Sun Type 6 Open */
X+ 0x165, /* Sun Type 6 Paste */
X+ 0x166, /* Sun Type 6 Find */
X+ 0x167, /* Sun Type 6 Cut */
X+ 0x125, /* Sun Type 6 Mute */
X+ /* 120 - 128 */
X+ 0x11f, /* Sun Type 6 VolumeDown */
X+ 0x11e, /* Sun Type 6 VolumeUp */
X+ 0x120, /* Sun Type 6 PowerDown */
X+
X+ /* Japanese 106/109 keyboard */
X+ 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
X+ 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
X+ 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
X+ 0x79, /* Keyboard Intl' 4 (Henkan) */
X+ 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
X+ 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
X };
X int scancode;
X
X scancode = keycode;
X if ((keycode >= 89) && (keycode < 89 + sizeof(scan)/sizeof(scan[0])))
X- scancode = scan[keycode - 89] | SCAN_PREFIX_E0;
X+ scancode = scan[keycode - 89];
X /* Pause/Break */
X if ((keycode == 104) && !(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))
X scancode = 0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL;
f8be75896e0e3b4b145846774568e271
echo x - ukbd.c.diff.current
sed 's/^X//' >ukbd.c.diff.current << '594511c3b5704ee4b236e1e96d9dbe3b'
X--- ukbd.c.orig 2009-04-18 10:31:47.000000000 +0900
X+++ ukbd.c 2009-04-25 18:39:05.000000000 +0900
X@@ -225,8 +225,8 @@
X NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
X NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
X 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
X- 121, 120, NN, NN, NN, NN, NN, 115, /* 80 - 87 */
X- 112, 125, 121, 123, NN, NN, NN, NN, /* 88 - 8F */
X+ 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
X+ 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
X NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
X NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
X NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
X@@ -1386,20 +1386,59 @@
X ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
X {
X static const int scan[] = {
X- 0x1c, 0x1d, 0x35,
X- 0x37 | SCAN_PREFIX_SHIFT, /* PrintScreen */
X- 0x38, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f,
X- 0x50, 0x51, 0x52, 0x53,
X- 0x46, /* XXX Pause/Break */
X- 0x5b, 0x5c, 0x5d,
X+ /* 89 */
X+ 0x11c, /* Enter */
X+ /* 90-99 */
X+ 0x11d, /* Ctrl-R */
X+ 0x135, /* Divide */
X+ 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
X+ 0x138, /* Alt-R */
X+ 0x147, /* Home */
X+ 0x148, /* Up */
X+ 0x149, /* PageUp */
X+ 0x14b, /* Left */
X+ 0x14d, /* Right */
X+ 0x14f, /* End */
X+ /* 100-109 */
X+ 0x150, /* Down */
X+ 0x151, /* PageDown */
X+ 0x152, /* Insert */
X+ 0x153, /* Delete */
X+ 0x146, /* XXX Pause/Break */
X+ 0x15b, /* Win_L(Super_L) */
X+ 0x15c, /* Win_R(Super_R) */
X+ 0x15d, /* Application(Menu) */
X+
X /* SUN TYPE 6 USB KEYBOARD */
X- 0x68, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
X- 0x64, 0x65, 0x66, 0x67, 0x25, 0x1f, 0x1e,
X- 0x20,
X+ 0x168, /* Sun Type 6 Help */
X+ 0x15e, /* Sun Type 6 Stop */
X+ /* 110 - 119 */
X+ 0x15f, /* Sun Type 6 Again */
X+ 0x160, /* Sun Type 6 Props */
X+ 0x161, /* Sun Type 6 Undo */
X+ 0x162, /* Sun Type 6 Front */
X+ 0x163, /* Sun Type 6 Copy */
X+ 0x164, /* Sun Type 6 Open */
X+ 0x165, /* Sun Type 6 Paste */
X+ 0x166, /* Sun Type 6 Find */
X+ 0x167, /* Sun Type 6 Cut */
X+ 0x125, /* Sun Type 6 Mute */
X+ /* 120 - 128 */
X+ 0x11f, /* Sun Type 6 VolumeDown */
X+ 0x11e, /* Sun Type 6 VolumeUp */
X+ 0x120, /* Sun Type 6 PowerDown */
X+
X+ /* Japanese 106/109 keyboard */
X+ 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
X+ 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
X+ 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
X+ 0x79, /* Keyboard Intl' 4 (Henkan) */
X+ 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
X+ 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
X };
X
X if ((code >= 89) && (code < (89 + (sizeof(scan) / sizeof(scan[0]))))) {
X- code = scan[code - 89] | SCAN_PREFIX_E0;
X+ code = scan[code - 89];
X }
X /* Pause/Break */
X if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
594511c3b5704ee4b236e1e96d9dbe3b
exit
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list