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