blob: e1ae15dd27a7b4f622ed3b24bd948b4204b5be7c [file] [log] [blame]
stevel@tonic-gate7c478bd2005-06-14 00:00:00 -07001/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
qz150045e4603302007-01-26 16:10:27 -08005 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
stevel@tonic-gate7c478bd2005-06-14 00:00:00 -07007 *
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/*
qz150045e4603302007-01-26 16:10:27 -080022 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
stevel@tonic-gate7c478bd2005-06-14 00:00:00 -070024 */
25
26#pragma ident "%Z%%M% %I% %E% SMI"
27
28/*
29 * This module contains the translation tables for PS/2 style keyboards.
30 */
31#define KEYMAP_SIZE_VARIABLE
32
33#include <sys/param.h>
34#include <sys/kbd.h>
35
36/* handy way to define control characters in the tables */
37#define c(ch) (ch&0x1F)
38#define ESC 0x1B
39#define DEL 0x7F
40
41#define KEYMAP_SIZE_PC 160
42
43/* ***************************** */
44/* PC-101 keyboard definitions */
45/* ***************************** */
46/* Unshifted keyboard table for PC keyboard */
47
48/* BEGIN CSTYLED */
49static keymap_entry_t keytab_pc_lc[KEYMAP_SIZE_PC] = {
50/* 0 */ HOLE, '`', '1', '2', '3', '4', '5', '6',
51/* 8 */ '7', '8', '9', '0', '-', '=', HOLE, '\b',
52/* 16 */ '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u',
53/* 24 */ 'i', 'o', 'p', '[', ']', '\\',
54 SHIFTKEYS+CAPSLOCK,
55 'a',
56/* 32 */ 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
57/* 40 */ ';', '\'', '\\', '\r',
58 SHIFTKEYS+LEFTSHIFT,
59 HOLE, 'z', 'x',
60/* 48 */ 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
61/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
62 SHIFTKEYS+LEFTCTRL,
63 HOLE, SHIFTKEYS+LEFTALT,
64 ' ', SHIFTKEYS+
65 RIGHTALT,
66 HOLE,
67/* 64 */ SHIFTKEYS+RIGHTCTRL,
68 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
69/* 72 */ HOLE, HOLE, HOLE, BF(8), DEL,
70 NOP, HOLE,
71 STRING+LEFTARROW,
72/* 80 */ RF(7), RF(13), HOLE,
73 STRING+UPARROW,
74 STRING+DOWNARROW,
75 RF(9), RF(15), HOLE,
76/* 88 */ HOLE,
77 STRING+RIGHTARROW,
78 SHIFTKEYS+NUMLOCK,
79 RF(7), STRING+LEFTARROW,
80 RF(13), HOLE,
81 PADSLASH,
82/* 96 */ STRING+UPARROW,
83 RF(11), STRING+DOWNARROW,
84 BF(8), PADSTAR,
85 RF(9),
86 STRING+RIGHTARROW,
87 RF(15),
88/*104 */ DEL, PADMINUS,
89 PADPLUS,
90 HOLE, PADENTER,
91 HOLE, ESC, HOLE,
92/*112 */ TF(1), TF(2), TF(3), TF(4), TF(5), TF(6), TF(7), TF(8),
93/*120 */ TF(9), TF(10), TF(11), TF(12), NOP, NOP, NOP, HOLE,
94/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
95/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
96/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
97/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
98/*160 */
99};
100
101/* Shifted keyboard table for PC keyboard */
102
103static keymap_entry_t keytab_pc_uc[KEYMAP_SIZE_PC] = {
104/* 0 */ HOLE, '~', '!', '@', '#', '$', '%', '^',
105/* 8 */ '&', '*', '(', ')', '_', '+', HOLE, '\b',
106/* 16 */ '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U',
107/* 24 */ 'I', 'O', 'P', '{', '}', '|',
108 SHIFTKEYS+CAPSLOCK,
109 'A',
110/* 32 */ 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
111/* 40 */ ':', '"', '|', '\r',
112 SHIFTKEYS+LEFTSHIFT,
113 HOLE, 'Z', 'X',
114/* 48 */ 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
115/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
116 SHIFTKEYS+LEFTCTRL,
117 HOLE,
118 SHIFTKEYS+LEFTALT,
119 ' ', SHIFTKEYS+
120 RIGHTALT,
121 HOLE,
122/* 64 */ SHIFTKEYS+RIGHTCTRL,
123 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
124/* 72 */ HOLE, HOLE, HOLE, BF(8), DEL, NOP, HOLE,
125 STRING+LEFTARROW,
126/* 80 */ RF(7), RF(13), HOLE, STRING+UPARROW,
127 STRING+DOWNARROW,
128 RF(9), RF(15), HOLE,
129/* 88 */ HOLE,
130 STRING+RIGHTARROW,
131 SHIFTKEYS+NUMLOCK,
132 '7', '4', '1', HOLE, '/',
133/* 96 */ '8', '5', '2', '0', '*', '9', '6', '3',
134/*104 */ '.', '-', '+', HOLE, '\n', HOLE, ESC, HOLE,
135/*112 */ TF(1), TF(2), TF(3), TF(4), TF(5), TF(6), TF(7), TF(8),
136/*120 */ TF(9), TF(10), TF(11), TF(12), NOP, NOP, NOP, HOLE,
137/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
138/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
139/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
140/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
141/*160 */
142};
143
144/* Caps Locked keyboard table for PC keyboard */
145
146static keymap_entry_t keytab_pc_cl[KEYMAP_SIZE_PC] = {
147/* 0 */ HOLE, '`', '1', '2', '3', '4', '5', '6',
148/* 8 */ '7', '8', '9', '0', '-', '=', HOLE, '\b',
149/* 16 */ '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U',
150/* 24 */ 'I', 'O', 'P', '[', ']', '\\',
151 SHIFTKEYS+CAPSLOCK,
152 'A',
153/* 32 */ 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
154/* 40 */ ';', '\'', '\\', '\r',
155 SHIFTKEYS+LEFTSHIFT,
156 HOLE, 'Z', 'X',
157/* 48 */ 'C', 'V', 'B', 'N', 'M', ',', '.', '/',
158/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
159 SHIFTKEYS+LEFTCTRL,
160 HOLE,
161 SHIFTKEYS+LEFTALT,
162 ' ', SHIFTKEYS+
163 RIGHTALT,
164 HOLE,
165/* 64 */ SHIFTKEYS+RIGHTCTRL,
166 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
167/* 72 */ HOLE, HOLE, HOLE, BF(8), DEL, NOP, HOLE,
168 STRING+LEFTARROW,
169/* 80 */ RF(7),
170 RF(13), HOLE,
171 STRING+UPARROW,
172 STRING+DOWNARROW,
173 RF(9), RF(15), HOLE,
174/* 88 */ HOLE,
175 STRING+RIGHTARROW,
176 SHIFTKEYS+NUMLOCK,
177 RF(7), STRING+LEFTARROW,
178 RF(13), HOLE, PADSLASH,
179/* 96 */ STRING+UPARROW,
180 RF(11), STRING+DOWNARROW,
181 BF(8), PADSTAR,
182 RF(9),
183 STRING+RIGHTARROW,
184 RF(15),
185/*104 */ DEL, PADMINUS,
186 PADPLUS,
187 HOLE, PADENTER,
188 HOLE, ESC, HOLE,
189/*112 */ TF(1), TF(2), TF(3), TF(4), TF(5), TF(6), TF(7), TF(8),
190/*120 */ TF(9), TF(10), TF(11), TF(12), NOP, NOP, NOP, HOLE,
191/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
192/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
193/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
194/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
195/*160 */
196};
197
198/* Alt Graph keyboard table for PC keyboard */
199
200static keymap_entry_t keytab_pc_ag[KEYMAP_SIZE_PC] = {
201/* 0 */ HOLE, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
202/* 8 */ NOP, NOP, NOP, NOP, NOP, NOP, HOLE, NOP,
203/* 16 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
204/* 24 */ NOP, NOP, NOP, NOP, NOP, NOP,
205 SHIFTKEYS+CAPSLOCK,
206 NOP,
207/* 32 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
208/* 40 */ NOP, NOP, NOP, NOP,
209 SHIFTKEYS+LEFTSHIFT,
210 HOLE, NOP, NOP,
211/* 48 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
212/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
213 SHIFTKEYS+LEFTCTRL,
214 HOLE,
215 SHIFTKEYS+LEFTALT,
216 ' ', SHIFTKEYS+
217 RIGHTALT,
218 HOLE,
219/* 64 */ SHIFTKEYS+RIGHTCTRL,
220 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
221/* 72 */ HOLE, HOLE, HOLE, BF(8), DEL, NOP, HOLE,
222 STRING+
223 LEFTARROW,
224/* 80 */ RF(7), RF(13), HOLE, STRING+
225 UPARROW,STRING+
226 DOWNARROW,RF(9), RF(15), HOLE,
227/* 88 */ HOLE, STRING+
228 RIGHTARROW,
229 SHIFTKEYS+NUMLOCK,
230 NOP, NOP, NOP, HOLE, NOP,
231/* 96 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
232/*104 */ NOP, NOP, NOP, HOLE, NOP, HOLE, ESC, HOLE,
233/*112 */ TF(1), TF(2), TF(3), TF(4), TF(5), TF(6), TF(7), TF(8),
234/*120 */ TF(9), TF(10), TF(11), TF(12), NOP, NOP, NOP, HOLE,
235/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
236/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
237/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
238/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
239/*160 */
240};
241
242/* Num Locked keyboard table for PC keyboard */
243
244static keymap_entry_t keytab_pc_nl[KEYMAP_SIZE_PC] = {
245/* 0 */ HOLE, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
246/* 8 */ NONL, NONL, NONL, NONL, NONL, NONL, HOLE, NONL,
247/* 16 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
248/* 24 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
249/* 32 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
250/* 40 */ NONL, NONL, NONL, NONL, NONL, HOLE, NONL, NONL,
251/* 48 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
252/* 56 */ NONL, NONL, NONL, HOLE, NONL, NONL, NONL, HOLE,
253/* 64 */ NONL, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
254/* 72 */ HOLE, HOLE, HOLE, NONL, NONL, NONL, HOLE, NONL,
255/* 80 */ NONL, NONL, HOLE, NONL, NONL, NONL, NONL, HOLE,
256/* 88 */ HOLE, NONL, NONL, PAD7, PAD4, PAD1, HOLE, NONL,
257/* 96 */ PAD8, PAD5, PAD2, PAD0, NONL, PAD9, PAD6, PAD3,
258/*104 */ PADDOT, NONL, NONL, HOLE, NONL, HOLE, NONL, HOLE,
259/*112 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, NONL,
260/*120 */ NONL, NONL, NONL, NONL, NONL, NONL, NONL, HOLE,
261/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
262/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
263/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
264/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
265/*160 */
266};
267
268/* Controlled keyboard table for PC keyboard */
269
270static keymap_entry_t keytab_pc_ct[KEYMAP_SIZE_PC] = {
271/* 0 */ HOLE, c('^'), '1', c('@'), '3', '4', '5', c('^'),
272/* 8 */ '7', '8', '9', '0', c('_'), '=', HOLE, '\b',
273/* 16 */ '\t', c('q'), c('w'), c('e'), c('r'), c('t'), c('y'), c('u'),
274/* 24 */ c('i'), c('o'), c('p'), c('['), c(']'), c('\\'),
275 SHIFTKEYS+CAPSLOCK,
276 c('a'),
277/* 32 */ c('s'), c('d'), c('f'), c('g'), c('h'), c('j'), c('k'), c('l'),
278/* 40 */ ';', '\'', '\\', '\r',
279 SHIFTKEYS+LEFTSHIFT,
280 HOLE, c('z'), c('x'),
281/* 48 */ c('c'), c('v'), c('b'), c('n'), c('m'), ',', '.', c('_'),
282/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
283 SHIFTKEYS+LEFTCTRL,
284 HOLE,
285 SHIFTKEYS+LEFTALT,
286 ' ', SHIFTKEYS+
287 RIGHTALT,
288 HOLE,
289/* 64 */ SHIFTKEYS+RIGHTCTRL,
290 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
291/* 72 */ HOLE, HOLE, HOLE, BF(8), DEL, NOP, HOLE,
292 STRING+LEFTARROW,
293/* 80 */ RF(7), RF(13), HOLE,
294 STRING+UPARROW,
295 STRING+DOWNARROW,
296 RF(9), RF(15), HOLE,
297/* 88 */ HOLE,
298 STRING+RIGHTARROW,
299 SHIFTKEYS+NUMLOCK,
300 PAD7, PAD4, PAD1, HOLE,
301 PADSLASH,
302/* 96 */ PAD8, PAD5, PAD2, PAD0, PADSTAR,
303 PAD9, PAD6, PAD3,
304/*104 */ PADDOT, PADMINUS,
305 PADPLUS,
306 HOLE, PADENTER,
307 HOLE, ESC, HOLE,
308/*112 */ TF(1), TF(2), TF(3), TF(4), TF(5), TF(6), TF(7), TF(8),
309/*120 */ TF(9), TF(10), TF(11), TF(12), NOP, NOP, NOP, HOLE,
310/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
311/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
312/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
313/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
314/*160 */
315};
316
317/* "Key Up" keyboard table for PC keyboard */
318
319
320static keymap_entry_t keytab_pc_up[KEYMAP_SIZE_PC] = {
321/* 0 */ HOLE, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
322/* 8 */ NOP, NOP, NOP, NOP, NOP, NOP, HOLE, NOP,
323/* 16 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
324/* 24 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
325/* 32 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
326/* 40 */ NOP, NOP, NOP, NOP,
327 SHIFTKEYS+LEFTSHIFT,
328 HOLE, NOP, NOP,
329/* 48 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
330/* 56 */ NOP, SHIFTKEYS+RIGHTSHIFT,
331 SHIFTKEYS+LEFTCTRL,
332 HOLE, SHIFTKEYS+LEFTALT,
333 NOP, SHIFTKEYS+
334 RIGHTALT,
335 HOLE,
336/* 64 */ SHIFTKEYS+RIGHTCTRL,
337 HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
338/* 72 */ HOLE, HOLE, HOLE, NOP, NOP, NOP, HOLE, NOP,
339/* 80 */ NOP, NOP, HOLE, NOP, NOP, NOP, NOP, HOLE,
340/* 88 */ HOLE, NOP, NOP, NOP, NOP, NOP, HOLE, NOP,
341/* 96 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
342/*104 */ NOP, NOP, NOP, HOLE, NOP, HOLE, NOP, HOLE,
343/*112 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
344/*120 */ NOP, NOP, NOP, NOP, NOP, NOP, NOP, HOLE,
345/*128 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
346/*136 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
347/*144 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
348/*152 */ HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE, HOLE,
349/*160 */
350};
351
352/* END CSTYLED */
353
354#define M(x) (1 << (x))
355#define MASK_ALL (M(LEFTSHIFT) | \
356 M(RIGHTSHIFT) | \
357 CTRLMASK | \
358 ALTMASK | \
359 ALTGRAPHMASK)
360
361/*
362 * Make Ctrl+Shift+F1 be Compose. This is SOOOO hokey.
363 */
364static struct exception_map exceptions_pc[] = {
365 { MASK_ALL, M(LEFTSHIFT)|M(LEFTCTRL), 112, COMPOSE, },
366 { MASK_ALL, M(LEFTSHIFT)|M(RIGHTCTRL), 112, COMPOSE, },
367 { MASK_ALL, M(RIGHTSHIFT)|M(LEFTCTRL), 112, COMPOSE, },
368 { MASK_ALL, M(RIGHTSHIFT)|M(RIGHTCTRL), 112, COMPOSE, },
369 { 0, },
370};
371
372/* Index to keymaps for PC keyboard */
373struct keyboard keyindex_pc = {
374 KEYMAP_SIZE_PC,
375 keytab_pc_lc,
376 keytab_pc_uc,
377 keytab_pc_cl,
378 keytab_pc_ag,
379 keytab_pc_nl,
380 keytab_pc_ct,
381 keytab_pc_up,
382 0x0000, /* Shift bits which stay on with idle keyboard */
383 0x0000, /* Bucky bits which stay on with idle keyboard */
384 112, 0, 31, /* abort keys: F1+A */
385 CAPSMASK|NUMLOCKMASK, /* Shift bits which toggle on down event */
386 exceptions_pc, /* Exceptions */
qz150045e4603302007-01-26 16:10:27 -0800387 44, 57, 126, /* new abort keys: Shift+Pause */
stevel@tonic-gate7c478bd2005-06-14 00:00:00 -0700388};