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