1 /*- 2 * Copyright (c) 1998 The NetBSD Foundation, Inc. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The NetBSD Foundation 6 * by Lennart Augustsson (lennart@augustsson.net) at 7 * Carlstedt Research & Technology. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 * 30 */ 31 32 /* 33 * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf 34 */ 35 36 #include "opt_compat.h" 37 #include "opt_kbd.h" 38 #include "opt_ukbd.h" 39 40 #include <sys/stdint.h> 41 #include <sys/param.h> 42 #include <sys/queue.h> 43 #include <sys/types.h> 44 #include <sys/systm.h> 45 #include <sys/kernel.h> 46 #include <sys/bus.h> 47 #include <sys/module.h> 48 #include <sys/lock.h> 49 #include <sys/condvar.h> 50 #include <sys/sysctl.h> 51 #include <sys/unistd.h> 52 #include <sys/callout.h> 53 #include <sys/malloc.h> 54 #include <sys/priv.h> 55 #include <sys/proc.h> 56 #include <sys/sched.h> 57 #include <sys/thread2.h> 58 59 #include <bus/u4b/usb.h> 60 #include <bus/u4b/usbdi.h> 61 #include <bus/u4b/usbdi_util.h> 62 #include <bus/u4b/usbhid.h> 63 64 #define USB_DEBUG_VAR ukbd_debug 65 #include <bus/u4b/usb_debug.h> 66 67 #include <bus/u4b/quirk/usb_quirk.h> 68 69 #include <sys/ioccom.h> 70 #include <sys/filio.h> 71 #include <sys/tty.h> 72 #include <sys/kbio.h> 73 74 #include <dev/misc/kbd/kbdreg.h> 75 76 /* the initial key map, accent map and fkey strings */ 77 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE) 78 #define KBD_DFLT_KEYMAP 79 #include "ukbdmap.h" 80 #endif 81 82 /* the following file must be included after "ukbdmap.h" */ 83 #include <dev/misc/kbd/kbdtables.h> 84 85 #ifdef USB_DEBUG 86 static int ukbd_debug = 0; 87 static int ukbd_no_leds = 0; 88 89 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd"); 90 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW, 91 &ukbd_debug, 0, "Debug level"); 92 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW, 93 &ukbd_no_leds, 0, "Disables setting of keyboard leds"); 94 95 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug); 96 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds); 97 #endif 98 99 #define UKBD_EMULATE_ATSCANCODE 1 100 #define UKBD_DRIVER_NAME "ukbd" 101 #define UKBD_NMOD 8 /* units */ 102 #define UKBD_NKEYCODE 6 /* units */ 103 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */ 104 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */ 105 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */ 106 #define UKBD_BUFFER_SIZE 64 /* bytes */ 107 108 struct ukbd_data { 109 uint16_t modifiers; 110 #define MOD_CONTROL_L 0x01 111 #define MOD_CONTROL_R 0x10 112 #define MOD_SHIFT_L 0x02 113 #define MOD_SHIFT_R 0x20 114 #define MOD_ALT_L 0x04 115 #define MOD_ALT_R 0x40 116 #define MOD_WIN_L 0x08 117 #define MOD_WIN_R 0x80 118 /* internal */ 119 #define MOD_EJECT 0x0100 120 #define MOD_FN 0x0200 121 uint8_t keycode[UKBD_NKEYCODE]; 122 }; 123 124 enum { 125 UKBD_INTR_DT, 126 UKBD_CTRL_LED, 127 UKBD_N_TRANSFER, 128 }; 129 130 struct ukbd_softc { 131 device_t sc_dev; 132 keyboard_t sc_kbd; 133 keymap_t sc_keymap; 134 accentmap_t sc_accmap; 135 136 fkeytab_t sc_fkeymap[UKBD_NFKEY]; 137 struct hid_location sc_loc_apple_eject; 138 struct hid_location sc_loc_apple_fn; 139 struct hid_location sc_loc_ctrl_l; 140 struct hid_location sc_loc_ctrl_r; 141 struct hid_location sc_loc_shift_l; 142 struct hid_location sc_loc_shift_r; 143 struct hid_location sc_loc_alt_l; 144 struct hid_location sc_loc_alt_r; 145 struct hid_location sc_loc_win_l; 146 struct hid_location sc_loc_win_r; 147 struct hid_location sc_loc_events; 148 struct hid_location sc_loc_numlock; 149 struct hid_location sc_loc_capslock; 150 struct hid_location sc_loc_scrolllock; 151 struct usb_callout sc_callout; 152 struct ukbd_data sc_ndata; 153 struct ukbd_data sc_odata; 154 155 struct thread *sc_poll_thread; 156 struct usb_device *sc_udev; 157 struct usb_interface *sc_iface; 158 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER]; 159 160 uint32_t sc_ntime[UKBD_NKEYCODE]; 161 uint32_t sc_otime[UKBD_NKEYCODE]; 162 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */ 163 uint32_t sc_time_ms; 164 uint32_t sc_composed_char; /* composed char code, if non-zero */ 165 #ifdef UKBD_EMULATE_ATSCANCODE 166 uint32_t sc_buffered_char[2]; 167 #endif 168 uint32_t sc_flags; /* flags */ 169 #define UKBD_FLAG_COMPOSE 0x00000001 170 #define UKBD_FLAG_POLLING 0x00000002 171 #define UKBD_FLAG_SET_LEDS 0x00000004 172 #define UKBD_FLAG_ATTACHED 0x00000010 173 #define UKBD_FLAG_GONE 0x00000020 174 175 #define UKBD_FLAG_HID_MASK 0x003fffc0 176 #define UKBD_FLAG_APPLE_EJECT 0x00000040 177 #define UKBD_FLAG_APPLE_FN 0x00000080 178 #define UKBD_FLAG_APPLE_SWAP 0x00000100 179 #define UKBD_FLAG_TIMER_RUNNING 0x00000200 180 #define UKBD_FLAG_CTRL_L 0x00000400 181 #define UKBD_FLAG_CTRL_R 0x00000800 182 #define UKBD_FLAG_SHIFT_L 0x00001000 183 #define UKBD_FLAG_SHIFT_R 0x00002000 184 #define UKBD_FLAG_ALT_L 0x00004000 185 #define UKBD_FLAG_ALT_R 0x00008000 186 #define UKBD_FLAG_WIN_L 0x00010000 187 #define UKBD_FLAG_WIN_R 0x00020000 188 #define UKBD_FLAG_EVENTS 0x00040000 189 #define UKBD_FLAG_NUMLOCK 0x00080000 190 #define UKBD_FLAG_CAPSLOCK 0x00100000 191 #define UKBD_FLAG_SCROLLLOCK 0x00200000 192 193 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ 194 int sc_state; /* shift/lock key state */ 195 int sc_accents; /* accent key index (> 0) */ 196 int sc_led_size; 197 int sc_kbd_size; 198 199 uint16_t sc_inputs; 200 uint16_t sc_inputhead; 201 uint16_t sc_inputtail; 202 uint16_t sc_modifiers; 203 204 uint8_t sc_leds; /* store for async led requests */ 205 uint8_t sc_iface_index; 206 uint8_t sc_iface_no; 207 uint8_t sc_id_apple_eject; 208 uint8_t sc_id_apple_fn; 209 uint8_t sc_id_ctrl_l; 210 uint8_t sc_id_ctrl_r; 211 uint8_t sc_id_shift_l; 212 uint8_t sc_id_shift_r; 213 uint8_t sc_id_alt_l; 214 uint8_t sc_id_alt_r; 215 uint8_t sc_id_win_l; 216 uint8_t sc_id_win_r; 217 uint8_t sc_id_event; 218 uint8_t sc_id_numlock; 219 uint8_t sc_id_capslock; 220 uint8_t sc_id_scrolllock; 221 uint8_t sc_id_events; 222 uint8_t sc_kbd_id; 223 224 uint8_t sc_buffer[UKBD_BUFFER_SIZE]; 225 }; 226 227 #define KEY_ERROR 0x01 228 229 #define KEY_PRESS 0 230 #define KEY_RELEASE 0x400 231 #define KEY_INDEX(c) ((c) & 0xFF) 232 233 #define SCAN_PRESS 0 234 #define SCAN_RELEASE 0x80 235 #define SCAN_PREFIX_E0 0x100 236 #define SCAN_PREFIX_E1 0x200 237 #define SCAN_PREFIX_CTL 0x400 238 #define SCAN_PREFIX_SHIFT 0x800 239 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \ 240 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT) 241 #define SCAN_CHAR(c) ((c) & 0x7f) 242 243 #define UKBD_LOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_EXCLUSIVE) 244 #define UKBD_UNLOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_RELEASE) 245 246 #ifdef INVARIANTS 247 248 /* 249 * Assert that the lock is held in all contexts 250 * where the code can be executed. 251 */ 252 #define UKBD_LOCK_ASSERT() 253 254 /* 255 * Assert that the lock is held in the contexts 256 * where it really has to be so. 257 */ 258 #define UKBD_CTX_LOCK_ASSERT() 259 #else 260 261 #define UKBD_LOCK_ASSERT() (void)0 262 #define UKBD_CTX_LOCK_ASSERT() (void)0 263 264 #endif 265 266 struct ukbd_mods { 267 uint32_t mask, key; 268 }; 269 270 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = { 271 {MOD_CONTROL_L, 0xe0}, 272 {MOD_CONTROL_R, 0xe4}, 273 {MOD_SHIFT_L, 0xe1}, 274 {MOD_SHIFT_R, 0xe5}, 275 {MOD_ALT_L, 0xe2}, 276 {MOD_ALT_R, 0xe6}, 277 {MOD_WIN_L, 0xe3}, 278 {MOD_WIN_R, 0xe7}, 279 }; 280 281 #define NN 0 /* no translation */ 282 /* 283 * Translate USB keycodes to AT keyboard scancodes. 284 */ 285 /* 286 * FIXME: Mac USB keyboard generates: 287 * 0x53: keypad NumLock/Clear 288 * 0x66: Power 289 * 0x67: keypad = 290 * 0x68: F13 291 * 0x69: F14 292 * 0x6a: F15 293 */ 294 static const uint8_t ukbd_trtab[256] = { 295 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */ 296 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */ 297 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */ 298 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */ 299 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */ 300 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */ 301 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */ 302 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */ 303 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */ 304 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */ 305 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */ 306 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */ 307 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */ 308 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */ 309 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */ 310 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */ 311 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */ 312 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */ 313 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */ 314 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */ 315 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */ 316 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */ 317 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */ 318 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */ 319 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */ 320 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */ 321 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */ 322 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */ 323 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */ 324 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */ 325 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */ 326 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */ 327 }; 328 329 static const uint8_t ukbd_boot_desc[] = { 330 0x05, 0x01, 0x09, 0x06, 0xa1, 331 0x01, 0x05, 0x07, 0x19, 0xe0, 332 0x29, 0xe7, 0x15, 0x00, 0x25, 333 0x01, 0x75, 0x01, 0x95, 0x08, 334 0x81, 0x02, 0x95, 0x01, 0x75, 335 0x08, 0x81, 0x01, 0x95, 0x03, 336 0x75, 0x01, 0x05, 0x08, 0x19, 337 0x01, 0x29, 0x03, 0x91, 0x02, 338 0x95, 0x05, 0x75, 0x01, 0x91, 339 0x01, 0x95, 0x06, 0x75, 0x08, 340 0x15, 0x00, 0x26, 0xff, 0x00, 341 0x05, 0x07, 0x19, 0x00, 0x2a, 342 0xff, 0x00, 0x81, 0x00, 0xc0 343 }; 344 345 /* prototypes */ 346 static void ukbd_timeout(void *); 347 static void ukbd_set_leds(struct ukbd_softc *, uint8_t); 348 static int ukbd_set_typematic(keyboard_t *, int); 349 #ifdef UKBD_EMULATE_ATSCANCODE 350 static int ukbd_key2scan(struct ukbd_softc *, int, int, int); 351 #endif 352 static uint32_t ukbd_read_char(keyboard_t *, int); 353 static void ukbd_clear_state(keyboard_t *); 354 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t); 355 static int ukbd_enable(keyboard_t *); 356 static int ukbd_disable(keyboard_t *); 357 static void ukbd_interrupt(struct ukbd_softc *); 358 static void ukbd_event_keyinput(struct ukbd_softc *); 359 360 static device_probe_t ukbd_probe; 361 static device_attach_t ukbd_attach; 362 static device_detach_t ukbd_detach; 363 static device_resume_t ukbd_resume; 364 365 static uint8_t 366 ukbd_any_key_pressed(struct ukbd_softc *sc) 367 { 368 uint8_t i; 369 uint8_t j; 370 371 for (j = i = 0; i < UKBD_NKEYCODE; i++) 372 j |= sc->sc_odata.keycode[i]; 373 374 return (j ? 1 : 0); 375 } 376 377 static void 378 ukbd_start_timer(struct ukbd_softc *sc) 379 { 380 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING; 381 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc); 382 } 383 384 static void 385 ukbd_put_key(struct ukbd_softc *sc, uint32_t key) 386 { 387 388 UKBD_CTX_LOCK_ASSERT(); 389 390 DPRINTF("0x%02x (%d) %s\n", key, key, 391 (key & KEY_RELEASE) ? "released" : "pressed"); 392 393 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) { 394 sc->sc_input[sc->sc_inputtail] = key; 395 ++(sc->sc_inputs); 396 ++(sc->sc_inputtail); 397 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) { 398 sc->sc_inputtail = 0; 399 } 400 } else { 401 DPRINTF("input buffer is full\n"); 402 } 403 } 404 405 static void 406 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait) 407 { 408 409 UKBD_CTX_LOCK_ASSERT(); 410 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0, 411 ("ukbd_do_poll called when not polling\n")); 412 DPRINTFN(2, "polling\n"); 413 #if 0 /* XXX */ 414 if (!kdb_active && !SCHEDULER_STOPPED()) { 415 #endif 416 /* 417 * In this context the kernel is polling for input, 418 * but the USB subsystem works in normal interrupt-driven 419 * mode, so we just wait on the USB threads to do the job. 420 * Note that we currently hold the Giant, but it's also used 421 * as the transfer mtx, so we must release it while waiting. 422 */ 423 while (sc->sc_inputs == 0) { 424 /* 425 * Give USB threads a chance to run. Note that 426 * kern_yield performs DROP_GIANT + PICKUP_GIANT. 427 */ 428 lwkt_yield(); 429 if (!wait) 430 break; 431 } 432 return; 433 #if 0 434 } 435 #endif 436 437 while (sc->sc_inputs == 0) { 438 439 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER); 440 441 /* Delay-optimised support for repetition of keys */ 442 if (ukbd_any_key_pressed(sc)) { 443 /* a key is pressed - need timekeeping */ 444 DELAY(1000); 445 446 /* 1 millisecond has passed */ 447 sc->sc_time_ms += 1; 448 } 449 450 ukbd_interrupt(sc); 451 452 if (!wait) 453 break; 454 } 455 } 456 457 static int32_t 458 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait) 459 { 460 int32_t c; 461 462 UKBD_CTX_LOCK_ASSERT(); 463 #if 0 464 KASSERT((!kdb_active && !SCHEDULER_STOPPED()) 465 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0, 466 ("not polling in kdb or panic\n")); 467 #endif 468 469 if (sc->sc_inputs == 0) { 470 /* start transfer, if not already started */ 471 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]); 472 } 473 474 if (sc->sc_flags & UKBD_FLAG_POLLING) 475 ukbd_do_poll(sc, wait); 476 477 if (sc->sc_inputs == 0) { 478 c = -1; 479 } else { 480 c = sc->sc_input[sc->sc_inputhead]; 481 --(sc->sc_inputs); 482 ++(sc->sc_inputhead); 483 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) { 484 sc->sc_inputhead = 0; 485 } 486 } 487 return (c); 488 } 489 490 static void 491 ukbd_interrupt(struct ukbd_softc *sc) 492 { 493 uint32_t n_mod; 494 uint32_t o_mod; 495 uint32_t now = sc->sc_time_ms; 496 uint32_t dtime; 497 uint8_t key; 498 uint8_t i; 499 uint8_t j; 500 501 UKBD_CTX_LOCK_ASSERT(); 502 503 if (sc->sc_ndata.keycode[0] == KEY_ERROR) 504 return; 505 506 n_mod = sc->sc_ndata.modifiers; 507 o_mod = sc->sc_odata.modifiers; 508 if (n_mod != o_mod) { 509 for (i = 0; i < UKBD_NMOD; i++) { 510 if ((n_mod & ukbd_mods[i].mask) != 511 (o_mod & ukbd_mods[i].mask)) { 512 ukbd_put_key(sc, ukbd_mods[i].key | 513 ((n_mod & ukbd_mods[i].mask) ? 514 KEY_PRESS : KEY_RELEASE)); 515 } 516 } 517 } 518 /* Check for released keys. */ 519 for (i = 0; i < UKBD_NKEYCODE; i++) { 520 key = sc->sc_odata.keycode[i]; 521 if (key == 0) { 522 continue; 523 } 524 for (j = 0; j < UKBD_NKEYCODE; j++) { 525 if (sc->sc_ndata.keycode[j] == 0) { 526 continue; 527 } 528 if (key == sc->sc_ndata.keycode[j]) { 529 goto rfound; 530 } 531 } 532 ukbd_put_key(sc, key | KEY_RELEASE); 533 rfound: ; 534 } 535 536 /* Check for pressed keys. */ 537 for (i = 0; i < UKBD_NKEYCODE; i++) { 538 key = sc->sc_ndata.keycode[i]; 539 if (key == 0) { 540 continue; 541 } 542 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1; 543 for (j = 0; j < UKBD_NKEYCODE; j++) { 544 if (sc->sc_odata.keycode[j] == 0) { 545 continue; 546 } 547 if (key == sc->sc_odata.keycode[j]) { 548 549 /* key is still pressed */ 550 551 sc->sc_ntime[i] = sc->sc_otime[j]; 552 dtime = (sc->sc_otime[j] - now); 553 554 if (!(dtime & 0x80000000)) { 555 /* time has not elapsed */ 556 goto pfound; 557 } 558 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2; 559 break; 560 } 561 } 562 ukbd_put_key(sc, key | KEY_PRESS); 563 564 /* 565 * If any other key is presently down, force its repeat to be 566 * well in the future (100s). This makes the last key to be 567 * pressed do the autorepeat. 568 */ 569 for (j = 0; j != UKBD_NKEYCODE; j++) { 570 if (j != i) 571 sc->sc_ntime[j] = now + (100 * 1000); 572 } 573 pfound: ; 574 } 575 576 sc->sc_odata = sc->sc_ndata; 577 578 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime)); 579 580 ukbd_event_keyinput(sc); 581 } 582 583 static void 584 ukbd_event_keyinput(struct ukbd_softc *sc) 585 { 586 int c; 587 588 UKBD_CTX_LOCK_ASSERT(); 589 590 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0) 591 return; 592 593 if (sc->sc_inputs == 0) 594 return; 595 596 if (KBD_IS_ACTIVE(&sc->sc_kbd) && 597 KBD_IS_BUSY(&sc->sc_kbd)) { 598 /* let the callback function process the input */ 599 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT, 600 sc->sc_kbd.kb_callback.kc_arg); 601 } else { 602 /* read and discard the input, no one is waiting for it */ 603 do { 604 c = ukbd_read_char(&sc->sc_kbd, 0); 605 } while (c != NOKEY); 606 } 607 } 608 609 static void 610 ukbd_timeout(void *arg) 611 { 612 struct ukbd_softc *sc = arg; 613 614 UKBD_LOCK_ASSERT(); 615 616 sc->sc_time_ms += 25; /* milliseconds */ 617 618 ukbd_interrupt(sc); 619 620 /* Make sure any leftover key events gets read out */ 621 ukbd_event_keyinput(sc); 622 623 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) { 624 ukbd_start_timer(sc); 625 } else { 626 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING; 627 } 628 } 629 630 static uint8_t 631 ukbd_apple_fn(uint8_t keycode) { 632 switch (keycode) { 633 case 0x28: return 0x49; /* RETURN -> INSERT */ 634 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */ 635 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */ 636 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */ 637 case 0x52: return 0x4b; /* UP ARROW -> PGUP */ 638 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */ 639 default: return keycode; 640 } 641 } 642 643 static uint8_t 644 ukbd_apple_swap(uint8_t keycode) { 645 switch (keycode) { 646 case 0x35: return 0x64; 647 case 0x64: return 0x35; 648 default: return keycode; 649 } 650 } 651 652 static void 653 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error) 654 { 655 struct ukbd_softc *sc = usbd_xfer_softc(xfer); 656 struct usb_page_cache *pc; 657 uint8_t i; 658 uint8_t offset; 659 uint8_t id; 660 int len; 661 662 UKBD_LOCK_ASSERT(); 663 664 usbd_xfer_status(xfer, &len, NULL, NULL, NULL); 665 pc = usbd_xfer_get_frame(xfer, 0); 666 667 switch (USB_GET_STATE(xfer)) { 668 case USB_ST_TRANSFERRED: 669 DPRINTF("actlen=%d bytes\n", len); 670 671 if (len == 0) { 672 DPRINTF("zero length data\n"); 673 goto tr_setup; 674 } 675 676 if (sc->sc_kbd_id != 0) { 677 /* check and remove HID ID byte */ 678 usbd_copy_out(pc, 0, &id, 1); 679 offset = 1; 680 len--; 681 if (len == 0) { 682 DPRINTF("zero length data\n"); 683 goto tr_setup; 684 } 685 } else { 686 offset = 0; 687 id = 0; 688 } 689 690 if (len > UKBD_BUFFER_SIZE) 691 len = UKBD_BUFFER_SIZE; 692 693 /* get data */ 694 usbd_copy_out(pc, offset, sc->sc_buffer, len); 695 696 /* clear temporary storage */ 697 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata)); 698 699 /* scan through HID data */ 700 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) && 701 (id == sc->sc_id_apple_eject)) { 702 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject)) 703 sc->sc_modifiers |= MOD_EJECT; 704 else 705 sc->sc_modifiers &= ~MOD_EJECT; 706 } 707 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) && 708 (id == sc->sc_id_apple_fn)) { 709 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn)) 710 sc->sc_modifiers |= MOD_FN; 711 else 712 sc->sc_modifiers &= ~MOD_FN; 713 } 714 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) && 715 (id == sc->sc_id_ctrl_l)) { 716 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l)) 717 sc-> sc_modifiers |= MOD_CONTROL_L; 718 else 719 sc-> sc_modifiers &= ~MOD_CONTROL_L; 720 } 721 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) && 722 (id == sc->sc_id_ctrl_r)) { 723 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r)) 724 sc->sc_modifiers |= MOD_CONTROL_R; 725 else 726 sc->sc_modifiers &= ~MOD_CONTROL_R; 727 } 728 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) && 729 (id == sc->sc_id_shift_l)) { 730 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l)) 731 sc->sc_modifiers |= MOD_SHIFT_L; 732 else 733 sc->sc_modifiers &= ~MOD_SHIFT_L; 734 } 735 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) && 736 (id == sc->sc_id_shift_r)) { 737 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r)) 738 sc->sc_modifiers |= MOD_SHIFT_R; 739 else 740 sc->sc_modifiers &= ~MOD_SHIFT_R; 741 } 742 if ((sc->sc_flags & UKBD_FLAG_ALT_L) && 743 (id == sc->sc_id_alt_l)) { 744 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l)) 745 sc->sc_modifiers |= MOD_ALT_L; 746 else 747 sc->sc_modifiers &= ~MOD_ALT_L; 748 } 749 if ((sc->sc_flags & UKBD_FLAG_ALT_R) && 750 (id == sc->sc_id_alt_r)) { 751 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r)) 752 sc->sc_modifiers |= MOD_ALT_R; 753 else 754 sc->sc_modifiers &= ~MOD_ALT_R; 755 } 756 if ((sc->sc_flags & UKBD_FLAG_WIN_L) && 757 (id == sc->sc_id_win_l)) { 758 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l)) 759 sc->sc_modifiers |= MOD_WIN_L; 760 else 761 sc->sc_modifiers &= ~MOD_WIN_L; 762 } 763 if ((sc->sc_flags & UKBD_FLAG_WIN_R) && 764 (id == sc->sc_id_win_r)) { 765 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r)) 766 sc->sc_modifiers |= MOD_WIN_R; 767 else 768 sc->sc_modifiers &= ~MOD_WIN_R; 769 } 770 771 sc->sc_ndata.modifiers = sc->sc_modifiers; 772 773 if ((sc->sc_flags & UKBD_FLAG_EVENTS) && 774 (id == sc->sc_id_events)) { 775 i = sc->sc_loc_events.count; 776 if (i > UKBD_NKEYCODE) 777 i = UKBD_NKEYCODE; 778 if (i > len) 779 i = len; 780 while (i--) { 781 sc->sc_ndata.keycode[i] = 782 hid_get_data(sc->sc_buffer + i, len - i, 783 &sc->sc_loc_events); 784 } 785 } 786 787 #ifdef USB_DEBUG 788 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers); 789 for (i = 0; i < UKBD_NKEYCODE; i++) { 790 if (sc->sc_ndata.keycode[i]) { 791 DPRINTF("[%d] = 0x%02x\n", 792 (int)i, (int)sc->sc_ndata.keycode[i]); 793 } 794 } 795 #endif 796 if (sc->sc_modifiers & MOD_FN) { 797 for (i = 0; i < UKBD_NKEYCODE; i++) { 798 sc->sc_ndata.keycode[i] = 799 ukbd_apple_fn(sc->sc_ndata.keycode[i]); 800 } 801 } 802 803 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) { 804 for (i = 0; i < UKBD_NKEYCODE; i++) { 805 sc->sc_ndata.keycode[i] = 806 ukbd_apple_swap(sc->sc_ndata.keycode[i]); 807 } 808 } 809 810 ukbd_interrupt(sc); 811 812 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) { 813 if (ukbd_any_key_pressed(sc)) { 814 ukbd_start_timer(sc); 815 } 816 } 817 818 case USB_ST_SETUP: 819 tr_setup: 820 if (sc->sc_inputs < UKBD_IN_BUF_FULL) { 821 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); 822 usbd_transfer_submit(xfer); 823 } else { 824 DPRINTF("input queue is full!\n"); 825 } 826 break; 827 828 default: /* Error */ 829 DPRINTF("error=%s\n", usbd_errstr(error)); 830 831 if (error != USB_ERR_CANCELLED) { 832 /* try to clear stall first */ 833 usbd_xfer_set_stall(xfer); 834 goto tr_setup; 835 } 836 break; 837 } 838 } 839 840 static void 841 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error) 842 { 843 struct ukbd_softc *sc = usbd_xfer_softc(xfer); 844 struct usb_device_request req; 845 struct usb_page_cache *pc; 846 uint8_t id; 847 uint8_t any; 848 int len; 849 850 UKBD_LOCK_ASSERT(); 851 852 #ifdef USB_DEBUG 853 if (ukbd_no_leds) 854 return; 855 #endif 856 857 switch (USB_GET_STATE(xfer)) { 858 case USB_ST_TRANSFERRED: 859 case USB_ST_SETUP: 860 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS)) 861 break; 862 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS; 863 864 req.bmRequestType = UT_WRITE_CLASS_INTERFACE; 865 req.bRequest = UR_SET_REPORT; 866 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0); 867 req.wIndex[0] = sc->sc_iface_no; 868 req.wIndex[1] = 0; 869 req.wLength[1] = 0; 870 871 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE); 872 873 id = 0; 874 any = 0; 875 876 /* Assumption: All led bits must be in the same ID. */ 877 878 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) { 879 if (sc->sc_leds & NLKED) { 880 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1, 881 &sc->sc_loc_numlock, 1); 882 } 883 id = sc->sc_id_numlock; 884 any = 1; 885 } 886 887 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) { 888 if (sc->sc_leds & SLKED) { 889 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1, 890 &sc->sc_loc_scrolllock, 1); 891 } 892 id = sc->sc_id_scrolllock; 893 any = 1; 894 } 895 896 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) { 897 if (sc->sc_leds & CLKED) { 898 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1, 899 &sc->sc_loc_capslock, 1); 900 } 901 id = sc->sc_id_capslock; 902 any = 1; 903 } 904 905 /* if no leds, nothing to do */ 906 if (!any) 907 break; 908 909 /* range check output report length */ 910 len = sc->sc_led_size; 911 if (len > (UKBD_BUFFER_SIZE - 1)) 912 len = (UKBD_BUFFER_SIZE - 1); 913 914 /* check if we need to prefix an ID byte */ 915 sc->sc_buffer[0] = id; 916 917 pc = usbd_xfer_get_frame(xfer, 1); 918 if (id != 0) { 919 len++; 920 usbd_copy_in(pc, 0, sc->sc_buffer, len); 921 } else { 922 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len); 923 } 924 req.wLength[0] = len; 925 usbd_xfer_set_frame_len(xfer, 1, len); 926 927 DPRINTF("len=%d, id=%d\n", len, id); 928 929 /* setup control request last */ 930 pc = usbd_xfer_get_frame(xfer, 0); 931 usbd_copy_in(pc, 0, &req, sizeof(req)); 932 usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); 933 934 /* start data transfer */ 935 usbd_xfer_set_frames(xfer, 2); 936 usbd_transfer_submit(xfer); 937 break; 938 939 default: /* Error */ 940 DPRINTFN(1, "error=%s\n", usbd_errstr(error)); 941 break; 942 } 943 } 944 945 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = { 946 947 [UKBD_INTR_DT] = { 948 .type = UE_INTERRUPT, 949 .endpoint = UE_ADDR_ANY, 950 .direction = UE_DIR_IN, 951 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, 952 .bufsize = 0, /* use wMaxPacketSize */ 953 .callback = &ukbd_intr_callback, 954 }, 955 956 [UKBD_CTRL_LED] = { 957 .type = UE_CONTROL, 958 .endpoint = 0x00, /* Control pipe */ 959 .direction = UE_DIR_ANY, 960 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE, 961 .callback = &ukbd_set_leds_callback, 962 .timeout = 1000, /* 1 second */ 963 }, 964 }; 965 966 /* A match on these entries will load ukbd */ 967 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = { 968 {USB_IFACE_CLASS(UICLASS_HID), 969 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT), 970 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),}, 971 }; 972 973 static int 974 ukbd_probe(device_t dev) 975 { 976 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME); 977 struct usb_attach_arg *uaa = device_get_ivars(dev); 978 void *d_ptr; 979 int error; 980 uint16_t d_len; 981 982 DPRINTFN(11, "\n"); 983 984 if (sw == NULL) { 985 return (ENXIO); 986 } 987 if (uaa->usb_mode != USB_MODE_HOST) { 988 return (ENXIO); 989 } 990 991 if (uaa->info.bInterfaceClass != UICLASS_HID) 992 return (ENXIO); 993 994 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) && 995 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD)) { 996 if (usb_test_quirk(uaa, UQ_KBD_IGNORE)) 997 return (ENXIO); 998 else 999 return (BUS_PROBE_DEFAULT); 1000 } 1001 1002 error = usbd_req_get_hid_desc(uaa->device, NULL, 1003 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex); 1004 1005 if (error) 1006 return (ENXIO); 1007 1008 /* 1009 * NOTE: we currently don't support USB mouse and USB keyboard 1010 * on the same USB endpoint. 1011 */ 1012 if (hid_is_collection(d_ptr, d_len, 1013 HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE))) { 1014 /* most likely a mouse */ 1015 error = ENXIO; 1016 } else if (hid_is_collection(d_ptr, d_len, 1017 HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_KEYBOARD))) { 1018 if (usb_test_quirk(uaa, UQ_KBD_IGNORE)) 1019 error = ENXIO; 1020 else 1021 error = BUS_PROBE_DEFAULT; 1022 } else 1023 error = ENXIO; 1024 1025 kfree(d_ptr, M_TEMP); 1026 return (error); 1027 } 1028 1029 static void 1030 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len) 1031 { 1032 uint32_t flags; 1033 1034 /* reset detected bits */ 1035 sc->sc_flags &= ~UKBD_FLAG_HID_MASK; 1036 1037 /* check if there is an ID byte */ 1038 sc->sc_kbd_size = hid_report_size(ptr, len, 1039 hid_input, &sc->sc_kbd_id); 1040 1041 /* investigate if this is an Apple Keyboard */ 1042 if (hid_locate(ptr, len, 1043 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT), 1044 hid_input, 0, &sc->sc_loc_apple_eject, &flags, 1045 &sc->sc_id_apple_eject)) { 1046 if (flags & HIO_VARIABLE) 1047 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT | 1048 UKBD_FLAG_APPLE_SWAP; 1049 DPRINTFN(1, "Found Apple eject-key\n"); 1050 } 1051 if (hid_locate(ptr, len, 1052 HID_USAGE2(0xFFFF, 0x0003), 1053 hid_input, 0, &sc->sc_loc_apple_fn, &flags, 1054 &sc->sc_id_apple_fn)) { 1055 if (flags & HIO_VARIABLE) 1056 sc->sc_flags |= UKBD_FLAG_APPLE_FN; 1057 DPRINTFN(1, "Found Apple FN-key\n"); 1058 } 1059 /* figure out some keys */ 1060 if (hid_locate(ptr, len, 1061 HID_USAGE2(HUP_KEYBOARD, 0xE0), 1062 hid_input, 0, &sc->sc_loc_ctrl_l, &flags, 1063 &sc->sc_id_ctrl_l)) { 1064 if (flags & HIO_VARIABLE) 1065 sc->sc_flags |= UKBD_FLAG_CTRL_L; 1066 DPRINTFN(1, "Found left control\n"); 1067 } 1068 if (hid_locate(ptr, len, 1069 HID_USAGE2(HUP_KEYBOARD, 0xE4), 1070 hid_input, 0, &sc->sc_loc_ctrl_r, &flags, 1071 &sc->sc_id_ctrl_r)) { 1072 if (flags & HIO_VARIABLE) 1073 sc->sc_flags |= UKBD_FLAG_CTRL_R; 1074 DPRINTFN(1, "Found right control\n"); 1075 } 1076 if (hid_locate(ptr, len, 1077 HID_USAGE2(HUP_KEYBOARD, 0xE1), 1078 hid_input, 0, &sc->sc_loc_shift_l, &flags, 1079 &sc->sc_id_shift_l)) { 1080 if (flags & HIO_VARIABLE) 1081 sc->sc_flags |= UKBD_FLAG_SHIFT_L; 1082 DPRINTFN(1, "Found left shift\n"); 1083 } 1084 if (hid_locate(ptr, len, 1085 HID_USAGE2(HUP_KEYBOARD, 0xE5), 1086 hid_input, 0, &sc->sc_loc_shift_r, &flags, 1087 &sc->sc_id_shift_r)) { 1088 if (flags & HIO_VARIABLE) 1089 sc->sc_flags |= UKBD_FLAG_SHIFT_R; 1090 DPRINTFN(1, "Found right shift\n"); 1091 } 1092 if (hid_locate(ptr, len, 1093 HID_USAGE2(HUP_KEYBOARD, 0xE2), 1094 hid_input, 0, &sc->sc_loc_alt_l, &flags, 1095 &sc->sc_id_alt_l)) { 1096 if (flags & HIO_VARIABLE) 1097 sc->sc_flags |= UKBD_FLAG_ALT_L; 1098 DPRINTFN(1, "Found left alt\n"); 1099 } 1100 if (hid_locate(ptr, len, 1101 HID_USAGE2(HUP_KEYBOARD, 0xE6), 1102 hid_input, 0, &sc->sc_loc_alt_r, &flags, 1103 &sc->sc_id_alt_r)) { 1104 if (flags & HIO_VARIABLE) 1105 sc->sc_flags |= UKBD_FLAG_ALT_R; 1106 DPRINTFN(1, "Found right alt\n"); 1107 } 1108 if (hid_locate(ptr, len, 1109 HID_USAGE2(HUP_KEYBOARD, 0xE3), 1110 hid_input, 0, &sc->sc_loc_win_l, &flags, 1111 &sc->sc_id_win_l)) { 1112 if (flags & HIO_VARIABLE) 1113 sc->sc_flags |= UKBD_FLAG_WIN_L; 1114 DPRINTFN(1, "Found left GUI\n"); 1115 } 1116 if (hid_locate(ptr, len, 1117 HID_USAGE2(HUP_KEYBOARD, 0xE7), 1118 hid_input, 0, &sc->sc_loc_win_r, &flags, 1119 &sc->sc_id_win_r)) { 1120 if (flags & HIO_VARIABLE) 1121 sc->sc_flags |= UKBD_FLAG_WIN_R; 1122 DPRINTFN(1, "Found right GUI\n"); 1123 } 1124 /* figure out event buffer */ 1125 if (hid_locate(ptr, len, 1126 HID_USAGE2(HUP_KEYBOARD, 0x00), 1127 hid_input, 0, &sc->sc_loc_events, &flags, 1128 &sc->sc_id_events)) { 1129 sc->sc_flags |= UKBD_FLAG_EVENTS; 1130 DPRINTFN(1, "Found keyboard events\n"); 1131 } 1132 1133 /* figure out leds on keyboard */ 1134 sc->sc_led_size = hid_report_size(ptr, len, 1135 hid_output, NULL); 1136 1137 if (hid_locate(ptr, len, 1138 HID_USAGE2(HUP_LEDS, 0x01), 1139 hid_output, 0, &sc->sc_loc_numlock, &flags, 1140 &sc->sc_id_numlock)) { 1141 if (flags & HIO_VARIABLE) 1142 sc->sc_flags |= UKBD_FLAG_NUMLOCK; 1143 DPRINTFN(1, "Found keyboard numlock\n"); 1144 } 1145 if (hid_locate(ptr, len, 1146 HID_USAGE2(HUP_LEDS, 0x02), 1147 hid_output, 0, &sc->sc_loc_capslock, &flags, 1148 &sc->sc_id_capslock)) { 1149 if (flags & HIO_VARIABLE) 1150 sc->sc_flags |= UKBD_FLAG_CAPSLOCK; 1151 DPRINTFN(1, "Found keyboard capslock\n"); 1152 } 1153 if (hid_locate(ptr, len, 1154 HID_USAGE2(HUP_LEDS, 0x03), 1155 hid_output, 0, &sc->sc_loc_scrolllock, &flags, 1156 &sc->sc_id_scrolllock)) { 1157 if (flags & HIO_VARIABLE) 1158 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK; 1159 DPRINTFN(1, "Found keyboard scrolllock\n"); 1160 } 1161 } 1162 1163 static int 1164 ukbd_attach(device_t dev) 1165 { 1166 struct ukbd_softc *sc = device_get_softc(dev); 1167 struct usb_attach_arg *uaa = device_get_ivars(dev); 1168 int32_t unit = device_get_unit(dev); 1169 keyboard_t *kbd = &sc->sc_kbd; 1170 void *hid_ptr = NULL; 1171 usb_error_t err; 1172 uint16_t n; 1173 uint16_t hid_len; 1174 1175 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, 1176 unit, 0, KB_PRI_USB, 0, 0); 1177 1178 kbd->kb_data = (void *)sc; 1179 1180 device_set_usb_desc(dev); 1181 1182 sc->sc_udev = uaa->device; 1183 sc->sc_iface = uaa->iface; 1184 sc->sc_iface_index = uaa->info.bIfaceIndex; 1185 sc->sc_iface_no = uaa->info.bIfaceNum; 1186 sc->sc_mode = K_XLATE; 1187 1188 usb_callout_init_mtx(&sc->sc_callout, &kbd->kb_lock, 0); 1189 1190 err = usbd_transfer_setup(uaa->device, 1191 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config, 1192 UKBD_N_TRANSFER, sc, &sc->sc_kbd.kb_lock); 1193 1194 if (err) { 1195 DPRINTF("error=%s\n", usbd_errstr(err)); 1196 goto detach; 1197 } 1198 /* setup default keyboard maps */ 1199 1200 sc->sc_keymap = key_map; 1201 sc->sc_accmap = accent_map; 1202 for (n = 0; n < UKBD_NFKEY; n++) { 1203 sc->sc_fkeymap[n] = fkey_tab[n]; 1204 } 1205 1206 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap, 1207 sc->sc_fkeymap, UKBD_NFKEY); 1208 1209 KBD_FOUND_DEVICE(kbd); 1210 1211 ukbd_clear_state(kbd); 1212 1213 /* 1214 * FIXME: set the initial value for lock keys in "sc_state" 1215 * according to the BIOS data? 1216 */ 1217 KBD_PROBE_DONE(kbd); 1218 1219 /* get HID descriptor */ 1220 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr, 1221 &hid_len, M_TEMP, uaa->info.bIfaceIndex); 1222 1223 if (err == 0) { 1224 DPRINTF("Parsing HID descriptor of %d bytes\n", 1225 (int)hid_len); 1226 1227 ukbd_parse_hid(sc, hid_ptr, hid_len); 1228 1229 kfree(hid_ptr, M_TEMP); 1230 } 1231 1232 /* check if we should use the boot protocol */ 1233 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) || 1234 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) { 1235 1236 DPRINTF("Forcing boot protocol\n"); 1237 1238 err = usbd_req_set_protocol(sc->sc_udev, NULL, 1239 sc->sc_iface_index, 0); 1240 1241 if (err != 0) { 1242 DPRINTF("Set protocol error=%s (ignored)\n", 1243 usbd_errstr(err)); 1244 } 1245 1246 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc)); 1247 } 1248 1249 /* ignore if SETIDLE fails, hence it is not crucial */ 1250 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0); 1251 1252 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state); 1253 1254 KBD_INIT_DONE(kbd); 1255 1256 if (kbd_register(kbd) < 0) { 1257 goto detach; 1258 } 1259 KBD_CONFIG_DONE(kbd); 1260 1261 ukbd_enable(kbd); 1262 1263 #ifdef KBD_INSTALL_CDEV 1264 if (kbd_attach(kbd)) { 1265 goto detach; 1266 } 1267 #endif 1268 sc->sc_flags |= UKBD_FLAG_ATTACHED; 1269 1270 if (bootverbose) { 1271 genkbd_diag(kbd, bootverbose); 1272 } 1273 1274 /* start the keyboard */ 1275 UKBD_LOCK(sc); 1276 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]); 1277 UKBD_UNLOCK(sc); 1278 1279 return (0); /* success */ 1280 1281 detach: 1282 ukbd_detach(dev); 1283 return (ENXIO); /* error */ 1284 } 1285 1286 static int 1287 ukbd_detach(device_t dev) 1288 { 1289 struct ukbd_softc *sc = device_get_softc(dev); 1290 int error; 1291 1292 DPRINTF("\n"); 1293 1294 crit_enter(); 1295 sc->sc_flags |= UKBD_FLAG_GONE; 1296 1297 usb_callout_stop(&sc->sc_callout); 1298 1299 ukbd_disable(&sc->sc_kbd); 1300 1301 /* 1302 * XXX make sure this is in the correct place here, 1303 * it was taken from below the second if() 1304 */ 1305 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER); 1306 usb_callout_drain(&sc->sc_callout); 1307 1308 #ifdef KBD_INSTALL_CDEV 1309 if (sc->sc_flags & UKBD_FLAG_ATTACHED) { 1310 error = kbd_detach(&sc->sc_kbd); 1311 if (error) { 1312 /* usb attach cannot return an error */ 1313 device_printf(dev, "WARNING: kbd_detach() " 1314 "returned non-zero! (ignored)\n"); 1315 } 1316 } 1317 #endif 1318 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) { 1319 /* 1320 * kbd_unregister requires kb_lock to be held 1321 * but lockuninits it then 1322 */ 1323 UKBD_LOCK(sc); 1324 error = kbd_unregister(&sc->sc_kbd); 1325 if (error) { 1326 /* usb attach cannot return an error */ 1327 device_printf(dev, "WARNING: kbd_unregister() " 1328 "returned non-zero! (ignored)\n"); 1329 } 1330 } 1331 sc->sc_kbd.kb_flags = 0; 1332 1333 1334 crit_exit(); 1335 1336 DPRINTF("%s: disconnected\n", 1337 device_get_nameunit(dev)); 1338 1339 return (0); 1340 } 1341 1342 static int 1343 ukbd_resume(device_t dev) 1344 { 1345 struct ukbd_softc *sc = device_get_softc(dev); 1346 1347 ukbd_clear_state(&sc->sc_kbd); 1348 1349 return (0); 1350 } 1351 1352 /* early keyboard probe, not supported */ 1353 static int 1354 ukbd_configure(int flags) 1355 { 1356 return (0); 1357 } 1358 1359 /* detect a keyboard, not used */ 1360 static int 1361 ukbd__probe(int unit, void *arg, int flags) 1362 { 1363 return (ENXIO); 1364 } 1365 1366 /* reset and initialize the device, not used */ 1367 static int 1368 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) 1369 { 1370 return (ENXIO); 1371 } 1372 1373 /* test the interface to the device, not used */ 1374 static int 1375 ukbd_test_if(keyboard_t *kbd) 1376 { 1377 return (0); 1378 } 1379 1380 /* finish using this keyboard, not used */ 1381 static int 1382 ukbd_term(keyboard_t *kbd) 1383 { 1384 return (ENXIO); 1385 } 1386 1387 /* keyboard interrupt routine, not used */ 1388 static int 1389 ukbd_intr(keyboard_t *kbd, void *arg) 1390 { 1391 return (0); 1392 } 1393 1394 /* lock the access to the keyboard, not used */ 1395 static int 1396 ukbd_lock(keyboard_t *kbd, int lock) 1397 { 1398 return (1); 1399 } 1400 1401 /* 1402 * Enable the access to the device; until this function is called, 1403 * the client cannot read from the keyboard. 1404 */ 1405 static int 1406 ukbd_enable(keyboard_t *kbd) 1407 { 1408 crit_enter(); 1409 KBD_ACTIVATE(kbd); 1410 crit_exit(); 1411 1412 return (0); 1413 } 1414 1415 /* disallow the access to the device */ 1416 static int 1417 ukbd_disable(keyboard_t *kbd) 1418 { 1419 crit_enter(); 1420 KBD_DEACTIVATE(kbd); 1421 crit_exit(); 1422 1423 return (0); 1424 } 1425 1426 /* check if data is waiting */ 1427 /* Currently unused. */ 1428 static int 1429 ukbd_check(keyboard_t *kbd) 1430 { 1431 struct ukbd_softc *sc = kbd->kb_data; 1432 1433 if (!KBD_IS_ACTIVE(kbd)) 1434 return (0); 1435 1436 if (sc->sc_flags & UKBD_FLAG_POLLING) 1437 ukbd_do_poll(sc, 0); 1438 1439 #ifdef UKBD_EMULATE_ATSCANCODE 1440 if (sc->sc_buffered_char[0]) { 1441 return (1); 1442 } 1443 #endif 1444 if (sc->sc_inputs > 0) { 1445 return (1); 1446 } 1447 return (0); 1448 } 1449 1450 /* check if char is waiting */ 1451 static int 1452 ukbd_check_char_locked(keyboard_t *kbd) 1453 { 1454 struct ukbd_softc *sc = kbd->kb_data; 1455 1456 if (!KBD_IS_ACTIVE(kbd)) 1457 return (0); 1458 1459 if ((sc->sc_composed_char > 0) && 1460 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) { 1461 return (1); 1462 } 1463 return (ukbd_check(kbd)); 1464 } 1465 1466 static int 1467 ukbd_check_char(keyboard_t *kbd) 1468 { 1469 int result; 1470 #if 0 1471 struct ukbd_softc *sc = kbd->kb_data; 1472 1473 UKBD_LOCK(sc); 1474 #endif 1475 result = ukbd_check_char_locked(kbd); 1476 #if 0 1477 UKBD_UNLOCK(sc); 1478 #endif 1479 1480 return (result); 1481 } 1482 1483 1484 /* read one byte from the keyboard if it's allowed */ 1485 /* Currently unused. */ 1486 static int 1487 ukbd_read(keyboard_t *kbd, int wait) 1488 { 1489 struct ukbd_softc *sc = kbd->kb_data; 1490 int32_t usbcode; 1491 #ifdef UKBD_EMULATE_ATSCANCODE 1492 uint32_t keycode; 1493 uint32_t scancode; 1494 1495 #endif 1496 1497 if (!KBD_IS_ACTIVE(kbd)) 1498 return (-1); 1499 1500 #ifdef UKBD_EMULATE_ATSCANCODE 1501 if (sc->sc_buffered_char[0]) { 1502 scancode = sc->sc_buffered_char[0]; 1503 if (scancode & SCAN_PREFIX) { 1504 sc->sc_buffered_char[0] &= ~SCAN_PREFIX; 1505 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1); 1506 } 1507 sc->sc_buffered_char[0] = sc->sc_buffered_char[1]; 1508 sc->sc_buffered_char[1] = 0; 1509 return (scancode); 1510 } 1511 #endif /* UKBD_EMULATE_ATSCANCODE */ 1512 1513 /* XXX */ 1514 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1); 1515 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1)) 1516 return (-1); 1517 1518 ++(kbd->kb_count); 1519 1520 #ifdef UKBD_EMULATE_ATSCANCODE 1521 keycode = ukbd_trtab[KEY_INDEX(usbcode)]; 1522 if (keycode == NN) { 1523 return -1; 1524 } 1525 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers, 1526 (usbcode & KEY_RELEASE))); 1527 #else /* !UKBD_EMULATE_ATSCANCODE */ 1528 return (usbcode); 1529 #endif /* UKBD_EMULATE_ATSCANCODE */ 1530 } 1531 1532 /* read char from the keyboard */ 1533 static uint32_t 1534 ukbd_read_char_locked(keyboard_t *kbd, int wait) 1535 { 1536 struct ukbd_softc *sc = kbd->kb_data; 1537 uint32_t action; 1538 uint32_t keycode; 1539 int32_t usbcode; 1540 #ifdef UKBD_EMULATE_ATSCANCODE 1541 uint32_t scancode; 1542 #endif 1543 1544 if (!KBD_IS_ACTIVE(kbd)) 1545 return (NOKEY); 1546 1547 next_code: 1548 1549 /* do we have a composed char to return ? */ 1550 1551 if ((sc->sc_composed_char > 0) && 1552 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) { 1553 1554 action = sc->sc_composed_char; 1555 sc->sc_composed_char = 0; 1556 1557 if (action > 0xFF) { 1558 goto errkey; 1559 } 1560 goto done; 1561 } 1562 #ifdef UKBD_EMULATE_ATSCANCODE 1563 1564 /* do we have a pending raw scan code? */ 1565 1566 if (sc->sc_mode == K_RAW) { 1567 scancode = sc->sc_buffered_char[0]; 1568 if (scancode) { 1569 if (scancode & SCAN_PREFIX) { 1570 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX); 1571 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1); 1572 } 1573 sc->sc_buffered_char[0] = sc->sc_buffered_char[1]; 1574 sc->sc_buffered_char[1] = 0; 1575 return (scancode); 1576 } 1577 } 1578 #endif /* UKBD_EMULATE_ATSCANCODE */ 1579 1580 /* see if there is something in the keyboard port */ 1581 /* XXX */ 1582 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1); 1583 if (usbcode == -1) { 1584 return (NOKEY); 1585 } 1586 ++kbd->kb_count; 1587 1588 #ifdef UKBD_EMULATE_ATSCANCODE 1589 /* USB key index -> key code -> AT scan code */ 1590 keycode = ukbd_trtab[KEY_INDEX(usbcode)]; 1591 if (keycode == NN) { 1592 return (NOKEY); 1593 } 1594 /* return an AT scan code for the K_RAW mode */ 1595 if (sc->sc_mode == K_RAW) { 1596 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers, 1597 (usbcode & KEY_RELEASE))); 1598 } 1599 #else /* !UKBD_EMULATE_ATSCANCODE */ 1600 1601 /* return the byte as is for the K_RAW mode */ 1602 if (sc->sc_mode == K_RAW) { 1603 return (usbcode); 1604 } 1605 /* USB key index -> key code */ 1606 keycode = ukbd_trtab[KEY_INDEX(usbcode)]; 1607 if (keycode == NN) { 1608 return (NOKEY); 1609 } 1610 #endif /* UKBD_EMULATE_ATSCANCODE */ 1611 1612 switch (keycode) { 1613 case 0x38: /* left alt (compose key) */ 1614 if (usbcode & KEY_RELEASE) { 1615 if (sc->sc_flags & UKBD_FLAG_COMPOSE) { 1616 sc->sc_flags &= ~UKBD_FLAG_COMPOSE; 1617 1618 if (sc->sc_composed_char > 0xFF) { 1619 sc->sc_composed_char = 0; 1620 } 1621 } 1622 } else { 1623 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) { 1624 sc->sc_flags |= UKBD_FLAG_COMPOSE; 1625 sc->sc_composed_char = 0; 1626 } 1627 } 1628 break; 1629 /* XXX: I don't like these... */ 1630 case 0x5c: /* print screen */ 1631 if (sc->sc_flags & ALTS) { 1632 keycode = 0x54; /* sysrq */ 1633 } 1634 break; 1635 case 0x68: /* pause/break */ 1636 if (sc->sc_flags & CTLS) { 1637 keycode = 0x6c; /* break */ 1638 } 1639 break; 1640 } 1641 1642 /* return the key code in the K_CODE mode */ 1643 if (usbcode & KEY_RELEASE) { 1644 keycode |= SCAN_RELEASE; 1645 } 1646 if (sc->sc_mode == K_CODE) { 1647 return (keycode); 1648 } 1649 /* compose a character code */ 1650 if (sc->sc_flags & UKBD_FLAG_COMPOSE) { 1651 switch (keycode) { 1652 /* key pressed, process it */ 1653 case 0x47: 1654 case 0x48: 1655 case 0x49: /* keypad 7,8,9 */ 1656 sc->sc_composed_char *= 10; 1657 sc->sc_composed_char += keycode - 0x40; 1658 goto check_composed; 1659 1660 case 0x4B: 1661 case 0x4C: 1662 case 0x4D: /* keypad 4,5,6 */ 1663 sc->sc_composed_char *= 10; 1664 sc->sc_composed_char += keycode - 0x47; 1665 goto check_composed; 1666 1667 case 0x4F: 1668 case 0x50: 1669 case 0x51: /* keypad 1,2,3 */ 1670 sc->sc_composed_char *= 10; 1671 sc->sc_composed_char += keycode - 0x4E; 1672 goto check_composed; 1673 1674 case 0x52: /* keypad 0 */ 1675 sc->sc_composed_char *= 10; 1676 goto check_composed; 1677 1678 /* key released, no interest here */ 1679 case SCAN_RELEASE | 0x47: 1680 case SCAN_RELEASE | 0x48: 1681 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */ 1682 case SCAN_RELEASE | 0x4B: 1683 case SCAN_RELEASE | 0x4C: 1684 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */ 1685 case SCAN_RELEASE | 0x4F: 1686 case SCAN_RELEASE | 0x50: 1687 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */ 1688 case SCAN_RELEASE | 0x52: /* keypad 0 */ 1689 goto next_code; 1690 1691 case 0x38: /* left alt key */ 1692 break; 1693 1694 default: 1695 if (sc->sc_composed_char > 0) { 1696 sc->sc_flags &= ~UKBD_FLAG_COMPOSE; 1697 sc->sc_composed_char = 0; 1698 goto errkey; 1699 } 1700 break; 1701 } 1702 } 1703 /* keycode to key action */ 1704 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode), 1705 (keycode & SCAN_RELEASE), 1706 &sc->sc_state, &sc->sc_accents); 1707 if (action == NOKEY) { 1708 goto next_code; 1709 } 1710 done: 1711 return (action); 1712 1713 check_composed: 1714 if (sc->sc_composed_char <= 0xFF) { 1715 goto next_code; 1716 } 1717 errkey: 1718 return (ERRKEY); 1719 } 1720 1721 /* Currently wait is always false. */ 1722 static uint32_t 1723 ukbd_read_char(keyboard_t *kbd, int wait) 1724 { 1725 uint32_t keycode; 1726 #if 0 1727 struct ukbd_softc *sc = kbd->kb_data; 1728 1729 UKBD_LOCK(sc); 1730 #endif 1731 keycode = ukbd_read_char_locked(kbd, wait); 1732 #if 0 1733 UKBD_UNLOCK(sc); 1734 #endif 1735 1736 return (keycode); 1737 } 1738 1739 /* some useful control functions */ 1740 static int 1741 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg) 1742 { 1743 struct ukbd_softc *sc = kbd->kb_data; 1744 int i; 1745 #if 0 /* XXX */ 1746 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 1747 defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 1748 int ival; 1749 1750 #endif 1751 #endif 1752 1753 switch (cmd) { 1754 case KDGKBMODE: /* get keyboard mode */ 1755 *(int *)arg = sc->sc_mode; 1756 break; 1757 #if 0 /* XXX */ 1758 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 1759 defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 1760 case _IO('K', 7): 1761 ival = IOCPARM_IVAL(arg); 1762 arg = (caddr_t)&ival; 1763 /* FALLTHROUGH */ 1764 #endif 1765 #endif 1766 case KDSKBMODE: /* set keyboard mode */ 1767 switch (*(int *)arg) { 1768 case K_XLATE: 1769 if (sc->sc_mode != K_XLATE) { 1770 /* make lock key state and LED state match */ 1771 sc->sc_state &= ~LOCK_MASK; 1772 sc->sc_state |= KBD_LED_VAL(kbd); 1773 } 1774 /* FALLTHROUGH */ 1775 case K_RAW: 1776 case K_CODE: 1777 if (sc->sc_mode != *(int *)arg) { 1778 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0) 1779 ukbd_clear_state(kbd); 1780 sc->sc_mode = *(int *)arg; 1781 } 1782 break; 1783 default: 1784 return (EINVAL); 1785 } 1786 break; 1787 1788 case KDGETLED: /* get keyboard LED */ 1789 *(int *)arg = KBD_LED_VAL(kbd); 1790 break; 1791 #if 0 /* XXX */ 1792 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 1793 defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 1794 case _IO('K', 66): 1795 ival = IOCPARM_IVAL(arg); 1796 arg = (caddr_t)&ival; 1797 /* FALLTHROUGH */ 1798 #endif 1799 #endif 1800 case KDSETLED: /* set keyboard LED */ 1801 /* NOTE: lock key state in "sc_state" won't be changed */ 1802 if (*(int *)arg & ~LOCK_MASK) 1803 return (EINVAL); 1804 1805 i = *(int *)arg; 1806 1807 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */ 1808 if (sc->sc_mode == K_XLATE && 1809 kbd->kb_keymap->n_keys > ALTGR_OFFSET) { 1810 if (i & ALKED) 1811 i |= CLKED; 1812 else 1813 i &= ~CLKED; 1814 } 1815 if (KBD_HAS_DEVICE(kbd)) 1816 ukbd_set_leds(sc, i); 1817 1818 KBD_LED_VAL(kbd) = *(int *)arg; 1819 break; 1820 case KDGKBSTATE: /* get lock key state */ 1821 *(int *)arg = sc->sc_state & LOCK_MASK; 1822 break; 1823 #if 0 /* XXX */ 1824 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 1825 defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 1826 case _IO('K', 20): 1827 ival = IOCPARM_IVAL(arg); 1828 arg = (caddr_t)&ival; 1829 /* FALLTHROUGH */ 1830 #endif 1831 #endif 1832 case KDSKBSTATE: /* set lock key state */ 1833 if (*(int *)arg & ~LOCK_MASK) { 1834 return (EINVAL); 1835 } 1836 sc->sc_state &= ~LOCK_MASK; 1837 sc->sc_state |= *(int *)arg; 1838 1839 /* set LEDs and quit */ 1840 return (ukbd_ioctl(kbd, KDSETLED, arg)); 1841 1842 case KDSETREPEAT: /* set keyboard repeat rate (new 1843 * interface) */ 1844 if (!KBD_HAS_DEVICE(kbd)) { 1845 return (0); 1846 } 1847 if (((int *)arg)[1] < 0) { 1848 return (EINVAL); 1849 } 1850 if (((int *)arg)[0] < 0) { 1851 return (EINVAL); 1852 } 1853 if (((int *)arg)[0] < 200) /* fastest possible value */ 1854 kbd->kb_delay1 = 200; 1855 else 1856 kbd->kb_delay1 = ((int *)arg)[0]; 1857 kbd->kb_delay2 = ((int *)arg)[1]; 1858 return (0); 1859 1860 #if 0 /* XXX */ 1861 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 1862 defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 1863 case _IO('K', 67): 1864 ival = IOCPARM_IVAL(arg); 1865 arg = (caddr_t)&ival; 1866 /* FALLTHROUGH */ 1867 #endif 1868 #endif 1869 case KDSETRAD: /* set keyboard repeat rate (old 1870 * interface) */ 1871 return (ukbd_set_typematic(kbd, *(int *)arg)); 1872 1873 case PIO_KEYMAP: /* set keyboard translation table */ 1874 case PIO_KEYMAPENT: /* set keyboard translation table 1875 * entry */ 1876 case PIO_DEADKEYMAP: /* set accent key translation table */ 1877 sc->sc_accents = 0; 1878 /* FALLTHROUGH */ 1879 default: 1880 return (genkbd_commonioctl(kbd, cmd, arg)); 1881 } 1882 1883 return (0); 1884 } 1885 1886 static int 1887 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) 1888 { 1889 int result; 1890 struct ukbd_softc *sc = kbd->kb_data; 1891 1892 /* 1893 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any 1894 * context where printf(9) can be called, which among other things 1895 * includes interrupt filters and threads with any kinds of locks 1896 * already held. For this reason it would be dangerous to acquire 1897 * the Giant here unconditionally. On the other hand we have to 1898 * have it to handle the ioctl. 1899 * So we make our best effort to auto-detect whether we can grab 1900 * the Giant or not. Blame syscons(4) for this. 1901 */ 1902 switch (cmd) { 1903 case KDGKBSTATE: 1904 case KDSKBSTATE: 1905 case KDSETLED: 1906 if(!lockowned(&kbd->kb_lock)) { 1907 return (EDEADLK); /* best I could come up with */ 1908 } 1909 /* FALLTHROUGH */ 1910 default: 1911 UKBD_LOCK(sc); 1912 result = ukbd_ioctl_locked(kbd, cmd, arg); 1913 UKBD_UNLOCK(sc); 1914 return (result); 1915 } 1916 } 1917 1918 1919 /* clear the internal state of the keyboard */ 1920 static void 1921 ukbd_clear_state(keyboard_t *kbd) 1922 { 1923 struct ukbd_softc *sc = kbd->kb_data; 1924 1925 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING); 1926 sc->sc_state &= LOCK_MASK; /* preserve locking key state */ 1927 sc->sc_accents = 0; 1928 sc->sc_composed_char = 0; 1929 #ifdef UKBD_EMULATE_ATSCANCODE 1930 sc->sc_buffered_char[0] = 0; 1931 sc->sc_buffered_char[1] = 0; 1932 #endif 1933 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata)); 1934 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata)); 1935 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime)); 1936 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime)); 1937 } 1938 1939 /* save the internal state, not used */ 1940 static int 1941 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len) 1942 { 1943 return (len == 0) ? 1 : -1; 1944 } 1945 1946 /* set the internal state, not used */ 1947 static int 1948 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len) 1949 { 1950 return (EINVAL); 1951 } 1952 1953 static int 1954 ukbd_poll(keyboard_t *kbd, int on) 1955 { 1956 struct ukbd_softc *sc = kbd->kb_data; 1957 1958 UKBD_LOCK(sc); 1959 if (on) { 1960 sc->sc_flags |= UKBD_FLAG_POLLING; 1961 sc->sc_poll_thread = curthread; 1962 } else { 1963 sc->sc_flags &= ~UKBD_FLAG_POLLING; 1964 ukbd_start_timer(sc); /* start timer */ 1965 } 1966 UKBD_UNLOCK(sc); 1967 1968 return (0); 1969 } 1970 1971 /* local functions */ 1972 1973 static void 1974 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds) 1975 { 1976 UKBD_LOCK_ASSERT(); 1977 DPRINTF("leds=0x%02x\n", leds); 1978 1979 sc->sc_leds = leds; 1980 sc->sc_flags |= UKBD_FLAG_SET_LEDS; 1981 1982 /* start transfer, if not already started */ 1983 1984 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]); 1985 } 1986 1987 static int 1988 ukbd_set_typematic(keyboard_t *kbd, int code) 1989 { 1990 static const int delays[] = {250, 500, 750, 1000}; 1991 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63, 1992 68, 76, 84, 92, 100, 110, 118, 126, 1993 136, 152, 168, 184, 200, 220, 236, 252, 1994 272, 304, 336, 368, 400, 440, 472, 504}; 1995 1996 if (code & ~0x7f) { 1997 return (EINVAL); 1998 } 1999 kbd->kb_delay1 = delays[(code >> 5) & 3]; 2000 kbd->kb_delay2 = rates[code & 0x1f]; 2001 return (0); 2002 } 2003 2004 #ifdef UKBD_EMULATE_ATSCANCODE 2005 static int 2006 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up) 2007 { 2008 static const int scan[] = { 2009 /* 89 */ 2010 0x11c, /* Enter */ 2011 /* 90-99 */ 2012 0x11d, /* Ctrl-R */ 2013 0x135, /* Divide */ 2014 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */ 2015 0x138, /* Alt-R */ 2016 0x147, /* Home */ 2017 0x148, /* Up */ 2018 0x149, /* PageUp */ 2019 0x14b, /* Left */ 2020 0x14d, /* Right */ 2021 0x14f, /* End */ 2022 /* 100-109 */ 2023 0x150, /* Down */ 2024 0x151, /* PageDown */ 2025 0x152, /* Insert */ 2026 0x153, /* Delete */ 2027 0x146, /* XXX Pause/Break */ 2028 0x15b, /* Win_L(Super_L) */ 2029 0x15c, /* Win_R(Super_R) */ 2030 0x15d, /* Application(Menu) */ 2031 2032 /* SUN TYPE 6 USB KEYBOARD */ 2033 0x168, /* Sun Type 6 Help */ 2034 0x15e, /* Sun Type 6 Stop */ 2035 /* 110 - 119 */ 2036 0x15f, /* Sun Type 6 Again */ 2037 0x160, /* Sun Type 6 Props */ 2038 0x161, /* Sun Type 6 Undo */ 2039 0x162, /* Sun Type 6 Front */ 2040 0x163, /* Sun Type 6 Copy */ 2041 0x164, /* Sun Type 6 Open */ 2042 0x165, /* Sun Type 6 Paste */ 2043 0x166, /* Sun Type 6 Find */ 2044 0x167, /* Sun Type 6 Cut */ 2045 0x125, /* Sun Type 6 Mute */ 2046 /* 120 - 128 */ 2047 0x11f, /* Sun Type 6 VolumeDown */ 2048 0x11e, /* Sun Type 6 VolumeUp */ 2049 0x120, /* Sun Type 6 PowerDown */ 2050 2051 /* Japanese 106/109 keyboard */ 2052 0x73, /* Keyboard Intl' 1 (backslash / underscore) */ 2053 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */ 2054 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */ 2055 0x79, /* Keyboard Intl' 4 (Henkan) */ 2056 0x7b, /* Keyboard Intl' 5 (Muhenkan) */ 2057 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */ 2058 }; 2059 2060 if ((code >= 89) && (code < (89 + (sizeof(scan) / sizeof(scan[0]))))) { 2061 code = scan[code - 89]; 2062 } 2063 /* Pause/Break */ 2064 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) { 2065 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL); 2066 } 2067 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) { 2068 code &= ~SCAN_PREFIX_SHIFT; 2069 } 2070 code |= (up ? SCAN_RELEASE : SCAN_PRESS); 2071 2072 if (code & SCAN_PREFIX) { 2073 if (code & SCAN_PREFIX_CTL) { 2074 /* Ctrl */ 2075 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE)); 2076 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX); 2077 } else if (code & SCAN_PREFIX_SHIFT) { 2078 /* Shift */ 2079 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE)); 2080 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT); 2081 } else { 2082 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX); 2083 sc->sc_buffered_char[1] = 0; 2084 } 2085 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1); 2086 } 2087 return (code); 2088 2089 } 2090 2091 #endif /* UKBD_EMULATE_ATSCANCODE */ 2092 2093 static keyboard_switch_t ukbdsw = { 2094 .probe = &ukbd__probe, 2095 .init = &ukbd_init, 2096 .term = &ukbd_term, 2097 .intr = &ukbd_intr, 2098 .test_if = &ukbd_test_if, 2099 .enable = &ukbd_enable, 2100 .disable = &ukbd_disable, 2101 .read = &ukbd_read, 2102 .check = &ukbd_check, 2103 .read_char = &ukbd_read_char, 2104 .check_char = &ukbd_check_char, 2105 .ioctl = &ukbd_ioctl, 2106 .lock = &ukbd_lock, 2107 .clear_state = &ukbd_clear_state, 2108 .get_state = &ukbd_get_state, 2109 .set_state = &ukbd_set_state, 2110 .get_fkeystr = &genkbd_get_fkeystr, 2111 .poll = &ukbd_poll, 2112 .diag = &genkbd_diag, 2113 }; 2114 2115 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure); 2116 2117 static int 2118 ukbd_driver_load(module_t mod, int what, void *arg) 2119 { 2120 switch (what) { 2121 case MOD_LOAD: 2122 kbd_add_driver(&ukbd_kbd_driver); 2123 break; 2124 case MOD_UNLOAD: 2125 kbd_delete_driver(&ukbd_kbd_driver); 2126 break; 2127 } 2128 return (0); 2129 } 2130 2131 static devclass_t ukbd_devclass; 2132 2133 static device_method_t ukbd_methods[] = { 2134 DEVMETHOD(device_probe, ukbd_probe), 2135 DEVMETHOD(device_attach, ukbd_attach), 2136 DEVMETHOD(device_detach, ukbd_detach), 2137 DEVMETHOD(device_resume, ukbd_resume), 2138 {0, 0} 2139 }; 2140 2141 static driver_t ukbd_driver = { 2142 .name = "ukbd", 2143 .methods = ukbd_methods, 2144 .size = sizeof(struct ukbd_softc), 2145 }; 2146 2147 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, NULL); 2148 MODULE_DEPEND(ukbd, usb, 1, 1, 1); 2149 MODULE_VERSION(ukbd, 1); 2150