1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * This module contains the translation tables for the up-down encoded
31  * USB keyboards.
32  */
33 #include <sys/usb/usba/usbai_version.h>
34 
35 #define	KEYMAP_SIZE_VARIABLE
36 
37 #include <sys/param.h>
38 #include <sys/kbd.h>
39 #include <sys/stream.h>
40 #include <sys/consdev.h>
41 #include <sys/note.h>
42 #include <sys/usb/clients/hid/hid.h>
43 #include <sys/usb/clients/hid/hid_polled.h>
44 #include <sys/usb/clients/hidparser/hidparser.h>
45 #include <sys/kbtrans.h>
46 #include <sys/usb/clients/usbkbm/usbkbm.h>
47 #include <sys/types.h>
48 #include <sys/kmem.h>
49 #include <sys/sunddi.h>
50 
51 /* handy way to define control characters in the tables */
52 #define	c(char)(char&0x1F)
53 #define	ESC 0x1B
54 #define	DEL 0x7F
55 
56 /* Unshifted keyboard table for USB keyboard */
57 
58 static keymap_entry_t keytab_usb_lc[KEYMAP_SIZE_USB] = {
59 /*   0 */	HOLE, HOLE, HOLE, ERROR, 'a', 'b', 'c', 'd',
60 /*   8 */	'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
61 /*  16 */	'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
62 /*  24 */	'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
63 /*  32 */	'3', '4', '5', '6', '7', '8', '9', '0',
64 /*  40 */	'\r', ESC, '\b', '\t', ' ', '-', '=', '[',
65 /*  48  */	']',   '\\',   HOLE,    ';',   '\'',    '`',   ',',   '.',
66 /*  56 */	'/', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
67 		TF(4), TF(5), TF(6),
68 /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
69 		RF(2), RF(3),
70 /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
71 					STRING+RIGHTARROW,
72 /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
73 					SHIFTKEYS+NUMLOCK, RF(5),
74 		RF(6), BF(15), BF(14),
75 /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15), STRING+LEFTARROW, \
76 		RF(11), STRING+RIGHTARROW, RF(7),
77 /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
78 		BF(13), HOLE,
79 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
80 /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
81 /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6), LF(8), \
82 		LF(9), RF(4),
83 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
84 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
85 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
86 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
87 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
88 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
89 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
90 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
91 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
92 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
93 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
94 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
95 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
96 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
97 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
98 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
99 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
100 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
101 };
102 
103 
104 /* Shifted keyboard table for USB keyboard */
105 
106 static keymap_entry_t keytab_usb_uc[KEYMAP_SIZE_USB] = {
107 /*   0 */	HOLE, HOLE, HOLE, ERROR, 'A', 'B', 'C', 'D',
108 /*   8 */	'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
109 /*  16 */	'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
110 /*  24 */	'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
111 /*  32 */	'#', '$', '%', '^', '&', '*', '(', ')',
112 /*  40 */	'\r', ESC, '\b', '\t', ' ', '_', '+', '{',
113 /*  48  */	'}',   '|',   HOLE,    ':',   '"',  '~',   '<',   '>',
114 /*  56 */	'?', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
115 		TF(4), TF(5), TF(6),
116 /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
117 		RF(2), RF(3),
118 /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
119 					STRING+RIGHTARROW,
120 /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
121 					SHIFTKEYS+NUMLOCK, RF(5), RF(6), \
122 		BF(15), BF(14), \
123 /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15), \
124 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
125 /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
126 		BF(13), HOLE,
127 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
128 /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
129 /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6), \
130 		LF(8), LF(9), RF(4),
131 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
132 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
133 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
134 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
135 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
136 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
137 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
138 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
139 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
140 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
141 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
142 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
143 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
144 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
145 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
146 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
147 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
148 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
149 	};
150 
151 
152 /* Caps Locked keyboard table for USB keyboard */
153 
154 static keymap_entry_t keytab_usb_cl[KEYMAP_SIZE_USB] = {
155 
156 /*   0 */	HOLE, HOLE, HOLE, ERROR, 'A', 'B', 'C', 'D',
157 /*   8 */	'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
158 /*  16 */	'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
159 /*  24 */	'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2',
160 /*  32 */	'3', '4', '5', '6', '7', '8', '9', '0',
161 /*  40 */	'\r', ESC, '\b', '\t', ' ', '-', '=', '[',
162 /*  48  */	']',   '\\',   HOLE,    ';',   '\'',  '`',   ',',   '.',
163 /*  56 */	'/', SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
164 		TF(4), TF(5), TF(6),
165 /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
166 		RF(2), RF(3),
167 /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
168 						STRING+RIGHTARROW,
169 /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
170 			SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
171 /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15),
172 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
173 /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
174 		BF(13), HOLE,
175 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
176 /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
177 /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6),
178 		LF(8), LF(9), RF(4),
179 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
180 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
181 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
182 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
183 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
184 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
185 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
186 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
187 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
188 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
189 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
190 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
191 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT,
192 		SHIFTKEYS+ALT, BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL,
193 		SHIFTKEYS+RIGHTSHIFT,
194 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
195 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
196 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
197 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
198 	};
199 
200 
201 /* Alt Graph keyboard table for USB keyboard */
202 
203 static keymap_entry_t keytab_usb_ag[KEYMAP_SIZE_USB] = {
204 /*  0 */	HOLE,	HOLE, HOLE,	ERROR,	NOP,	NOP,	NOP,	NOP,
205 /*  8 */	NOP, 	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
206 /* 16 */	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
207 /* 24 */	NOP, 	NOP, 	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
208 /* 32 */	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,	NOP,
209 /* 40 */	'\r',	ESC,	'\b',	'\t',	' ',	NOP,	NOP,	NOP,
210 /* 48 */	NOP,	NOP,	HOLE,	NOP,	NOP,	NOP,	NOP,	NOP,
211 /* 56 */	NOP,	SHIFTKEYS+CAPSLOCK,	TF(1), TF(2),
212 				TF(3),	TF(4),	TF(5),	TF(6),
213 /* 64 */	TF(7),	TF(8),	 TF(9),	TF(10),
214 					TF(11),	TF(12), RF(2),	RF(3),
215 /* 72 */	RF(1),	BF(8),	RF(7),	RF(9),	DEL, RF(13), RF(15),
216 					STRING+RIGHTARROW,
217 /* 80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
218 			SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
219 /* 88 */	BF(11),	RF(13),	STRING+DOWNARROW, RF(15),
220 			STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
221 /* 96 */	STRING+UPARROW,	RF(9),	BF(8), BF(10),
222 					HOLE,	COMPOSE, BF(13), HOLE,
223 /* 104 */	HOLE,	HOLE,	HOLE,	HOLE,	HOLE,	HOLE, HOLE,	HOLE,
224 /* 112 */	HOLE,	HOLE, HOLE,	HOLE,	LF(7),	LF(16), LF(3), LF(5),
225 /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2),	LF(4), LF(10), LF(6),
226 		LF(8),	LF(9),	RF(4),
227 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
228 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
229 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
230 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
231 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
232 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
233 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
234 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
235 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
236 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
237 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
238 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
239 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
240 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
241 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
242 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
243 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
244 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
245 };
246 
247 /* Num Locked keyboard table for USB keyboard */
248 
249 static keymap_entry_t keytab_usb_nl[KEYMAP_SIZE_USB] = {
250 
251 /*   0 */	HOLE, HOLE, HOLE, NONL, NONL, NONL, NONL, NONL,
252 /*   8 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
253 /*  16 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
254 /*  24 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
255 /*  32 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
256 /*  40 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
257 /*  48 */	NONL, NONL, HOLE, NONL, NONL, NONL, NONL, NONL,
258 /*  56 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
259 /*  64 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
260 /*  72 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
261 /*  80 */	NONL, NONL, NONL, NONL, PADSLASH, PADSTAR, PADMINUS, PADPLUS,
262 /*  88 */	PADENTER, PAD1, PAD2, PAD3, PAD4, PAD5, PAD6, PAD7,
263 /*  96 */	PAD8, PAD9, PAD0, PADDOT, HOLE, NONL, NONL, HOLE,
264 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
265 /* 112 */	HOLE, HOLE, HOLE, HOLE, NONL, NONL, NONL, NONL,
266 /* 120 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, PADEQUAL,
267 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
268 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
269 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
270 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, NONL, HOLE,
271 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
272 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
273 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
274 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
275 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
276 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
277 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
278 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
279 /* 224 */	NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
280 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
281 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
282 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
283 };
284 
285 /* Controlled keyboard table for USB keyboard */
286 
287 static keymap_entry_t keytab_usb_ct[KEYMAP_SIZE_USB] = {
288 /*   0 */	HOLE, HOLE, HOLE, ERROR, c('a'), c('b'), c('c'), c('d'),
289 /*   8 */	c('e'), c('f'), c('g'), c('h'), c('i'), c('j'), c('k'), c('l'),
290 /*  16 */	c('m'), c('n'), c('o'), c('p'), c('q'), c('r'), c('s'), c('t'),
291 /*  24 */	c('u'), c('v'), c('w'), c('x'), c('y'), c('z'), '1', c(' '),
292 /*  32 */	'3', '4', '5', c('^'), '7', '8', '9', '0',
293 /*  40 */	'\r', ESC, '\b', '\t', c(' '), c('_'), '=', ESC,
294 /*  48  */	c(']'),   c('\\'),   HOLE,    ';',   '\'',    c('^'),
295 		',',   '.',
296 /*  56 */	c('_'), SHIFTKEYS+CAPSLOCK, TF(1), TF(2), TF(3),
297 		TF(4), TF(5), TF(6),
298 /*  64 */	TF(7), TF(8), TF(9), TF(10), TF(11), TF(12),
299 		RF(2), RF(3),
300 /*  72 */	RF(1), BF(8), RF(7), RF(9), DEL, RF(13), RF(15),
301 						STRING+RIGHTARROW,
302 /*  80 */	STRING+LEFTARROW, STRING+DOWNARROW, STRING+UPARROW,
303 		SHIFTKEYS+NUMLOCK, RF(5), RF(6), BF(15), BF(14),
304 /*  88 */	BF(11), RF(13), STRING+DOWNARROW, RF(15),
305 		STRING+LEFTARROW, RF(11), STRING+RIGHTARROW, RF(7),
306 /*  96 */	STRING+UPARROW, RF(9), BF(8), BF(10), HOLE, COMPOSE,
307 		BF(13), HOLE,
308 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
309 /* 112 */	HOLE, HOLE, HOLE, HOLE, LF(7), LF(16), LF(3), LF(5),
310 /* 120 */	BUCKYBITS+SYSTEMBIT, LF(2), LF(4), LF(10), LF(6),
311 		LF(8), LF(9), RF(4),
312 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
313 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
314 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
315 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, '\r', HOLE,
316 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
317 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
318 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
319 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
320 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
321 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
322 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
323 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
324 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
325 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
326 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
327 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
328 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
329 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
330 
331 
332 };
333 
334 /* "Key Up" keyboard table for USB keyboard */
335 
336 static keymap_entry_t keytab_usb_up[KEYMAP_SIZE_USB] = {
337 
338 /*   0 */	HOLE, HOLE, HOLE, NOP, NOP, NOP, NOP, NOP,
339 /*   8 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
340 /*  16 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
341 /*  24 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
342 /*  32 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
343 /*  40 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
344 /*  48  */	NOP, NOP, HOLE, NOP, NOP, NOP, NOP, NOP,
345 /*  56 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
346 /*  64 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
347 /*  72 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
348 /*  80 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
349 /*  88 */	NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
350 /*  96 */	NOP, NOP, NOP, NOP, HOLE, NOP, NOP, HOLE,
351 /* 104 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
352 /* 112 */	HOLE, HOLE, HOLE, HOLE, NOP, NOP, NOP, NOP,
353 /* 120 */	BUCKYBITS+SYSTEMBIT, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
354 /* 128 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
355 /* 136 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
356 /* 144 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
357 /* 152 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, NOP, HOLE,
358 /* 160 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
359 /* 168 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
360 /* 176 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
361 /* 184 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
362 /* 192 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
363 /* 200 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
364 /* 208 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
365 /* 216 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
366 /* 224 */	SHIFTKEYS+LEFTCTRL, SHIFTKEYS+LEFTSHIFT, SHIFTKEYS+ALT,
367 		BUCKYBITS+METABIT, SHIFTKEYS+RIGHTCTRL, SHIFTKEYS+RIGHTSHIFT,
368 		SHIFTKEYS+ALTGRAPH, BUCKYBITS+METABIT,
369 /* 232 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
370 /* 240 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
371 /* 248 */	HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
372 	};
373 
374 
375 /*
376  * Index into keytab_pc_lc based on USB scancodes
377  */
378 static keymap_entry_t keytab_usb2pc[KEYMAP_SIZE_USB] = {
379 /*   0 */	0,	0,	0,	0,	31,	50,	48,	33,
380 /*   8 */	19,	34,	35,	36,	24,	37,	38,	39,
381 /*  16 */	52,	51,	25,	26,	17,	20,	32,	21,
382 /*  24 */	23,	49,	18,	47,	22,	46,	2,	3,
383 /*  32 */	4,	5,	6,	7,	8,	9,	10,	11,
384 /*  40 */	43,	110,	15,	16,	61,	12,	13,	27,
385 /*  48 */	28,	29,	0,	40,	41,	1,	53,	54,
386 /*  56 */	55,	30,	112,	113,	114,	115,	116,	117,
387 /*  64 */	118,	119,	120,	121,	122,	123,	124,	125,
388 /*  72 */	126,	75,	80,	85,	76,	81,	86,	89,
389 /*  80 */	79,	84,	83,	90,	95,	100,	105,	106,
390 /*  88 */	108,	93,	98,	103,	92,	97,	102,	91,
391 /*  96 */	96,	101,	99,	104,	0,	0,	0,	0,
392 /* 104 */	0,	0,	0,	0,	0,	0,	0,	0,
393 /* 112 */	0,	0,	0,	0,	0,	0,	0,	0,
394 /* 120 */	0,	0,	0,	0,	0,	0,	0,	0,
395 /* 128 */	0,	0,	0,	0,	0,	0,	0,	0,
396 /* 136 */	0,	0,	0,	0,	0,	0,	0,	0,
397 /* 144 */	0,	0,	0,	0,	0,	0,	0,	0,
398 /* 152 */	0,	0,	0,	0,	0,	0,	0,	0,
399 /* 160 */	0,	0,	0,	0,	0,	0,	0,	0,
400 /* 168 */	0,	0,	0,	0,	0,	0,	0,	0,
401 /* 176 */	0,	0,	0,	0,	0,	0,	0,	0,
402 /* 184 */	0,	0,	0,	0,	0,	0,	0,	0,
403 /* 192 */	0,	0,	0,	0,	0,	0,	0,	0,
404 /* 200 */	0,	0,	0,	0,	0,	0,	0,	0,
405 /* 208 */	0,	0,	0,	0,	0,	0,	0,	0,
406 /* 216 */	0,	0,	0,	0,	0,	0,	0,	0,
407 /* 224 */	58,	44,	60,	0,	64,	57,	62,	0,
408 /* 232 */	0,	0,	0,	0,	0,	0,	0,	0,
409 /* 240 */	0,	0,	0,	0,	0,	0,	0,	0,
410 /* 248 */	0,	0,	0,	0,	0,	0,	0
411 };
412 
413 /* Index to keymaps for USB keyboard */
414 static struct keyboard kbtrans_usb_keyindex = {
415 	KEYMAP_SIZE_USB,
416 	keytab_usb_lc,
417 	keytab_usb_uc,
418 	keytab_usb_cl,
419 	keytab_usb_ag,
420 	keytab_usb_nl,
421 	keytab_usb_ct,
422 	keytab_usb_up,
423 	0x0000,		/* Shift bits which stay on with idle keyboard */
424 	0x0000,		/* Bucky bits which stay on with idle keyboard */
425 	120,
426 #if defined(__sparc)
427 	0,		/* no alternate abort key F1 on sparc */
428 #else
429 	58,		/* alternate abort key F1 */
430 #endif
431 	4,
432 	CAPSMASK|NUMLOCKMASK,	/* Shift bits which toggle on down event */
433 	NULL,		/* Exception table */
434 };
435 
436 struct keyboard *
437 kbtrans_usbkb_maptab_init(void)
438 {
439 	struct keyboard *pkbd;
440 
441 	pkbd = (struct keyboard *)
442 	    kmem_alloc(sizeof (struct keyboard), KM_SLEEP);
443 
444 	bcopy(&kbtrans_usb_keyindex, pkbd, sizeof (*pkbd));
445 
446 	return (pkbd);
447 }
448 
449 void
450 kbtrans_usbkb_maptab_fini(struct keyboard **ppkbd)
451 {
452 	kmem_free(*ppkbd, sizeof (struct keyboard));
453 	*ppkbd = NULL;
454 }
455 
456 /*
457  * Translate USB scancodes to PC scancodes before sending it to 'kbtrans'
458  */
459 keymap_entry_t
460 kbtrans_keycode_usb2pc(int key)
461 {
462 	ASSERT(key >= 0 && key <= 255);
463 	return (keytab_usb2pc[key]);
464 }
465