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;
95 static int ukbd_pollrate = 0;
97 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
98 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
99 &ukbd_debug, 0, "Debug level");
100 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
101 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
102 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
103 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
104 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW | CTLFLAG_TUN,
105 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
106 TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
109 #define UKBD_EMULATE_ATSCANCODE 1
110 #define UKBD_DRIVER_NAME "ukbd"
111 #define UKBD_NMOD 8 /* units */
112 #define UKBD_NKEYCODE 6 /* units */
113 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
114 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
115 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
116 #define UKBD_BUFFER_SIZE 64 /* bytes */
120 #define MOD_CONTROL_L 0x01
121 #define MOD_CONTROL_R 0x10
122 #define MOD_SHIFT_L 0x02
123 #define MOD_SHIFT_R 0x20
124 #define MOD_ALT_L 0x04
125 #define MOD_ALT_R 0x40
126 #define MOD_WIN_L 0x08
127 #define MOD_WIN_R 0x80
129 #define MOD_EJECT 0x0100
130 #define MOD_FN 0x0200
131 uint8_t keycode[UKBD_NKEYCODE];
143 accentmap_t sc_accmap;
144 fkeytab_t sc_fkeymap[UKBD_NFKEY];
145 struct hid_location sc_loc_apple_eject;
146 struct hid_location sc_loc_apple_fn;
147 struct hid_location sc_loc_ctrl_l;
148 struct hid_location sc_loc_ctrl_r;
149 struct hid_location sc_loc_shift_l;
150 struct hid_location sc_loc_shift_r;
151 struct hid_location sc_loc_alt_l;
152 struct hid_location sc_loc_alt_r;
153 struct hid_location sc_loc_win_l;
154 struct hid_location sc_loc_win_r;
155 struct hid_location sc_loc_events;
156 struct hid_location sc_loc_numlock;
157 struct hid_location sc_loc_capslock;
158 struct hid_location sc_loc_scrolllock;
159 struct usb_callout sc_callout;
160 struct ukbd_data sc_ndata;
161 struct ukbd_data sc_odata;
163 struct thread *sc_poll_thread;
164 struct usb_device *sc_udev;
165 struct usb_interface *sc_iface;
166 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
168 uint32_t sc_ntime[UKBD_NKEYCODE];
169 uint32_t sc_otime[UKBD_NKEYCODE];
170 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
172 uint32_t sc_composed_char; /* composed char code, if non-zero */
173 #ifdef UKBD_EMULATE_ATSCANCODE
174 uint32_t sc_buffered_char[2];
176 uint32_t sc_flags; /* flags */
177 #define UKBD_FLAG_COMPOSE 0x00000001
178 #define UKBD_FLAG_POLLING 0x00000002
179 #define UKBD_FLAG_SET_LEDS 0x00000004
180 #define UKBD_FLAG_ATTACHED 0x00000010
181 #define UKBD_FLAG_GONE 0x00000020
183 #define UKBD_FLAG_HID_MASK 0x003fffc0
184 #define UKBD_FLAG_APPLE_EJECT 0x00000040
185 #define UKBD_FLAG_APPLE_FN 0x00000080
186 #define UKBD_FLAG_APPLE_SWAP 0x00000100
187 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
188 #define UKBD_FLAG_CTRL_L 0x00000400
189 #define UKBD_FLAG_CTRL_R 0x00000800
190 #define UKBD_FLAG_SHIFT_L 0x00001000
191 #define UKBD_FLAG_SHIFT_R 0x00002000
192 #define UKBD_FLAG_ALT_L 0x00004000
193 #define UKBD_FLAG_ALT_R 0x00008000
194 #define UKBD_FLAG_WIN_L 0x00010000
195 #define UKBD_FLAG_WIN_R 0x00020000
196 #define UKBD_FLAG_EVENTS 0x00040000
197 #define UKBD_FLAG_NUMLOCK 0x00080000
198 #define UKBD_FLAG_CAPSLOCK 0x00100000
199 #define UKBD_FLAG_SCROLLLOCK 0x00200000
201 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
202 int sc_state; /* shift/lock key state */
203 int sc_accents; /* accent key index (> 0) */
208 uint16_t sc_inputhead;
209 uint16_t sc_inputtail;
210 uint16_t sc_modifiers;
212 uint8_t sc_leds; /* store for async led requests */
213 uint8_t sc_iface_index;
215 uint8_t sc_id_apple_eject;
216 uint8_t sc_id_apple_fn;
217 uint8_t sc_id_ctrl_l;
218 uint8_t sc_id_ctrl_r;
219 uint8_t sc_id_shift_l;
220 uint8_t sc_id_shift_r;
226 uint8_t sc_id_numlock;
227 uint8_t sc_id_capslock;
228 uint8_t sc_id_scrolllock;
229 uint8_t sc_id_events;
232 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
235 #define KEY_ERROR 0x01
238 #define KEY_RELEASE 0x400
239 #define KEY_INDEX(c) ((c) & 0xFF)
242 #define SCAN_RELEASE 0x80
243 #define SCAN_PREFIX_E0 0x100
244 #define SCAN_PREFIX_E1 0x200
245 #define SCAN_PREFIX_CTL 0x400
246 #define SCAN_PREFIX_SHIFT 0x800
247 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
248 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
249 #define SCAN_CHAR(c) ((c) & 0x7f)
251 #define UKBD_LOCK() mtx_lock(&Giant)
252 #define UKBD_UNLOCK() mtx_unlock(&Giant)
257 * Assert that the lock is held in all contexts
258 * where the code can be executed.
260 #define UKBD_LOCK_ASSERT() mtx_assert(&Giant, MA_OWNED)
263 * Assert that the lock is held in the contexts
264 * where it really has to be so.
266 #define UKBD_CTX_LOCK_ASSERT() \
268 if (!kdb_active && panicstr == NULL) \
269 mtx_assert(&Giant, MA_OWNED); \
273 #define UKBD_LOCK_ASSERT() (void)0
274 #define UKBD_CTX_LOCK_ASSERT() (void)0
282 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
283 {MOD_CONTROL_L, 0xe0},
284 {MOD_CONTROL_R, 0xe4},
293 #define NN 0 /* no translation */
295 * Translate USB keycodes to AT keyboard scancodes.
298 * FIXME: Mac USB keyboard generates:
299 * 0x53: keypad NumLock/Clear
306 static const uint8_t ukbd_trtab[256] = {
307 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
308 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
309 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
310 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
311 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
312 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
313 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
314 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
315 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
316 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
317 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
318 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
319 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
320 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
321 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
322 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
323 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
324 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
335 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
336 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
337 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
338 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
341 static const uint8_t ukbd_boot_desc[] = {
342 0x05, 0x01, 0x09, 0x06, 0xa1,
343 0x01, 0x05, 0x07, 0x19, 0xe0,
344 0x29, 0xe7, 0x15, 0x00, 0x25,
345 0x01, 0x75, 0x01, 0x95, 0x08,
346 0x81, 0x02, 0x95, 0x01, 0x75,
347 0x08, 0x81, 0x01, 0x95, 0x03,
348 0x75, 0x01, 0x05, 0x08, 0x19,
349 0x01, 0x29, 0x03, 0x91, 0x02,
350 0x95, 0x05, 0x75, 0x01, 0x91,
351 0x01, 0x95, 0x06, 0x75, 0x08,
352 0x15, 0x00, 0x26, 0xff, 0x00,
353 0x05, 0x07, 0x19, 0x00, 0x2a,
354 0xff, 0x00, 0x81, 0x00, 0xc0
358 static void ukbd_timeout(void *);
359 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
360 static int ukbd_set_typematic(keyboard_t *, int);
361 #ifdef UKBD_EMULATE_ATSCANCODE
362 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
364 static uint32_t ukbd_read_char(keyboard_t *, int);
365 static void ukbd_clear_state(keyboard_t *);
366 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
367 static int ukbd_enable(keyboard_t *);
368 static int ukbd_disable(keyboard_t *);
369 static void ukbd_interrupt(struct ukbd_softc *);
370 static void ukbd_event_keyinput(struct ukbd_softc *);
372 static device_probe_t ukbd_probe;
373 static device_attach_t ukbd_attach;
374 static device_detach_t ukbd_detach;
375 static device_resume_t ukbd_resume;
378 ukbd_any_key_pressed(struct ukbd_softc *sc)
383 for (j = i = 0; i < UKBD_NKEYCODE; i++)
384 j |= sc->sc_odata.keycode[i];
390 ukbd_start_timer(struct ukbd_softc *sc)
392 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
393 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
397 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
400 UKBD_CTX_LOCK_ASSERT();
402 DPRINTF("0x%02x (%d) %s\n", key, key,
403 (key & KEY_RELEASE) ? "released" : "pressed");
405 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
406 sc->sc_input[sc->sc_inputtail] = key;
408 ++(sc->sc_inputtail);
409 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
410 sc->sc_inputtail = 0;
413 DPRINTF("input buffer is full\n");
418 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
421 UKBD_CTX_LOCK_ASSERT();
422 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
423 ("ukbd_do_poll called when not polling\n"));
424 DPRINTFN(2, "polling\n");
426 if (!kdb_active && !SCHEDULER_STOPPED()) {
428 * In this context the kernel is polling for input,
429 * but the USB subsystem works in normal interrupt-driven
430 * mode, so we just wait on the USB threads to do the job.
431 * Note that we currently hold the Giant, but it's also used
432 * as the transfer mtx, so we must release it while waiting.
434 while (sc->sc_inputs == 0) {
436 * Give USB threads a chance to run. Note that
437 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
439 kern_yield(PRI_UNCHANGED);
446 while (sc->sc_inputs == 0) {
448 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
450 /* Delay-optimised support for repetition of keys */
451 if (ukbd_any_key_pressed(sc)) {
452 /* a key is pressed - need timekeeping */
455 /* 1 millisecond has passed */
467 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
471 UKBD_CTX_LOCK_ASSERT();
472 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
473 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
474 ("not polling in kdb or panic\n"));
476 if (sc->sc_inputs == 0 &&
477 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
478 /* start transfer, if not already started */
479 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
482 if (sc->sc_flags & UKBD_FLAG_POLLING)
483 ukbd_do_poll(sc, wait);
485 if (sc->sc_inputs == 0) {
488 c = sc->sc_input[sc->sc_inputhead];
490 ++(sc->sc_inputhead);
491 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
492 sc->sc_inputhead = 0;
499 ukbd_interrupt(struct ukbd_softc *sc)
503 uint32_t now = sc->sc_time_ms;
509 UKBD_CTX_LOCK_ASSERT();
511 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
514 n_mod = sc->sc_ndata.modifiers;
515 o_mod = sc->sc_odata.modifiers;
516 if (n_mod != o_mod) {
517 for (i = 0; i < UKBD_NMOD; i++) {
518 if ((n_mod & ukbd_mods[i].mask) !=
519 (o_mod & ukbd_mods[i].mask)) {
520 ukbd_put_key(sc, ukbd_mods[i].key |
521 ((n_mod & ukbd_mods[i].mask) ?
522 KEY_PRESS : KEY_RELEASE));
526 /* Check for released keys. */
527 for (i = 0; i < UKBD_NKEYCODE; i++) {
528 key = sc->sc_odata.keycode[i];
532 for (j = 0; j < UKBD_NKEYCODE; j++) {
533 if (sc->sc_ndata.keycode[j] == 0) {
536 if (key == sc->sc_ndata.keycode[j]) {
540 ukbd_put_key(sc, key | KEY_RELEASE);
544 /* Check for pressed keys. */
545 for (i = 0; i < UKBD_NKEYCODE; i++) {
546 key = sc->sc_ndata.keycode[i];
550 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
551 for (j = 0; j < UKBD_NKEYCODE; j++) {
552 if (sc->sc_odata.keycode[j] == 0) {
555 if (key == sc->sc_odata.keycode[j]) {
557 /* key is still pressed */
559 sc->sc_ntime[i] = sc->sc_otime[j];
560 dtime = (sc->sc_otime[j] - now);
562 if (!(dtime & 0x80000000)) {
563 /* time has not elapsed */
566 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
570 ukbd_put_key(sc, key | KEY_PRESS);
573 * If any other key is presently down, force its repeat to be
574 * well in the future (100s). This makes the last key to be
575 * pressed do the autorepeat.
577 for (j = 0; j != UKBD_NKEYCODE; j++) {
579 sc->sc_ntime[j] = now + (100 * 1000);
584 sc->sc_odata = sc->sc_ndata;
586 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
588 ukbd_event_keyinput(sc);
592 ukbd_event_keyinput(struct ukbd_softc *sc)
596 UKBD_CTX_LOCK_ASSERT();
598 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
601 if (sc->sc_inputs == 0)
604 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
605 KBD_IS_BUSY(&sc->sc_kbd)) {
606 /* let the callback function process the input */
607 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
608 sc->sc_kbd.kb_callback.kc_arg);
610 /* read and discard the input, no one is waiting for it */
612 c = ukbd_read_char(&sc->sc_kbd, 0);
613 } while (c != NOKEY);
618 ukbd_timeout(void *arg)
620 struct ukbd_softc *sc = arg;
624 sc->sc_time_ms += 25; /* milliseconds */
628 /* Make sure any leftover key events gets read out */
629 ukbd_event_keyinput(sc);
631 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
632 ukbd_start_timer(sc);
634 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
639 ukbd_apple_fn(uint8_t keycode) {
641 case 0x28: return 0x49; /* RETURN -> INSERT */
642 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
643 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
644 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
645 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
646 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
647 default: return keycode;
652 ukbd_apple_swap(uint8_t keycode) {
654 case 0x35: return 0x64;
655 case 0x64: return 0x35;
656 default: return keycode;
661 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
663 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
664 struct usb_page_cache *pc;
672 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
673 pc = usbd_xfer_get_frame(xfer, 0);
675 switch (USB_GET_STATE(xfer)) {
676 case USB_ST_TRANSFERRED:
677 DPRINTF("actlen=%d bytes\n", len);
680 DPRINTF("zero length data\n");
684 if (sc->sc_kbd_id != 0) {
685 /* check and remove HID ID byte */
686 usbd_copy_out(pc, 0, &id, 1);
690 DPRINTF("zero length data\n");
698 if (len > UKBD_BUFFER_SIZE)
699 len = UKBD_BUFFER_SIZE;
702 usbd_copy_out(pc, offset, sc->sc_buffer, len);
704 /* clear temporary storage */
705 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
707 /* scan through HID data */
708 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
709 (id == sc->sc_id_apple_eject)) {
710 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
711 sc->sc_modifiers |= MOD_EJECT;
713 sc->sc_modifiers &= ~MOD_EJECT;
715 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
716 (id == sc->sc_id_apple_fn)) {
717 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
718 sc->sc_modifiers |= MOD_FN;
720 sc->sc_modifiers &= ~MOD_FN;
722 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
723 (id == sc->sc_id_ctrl_l)) {
724 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
725 sc-> sc_modifiers |= MOD_CONTROL_L;
727 sc-> sc_modifiers &= ~MOD_CONTROL_L;
729 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
730 (id == sc->sc_id_ctrl_r)) {
731 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
732 sc->sc_modifiers |= MOD_CONTROL_R;
734 sc->sc_modifiers &= ~MOD_CONTROL_R;
736 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
737 (id == sc->sc_id_shift_l)) {
738 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
739 sc->sc_modifiers |= MOD_SHIFT_L;
741 sc->sc_modifiers &= ~MOD_SHIFT_L;
743 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
744 (id == sc->sc_id_shift_r)) {
745 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
746 sc->sc_modifiers |= MOD_SHIFT_R;
748 sc->sc_modifiers &= ~MOD_SHIFT_R;
750 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
751 (id == sc->sc_id_alt_l)) {
752 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
753 sc->sc_modifiers |= MOD_ALT_L;
755 sc->sc_modifiers &= ~MOD_ALT_L;
757 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
758 (id == sc->sc_id_alt_r)) {
759 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
760 sc->sc_modifiers |= MOD_ALT_R;
762 sc->sc_modifiers &= ~MOD_ALT_R;
764 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
765 (id == sc->sc_id_win_l)) {
766 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
767 sc->sc_modifiers |= MOD_WIN_L;
769 sc->sc_modifiers &= ~MOD_WIN_L;
771 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
772 (id == sc->sc_id_win_r)) {
773 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
774 sc->sc_modifiers |= MOD_WIN_R;
776 sc->sc_modifiers &= ~MOD_WIN_R;
779 sc->sc_ndata.modifiers = sc->sc_modifiers;
781 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
782 (id == sc->sc_id_events)) {
783 i = sc->sc_loc_events.count;
784 if (i > UKBD_NKEYCODE)
789 sc->sc_ndata.keycode[i] =
790 hid_get_data(sc->sc_buffer + i, len - i,
796 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
797 for (i = 0; i < UKBD_NKEYCODE; i++) {
798 if (sc->sc_ndata.keycode[i]) {
799 DPRINTF("[%d] = 0x%02x\n",
800 (int)i, (int)sc->sc_ndata.keycode[i]);
804 if (sc->sc_modifiers & MOD_FN) {
805 for (i = 0; i < UKBD_NKEYCODE; i++) {
806 sc->sc_ndata.keycode[i] =
807 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
811 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
812 for (i = 0; i < UKBD_NKEYCODE; i++) {
813 sc->sc_ndata.keycode[i] =
814 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
820 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
821 if (ukbd_any_key_pressed(sc)) {
822 ukbd_start_timer(sc);
828 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
829 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
830 usbd_transfer_submit(xfer);
832 DPRINTF("input queue is full!\n");
837 DPRINTF("error=%s\n", usbd_errstr(error));
839 if (error != USB_ERR_CANCELLED) {
840 /* try to clear stall first */
841 usbd_xfer_set_stall(xfer);
849 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
851 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
852 struct usb_device_request req;
853 struct usb_page_cache *pc;
865 switch (USB_GET_STATE(xfer)) {
866 case USB_ST_TRANSFERRED:
868 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
870 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
872 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
873 req.bRequest = UR_SET_REPORT;
874 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
875 req.wIndex[0] = sc->sc_iface_no;
879 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
884 /* Assumption: All led bits must be in the same ID. */
886 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
887 if (sc->sc_leds & NLKED) {
888 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
889 &sc->sc_loc_numlock, 1);
891 id = sc->sc_id_numlock;
895 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
896 if (sc->sc_leds & SLKED) {
897 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
898 &sc->sc_loc_scrolllock, 1);
900 id = sc->sc_id_scrolllock;
904 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
905 if (sc->sc_leds & CLKED) {
906 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
907 &sc->sc_loc_capslock, 1);
909 id = sc->sc_id_capslock;
913 /* if no leds, nothing to do */
917 /* range check output report length */
918 len = sc->sc_led_size;
919 if (len > (UKBD_BUFFER_SIZE - 1))
920 len = (UKBD_BUFFER_SIZE - 1);
922 /* check if we need to prefix an ID byte */
923 sc->sc_buffer[0] = id;
925 pc = usbd_xfer_get_frame(xfer, 1);
928 usbd_copy_in(pc, 0, sc->sc_buffer, len);
930 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
932 req.wLength[0] = len;
933 usbd_xfer_set_frame_len(xfer, 1, len);
935 DPRINTF("len=%d, id=%d\n", len, id);
937 /* setup control request last */
938 pc = usbd_xfer_get_frame(xfer, 0);
939 usbd_copy_in(pc, 0, &req, sizeof(req));
940 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
942 /* start data transfer */
943 usbd_xfer_set_frames(xfer, 2);
944 usbd_transfer_submit(xfer);
948 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
953 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
956 .type = UE_INTERRUPT,
957 .endpoint = UE_ADDR_ANY,
958 .direction = UE_DIR_IN,
959 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
960 .bufsize = 0, /* use wMaxPacketSize */
961 .callback = &ukbd_intr_callback,
966 .endpoint = 0x00, /* Control pipe */
967 .direction = UE_DIR_ANY,
968 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
969 .callback = &ukbd_set_leds_callback,
970 .timeout = 1000, /* 1 second */
974 /* A match on these entries will load ukbd */
975 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
976 {USB_IFACE_CLASS(UICLASS_HID),
977 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
978 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
982 ukbd_probe(device_t dev)
984 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
985 struct usb_attach_arg *uaa = device_get_ivars(dev);
996 if (uaa->usb_mode != USB_MODE_HOST) {
1000 if (uaa->info.bInterfaceClass != UICLASS_HID)
1003 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1006 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1007 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1008 return (BUS_PROBE_DEFAULT);
1010 error = usbd_req_get_hid_desc(uaa->device, NULL,
1011 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1016 if (hid_is_keyboard(d_ptr, d_len)) {
1017 if (hid_is_mouse(d_ptr, d_len)) {
1019 * NOTE: We currently don't support USB mouse
1020 * and USB keyboard on the same USB endpoint.
1021 * Let "ums" driver win.
1025 error = BUS_PROBE_DEFAULT;
1030 free(d_ptr, M_TEMP);
1035 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1039 /* reset detected bits */
1040 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1042 /* check if there is an ID byte */
1043 sc->sc_kbd_size = hid_report_size(ptr, len,
1044 hid_input, &sc->sc_kbd_id);
1046 /* investigate if this is an Apple Keyboard */
1047 if (hid_locate(ptr, len,
1048 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1049 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1050 &sc->sc_id_apple_eject)) {
1051 if (flags & HIO_VARIABLE)
1052 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1053 UKBD_FLAG_APPLE_SWAP;
1054 DPRINTFN(1, "Found Apple eject-key\n");
1056 if (hid_locate(ptr, len,
1057 HID_USAGE2(0xFFFF, 0x0003),
1058 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1059 &sc->sc_id_apple_fn)) {
1060 if (flags & HIO_VARIABLE)
1061 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1062 DPRINTFN(1, "Found Apple FN-key\n");
1064 /* figure out some keys */
1065 if (hid_locate(ptr, len,
1066 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1067 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1068 &sc->sc_id_ctrl_l)) {
1069 if (flags & HIO_VARIABLE)
1070 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1071 DPRINTFN(1, "Found left control\n");
1073 if (hid_locate(ptr, len,
1074 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1075 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1076 &sc->sc_id_ctrl_r)) {
1077 if (flags & HIO_VARIABLE)
1078 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1079 DPRINTFN(1, "Found right control\n");
1081 if (hid_locate(ptr, len,
1082 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1083 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1084 &sc->sc_id_shift_l)) {
1085 if (flags & HIO_VARIABLE)
1086 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1087 DPRINTFN(1, "Found left shift\n");
1089 if (hid_locate(ptr, len,
1090 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1091 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1092 &sc->sc_id_shift_r)) {
1093 if (flags & HIO_VARIABLE)
1094 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1095 DPRINTFN(1, "Found right shift\n");
1097 if (hid_locate(ptr, len,
1098 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1099 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1100 &sc->sc_id_alt_l)) {
1101 if (flags & HIO_VARIABLE)
1102 sc->sc_flags |= UKBD_FLAG_ALT_L;
1103 DPRINTFN(1, "Found left alt\n");
1105 if (hid_locate(ptr, len,
1106 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1107 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1108 &sc->sc_id_alt_r)) {
1109 if (flags & HIO_VARIABLE)
1110 sc->sc_flags |= UKBD_FLAG_ALT_R;
1111 DPRINTFN(1, "Found right alt\n");
1113 if (hid_locate(ptr, len,
1114 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1115 hid_input, 0, &sc->sc_loc_win_l, &flags,
1116 &sc->sc_id_win_l)) {
1117 if (flags & HIO_VARIABLE)
1118 sc->sc_flags |= UKBD_FLAG_WIN_L;
1119 DPRINTFN(1, "Found left GUI\n");
1121 if (hid_locate(ptr, len,
1122 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1123 hid_input, 0, &sc->sc_loc_win_r, &flags,
1124 &sc->sc_id_win_r)) {
1125 if (flags & HIO_VARIABLE)
1126 sc->sc_flags |= UKBD_FLAG_WIN_R;
1127 DPRINTFN(1, "Found right GUI\n");
1129 /* figure out event buffer */
1130 if (hid_locate(ptr, len,
1131 HID_USAGE2(HUP_KEYBOARD, 0x00),
1132 hid_input, 0, &sc->sc_loc_events, &flags,
1133 &sc->sc_id_events)) {
1134 if (flags & HIO_VARIABLE) {
1135 DPRINTFN(1, "Ignoring keyboard event control\n");
1137 sc->sc_flags |= UKBD_FLAG_EVENTS;
1138 DPRINTFN(1, "Found keyboard event array\n");
1142 /* figure out leds on keyboard */
1143 sc->sc_led_size = hid_report_size(ptr, len,
1146 if (hid_locate(ptr, len,
1147 HID_USAGE2(HUP_LEDS, 0x01),
1148 hid_output, 0, &sc->sc_loc_numlock, &flags,
1149 &sc->sc_id_numlock)) {
1150 if (flags & HIO_VARIABLE)
1151 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1152 DPRINTFN(1, "Found keyboard numlock\n");
1154 if (hid_locate(ptr, len,
1155 HID_USAGE2(HUP_LEDS, 0x02),
1156 hid_output, 0, &sc->sc_loc_capslock, &flags,
1157 &sc->sc_id_capslock)) {
1158 if (flags & HIO_VARIABLE)
1159 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1160 DPRINTFN(1, "Found keyboard capslock\n");
1162 if (hid_locate(ptr, len,
1163 HID_USAGE2(HUP_LEDS, 0x03),
1164 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1165 &sc->sc_id_scrolllock)) {
1166 if (flags & HIO_VARIABLE)
1167 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1168 DPRINTFN(1, "Found keyboard scrolllock\n");
1173 ukbd_attach(device_t dev)
1175 struct ukbd_softc *sc = device_get_softc(dev);
1176 struct usb_attach_arg *uaa = device_get_ivars(dev);
1177 int unit = device_get_unit(dev);
1178 keyboard_t *kbd = &sc->sc_kbd;
1179 void *hid_ptr = NULL;
1188 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1190 kbd->kb_data = (void *)sc;
1192 device_set_usb_desc(dev);
1194 sc->sc_udev = uaa->device;
1195 sc->sc_iface = uaa->iface;
1196 sc->sc_iface_index = uaa->info.bIfaceIndex;
1197 sc->sc_iface_no = uaa->info.bIfaceNum;
1198 sc->sc_mode = K_XLATE;
1200 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1202 err = usbd_transfer_setup(uaa->device,
1203 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1204 UKBD_N_TRANSFER, sc, &Giant);
1207 DPRINTF("error=%s\n", usbd_errstr(err));
1210 /* setup default keyboard maps */
1212 sc->sc_keymap = key_map;
1213 sc->sc_accmap = accent_map;
1214 for (n = 0; n < UKBD_NFKEY; n++) {
1215 sc->sc_fkeymap[n] = fkey_tab[n];
1218 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1219 sc->sc_fkeymap, UKBD_NFKEY);
1221 KBD_FOUND_DEVICE(kbd);
1223 ukbd_clear_state(kbd);
1226 * FIXME: set the initial value for lock keys in "sc_state"
1227 * according to the BIOS data?
1229 KBD_PROBE_DONE(kbd);
1231 /* get HID descriptor */
1232 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1233 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1236 DPRINTF("Parsing HID descriptor of %d bytes\n",
1239 ukbd_parse_hid(sc, hid_ptr, hid_len);
1241 free(hid_ptr, M_TEMP);
1244 /* check if we should use the boot protocol */
1245 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1246 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1248 DPRINTF("Forcing boot protocol\n");
1250 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1251 sc->sc_iface_index, 0);
1254 DPRINTF("Set protocol error=%s (ignored)\n",
1258 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1261 /* ignore if SETIDLE fails, hence it is not crucial */
1262 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1264 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1268 if (kbd_register(kbd) < 0) {
1271 KBD_CONFIG_DONE(kbd);
1275 #ifdef KBD_INSTALL_CDEV
1276 if (kbd_attach(kbd)) {
1280 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1283 genkbd_diag(kbd, bootverbose);
1287 /* check for polling rate override */
1288 rate = ukbd_pollrate;
1295 /* set new polling interval in ms */
1296 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1299 /* start the keyboard */
1300 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1302 return (0); /* success */
1306 return (ENXIO); /* error */
1310 ukbd_detach(device_t dev)
1312 struct ukbd_softc *sc = device_get_softc(dev);
1319 sc->sc_flags |= UKBD_FLAG_GONE;
1321 usb_callout_stop(&sc->sc_callout);
1323 /* kill any stuck keys */
1324 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1325 /* stop receiving events from the USB keyboard */
1326 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1328 /* release all leftover keys, if any */
1329 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1331 /* process releasing of all keys */
1335 ukbd_disable(&sc->sc_kbd);
1337 #ifdef KBD_INSTALL_CDEV
1338 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1339 error = kbd_detach(&sc->sc_kbd);
1341 /* usb attach cannot return an error */
1342 device_printf(dev, "WARNING: kbd_detach() "
1343 "returned non-zero! (ignored)\n");
1347 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1348 error = kbd_unregister(&sc->sc_kbd);
1350 /* usb attach cannot return an error */
1351 device_printf(dev, "WARNING: kbd_unregister() "
1352 "returned non-zero! (ignored)\n");
1355 sc->sc_kbd.kb_flags = 0;
1357 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1359 usb_callout_drain(&sc->sc_callout);
1361 DPRINTF("%s: disconnected\n",
1362 device_get_nameunit(dev));
1368 ukbd_resume(device_t dev)
1370 struct ukbd_softc *sc = device_get_softc(dev);
1374 ukbd_clear_state(&sc->sc_kbd);
1379 /* early keyboard probe, not supported */
1381 ukbd_configure(int flags)
1386 /* detect a keyboard, not used */
1388 ukbd__probe(int unit, void *arg, int flags)
1393 /* reset and initialize the device, not used */
1395 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1400 /* test the interface to the device, not used */
1402 ukbd_test_if(keyboard_t *kbd)
1407 /* finish using this keyboard, not used */
1409 ukbd_term(keyboard_t *kbd)
1414 /* keyboard interrupt routine, not used */
1416 ukbd_intr(keyboard_t *kbd, void *arg)
1421 /* lock the access to the keyboard, not used */
1423 ukbd_lock(keyboard_t *kbd, int lock)
1429 * Enable the access to the device; until this function is called,
1430 * the client cannot read from the keyboard.
1433 ukbd_enable(keyboard_t *kbd)
1443 /* disallow the access to the device */
1445 ukbd_disable(keyboard_t *kbd)
1449 KBD_DEACTIVATE(kbd);
1455 /* check if data is waiting */
1456 /* Currently unused. */
1458 ukbd_check(keyboard_t *kbd)
1460 struct ukbd_softc *sc = kbd->kb_data;
1462 UKBD_CTX_LOCK_ASSERT();
1464 if (!KBD_IS_ACTIVE(kbd))
1467 if (sc->sc_flags & UKBD_FLAG_POLLING)
1468 ukbd_do_poll(sc, 0);
1470 #ifdef UKBD_EMULATE_ATSCANCODE
1471 if (sc->sc_buffered_char[0]) {
1475 if (sc->sc_inputs > 0) {
1481 /* check if char is waiting */
1483 ukbd_check_char_locked(keyboard_t *kbd)
1485 struct ukbd_softc *sc = kbd->kb_data;
1487 UKBD_CTX_LOCK_ASSERT();
1489 if (!KBD_IS_ACTIVE(kbd))
1492 if ((sc->sc_composed_char > 0) &&
1493 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1496 return (ukbd_check(kbd));
1500 ukbd_check_char(keyboard_t *kbd)
1505 result = ukbd_check_char_locked(kbd);
1511 /* read one byte from the keyboard if it's allowed */
1512 /* Currently unused. */
1514 ukbd_read(keyboard_t *kbd, int wait)
1516 struct ukbd_softc *sc = kbd->kb_data;
1518 #ifdef UKBD_EMULATE_ATSCANCODE
1524 UKBD_CTX_LOCK_ASSERT();
1526 if (!KBD_IS_ACTIVE(kbd))
1529 #ifdef UKBD_EMULATE_ATSCANCODE
1530 if (sc->sc_buffered_char[0]) {
1531 scancode = sc->sc_buffered_char[0];
1532 if (scancode & SCAN_PREFIX) {
1533 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1534 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1536 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1537 sc->sc_buffered_char[1] = 0;
1540 #endif /* UKBD_EMULATE_ATSCANCODE */
1543 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1544 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1549 #ifdef UKBD_EMULATE_ATSCANCODE
1550 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1551 if (keycode == NN) {
1554 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1555 (usbcode & KEY_RELEASE)));
1556 #else /* !UKBD_EMULATE_ATSCANCODE */
1558 #endif /* UKBD_EMULATE_ATSCANCODE */
1561 /* read char from the keyboard */
1563 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1565 struct ukbd_softc *sc = kbd->kb_data;
1569 #ifdef UKBD_EMULATE_ATSCANCODE
1573 UKBD_CTX_LOCK_ASSERT();
1575 if (!KBD_IS_ACTIVE(kbd))
1580 /* do we have a composed char to return ? */
1582 if ((sc->sc_composed_char > 0) &&
1583 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1585 action = sc->sc_composed_char;
1586 sc->sc_composed_char = 0;
1588 if (action > 0xFF) {
1593 #ifdef UKBD_EMULATE_ATSCANCODE
1595 /* do we have a pending raw scan code? */
1597 if (sc->sc_mode == K_RAW) {
1598 scancode = sc->sc_buffered_char[0];
1600 if (scancode & SCAN_PREFIX) {
1601 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1602 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1604 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1605 sc->sc_buffered_char[1] = 0;
1609 #endif /* UKBD_EMULATE_ATSCANCODE */
1611 /* see if there is something in the keyboard port */
1613 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1614 if (usbcode == -1) {
1619 #ifdef UKBD_EMULATE_ATSCANCODE
1620 /* USB key index -> key code -> AT scan code */
1621 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1622 if (keycode == NN) {
1625 /* return an AT scan code for the K_RAW mode */
1626 if (sc->sc_mode == K_RAW) {
1627 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1628 (usbcode & KEY_RELEASE)));
1630 #else /* !UKBD_EMULATE_ATSCANCODE */
1632 /* return the byte as is for the K_RAW mode */
1633 if (sc->sc_mode == K_RAW) {
1636 /* USB key index -> key code */
1637 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1638 if (keycode == NN) {
1641 #endif /* UKBD_EMULATE_ATSCANCODE */
1644 case 0x38: /* left alt (compose key) */
1645 if (usbcode & KEY_RELEASE) {
1646 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1647 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1649 if (sc->sc_composed_char > 0xFF) {
1650 sc->sc_composed_char = 0;
1654 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1655 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1656 sc->sc_composed_char = 0;
1660 /* XXX: I don't like these... */
1661 case 0x5c: /* print screen */
1662 if (sc->sc_flags & ALTS) {
1663 keycode = 0x54; /* sysrq */
1666 case 0x68: /* pause/break */
1667 if (sc->sc_flags & CTLS) {
1668 keycode = 0x6c; /* break */
1673 /* return the key code in the K_CODE mode */
1674 if (usbcode & KEY_RELEASE) {
1675 keycode |= SCAN_RELEASE;
1677 if (sc->sc_mode == K_CODE) {
1680 /* compose a character code */
1681 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1683 /* key pressed, process it */
1686 case 0x49: /* keypad 7,8,9 */
1687 sc->sc_composed_char *= 10;
1688 sc->sc_composed_char += keycode - 0x40;
1689 goto check_composed;
1693 case 0x4D: /* keypad 4,5,6 */
1694 sc->sc_composed_char *= 10;
1695 sc->sc_composed_char += keycode - 0x47;
1696 goto check_composed;
1700 case 0x51: /* keypad 1,2,3 */
1701 sc->sc_composed_char *= 10;
1702 sc->sc_composed_char += keycode - 0x4E;
1703 goto check_composed;
1705 case 0x52: /* keypad 0 */
1706 sc->sc_composed_char *= 10;
1707 goto check_composed;
1709 /* key released, no interest here */
1710 case SCAN_RELEASE | 0x47:
1711 case SCAN_RELEASE | 0x48:
1712 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1713 case SCAN_RELEASE | 0x4B:
1714 case SCAN_RELEASE | 0x4C:
1715 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1716 case SCAN_RELEASE | 0x4F:
1717 case SCAN_RELEASE | 0x50:
1718 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1719 case SCAN_RELEASE | 0x52: /* keypad 0 */
1722 case 0x38: /* left alt key */
1726 if (sc->sc_composed_char > 0) {
1727 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1728 sc->sc_composed_char = 0;
1734 /* keycode to key action */
1735 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1736 (keycode & SCAN_RELEASE),
1737 &sc->sc_state, &sc->sc_accents);
1738 if (action == NOKEY) {
1745 if (sc->sc_composed_char <= 0xFF) {
1752 /* Currently wait is always false. */
1754 ukbd_read_char(keyboard_t *kbd, int wait)
1759 keycode = ukbd_read_char_locked(kbd, wait);
1765 /* some useful control functions */
1767 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1769 struct ukbd_softc *sc = kbd->kb_data;
1771 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1772 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1780 case KDGKBMODE: /* get keyboard mode */
1781 *(int *)arg = sc->sc_mode;
1783 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1784 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1786 ival = IOCPARM_IVAL(arg);
1787 arg = (caddr_t)&ival;
1790 case KDSKBMODE: /* set keyboard mode */
1791 switch (*(int *)arg) {
1793 if (sc->sc_mode != K_XLATE) {
1794 /* make lock key state and LED state match */
1795 sc->sc_state &= ~LOCK_MASK;
1796 sc->sc_state |= KBD_LED_VAL(kbd);
1801 if (sc->sc_mode != *(int *)arg) {
1802 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1803 ukbd_clear_state(kbd);
1804 sc->sc_mode = *(int *)arg;
1812 case KDGETLED: /* get keyboard LED */
1813 *(int *)arg = KBD_LED_VAL(kbd);
1815 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1816 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1818 ival = IOCPARM_IVAL(arg);
1819 arg = (caddr_t)&ival;
1822 case KDSETLED: /* set keyboard LED */
1823 /* NOTE: lock key state in "sc_state" won't be changed */
1824 if (*(int *)arg & ~LOCK_MASK)
1829 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1830 if (sc->sc_mode == K_XLATE &&
1831 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1837 if (KBD_HAS_DEVICE(kbd))
1838 ukbd_set_leds(sc, i);
1840 KBD_LED_VAL(kbd) = *(int *)arg;
1842 case KDGKBSTATE: /* get lock key state */
1843 *(int *)arg = sc->sc_state & LOCK_MASK;
1845 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1846 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1848 ival = IOCPARM_IVAL(arg);
1849 arg = (caddr_t)&ival;
1852 case KDSKBSTATE: /* set lock key state */
1853 if (*(int *)arg & ~LOCK_MASK) {
1856 sc->sc_state &= ~LOCK_MASK;
1857 sc->sc_state |= *(int *)arg;
1859 /* set LEDs and quit */
1860 return (ukbd_ioctl(kbd, KDSETLED, arg));
1862 case KDSETREPEAT: /* set keyboard repeat rate (new
1864 if (!KBD_HAS_DEVICE(kbd)) {
1867 if (((int *)arg)[1] < 0) {
1870 if (((int *)arg)[0] < 0) {
1873 if (((int *)arg)[0] < 200) /* fastest possible value */
1874 kbd->kb_delay1 = 200;
1876 kbd->kb_delay1 = ((int *)arg)[0];
1877 kbd->kb_delay2 = ((int *)arg)[1];
1880 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1881 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1883 ival = IOCPARM_IVAL(arg);
1884 arg = (caddr_t)&ival;
1887 case KDSETRAD: /* set keyboard repeat rate (old
1889 return (ukbd_set_typematic(kbd, *(int *)arg));
1891 case PIO_KEYMAP: /* set keyboard translation table */
1892 case OPIO_KEYMAP: /* set keyboard translation table
1894 case PIO_KEYMAPENT: /* set keyboard translation table
1896 case PIO_DEADKEYMAP: /* set accent key translation table */
1900 return (genkbd_commonioctl(kbd, cmd, arg));
1907 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1912 * XXX Check of someone is calling us from a critical section:
1914 if (curthread->td_critnest != 0)
1918 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1919 * context where printf(9) can be called, which among other things
1920 * includes interrupt filters and threads with any kinds of locks
1921 * already held. For this reason it would be dangerous to acquire
1922 * the Giant here unconditionally. On the other hand we have to
1923 * have it to handle the ioctl.
1924 * So we make our best effort to auto-detect whether we can grab
1925 * the Giant or not. Blame syscons(4) for this.
1931 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1932 return (EDEADLK); /* best I could come up with */
1936 result = ukbd_ioctl_locked(kbd, cmd, arg);
1943 /* clear the internal state of the keyboard */
1945 ukbd_clear_state(keyboard_t *kbd)
1947 struct ukbd_softc *sc = kbd->kb_data;
1949 UKBD_CTX_LOCK_ASSERT();
1951 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1952 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1954 sc->sc_composed_char = 0;
1955 #ifdef UKBD_EMULATE_ATSCANCODE
1956 sc->sc_buffered_char[0] = 0;
1957 sc->sc_buffered_char[1] = 0;
1959 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1960 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1961 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1962 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1965 /* save the internal state, not used */
1967 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1969 return (len == 0) ? 1 : -1;
1972 /* set the internal state, not used */
1974 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1980 ukbd_poll(keyboard_t *kbd, int on)
1982 struct ukbd_softc *sc = kbd->kb_data;
1986 sc->sc_flags |= UKBD_FLAG_POLLING;
1987 sc->sc_poll_thread = curthread;
1989 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1990 ukbd_start_timer(sc); /* start timer */
1997 /* local functions */
2000 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2004 DPRINTF("leds=0x%02x\n", leds);
2007 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2009 /* start transfer, if not already started */
2011 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2015 ukbd_set_typematic(keyboard_t *kbd, int code)
2017 static const int delays[] = {250, 500, 750, 1000};
2018 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2019 68, 76, 84, 92, 100, 110, 118, 126,
2020 136, 152, 168, 184, 200, 220, 236, 252,
2021 272, 304, 336, 368, 400, 440, 472, 504};
2026 kbd->kb_delay1 = delays[(code >> 5) & 3];
2027 kbd->kb_delay2 = rates[code & 0x1f];
2031 #ifdef UKBD_EMULATE_ATSCANCODE
2033 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2035 static const int scan[] = {
2041 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2051 0x151, /* PageDown */
2054 0x146, /* XXX Pause/Break */
2055 0x15b, /* Win_L(Super_L) */
2056 0x15c, /* Win_R(Super_R) */
2057 0x15d, /* Application(Menu) */
2059 /* SUN TYPE 6 USB KEYBOARD */
2060 0x168, /* Sun Type 6 Help */
2061 0x15e, /* Sun Type 6 Stop */
2063 0x15f, /* Sun Type 6 Again */
2064 0x160, /* Sun Type 6 Props */
2065 0x161, /* Sun Type 6 Undo */
2066 0x162, /* Sun Type 6 Front */
2067 0x163, /* Sun Type 6 Copy */
2068 0x164, /* Sun Type 6 Open */
2069 0x165, /* Sun Type 6 Paste */
2070 0x166, /* Sun Type 6 Find */
2071 0x167, /* Sun Type 6 Cut */
2072 0x125, /* Sun Type 6 Mute */
2074 0x11f, /* Sun Type 6 VolumeDown */
2075 0x11e, /* Sun Type 6 VolumeUp */
2076 0x120, /* Sun Type 6 PowerDown */
2078 /* Japanese 106/109 keyboard */
2079 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2080 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2081 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2082 0x79, /* Keyboard Intl' 4 (Henkan) */
2083 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2084 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2087 if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2088 code = scan[code - 89];
2091 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2092 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2094 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2095 code &= ~SCAN_PREFIX_SHIFT;
2097 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2099 if (code & SCAN_PREFIX) {
2100 if (code & SCAN_PREFIX_CTL) {
2102 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2103 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2104 } else if (code & SCAN_PREFIX_SHIFT) {
2106 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2107 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2109 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2110 sc->sc_buffered_char[1] = 0;
2112 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2118 #endif /* UKBD_EMULATE_ATSCANCODE */
2120 static keyboard_switch_t ukbdsw = {
2121 .probe = &ukbd__probe,
2125 .test_if = &ukbd_test_if,
2126 .enable = &ukbd_enable,
2127 .disable = &ukbd_disable,
2129 .check = &ukbd_check,
2130 .read_char = &ukbd_read_char,
2131 .check_char = &ukbd_check_char,
2132 .ioctl = &ukbd_ioctl,
2134 .clear_state = &ukbd_clear_state,
2135 .get_state = &ukbd_get_state,
2136 .set_state = &ukbd_set_state,
2137 .get_fkeystr = &genkbd_get_fkeystr,
2139 .diag = &genkbd_diag,
2142 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2145 ukbd_driver_load(module_t mod, int what, void *arg)
2149 kbd_add_driver(&ukbd_kbd_driver);
2152 kbd_delete_driver(&ukbd_kbd_driver);
2158 static devclass_t ukbd_devclass;
2160 static device_method_t ukbd_methods[] = {
2161 DEVMETHOD(device_probe, ukbd_probe),
2162 DEVMETHOD(device_attach, ukbd_attach),
2163 DEVMETHOD(device_detach, ukbd_detach),
2164 DEVMETHOD(device_resume, ukbd_resume),
2169 static driver_t ukbd_driver = {
2171 .methods = ukbd_methods,
2172 .size = sizeof(struct ukbd_softc),
2175 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2176 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2177 MODULE_VERSION(ukbd, 1);