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 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 */ 49 static 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 103 static 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 146 static 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 200 static 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 244 static 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 270 static 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 320 static 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 */ 364 static 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 */ 373 struct 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 */ 387 44, 57, 126, /* new abort keys: Shift+Pause */ 388 }; 389