xref: /onnv-gate/usr/src/uts/common/io/kbtrans/usb_keytables.c (revision 3505:280762f431b6)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*3505Sqz150045  * Common Development and Distribution License (the "License").
6*3505Sqz150045  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*3505Sqz150045  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
270Sstevel@tonic-gate 
280Sstevel@tonic-gate /*
290Sstevel@tonic-gate  * This module contains the translation tables for the up-down encoded
300Sstevel@tonic-gate  * USB keyboards.
310Sstevel@tonic-gate  */
320Sstevel@tonic-gate #include <sys/usb/usba/usbai_version.h>
330Sstevel@tonic-gate 
340Sstevel@tonic-gate #define	KEYMAP_SIZE_VARIABLE
350Sstevel@tonic-gate 
360Sstevel@tonic-gate #include <sys/param.h>
370Sstevel@tonic-gate #include <sys/kbd.h>
380Sstevel@tonic-gate #include <sys/stream.h>
390Sstevel@tonic-gate #include <sys/consdev.h>
400Sstevel@tonic-gate #include <sys/note.h>
410Sstevel@tonic-gate #include <sys/usb/clients/hid/hid.h>
420Sstevel@tonic-gate #include <sys/usb/clients/hid/hid_polled.h>
430Sstevel@tonic-gate #include <sys/usb/clients/hidparser/hidparser.h>
440Sstevel@tonic-gate #include <sys/kbtrans.h>
450Sstevel@tonic-gate #include <sys/usb/clients/usbkbm/usbkbm.h>
460Sstevel@tonic-gate #include <sys/types.h>
470Sstevel@tonic-gate #include <sys/kmem.h>
480Sstevel@tonic-gate #include <sys/sunddi.h>
490Sstevel@tonic-gate 
500Sstevel@tonic-gate /* handy way to define control characters in the tables */
510Sstevel@tonic-gate #define	c(char)(char&0x1F)
520Sstevel@tonic-gate #define	ESC 0x1B
530Sstevel@tonic-gate #define	DEL 0x7F
540Sstevel@tonic-gate 
550Sstevel@tonic-gate /* Unshifted keyboard table for USB keyboard */
560Sstevel@tonic-gate 
570Sstevel@tonic-gate static keymap_entry_t keytab_usb_lc[KEYMAP_SIZE_USB] = {
580Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, ERROR, 'a', 'b', 'c', 'd',
590Sstevel@tonic-gate /*   8 */	'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
600Sstevel@tonic-gate /*  16 */	'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
610Sstevel@tonic-gate /*  24 */	'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
620Sstevel@tonic-gate /*  32 */	'3', '4', '5', '6', '7', '8', '9', '0',
630Sstevel@tonic-gate /*  40 */	'\r', ESC, '\b', '\t', ' ', '-', '=', '[',
640Sstevel@tonic-gate /*  48  */	']',   '\\',   HOLE,    ';',   '\'',    '`',   ',',   '.',
650Sstevel@tonic-gate /*  56 */	'/', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
660Sstevel@tonic-gate 		TF(4), TF(5), TF(6),
670Sstevel@tonic-gate /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
680Sstevel@tonic-gate 		RF(2), RF(3),
690Sstevel@tonic-gate /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
700Sstevel@tonic-gate 					STRING+RIGHTARROW,
710Sstevel@tonic-gate /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
720Sstevel@tonic-gate 					SHIFTKEYS+NUMLOCK, RF(5),
730Sstevel@tonic-gate 		RF(6), BF(15), BF(14),
740Sstevel@tonic-gate /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15), STRING+LEFTARROW, \
750Sstevel@tonic-gate 		RF(11), STRING+RIGHTARROW, RF(7),
760Sstevel@tonic-gate /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
770Sstevel@tonic-gate 		BF(13), HOLE,
780Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
790Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
800Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6), LF(8), \
810Sstevel@tonic-gate 		LF(9), RF(4),
820Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
830Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
840Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
850Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
860Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
870Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
880Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
890Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
900Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
910Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
920Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
930Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
940Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
950Sstevel@tonic-gate 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
960Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
970Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
980Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
990Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1000Sstevel@tonic-gate };
1010Sstevel@tonic-gate 
1020Sstevel@tonic-gate 
1030Sstevel@tonic-gate /* Shifted keyboard table for USB keyboard */
1040Sstevel@tonic-gate 
1050Sstevel@tonic-gate static keymap_entry_t keytab_usb_uc[KEYMAP_SIZE_USB] = {
1060Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, ERROR, 'A', 'B', 'C', 'D',
1070Sstevel@tonic-gate /*   8 */	'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
1080Sstevel@tonic-gate /*  16 */	'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
1090Sstevel@tonic-gate /*  24 */	'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
1100Sstevel@tonic-gate /*  32 */	'#', '$', '%', '^', '&', '*', '(', ')',
1110Sstevel@tonic-gate /*  40 */	'\r', ESC, '\b', '\t', ' ', '_', '+', '{',
1120Sstevel@tonic-gate /*  48  */	'}',   '|',   HOLE,    ':',   '"',  '~',   '<',   '>',
1130Sstevel@tonic-gate /*  56 */	'?', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
1140Sstevel@tonic-gate 		TF(4), TF(5), TF(6),
1150Sstevel@tonic-gate /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
1160Sstevel@tonic-gate 		RF(2), RF(3),
1170Sstevel@tonic-gate /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
1180Sstevel@tonic-gate 					STRING+RIGHTARROW,
1190Sstevel@tonic-gate /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
1200Sstevel@tonic-gate 					SHIFTKEYS+NUMLOCK, RF(5), RF(6), \
1210Sstevel@tonic-gate 		BF(15), BF(14), \
1220Sstevel@tonic-gate /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15), \
1230Sstevel@tonic-gate 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
1240Sstevel@tonic-gate /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
1250Sstevel@tonic-gate 		BF(13), HOLE,
1260Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1270Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
1280Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6), \
1290Sstevel@tonic-gate 		LF(8), LF(9), RF(4),
1300Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1310Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1320Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1330Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
1340Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1350Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1360Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1370Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1380Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1390Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1400Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1410Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1420Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
1430Sstevel@tonic-gate 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
1440Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
1450Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1460Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1470Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1480Sstevel@tonic-gate 	};
1490Sstevel@tonic-gate 
1500Sstevel@tonic-gate 
1510Sstevel@tonic-gate /* Caps Locked keyboard table for USB keyboard */
1520Sstevel@tonic-gate 
1530Sstevel@tonic-gate static keymap_entry_t keytab_usb_cl[KEYMAP_SIZE_USB] = {
1540Sstevel@tonic-gate 
1550Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, ERROR, 'A', 'B', 'C', 'D',
1560Sstevel@tonic-gate /*   8 */	'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
1570Sstevel@tonic-gate /*  16 */	'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
1580Sstevel@tonic-gate /*  24 */	'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2',
1590Sstevel@tonic-gate /*  32 */	'3', '4', '5', '6', '7', '8', '9', '0',
1600Sstevel@tonic-gate /*  40 */	'\r', ESC, '\b', '\t', ' ', '-', '=', '[',
1610Sstevel@tonic-gate /*  48  */	']',   '\\',   HOLE,    ';',   '\'',  '`',   ',',   '.',
1620Sstevel@tonic-gate /*  56 */	'/', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
1630Sstevel@tonic-gate 		TF(4), TF(5), TF(6),
1640Sstevel@tonic-gate /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
1650Sstevel@tonic-gate 		RF(2), RF(3),
1660Sstevel@tonic-gate /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
1670Sstevel@tonic-gate 						STRING+RIGHTARROW,
1680Sstevel@tonic-gate /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
1690Sstevel@tonic-gate 			SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
1700Sstevel@tonic-gate /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15),
1710Sstevel@tonic-gate 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
1720Sstevel@tonic-gate /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
1730Sstevel@tonic-gate 		BF(13), HOLE,
1740Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1750Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
1760Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6),
1770Sstevel@tonic-gate 		LF(8), LF(9), RF(4),
1780Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1790Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1800Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1810Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
1820Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1830Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1840Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1850Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1860Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1870Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1880Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1890Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1900Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT,
1910Sstevel@tonic-gate 		SHIFTKEYS+ALT, BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL,
1920Sstevel@tonic-gate 		SHIFTKEYS+RIGHTSHIFT,
1930Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
1940Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1950Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1960Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
1970Sstevel@tonic-gate 	};
1980Sstevel@tonic-gate 
1990Sstevel@tonic-gate 
2000Sstevel@tonic-gate /* Alt Graph keyboard table for USB keyboard */
2010Sstevel@tonic-gate 
2020Sstevel@tonic-gate static keymap_entry_t keytab_usb_ag[KEYMAP_SIZE_USB] = {
2030Sstevel@tonic-gate /*  0 */	HOLE,	HOLE, HOLE,	ERROR,	NOP,	NOP,	NOP,	NOP,
2040Sstevel@tonic-gate /*  8 */	NOP, 	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
2050Sstevel@tonic-gate /* 16 */	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
2060Sstevel@tonic-gate /* 24 */	NOP, 	NOP, 	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
2070Sstevel@tonic-gate /* 32 */	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
2080Sstevel@tonic-gate /* 40 */	'\r',	ESC,	'\b',	'\t',	' ',	NOP,	NOP,	NOP,
2090Sstevel@tonic-gate /* 48 */	NOP,	NOP,	HOLE,	NOP,	NOP,	NOP,	NOP,	NOP,
2100Sstevel@tonic-gate /* 56 */	NOP,	SHIFTKEYS+CAPSLOCK,	TF(1), TF(2),
2110Sstevel@tonic-gate 				TF(3),	TF(4),	TF(5),	TF(6),
2120Sstevel@tonic-gate /* 64 */	TF(7),	TF(8),	 TF(9),	TF(10),
2130Sstevel@tonic-gate 					TF(11),	TF(12), RF(2),	RF(3),
2140Sstevel@tonic-gate /* 72 */	RF(1),	BF(8),	RF(7),	RF(9),	DEL, RF(13), RF(15),
2150Sstevel@tonic-gate 					STRING+RIGHTARROW,
2160Sstevel@tonic-gate /* 80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
2170Sstevel@tonic-gate 			SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
2180Sstevel@tonic-gate /* 88 */	BF(11),	RF(13),	STRING+DOWNARROW, RF(15),
2190Sstevel@tonic-gate 			STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
2200Sstevel@tonic-gate /* 96 */	STRING+UPARROW,	RF(9),	BF(8), BF(10),
2210Sstevel@tonic-gate 					HOLE,	COMPOSE, BF(13), HOLE,
2220Sstevel@tonic-gate /* 104 */	HOLE,	HOLE,	HOLE,	HOLE,	HOLE,	HOLE, HOLE,	HOLE,
2230Sstevel@tonic-gate /* 112 */	HOLE,	HOLE, HOLE,	HOLE,	LF(7),	LF(16), LF(3), LF(5),
2240Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2),	LF(4), LF(10), LF(6),
2250Sstevel@tonic-gate 		LF(8),	LF(9),	RF(4),
2260Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2270Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2280Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2290Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
2300Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2310Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2320Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2330Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2340Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2350Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2360Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2370Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2380Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
2390Sstevel@tonic-gate 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
2400Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
2410Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2420Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2430Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2440Sstevel@tonic-gate };
2450Sstevel@tonic-gate 
2460Sstevel@tonic-gate /* Num Locked keyboard table for USB keyboard */
2470Sstevel@tonic-gate 
2480Sstevel@tonic-gate static keymap_entry_t keytab_usb_nl[KEYMAP_SIZE_USB] = {
2490Sstevel@tonic-gate 
2500Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, NONL, NONL, NONL, NONL, NONL,
2510Sstevel@tonic-gate /*   8 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2520Sstevel@tonic-gate /*  16 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2530Sstevel@tonic-gate /*  24 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2540Sstevel@tonic-gate /*  32 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2550Sstevel@tonic-gate /*  40 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2560Sstevel@tonic-gate /*  48 */	NONL, NONL, HOLE, NONL, NONL, NONL, NONL, NONL,
2570Sstevel@tonic-gate /*  56 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2580Sstevel@tonic-gate /*  64 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2590Sstevel@tonic-gate /*  72 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2600Sstevel@tonic-gate /*  80 */	NONL, NONL, NONL, NONL, PADSLASH, PADSTAR, PADMINUS, PADPLUS,
2610Sstevel@tonic-gate /*  88 */	PADENTER, PAD1, PAD2, PAD3, PAD4, PAD5, PAD6, PAD7,
2620Sstevel@tonic-gate /*  96 */	PAD8, PAD9, PAD0, PADDOT, HOLE, NONL, NONL, HOLE,
2630Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2640Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, NONL, NONL, NONL, NONL,
2650Sstevel@tonic-gate /* 120 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, PADEQUAL,
2660Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2670Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2680Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2690Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, NONL, HOLE,
2700Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2710Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2720Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2730Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2740Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2750Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2760Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2770Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2780Sstevel@tonic-gate /* 224 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
2790Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2800Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2810Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
2820Sstevel@tonic-gate };
2830Sstevel@tonic-gate 
2840Sstevel@tonic-gate /* Controlled keyboard table for USB keyboard */
2850Sstevel@tonic-gate 
2860Sstevel@tonic-gate static keymap_entry_t keytab_usb_ct[KEYMAP_SIZE_USB] = {
2870Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, ERROR, c('a'), c('b'), c('c'), c('d'),
2880Sstevel@tonic-gate /*   8 */	c('e'), c('f'), c('g'), c('h'), c('i'), c('j'), c('k'), c('l'),
2890Sstevel@tonic-gate /*  16 */	c('m'), c('n'), c('o'), c('p'), c('q'), c('r'), c('s'), c('t'),
2900Sstevel@tonic-gate /*  24 */	c('u'), c('v'), c('w'), c('x'), c('y'), c('z'), '1', c(' '),
2910Sstevel@tonic-gate /*  32 */	'3', '4', '5', c('^'), '7', '8', '9', '0',
2920Sstevel@tonic-gate /*  40 */	'\r', ESC, '\b', '\t', c(' '), c('_'), '=', ESC,
2930Sstevel@tonic-gate /*  48  */	c(']'),   c('\\'),   HOLE,    ';',   '\'',    c('^'),
2940Sstevel@tonic-gate 		',',   '.',
2950Sstevel@tonic-gate /*  56 */	c('_'), SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
2960Sstevel@tonic-gate 		TF(4), TF(5), TF(6),
2970Sstevel@tonic-gate /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
2980Sstevel@tonic-gate 		RF(2), RF(3),
2990Sstevel@tonic-gate /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
3000Sstevel@tonic-gate 						STRING+RIGHTARROW,
3010Sstevel@tonic-gate /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
3020Sstevel@tonic-gate 		SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
3030Sstevel@tonic-gate /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15),
3040Sstevel@tonic-gate 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
3050Sstevel@tonic-gate /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
3060Sstevel@tonic-gate 		BF(13), HOLE,
3070Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3080Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
3090Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6),
3100Sstevel@tonic-gate 		LF(8), LF(9), RF(4),
3110Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3120Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3130Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3140Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
3150Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3160Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3170Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3180Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3190Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3200Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3210Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3220Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3230Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
3240Sstevel@tonic-gate 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
3250Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
3260Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3270Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3280Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3290Sstevel@tonic-gate 
3300Sstevel@tonic-gate 
3310Sstevel@tonic-gate };
3320Sstevel@tonic-gate 
3330Sstevel@tonic-gate /* "Key Up" keyboard table for USB keyboard */
3340Sstevel@tonic-gate 
3350Sstevel@tonic-gate static keymap_entry_t keytab_usb_up[KEYMAP_SIZE_USB] = {
3360Sstevel@tonic-gate 
3370Sstevel@tonic-gate /*   0 */	HOLE, HOLE, HOLE, NOP, NOP, NOP, NOP, NOP,
3380Sstevel@tonic-gate /*   8 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3390Sstevel@tonic-gate /*  16 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3400Sstevel@tonic-gate /*  24 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3410Sstevel@tonic-gate /*  32 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3420Sstevel@tonic-gate /*  40 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3430Sstevel@tonic-gate /*  48  */	NOP, NOP, HOLE, NOP, NOP, NOP, NOP, NOP,
3440Sstevel@tonic-gate /*  56 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3450Sstevel@tonic-gate /*  64 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3460Sstevel@tonic-gate /*  72 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3470Sstevel@tonic-gate /*  80 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3480Sstevel@tonic-gate /*  88 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3490Sstevel@tonic-gate /*  96 */	NOP, NOP, NOP, NOP, HOLE, NOP, NOP, HOLE,
3500Sstevel@tonic-gate /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3510Sstevel@tonic-gate /* 112 */	HOLE, HOLE, HOLE, HOLE, NOP, NOP, NOP, NOP,
3520Sstevel@tonic-gate /* 120 */	BUCKYBITS+SYSTEMBIT, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
3530Sstevel@tonic-gate /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3540Sstevel@tonic-gate /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3550Sstevel@tonic-gate /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3560Sstevel@tonic-gate /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, NOP, HOLE,
3570Sstevel@tonic-gate /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3580Sstevel@tonic-gate /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3590Sstevel@tonic-gate /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3600Sstevel@tonic-gate /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3610Sstevel@tonic-gate /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3620Sstevel@tonic-gate /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3630Sstevel@tonic-gate /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3640Sstevel@tonic-gate /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3650Sstevel@tonic-gate /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
3660Sstevel@tonic-gate 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
3670Sstevel@tonic-gate 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
3680Sstevel@tonic-gate /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3690Sstevel@tonic-gate /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3700Sstevel@tonic-gate /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
3710Sstevel@tonic-gate 	};
3720Sstevel@tonic-gate 
3730Sstevel@tonic-gate 
3740Sstevel@tonic-gate /*
3750Sstevel@tonic-gate  * Index into keytab_pc_lc based on USB scancodes
3760Sstevel@tonic-gate  */
3770Sstevel@tonic-gate static keymap_entry_t keytab_usb2pc[KEYMAP_SIZE_USB] = {
3780Sstevel@tonic-gate /*   0 */	0,	0,	0,	0,	31,	50,	48,	33,
3790Sstevel@tonic-gate /*   8 */	19,	34,	35,	36,	24,	37,	38,	39,
3800Sstevel@tonic-gate /*  16 */	52,	51,	25,	26,	17,	20,	32,	21,
3810Sstevel@tonic-gate /*  24 */	23,	49,	18,	47,	22,	46,	2,	3,
3820Sstevel@tonic-gate /*  32 */	4,	5,	6,	7,	8,	9,	10,	11,
3830Sstevel@tonic-gate /*  40 */	43,	110,	15,	16,	61,	12,	13,	27,
3840Sstevel@tonic-gate /*  48 */	28,	29,	0,	40,	41,	1,	53,	54,
3850Sstevel@tonic-gate /*  56 */	55,	30,	112,	113,	114,	115,	116,	117,
3860Sstevel@tonic-gate /*  64 */	118,	119,	120,	121,	122,	123,	124,	125,
3870Sstevel@tonic-gate /*  72 */	126,	75,	80,	85,	76,	81,	86,	89,
3880Sstevel@tonic-gate /*  80 */	79,	84,	83,	90,	95,	100,	105,	106,
3890Sstevel@tonic-gate /*  88 */	108,	93,	98,	103,	92,	97,	102,	91,
3900Sstevel@tonic-gate /*  96 */	96,	101,	99,	104,	0,	0,	0,	0,
3910Sstevel@tonic-gate /* 104 */	0,	0,	0,	0,	0,	0,	0,	0,
3920Sstevel@tonic-gate /* 112 */	0,	0,	0,	0,	0,	0,	0,	0,
3930Sstevel@tonic-gate /* 120 */	0,	0,	0,	0,	0,	0,	0,	0,
3940Sstevel@tonic-gate /* 128 */	0,	0,	0,	0,	0,	0,	0,	0,
3950Sstevel@tonic-gate /* 136 */	0,	0,	0,	0,	0,	0,	0,	0,
3960Sstevel@tonic-gate /* 144 */	0,	0,	0,	0,	0,	0,	0,	0,
3970Sstevel@tonic-gate /* 152 */	0,	0,	0,	0,	0,	0,	0,	0,
3980Sstevel@tonic-gate /* 160 */	0,	0,	0,	0,	0,	0,	0,	0,
3990Sstevel@tonic-gate /* 168 */	0,	0,	0,	0,	0,	0,	0,	0,
4000Sstevel@tonic-gate /* 176 */	0,	0,	0,	0,	0,	0,	0,	0,
4010Sstevel@tonic-gate /* 184 */	0,	0,	0,	0,	0,	0,	0,	0,
4020Sstevel@tonic-gate /* 192 */	0,	0,	0,	0,	0,	0,	0,	0,
4030Sstevel@tonic-gate /* 200 */	0,	0,	0,	0,	0,	0,	0,	0,
4040Sstevel@tonic-gate /* 208 */	0,	0,	0,	0,	0,	0,	0,	0,
4050Sstevel@tonic-gate /* 216 */	0,	0,	0,	0,	0,	0,	0,	0,
4060Sstevel@tonic-gate /* 224 */	58,	44,	60,	0,	64,	57,	62,	0,
4070Sstevel@tonic-gate /* 232 */	0,	0,	0,	0,	0,	0,	0,	0,
4080Sstevel@tonic-gate /* 240 */	0,	0,	0,	0,	0,	0,	0,	0,
4090Sstevel@tonic-gate /* 248 */	0,	0,	0,	0,	0,	0,	0
4100Sstevel@tonic-gate };
4110Sstevel@tonic-gate 
4120Sstevel@tonic-gate /* Index to keymaps for USB keyboard */
4130Sstevel@tonic-gate static struct keyboard kbtrans_usb_keyindex = {
4140Sstevel@tonic-gate 	KEYMAP_SIZE_USB,
4150Sstevel@tonic-gate 	keytab_usb_lc,
4160Sstevel@tonic-gate 	keytab_usb_uc,
4170Sstevel@tonic-gate 	keytab_usb_cl,
4180Sstevel@tonic-gate 	keytab_usb_ag,
4190Sstevel@tonic-gate 	keytab_usb_nl,
4200Sstevel@tonic-gate 	keytab_usb_ct,
4210Sstevel@tonic-gate 	keytab_usb_up,
4220Sstevel@tonic-gate 	0x0000,		/* Shift bits which stay on with idle keyboard */
4230Sstevel@tonic-gate 	0x0000,		/* Bucky bits which stay on with idle keyboard */
4240Sstevel@tonic-gate 	120,
4250Sstevel@tonic-gate #if defined(__sparc)
4260Sstevel@tonic-gate 	0,		/* no alternate abort key F1 on sparc */
4270Sstevel@tonic-gate #else
4280Sstevel@tonic-gate 	58,		/* alternate abort key F1 */
4290Sstevel@tonic-gate #endif
4300Sstevel@tonic-gate 	4,
4310Sstevel@tonic-gate 	CAPSMASK|NUMLOCKMASK,	/* Shift bits which toggle on down event */
4320Sstevel@tonic-gate 	NULL,		/* Exception table */
433*3505Sqz150045 	225,		/* new abort key Left Shift */
434*3505Sqz150045 	229,		/* alternate new abort key Right Shift */
435*3505Sqz150045 	72,		/* new abort key Pause */
4360Sstevel@tonic-gate };
4370Sstevel@tonic-gate 
4380Sstevel@tonic-gate struct keyboard *
kbtrans_usbkb_maptab_init(void)4390Sstevel@tonic-gate kbtrans_usbkb_maptab_init(void)
4400Sstevel@tonic-gate {
4410Sstevel@tonic-gate 	struct keyboard *pkbd;
4420Sstevel@tonic-gate 
4430Sstevel@tonic-gate 	pkbd = (struct keyboard *)
4440Sstevel@tonic-gate 	    kmem_alloc(sizeof (struct keyboard), KM_SLEEP);
4450Sstevel@tonic-gate 
4460Sstevel@tonic-gate 	bcopy(&kbtrans_usb_keyindex, pkbd, sizeof (*pkbd));
4470Sstevel@tonic-gate 
4480Sstevel@tonic-gate 	return (pkbd);
4490Sstevel@tonic-gate }
4500Sstevel@tonic-gate 
4510Sstevel@tonic-gate void
kbtrans_usbkb_maptab_fini(struct keyboard ** ppkbd)4520Sstevel@tonic-gate kbtrans_usbkb_maptab_fini(struct keyboard **ppkbd)
4530Sstevel@tonic-gate {
4540Sstevel@tonic-gate 	kmem_free(*ppkbd, sizeof (struct keyboard));
4550Sstevel@tonic-gate 	*ppkbd = NULL;
4560Sstevel@tonic-gate }
4570Sstevel@tonic-gate 
4580Sstevel@tonic-gate /*
4590Sstevel@tonic-gate  * Translate USB scancodes to PC scancodes before sending it to 'kbtrans'
4600Sstevel@tonic-gate  */
4610Sstevel@tonic-gate keymap_entry_t
kbtrans_keycode_usb2pc(int key)4620Sstevel@tonic-gate kbtrans_keycode_usb2pc(int key)
4630Sstevel@tonic-gate {
4640Sstevel@tonic-gate 	ASSERT(key >= 0 && key <= 255);
4650Sstevel@tonic-gate 	return (keytab_usb2pc[key]);
4660Sstevel@tonic-gate }
467