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