6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at
11 * Carlstedt Research & Technology.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
37 * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
40 #include "opt_compat.h"
44 #include <sys/stdint.h>
45 #include <sys/stddef.h>
46 #include <sys/param.h>
47 #include <sys/queue.h>
48 #include <sys/types.h>
49 #include <sys/systm.h>
50 #include <sys/kernel.h>
52 #include <sys/module.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
63 #include <sys/sched.h>
66 #include <dev/usb/usb.h>
67 #include <dev/usb/usbdi.h>
68 #include <dev/usb/usbdi_util.h>
69 #include <dev/usb/usbhid.h>
71 #define USB_DEBUG_VAR ukbd_debug
72 #include <dev/usb/usb_debug.h>
74 #include <dev/usb/quirk/usb_quirk.h>
76 #include <sys/ioccom.h>
77 #include <sys/filio.h>
81 #include <dev/kbd/kbdreg.h>
83 /* the initial key map, accent map and fkey strings */
84 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
85 #define KBD_DFLT_KEYMAP
89 /* the following file must be included after "ukbdmap.h" */
90 #include <dev/kbd/kbdtables.h>
93 static int ukbd_debug = 0;
94 static int ukbd_no_leds = 0;
96 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
97 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
98 &ukbd_debug, 0, "Debug level");
99 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
100 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
101 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
102 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
105 #define UKBD_EMULATE_ATSCANCODE 1
106 #define UKBD_DRIVER_NAME "ukbd"
107 #define UKBD_NMOD 8 /* units */
108 #define UKBD_NKEYCODE 6 /* units */
109 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
110 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
111 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
112 #define UKBD_BUFFER_SIZE 64 /* bytes */
116 #define MOD_CONTROL_L 0x01
117 #define MOD_CONTROL_R 0x10
118 #define MOD_SHIFT_L 0x02
119 #define MOD_SHIFT_R 0x20
120 #define MOD_ALT_L 0x04
121 #define MOD_ALT_R 0x40
122 #define MOD_WIN_L 0x08
123 #define MOD_WIN_R 0x80
125 #define MOD_EJECT 0x0100
126 #define MOD_FN 0x0200
127 uint8_t keycode[UKBD_NKEYCODE];
139 accentmap_t sc_accmap;
140 fkeytab_t sc_fkeymap[UKBD_NFKEY];
141 struct hid_location sc_loc_apple_eject;
142 struct hid_location sc_loc_apple_fn;
143 struct hid_location sc_loc_ctrl_l;
144 struct hid_location sc_loc_ctrl_r;
145 struct hid_location sc_loc_shift_l;
146 struct hid_location sc_loc_shift_r;
147 struct hid_location sc_loc_alt_l;
148 struct hid_location sc_loc_alt_r;
149 struct hid_location sc_loc_win_l;
150 struct hid_location sc_loc_win_r;
151 struct hid_location sc_loc_events;
152 struct hid_location sc_loc_numlock;
153 struct hid_location sc_loc_capslock;
154 struct hid_location sc_loc_scrolllock;
155 struct usb_callout sc_callout;
156 struct ukbd_data sc_ndata;
157 struct ukbd_data sc_odata;
159 struct thread *sc_poll_thread;
160 struct usb_device *sc_udev;
161 struct usb_interface *sc_iface;
162 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
164 uint32_t sc_ntime[UKBD_NKEYCODE];
165 uint32_t sc_otime[UKBD_NKEYCODE];
166 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
168 uint32_t sc_composed_char; /* composed char code, if non-zero */
169 #ifdef UKBD_EMULATE_ATSCANCODE
170 uint32_t sc_buffered_char[2];
172 uint32_t sc_flags; /* flags */
173 #define UKBD_FLAG_COMPOSE 0x00000001
174 #define UKBD_FLAG_POLLING 0x00000002
175 #define UKBD_FLAG_SET_LEDS 0x00000004
176 #define UKBD_FLAG_ATTACHED 0x00000010
177 #define UKBD_FLAG_GONE 0x00000020
179 #define UKBD_FLAG_HID_MASK 0x003fffc0
180 #define UKBD_FLAG_APPLE_EJECT 0x00000040
181 #define UKBD_FLAG_APPLE_FN 0x00000080
182 #define UKBD_FLAG_APPLE_SWAP 0x00000100
183 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
184 #define UKBD_FLAG_CTRL_L 0x00000400
185 #define UKBD_FLAG_CTRL_R 0x00000800
186 #define UKBD_FLAG_SHIFT_L 0x00001000
187 #define UKBD_FLAG_SHIFT_R 0x00002000
188 #define UKBD_FLAG_ALT_L 0x00004000
189 #define UKBD_FLAG_ALT_R 0x00008000
190 #define UKBD_FLAG_WIN_L 0x00010000
191 #define UKBD_FLAG_WIN_R 0x00020000
192 #define UKBD_FLAG_EVENTS 0x00040000
193 #define UKBD_FLAG_NUMLOCK 0x00080000
194 #define UKBD_FLAG_CAPSLOCK 0x00100000
195 #define UKBD_FLAG_SCROLLLOCK 0x00200000
197 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
198 int sc_state; /* shift/lock key state */
199 int sc_accents; /* accent key index (> 0) */
204 uint16_t sc_inputhead;
205 uint16_t sc_inputtail;
206 uint16_t sc_modifiers;
208 uint8_t sc_leds; /* store for async led requests */
209 uint8_t sc_iface_index;
211 uint8_t sc_id_apple_eject;
212 uint8_t sc_id_apple_fn;
213 uint8_t sc_id_ctrl_l;
214 uint8_t sc_id_ctrl_r;
215 uint8_t sc_id_shift_l;
216 uint8_t sc_id_shift_r;
222 uint8_t sc_id_numlock;
223 uint8_t sc_id_capslock;
224 uint8_t sc_id_scrolllock;
225 uint8_t sc_id_events;
228 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
231 #define KEY_ERROR 0x01
234 #define KEY_RELEASE 0x400
235 #define KEY_INDEX(c) ((c) & 0xFF)
238 #define SCAN_RELEASE 0x80
239 #define SCAN_PREFIX_E0 0x100
240 #define SCAN_PREFIX_E1 0x200
241 #define SCAN_PREFIX_CTL 0x400
242 #define SCAN_PREFIX_SHIFT 0x800
243 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
244 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
245 #define SCAN_CHAR(c) ((c) & 0x7f)
247 #define UKBD_LOCK() mtx_lock(&Giant)
248 #define UKBD_UNLOCK() mtx_unlock(&Giant)
253 * Assert that the lock is held in all contexts
254 * where the code can be executed.
256 #define UKBD_LOCK_ASSERT() mtx_assert(&Giant, MA_OWNED)
259 * Assert that the lock is held in the contexts
260 * where it really has to be so.
262 #define UKBD_CTX_LOCK_ASSERT() \
264 if (!kdb_active && panicstr == NULL) \
265 mtx_assert(&Giant, MA_OWNED); \
269 #define UKBD_LOCK_ASSERT() (void)0
270 #define UKBD_CTX_LOCK_ASSERT() (void)0
278 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
279 {MOD_CONTROL_L, 0xe0},
280 {MOD_CONTROL_R, 0xe4},
289 #define NN 0 /* no translation */
291 * Translate USB keycodes to AT keyboard scancodes.
294 * FIXME: Mac USB keyboard generates:
295 * 0x53: keypad NumLock/Clear
302 static const uint8_t ukbd_trtab[256] = {
303 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
304 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
305 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
306 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
307 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
308 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
309 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
310 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
311 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
312 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
313 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
314 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
315 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
316 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
317 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
318 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
319 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
320 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
331 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
337 static const uint8_t ukbd_boot_desc[] = {
338 0x05, 0x01, 0x09, 0x06, 0xa1,
339 0x01, 0x05, 0x07, 0x19, 0xe0,
340 0x29, 0xe7, 0x15, 0x00, 0x25,
341 0x01, 0x75, 0x01, 0x95, 0x08,
342 0x81, 0x02, 0x95, 0x01, 0x75,
343 0x08, 0x81, 0x01, 0x95, 0x03,
344 0x75, 0x01, 0x05, 0x08, 0x19,
345 0x01, 0x29, 0x03, 0x91, 0x02,
346 0x95, 0x05, 0x75, 0x01, 0x91,
347 0x01, 0x95, 0x06, 0x75, 0x08,
348 0x15, 0x00, 0x26, 0xff, 0x00,
349 0x05, 0x07, 0x19, 0x00, 0x2a,
350 0xff, 0x00, 0x81, 0x00, 0xc0
354 static void ukbd_timeout(void *);
355 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
356 static int ukbd_set_typematic(keyboard_t *, int);
357 #ifdef UKBD_EMULATE_ATSCANCODE
358 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
360 static uint32_t ukbd_read_char(keyboard_t *, int);
361 static void ukbd_clear_state(keyboard_t *);
362 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
363 static int ukbd_enable(keyboard_t *);
364 static int ukbd_disable(keyboard_t *);
365 static void ukbd_interrupt(struct ukbd_softc *);
366 static void ukbd_event_keyinput(struct ukbd_softc *);
368 static device_probe_t ukbd_probe;
369 static device_attach_t ukbd_attach;
370 static device_detach_t ukbd_detach;
371 static device_resume_t ukbd_resume;
374 ukbd_any_key_pressed(struct ukbd_softc *sc)
379 for (j = i = 0; i < UKBD_NKEYCODE; i++)
380 j |= sc->sc_odata.keycode[i];
386 ukbd_start_timer(struct ukbd_softc *sc)
388 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
389 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
393 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
396 UKBD_CTX_LOCK_ASSERT();
398 DPRINTF("0x%02x (%d) %s\n", key, key,
399 (key & KEY_RELEASE) ? "released" : "pressed");
401 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
402 sc->sc_input[sc->sc_inputtail] = key;
404 ++(sc->sc_inputtail);
405 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
406 sc->sc_inputtail = 0;
409 DPRINTF("input buffer is full\n");
414 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
417 UKBD_CTX_LOCK_ASSERT();
418 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
419 ("ukbd_do_poll called when not polling\n"));
420 DPRINTFN(2, "polling\n");
422 if (!kdb_active && !SCHEDULER_STOPPED()) {
424 * In this context the kernel is polling for input,
425 * but the USB subsystem works in normal interrupt-driven
426 * mode, so we just wait on the USB threads to do the job.
427 * Note that we currently hold the Giant, but it's also used
428 * as the transfer mtx, so we must release it while waiting.
430 while (sc->sc_inputs == 0) {
432 * Give USB threads a chance to run. Note that
433 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
435 kern_yield(PRI_UNCHANGED);
442 while (sc->sc_inputs == 0) {
444 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
446 /* Delay-optimised support for repetition of keys */
447 if (ukbd_any_key_pressed(sc)) {
448 /* a key is pressed - need timekeeping */
451 /* 1 millisecond has passed */
463 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
467 UKBD_CTX_LOCK_ASSERT();
468 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
469 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
470 ("not polling in kdb or panic\n"));
472 if (sc->sc_inputs == 0 &&
473 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
474 /* start transfer, if not already started */
475 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
478 if (sc->sc_flags & UKBD_FLAG_POLLING)
479 ukbd_do_poll(sc, wait);
481 if (sc->sc_inputs == 0) {
484 c = sc->sc_input[sc->sc_inputhead];
486 ++(sc->sc_inputhead);
487 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
488 sc->sc_inputhead = 0;
495 ukbd_interrupt(struct ukbd_softc *sc)
499 uint32_t now = sc->sc_time_ms;
505 UKBD_CTX_LOCK_ASSERT();
507 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
510 n_mod = sc->sc_ndata.modifiers;
511 o_mod = sc->sc_odata.modifiers;
512 if (n_mod != o_mod) {
513 for (i = 0; i < UKBD_NMOD; i++) {
514 if ((n_mod & ukbd_mods[i].mask) !=
515 (o_mod & ukbd_mods[i].mask)) {
516 ukbd_put_key(sc, ukbd_mods[i].key |
517 ((n_mod & ukbd_mods[i].mask) ?
518 KEY_PRESS : KEY_RELEASE));
522 /* Check for released keys. */
523 for (i = 0; i < UKBD_NKEYCODE; i++) {
524 key = sc->sc_odata.keycode[i];
528 for (j = 0; j < UKBD_NKEYCODE; j++) {
529 if (sc->sc_ndata.keycode[j] == 0) {
532 if (key == sc->sc_ndata.keycode[j]) {
536 ukbd_put_key(sc, key | KEY_RELEASE);
540 /* Check for pressed keys. */
541 for (i = 0; i < UKBD_NKEYCODE; i++) {
542 key = sc->sc_ndata.keycode[i];
546 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
547 for (j = 0; j < UKBD_NKEYCODE; j++) {
548 if (sc->sc_odata.keycode[j] == 0) {
551 if (key == sc->sc_odata.keycode[j]) {
553 /* key is still pressed */
555 sc->sc_ntime[i] = sc->sc_otime[j];
556 dtime = (sc->sc_otime[j] - now);
558 if (!(dtime & 0x80000000)) {
559 /* time has not elapsed */
562 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
566 ukbd_put_key(sc, key | KEY_PRESS);
569 * If any other key is presently down, force its repeat to be
570 * well in the future (100s). This makes the last key to be
571 * pressed do the autorepeat.
573 for (j = 0; j != UKBD_NKEYCODE; j++) {
575 sc->sc_ntime[j] = now + (100 * 1000);
580 sc->sc_odata = sc->sc_ndata;
582 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
584 ukbd_event_keyinput(sc);
588 ukbd_event_keyinput(struct ukbd_softc *sc)
592 UKBD_CTX_LOCK_ASSERT();
594 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
597 if (sc->sc_inputs == 0)
600 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
601 KBD_IS_BUSY(&sc->sc_kbd)) {
602 /* let the callback function process the input */
603 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
604 sc->sc_kbd.kb_callback.kc_arg);
606 /* read and discard the input, no one is waiting for it */
608 c = ukbd_read_char(&sc->sc_kbd, 0);
609 } while (c != NOKEY);
614 ukbd_timeout(void *arg)
616 struct ukbd_softc *sc = arg;
620 sc->sc_time_ms += 25; /* milliseconds */
624 /* Make sure any leftover key events gets read out */
625 ukbd_event_keyinput(sc);
627 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
628 ukbd_start_timer(sc);
630 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
635 ukbd_apple_fn(uint8_t keycode) {
637 case 0x28: return 0x49; /* RETURN -> INSERT */
638 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
639 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
640 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
641 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
642 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
643 default: return keycode;
648 ukbd_apple_swap(uint8_t keycode) {
650 case 0x35: return 0x64;
651 case 0x64: return 0x35;
652 default: return keycode;
657 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
659 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
660 struct usb_page_cache *pc;
668 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
669 pc = usbd_xfer_get_frame(xfer, 0);
671 switch (USB_GET_STATE(xfer)) {
672 case USB_ST_TRANSFERRED:
673 DPRINTF("actlen=%d bytes\n", len);
676 DPRINTF("zero length data\n");
680 if (sc->sc_kbd_id != 0) {
681 /* check and remove HID ID byte */
682 usbd_copy_out(pc, 0, &id, 1);
686 DPRINTF("zero length data\n");
694 if (len > UKBD_BUFFER_SIZE)
695 len = UKBD_BUFFER_SIZE;
698 usbd_copy_out(pc, offset, sc->sc_buffer, len);
700 /* clear temporary storage */
701 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
703 /* scan through HID data */
704 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
705 (id == sc->sc_id_apple_eject)) {
706 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
707 sc->sc_modifiers |= MOD_EJECT;
709 sc->sc_modifiers &= ~MOD_EJECT;
711 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
712 (id == sc->sc_id_apple_fn)) {
713 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
714 sc->sc_modifiers |= MOD_FN;
716 sc->sc_modifiers &= ~MOD_FN;
718 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
719 (id == sc->sc_id_ctrl_l)) {
720 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
721 sc-> sc_modifiers |= MOD_CONTROL_L;
723 sc-> sc_modifiers &= ~MOD_CONTROL_L;
725 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
726 (id == sc->sc_id_ctrl_r)) {
727 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
728 sc->sc_modifiers |= MOD_CONTROL_R;
730 sc->sc_modifiers &= ~MOD_CONTROL_R;
732 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
733 (id == sc->sc_id_shift_l)) {
734 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
735 sc->sc_modifiers |= MOD_SHIFT_L;
737 sc->sc_modifiers &= ~MOD_SHIFT_L;
739 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
740 (id == sc->sc_id_shift_r)) {
741 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
742 sc->sc_modifiers |= MOD_SHIFT_R;
744 sc->sc_modifiers &= ~MOD_SHIFT_R;
746 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
747 (id == sc->sc_id_alt_l)) {
748 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
749 sc->sc_modifiers |= MOD_ALT_L;
751 sc->sc_modifiers &= ~MOD_ALT_L;
753 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
754 (id == sc->sc_id_alt_r)) {
755 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
756 sc->sc_modifiers |= MOD_ALT_R;
758 sc->sc_modifiers &= ~MOD_ALT_R;
760 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
761 (id == sc->sc_id_win_l)) {
762 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
763 sc->sc_modifiers |= MOD_WIN_L;
765 sc->sc_modifiers &= ~MOD_WIN_L;
767 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
768 (id == sc->sc_id_win_r)) {
769 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
770 sc->sc_modifiers |= MOD_WIN_R;
772 sc->sc_modifiers &= ~MOD_WIN_R;
775 sc->sc_ndata.modifiers = sc->sc_modifiers;
777 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
778 (id == sc->sc_id_events)) {
779 i = sc->sc_loc_events.count;
780 if (i > UKBD_NKEYCODE)
785 sc->sc_ndata.keycode[i] =
786 hid_get_data(sc->sc_buffer + i, len - i,
792 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
793 for (i = 0; i < UKBD_NKEYCODE; i++) {
794 if (sc->sc_ndata.keycode[i]) {
795 DPRINTF("[%d] = 0x%02x\n",
796 (int)i, (int)sc->sc_ndata.keycode[i]);
800 if (sc->sc_modifiers & MOD_FN) {
801 for (i = 0; i < UKBD_NKEYCODE; i++) {
802 sc->sc_ndata.keycode[i] =
803 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
807 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
808 for (i = 0; i < UKBD_NKEYCODE; i++) {
809 sc->sc_ndata.keycode[i] =
810 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
816 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
817 if (ukbd_any_key_pressed(sc)) {
818 ukbd_start_timer(sc);
824 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
825 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
826 usbd_transfer_submit(xfer);
828 DPRINTF("input queue is full!\n");
833 DPRINTF("error=%s\n", usbd_errstr(error));
835 if (error != USB_ERR_CANCELLED) {
836 /* try to clear stall first */
837 usbd_xfer_set_stall(xfer);
845 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
847 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
848 struct usb_device_request req;
849 struct usb_page_cache *pc;
861 switch (USB_GET_STATE(xfer)) {
862 case USB_ST_TRANSFERRED:
864 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
866 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
868 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
869 req.bRequest = UR_SET_REPORT;
870 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
871 req.wIndex[0] = sc->sc_iface_no;
875 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
880 /* Assumption: All led bits must be in the same ID. */
882 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
883 if (sc->sc_leds & NLKED) {
884 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
885 &sc->sc_loc_numlock, 1);
887 id = sc->sc_id_numlock;
891 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
892 if (sc->sc_leds & SLKED) {
893 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
894 &sc->sc_loc_scrolllock, 1);
896 id = sc->sc_id_scrolllock;
900 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
901 if (sc->sc_leds & CLKED) {
902 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
903 &sc->sc_loc_capslock, 1);
905 id = sc->sc_id_capslock;
909 /* if no leds, nothing to do */
913 /* range check output report length */
914 len = sc->sc_led_size;
915 if (len > (UKBD_BUFFER_SIZE - 1))
916 len = (UKBD_BUFFER_SIZE - 1);
918 /* check if we need to prefix an ID byte */
919 sc->sc_buffer[0] = id;
921 pc = usbd_xfer_get_frame(xfer, 1);
924 usbd_copy_in(pc, 0, sc->sc_buffer, len);
926 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
928 req.wLength[0] = len;
929 usbd_xfer_set_frame_len(xfer, 1, len);
931 DPRINTF("len=%d, id=%d\n", len, id);
933 /* setup control request last */
934 pc = usbd_xfer_get_frame(xfer, 0);
935 usbd_copy_in(pc, 0, &req, sizeof(req));
936 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
938 /* start data transfer */
939 usbd_xfer_set_frames(xfer, 2);
940 usbd_transfer_submit(xfer);
944 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
949 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
952 .type = UE_INTERRUPT,
953 .endpoint = UE_ADDR_ANY,
954 .direction = UE_DIR_IN,
955 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
956 .bufsize = 0, /* use wMaxPacketSize */
957 .callback = &ukbd_intr_callback,
962 .endpoint = 0x00, /* Control pipe */
963 .direction = UE_DIR_ANY,
964 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
965 .callback = &ukbd_set_leds_callback,
966 .timeout = 1000, /* 1 second */
970 /* A match on these entries will load ukbd */
971 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
972 {USB_IFACE_CLASS(UICLASS_HID),
973 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
974 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
978 ukbd_probe(device_t dev)
980 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
981 struct usb_attach_arg *uaa = device_get_ivars(dev);
992 if (uaa->usb_mode != USB_MODE_HOST) {
996 if (uaa->info.bInterfaceClass != UICLASS_HID)
999 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1002 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1003 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1004 return (BUS_PROBE_DEFAULT);
1006 error = usbd_req_get_hid_desc(uaa->device, NULL,
1007 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1012 if (hid_is_keyboard(d_ptr, d_len)) {
1013 if (hid_is_mouse(d_ptr, d_len)) {
1015 * NOTE: We currently don't support USB mouse
1016 * and USB keyboard on the same USB endpoint.
1017 * Let "ums" driver win.
1021 error = BUS_PROBE_DEFAULT;
1026 free(d_ptr, M_TEMP);
1031 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1035 /* reset detected bits */
1036 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1038 /* check if there is an ID byte */
1039 sc->sc_kbd_size = hid_report_size(ptr, len,
1040 hid_input, &sc->sc_kbd_id);
1042 /* investigate if this is an Apple Keyboard */
1043 if (hid_locate(ptr, len,
1044 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1045 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1046 &sc->sc_id_apple_eject)) {
1047 if (flags & HIO_VARIABLE)
1048 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1049 UKBD_FLAG_APPLE_SWAP;
1050 DPRINTFN(1, "Found Apple eject-key\n");
1052 if (hid_locate(ptr, len,
1053 HID_USAGE2(0xFFFF, 0x0003),
1054 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1055 &sc->sc_id_apple_fn)) {
1056 if (flags & HIO_VARIABLE)
1057 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1058 DPRINTFN(1, "Found Apple FN-key\n");
1060 /* figure out some keys */
1061 if (hid_locate(ptr, len,
1062 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1063 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1064 &sc->sc_id_ctrl_l)) {
1065 if (flags & HIO_VARIABLE)
1066 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1067 DPRINTFN(1, "Found left control\n");
1069 if (hid_locate(ptr, len,
1070 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1071 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1072 &sc->sc_id_ctrl_r)) {
1073 if (flags & HIO_VARIABLE)
1074 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1075 DPRINTFN(1, "Found right control\n");
1077 if (hid_locate(ptr, len,
1078 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1079 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1080 &sc->sc_id_shift_l)) {
1081 if (flags & HIO_VARIABLE)
1082 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1083 DPRINTFN(1, "Found left shift\n");
1085 if (hid_locate(ptr, len,
1086 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1087 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1088 &sc->sc_id_shift_r)) {
1089 if (flags & HIO_VARIABLE)
1090 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1091 DPRINTFN(1, "Found right shift\n");
1093 if (hid_locate(ptr, len,
1094 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1095 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1096 &sc->sc_id_alt_l)) {
1097 if (flags & HIO_VARIABLE)
1098 sc->sc_flags |= UKBD_FLAG_ALT_L;
1099 DPRINTFN(1, "Found left alt\n");
1101 if (hid_locate(ptr, len,
1102 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1103 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1104 &sc->sc_id_alt_r)) {
1105 if (flags & HIO_VARIABLE)
1106 sc->sc_flags |= UKBD_FLAG_ALT_R;
1107 DPRINTFN(1, "Found right alt\n");
1109 if (hid_locate(ptr, len,
1110 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1111 hid_input, 0, &sc->sc_loc_win_l, &flags,
1112 &sc->sc_id_win_l)) {
1113 if (flags & HIO_VARIABLE)
1114 sc->sc_flags |= UKBD_FLAG_WIN_L;
1115 DPRINTFN(1, "Found left GUI\n");
1117 if (hid_locate(ptr, len,
1118 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1119 hid_input, 0, &sc->sc_loc_win_r, &flags,
1120 &sc->sc_id_win_r)) {
1121 if (flags & HIO_VARIABLE)
1122 sc->sc_flags |= UKBD_FLAG_WIN_R;
1123 DPRINTFN(1, "Found right GUI\n");
1125 /* figure out event buffer */
1126 if (hid_locate(ptr, len,
1127 HID_USAGE2(HUP_KEYBOARD, 0x00),
1128 hid_input, 0, &sc->sc_loc_events, &flags,
1129 &sc->sc_id_events)) {
1130 if (flags & HIO_VARIABLE) {
1131 DPRINTFN(1, "Ignoring keyboard event control\n");
1133 sc->sc_flags |= UKBD_FLAG_EVENTS;
1134 DPRINTFN(1, "Found keyboard event array\n");
1138 /* figure out leds on keyboard */
1139 sc->sc_led_size = hid_report_size(ptr, len,
1142 if (hid_locate(ptr, len,
1143 HID_USAGE2(HUP_LEDS, 0x01),
1144 hid_output, 0, &sc->sc_loc_numlock, &flags,
1145 &sc->sc_id_numlock)) {
1146 if (flags & HIO_VARIABLE)
1147 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1148 DPRINTFN(1, "Found keyboard numlock\n");
1150 if (hid_locate(ptr, len,
1151 HID_USAGE2(HUP_LEDS, 0x02),
1152 hid_output, 0, &sc->sc_loc_capslock, &flags,
1153 &sc->sc_id_capslock)) {
1154 if (flags & HIO_VARIABLE)
1155 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1156 DPRINTFN(1, "Found keyboard capslock\n");
1158 if (hid_locate(ptr, len,
1159 HID_USAGE2(HUP_LEDS, 0x03),
1160 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1161 &sc->sc_id_scrolllock)) {
1162 if (flags & HIO_VARIABLE)
1163 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1164 DPRINTFN(1, "Found keyboard scrolllock\n");
1169 ukbd_attach(device_t dev)
1171 struct ukbd_softc *sc = device_get_softc(dev);
1172 struct usb_attach_arg *uaa = device_get_ivars(dev);
1173 int32_t unit = device_get_unit(dev);
1174 keyboard_t *kbd = &sc->sc_kbd;
1175 void *hid_ptr = NULL;
1182 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1184 kbd->kb_data = (void *)sc;
1186 device_set_usb_desc(dev);
1188 sc->sc_udev = uaa->device;
1189 sc->sc_iface = uaa->iface;
1190 sc->sc_iface_index = uaa->info.bIfaceIndex;
1191 sc->sc_iface_no = uaa->info.bIfaceNum;
1192 sc->sc_mode = K_XLATE;
1194 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1196 err = usbd_transfer_setup(uaa->device,
1197 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1198 UKBD_N_TRANSFER, sc, &Giant);
1201 DPRINTF("error=%s\n", usbd_errstr(err));
1204 /* setup default keyboard maps */
1206 sc->sc_keymap = key_map;
1207 sc->sc_accmap = accent_map;
1208 for (n = 0; n < UKBD_NFKEY; n++) {
1209 sc->sc_fkeymap[n] = fkey_tab[n];
1212 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1213 sc->sc_fkeymap, UKBD_NFKEY);
1215 KBD_FOUND_DEVICE(kbd);
1217 ukbd_clear_state(kbd);
1220 * FIXME: set the initial value for lock keys in "sc_state"
1221 * according to the BIOS data?
1223 KBD_PROBE_DONE(kbd);
1225 /* get HID descriptor */
1226 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1227 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1230 DPRINTF("Parsing HID descriptor of %d bytes\n",
1233 ukbd_parse_hid(sc, hid_ptr, hid_len);
1235 free(hid_ptr, M_TEMP);
1238 /* check if we should use the boot protocol */
1239 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1240 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1242 DPRINTF("Forcing boot protocol\n");
1244 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1245 sc->sc_iface_index, 0);
1248 DPRINTF("Set protocol error=%s (ignored)\n",
1252 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1255 /* ignore if SETIDLE fails, hence it is not crucial */
1256 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1258 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1262 if (kbd_register(kbd) < 0) {
1265 KBD_CONFIG_DONE(kbd);
1269 #ifdef KBD_INSTALL_CDEV
1270 if (kbd_attach(kbd)) {
1274 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1277 genkbd_diag(kbd, bootverbose);
1280 /* start the keyboard */
1281 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1283 return (0); /* success */
1287 return (ENXIO); /* error */
1291 ukbd_detach(device_t dev)
1293 struct ukbd_softc *sc = device_get_softc(dev);
1300 sc->sc_flags |= UKBD_FLAG_GONE;
1302 usb_callout_stop(&sc->sc_callout);
1304 /* kill any stuck keys */
1305 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1306 /* stop receiving events from the USB keyboard */
1307 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1309 /* release all leftover keys, if any */
1310 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1312 /* process releasing of all keys */
1316 ukbd_disable(&sc->sc_kbd);
1318 #ifdef KBD_INSTALL_CDEV
1319 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1320 error = kbd_detach(&sc->sc_kbd);
1322 /* usb attach cannot return an error */
1323 device_printf(dev, "WARNING: kbd_detach() "
1324 "returned non-zero! (ignored)\n");
1328 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1329 error = kbd_unregister(&sc->sc_kbd);
1331 /* usb attach cannot return an error */
1332 device_printf(dev, "WARNING: kbd_unregister() "
1333 "returned non-zero! (ignored)\n");
1336 sc->sc_kbd.kb_flags = 0;
1338 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1340 usb_callout_drain(&sc->sc_callout);
1342 DPRINTF("%s: disconnected\n",
1343 device_get_nameunit(dev));
1349 ukbd_resume(device_t dev)
1351 struct ukbd_softc *sc = device_get_softc(dev);
1355 ukbd_clear_state(&sc->sc_kbd);
1360 /* early keyboard probe, not supported */
1362 ukbd_configure(int flags)
1367 /* detect a keyboard, not used */
1369 ukbd__probe(int unit, void *arg, int flags)
1374 /* reset and initialize the device, not used */
1376 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1381 /* test the interface to the device, not used */
1383 ukbd_test_if(keyboard_t *kbd)
1388 /* finish using this keyboard, not used */
1390 ukbd_term(keyboard_t *kbd)
1395 /* keyboard interrupt routine, not used */
1397 ukbd_intr(keyboard_t *kbd, void *arg)
1402 /* lock the access to the keyboard, not used */
1404 ukbd_lock(keyboard_t *kbd, int lock)
1410 * Enable the access to the device; until this function is called,
1411 * the client cannot read from the keyboard.
1414 ukbd_enable(keyboard_t *kbd)
1424 /* disallow the access to the device */
1426 ukbd_disable(keyboard_t *kbd)
1430 KBD_DEACTIVATE(kbd);
1436 /* check if data is waiting */
1437 /* Currently unused. */
1439 ukbd_check(keyboard_t *kbd)
1441 struct ukbd_softc *sc = kbd->kb_data;
1443 UKBD_CTX_LOCK_ASSERT();
1445 if (!KBD_IS_ACTIVE(kbd))
1448 if (sc->sc_flags & UKBD_FLAG_POLLING)
1449 ukbd_do_poll(sc, 0);
1451 #ifdef UKBD_EMULATE_ATSCANCODE
1452 if (sc->sc_buffered_char[0]) {
1456 if (sc->sc_inputs > 0) {
1462 /* check if char is waiting */
1464 ukbd_check_char_locked(keyboard_t *kbd)
1466 struct ukbd_softc *sc = kbd->kb_data;
1468 UKBD_CTX_LOCK_ASSERT();
1470 if (!KBD_IS_ACTIVE(kbd))
1473 if ((sc->sc_composed_char > 0) &&
1474 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1477 return (ukbd_check(kbd));
1481 ukbd_check_char(keyboard_t *kbd)
1486 result = ukbd_check_char_locked(kbd);
1492 /* read one byte from the keyboard if it's allowed */
1493 /* Currently unused. */
1495 ukbd_read(keyboard_t *kbd, int wait)
1497 struct ukbd_softc *sc = kbd->kb_data;
1499 #ifdef UKBD_EMULATE_ATSCANCODE
1505 UKBD_CTX_LOCK_ASSERT();
1507 if (!KBD_IS_ACTIVE(kbd))
1510 #ifdef UKBD_EMULATE_ATSCANCODE
1511 if (sc->sc_buffered_char[0]) {
1512 scancode = sc->sc_buffered_char[0];
1513 if (scancode & SCAN_PREFIX) {
1514 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1515 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1517 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1518 sc->sc_buffered_char[1] = 0;
1521 #endif /* UKBD_EMULATE_ATSCANCODE */
1524 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1525 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1530 #ifdef UKBD_EMULATE_ATSCANCODE
1531 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1532 if (keycode == NN) {
1535 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1536 (usbcode & KEY_RELEASE)));
1537 #else /* !UKBD_EMULATE_ATSCANCODE */
1539 #endif /* UKBD_EMULATE_ATSCANCODE */
1542 /* read char from the keyboard */
1544 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1546 struct ukbd_softc *sc = kbd->kb_data;
1550 #ifdef UKBD_EMULATE_ATSCANCODE
1554 UKBD_CTX_LOCK_ASSERT();
1556 if (!KBD_IS_ACTIVE(kbd))
1561 /* do we have a composed char to return ? */
1563 if ((sc->sc_composed_char > 0) &&
1564 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1566 action = sc->sc_composed_char;
1567 sc->sc_composed_char = 0;
1569 if (action > 0xFF) {
1574 #ifdef UKBD_EMULATE_ATSCANCODE
1576 /* do we have a pending raw scan code? */
1578 if (sc->sc_mode == K_RAW) {
1579 scancode = sc->sc_buffered_char[0];
1581 if (scancode & SCAN_PREFIX) {
1582 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1583 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1585 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1586 sc->sc_buffered_char[1] = 0;
1590 #endif /* UKBD_EMULATE_ATSCANCODE */
1592 /* see if there is something in the keyboard port */
1594 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1595 if (usbcode == -1) {
1600 #ifdef UKBD_EMULATE_ATSCANCODE
1601 /* USB key index -> key code -> AT scan code */
1602 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1603 if (keycode == NN) {
1606 /* return an AT scan code for the K_RAW mode */
1607 if (sc->sc_mode == K_RAW) {
1608 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1609 (usbcode & KEY_RELEASE)));
1611 #else /* !UKBD_EMULATE_ATSCANCODE */
1613 /* return the byte as is for the K_RAW mode */
1614 if (sc->sc_mode == K_RAW) {
1617 /* USB key index -> key code */
1618 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1619 if (keycode == NN) {
1622 #endif /* UKBD_EMULATE_ATSCANCODE */
1625 case 0x38: /* left alt (compose key) */
1626 if (usbcode & KEY_RELEASE) {
1627 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1628 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1630 if (sc->sc_composed_char > 0xFF) {
1631 sc->sc_composed_char = 0;
1635 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1636 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1637 sc->sc_composed_char = 0;
1641 /* XXX: I don't like these... */
1642 case 0x5c: /* print screen */
1643 if (sc->sc_flags & ALTS) {
1644 keycode = 0x54; /* sysrq */
1647 case 0x68: /* pause/break */
1648 if (sc->sc_flags & CTLS) {
1649 keycode = 0x6c; /* break */
1654 /* return the key code in the K_CODE mode */
1655 if (usbcode & KEY_RELEASE) {
1656 keycode |= SCAN_RELEASE;
1658 if (sc->sc_mode == K_CODE) {
1661 /* compose a character code */
1662 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1664 /* key pressed, process it */
1667 case 0x49: /* keypad 7,8,9 */
1668 sc->sc_composed_char *= 10;
1669 sc->sc_composed_char += keycode - 0x40;
1670 goto check_composed;
1674 case 0x4D: /* keypad 4,5,6 */
1675 sc->sc_composed_char *= 10;
1676 sc->sc_composed_char += keycode - 0x47;
1677 goto check_composed;
1681 case 0x51: /* keypad 1,2,3 */
1682 sc->sc_composed_char *= 10;
1683 sc->sc_composed_char += keycode - 0x4E;
1684 goto check_composed;
1686 case 0x52: /* keypad 0 */
1687 sc->sc_composed_char *= 10;
1688 goto check_composed;
1690 /* key released, no interest here */
1691 case SCAN_RELEASE | 0x47:
1692 case SCAN_RELEASE | 0x48:
1693 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1694 case SCAN_RELEASE | 0x4B:
1695 case SCAN_RELEASE | 0x4C:
1696 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1697 case SCAN_RELEASE | 0x4F:
1698 case SCAN_RELEASE | 0x50:
1699 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1700 case SCAN_RELEASE | 0x52: /* keypad 0 */
1703 case 0x38: /* left alt key */
1707 if (sc->sc_composed_char > 0) {
1708 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1709 sc->sc_composed_char = 0;
1715 /* keycode to key action */
1716 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1717 (keycode & SCAN_RELEASE),
1718 &sc->sc_state, &sc->sc_accents);
1719 if (action == NOKEY) {
1726 if (sc->sc_composed_char <= 0xFF) {
1733 /* Currently wait is always false. */
1735 ukbd_read_char(keyboard_t *kbd, int wait)
1740 keycode = ukbd_read_char_locked(kbd, wait);
1746 /* some useful control functions */
1748 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1750 struct ukbd_softc *sc = kbd->kb_data;
1752 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1753 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1761 case KDGKBMODE: /* get keyboard mode */
1762 *(int *)arg = sc->sc_mode;
1764 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1765 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1767 ival = IOCPARM_IVAL(arg);
1768 arg = (caddr_t)&ival;
1771 case KDSKBMODE: /* set keyboard mode */
1772 switch (*(int *)arg) {
1774 if (sc->sc_mode != K_XLATE) {
1775 /* make lock key state and LED state match */
1776 sc->sc_state &= ~LOCK_MASK;
1777 sc->sc_state |= KBD_LED_VAL(kbd);
1782 if (sc->sc_mode != *(int *)arg) {
1783 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1784 ukbd_clear_state(kbd);
1785 sc->sc_mode = *(int *)arg;
1793 case KDGETLED: /* get keyboard LED */
1794 *(int *)arg = KBD_LED_VAL(kbd);
1796 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1797 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1799 ival = IOCPARM_IVAL(arg);
1800 arg = (caddr_t)&ival;
1803 case KDSETLED: /* set keyboard LED */
1804 /* NOTE: lock key state in "sc_state" won't be changed */
1805 if (*(int *)arg & ~LOCK_MASK)
1810 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1811 if (sc->sc_mode == K_XLATE &&
1812 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1818 if (KBD_HAS_DEVICE(kbd))
1819 ukbd_set_leds(sc, i);
1821 KBD_LED_VAL(kbd) = *(int *)arg;
1823 case KDGKBSTATE: /* get lock key state */
1824 *(int *)arg = sc->sc_state & LOCK_MASK;
1826 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1827 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1829 ival = IOCPARM_IVAL(arg);
1830 arg = (caddr_t)&ival;
1833 case KDSKBSTATE: /* set lock key state */
1834 if (*(int *)arg & ~LOCK_MASK) {
1837 sc->sc_state &= ~LOCK_MASK;
1838 sc->sc_state |= *(int *)arg;
1840 /* set LEDs and quit */
1841 return (ukbd_ioctl(kbd, KDSETLED, arg));
1843 case KDSETREPEAT: /* set keyboard repeat rate (new
1845 if (!KBD_HAS_DEVICE(kbd)) {
1848 if (((int *)arg)[1] < 0) {
1851 if (((int *)arg)[0] < 0) {
1854 if (((int *)arg)[0] < 200) /* fastest possible value */
1855 kbd->kb_delay1 = 200;
1857 kbd->kb_delay1 = ((int *)arg)[0];
1858 kbd->kb_delay2 = ((int *)arg)[1];
1861 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1862 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1864 ival = IOCPARM_IVAL(arg);
1865 arg = (caddr_t)&ival;
1868 case KDSETRAD: /* set keyboard repeat rate (old
1870 return (ukbd_set_typematic(kbd, *(int *)arg));
1872 case PIO_KEYMAP: /* set keyboard translation table */
1873 case OPIO_KEYMAP: /* set keyboard translation table
1875 case PIO_KEYMAPENT: /* set keyboard translation table
1877 case PIO_DEADKEYMAP: /* set accent key translation table */
1881 return (genkbd_commonioctl(kbd, cmd, arg));
1888 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1893 * XXX Check of someone is calling us from a critical section:
1895 if (curthread->td_critnest != 0)
1899 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1900 * context where printf(9) can be called, which among other things
1901 * includes interrupt filters and threads with any kinds of locks
1902 * already held. For this reason it would be dangerous to acquire
1903 * the Giant here unconditionally. On the other hand we have to
1904 * have it to handle the ioctl.
1905 * So we make our best effort to auto-detect whether we can grab
1906 * the Giant or not. Blame syscons(4) for this.
1912 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1913 return (EDEADLK); /* best I could come up with */
1917 result = ukbd_ioctl_locked(kbd, cmd, arg);
1924 /* clear the internal state of the keyboard */
1926 ukbd_clear_state(keyboard_t *kbd)
1928 struct ukbd_softc *sc = kbd->kb_data;
1930 UKBD_CTX_LOCK_ASSERT();
1932 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1933 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1935 sc->sc_composed_char = 0;
1936 #ifdef UKBD_EMULATE_ATSCANCODE
1937 sc->sc_buffered_char[0] = 0;
1938 sc->sc_buffered_char[1] = 0;
1940 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1941 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1942 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1943 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1946 /* save the internal state, not used */
1948 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1950 return (len == 0) ? 1 : -1;
1953 /* set the internal state, not used */
1955 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1961 ukbd_poll(keyboard_t *kbd, int on)
1963 struct ukbd_softc *sc = kbd->kb_data;
1967 sc->sc_flags |= UKBD_FLAG_POLLING;
1968 sc->sc_poll_thread = curthread;
1970 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1971 ukbd_start_timer(sc); /* start timer */
1978 /* local functions */
1981 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1985 DPRINTF("leds=0x%02x\n", leds);
1988 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1990 /* start transfer, if not already started */
1992 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1996 ukbd_set_typematic(keyboard_t *kbd, int code)
1998 static const int delays[] = {250, 500, 750, 1000};
1999 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2000 68, 76, 84, 92, 100, 110, 118, 126,
2001 136, 152, 168, 184, 200, 220, 236, 252,
2002 272, 304, 336, 368, 400, 440, 472, 504};
2007 kbd->kb_delay1 = delays[(code >> 5) & 3];
2008 kbd->kb_delay2 = rates[code & 0x1f];
2012 #ifdef UKBD_EMULATE_ATSCANCODE
2014 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2016 static const int scan[] = {
2022 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2032 0x151, /* PageDown */
2035 0x146, /* XXX Pause/Break */
2036 0x15b, /* Win_L(Super_L) */
2037 0x15c, /* Win_R(Super_R) */
2038 0x15d, /* Application(Menu) */
2040 /* SUN TYPE 6 USB KEYBOARD */
2041 0x168, /* Sun Type 6 Help */
2042 0x15e, /* Sun Type 6 Stop */
2044 0x15f, /* Sun Type 6 Again */
2045 0x160, /* Sun Type 6 Props */
2046 0x161, /* Sun Type 6 Undo */
2047 0x162, /* Sun Type 6 Front */
2048 0x163, /* Sun Type 6 Copy */
2049 0x164, /* Sun Type 6 Open */
2050 0x165, /* Sun Type 6 Paste */
2051 0x166, /* Sun Type 6 Find */
2052 0x167, /* Sun Type 6 Cut */
2053 0x125, /* Sun Type 6 Mute */
2055 0x11f, /* Sun Type 6 VolumeDown */
2056 0x11e, /* Sun Type 6 VolumeUp */
2057 0x120, /* Sun Type 6 PowerDown */
2059 /* Japanese 106/109 keyboard */
2060 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2061 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2062 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2063 0x79, /* Keyboard Intl' 4 (Henkan) */
2064 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2065 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2068 if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2069 code = scan[code - 89];
2072 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2073 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2075 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2076 code &= ~SCAN_PREFIX_SHIFT;
2078 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2080 if (code & SCAN_PREFIX) {
2081 if (code & SCAN_PREFIX_CTL) {
2083 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2084 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2085 } else if (code & SCAN_PREFIX_SHIFT) {
2087 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2088 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2090 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2091 sc->sc_buffered_char[1] = 0;
2093 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2099 #endif /* UKBD_EMULATE_ATSCANCODE */
2101 static keyboard_switch_t ukbdsw = {
2102 .probe = &ukbd__probe,
2106 .test_if = &ukbd_test_if,
2107 .enable = &ukbd_enable,
2108 .disable = &ukbd_disable,
2110 .check = &ukbd_check,
2111 .read_char = &ukbd_read_char,
2112 .check_char = &ukbd_check_char,
2113 .ioctl = &ukbd_ioctl,
2115 .clear_state = &ukbd_clear_state,
2116 .get_state = &ukbd_get_state,
2117 .set_state = &ukbd_set_state,
2118 .get_fkeystr = &genkbd_get_fkeystr,
2120 .diag = &genkbd_diag,
2123 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2126 ukbd_driver_load(module_t mod, int what, void *arg)
2130 kbd_add_driver(&ukbd_kbd_driver);
2133 kbd_delete_driver(&ukbd_kbd_driver);
2139 static devclass_t ukbd_devclass;
2141 static device_method_t ukbd_methods[] = {
2142 DEVMETHOD(device_probe, ukbd_probe),
2143 DEVMETHOD(device_attach, ukbd_attach),
2144 DEVMETHOD(device_detach, ukbd_detach),
2145 DEVMETHOD(device_resume, ukbd_resume),
2149 static driver_t ukbd_driver = {
2151 .methods = ukbd_methods,
2152 .size = sizeof(struct ukbd_softc),
2155 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2156 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2157 MODULE_VERSION(ukbd, 1);