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