5 * SPDX-License-Identifier: BSD-2-Clause-NetBSD
7 * Copyright (c) 1998 The NetBSD Foundation, Inc.
10 * This code is derived from software contributed to The NetBSD Foundation
11 * by Lennart Augustsson (lennart@augustsson.net) at
12 * Carlstedt Research & Technology.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
23 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
38 * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
43 #include "opt_evdev.h"
45 #include <sys/stdint.h>
46 #include <sys/stddef.h>
47 #include <sys/param.h>
48 #include <sys/queue.h>
49 #include <sys/types.h>
50 #include <sys/systm.h>
51 #include <sys/kernel.h>
53 #include <sys/module.h>
55 #include <sys/mutex.h>
56 #include <sys/condvar.h>
57 #include <sys/sysctl.h>
59 #include <sys/unistd.h>
60 #include <sys/callout.h>
61 #include <sys/malloc.h>
65 #include <dev/hid/hid.h>
67 #include <dev/usb/usb.h>
68 #include <dev/usb/usbdi.h>
69 #include <dev/usb/usbdi_util.h>
70 #include <dev/usb/usbhid.h>
72 #define USB_DEBUG_VAR ukbd_debug
73 #include <dev/usb/usb_debug.h>
75 #include <dev/usb/quirk/usb_quirk.h>
78 #include <dev/evdev/input.h>
79 #include <dev/evdev/evdev.h>
82 #include <sys/ioccom.h>
83 #include <sys/filio.h>
86 #include <dev/kbd/kbdreg.h>
88 /* the initial key map, accent map and fkey strings */
89 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
90 #define KBD_DFLT_KEYMAP
94 /* the following file must be included after "ukbdmap.h" */
95 #include <dev/kbd/kbdtables.h>
98 static int ukbd_debug = 0;
99 static int ukbd_no_leds = 0;
100 static int ukbd_pollrate = 0;
102 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
104 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RWTUN,
105 &ukbd_debug, 0, "Debug level");
106 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
107 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
108 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RWTUN,
109 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
112 #define UKBD_EMULATE_ATSCANCODE 1
113 #define UKBD_DRIVER_NAME "ukbd"
114 #define UKBD_NKEYCODE 256 /* units */
115 #define UKBD_IN_BUF_SIZE (4 * UKBD_NKEYCODE) /* scancodes */
116 #define UKBD_IN_BUF_FULL ((UKBD_IN_BUF_SIZE / 2) - 1) /* scancodes */
117 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
118 #define UKBD_BUFFER_SIZE 64 /* bytes */
119 #define UKBD_KEY_PRESSED(map, key) ({ \
120 CTASSERT((key) >= 0 && (key) < UKBD_NKEYCODE); \
121 ((map)[(key) / 64] & (1ULL << ((key) % 64))); \
124 #define MOD_EJECT 0x01
128 uint64_t bitmap[howmany(UKBD_NKEYCODE, 64)];
141 accentmap_t sc_accmap;
142 fkeytab_t sc_fkeymap[UKBD_NFKEY];
143 uint64_t sc_loc_key_valid[howmany(UKBD_NKEYCODE, 64)];
144 struct hid_location sc_loc_apple_eject;
145 struct hid_location sc_loc_apple_fn;
146 struct hid_location sc_loc_key[UKBD_NKEYCODE];
147 struct hid_location sc_loc_numlock;
148 struct hid_location sc_loc_capslock;
149 struct hid_location sc_loc_scrolllock;
150 struct usb_callout sc_callout;
151 struct ukbd_data sc_ndata;
152 struct ukbd_data sc_odata;
154 struct thread *sc_poll_thread;
155 struct usb_device *sc_udev;
156 struct usb_interface *sc_iface;
157 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
159 struct evdev_dev *sc_evdev;
162 sbintime_t sc_co_basetime;
164 uint32_t sc_repeat_time;
165 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
167 uint32_t sc_composed_char; /* composed char code, if non-zero */
168 #ifdef UKBD_EMULATE_ATSCANCODE
169 uint32_t sc_buffered_char[2];
171 uint32_t sc_flags; /* flags */
172 #define UKBD_FLAG_COMPOSE 0x00000001
173 #define UKBD_FLAG_POLLING 0x00000002
174 #define UKBD_FLAG_SET_LEDS 0x00000004
175 #define UKBD_FLAG_ATTACHED 0x00000010
176 #define UKBD_FLAG_GONE 0x00000020
178 #define UKBD_FLAG_HID_MASK 0x003fffc0
179 #define UKBD_FLAG_APPLE_EJECT 0x00000040
180 #define UKBD_FLAG_APPLE_FN 0x00000080
181 #define UKBD_FLAG_APPLE_SWAP 0x00000100
182 #define UKBD_FLAG_NUMLOCK 0x00080000
183 #define UKBD_FLAG_CAPSLOCK 0x00100000
184 #define UKBD_FLAG_SCROLLLOCK 0x00200000
186 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
187 int sc_state; /* shift/lock key state */
188 int sc_accents; /* accent key index (> 0) */
189 int sc_polling; /* polling recursion count */
194 uint16_t sc_inputhead;
195 uint16_t sc_inputtail;
197 uint8_t sc_leds; /* store for async led requests */
198 uint8_t sc_iface_index;
200 uint8_t sc_id_apple_eject;
201 uint8_t sc_id_apple_fn;
202 uint8_t sc_id_loc_key[UKBD_NKEYCODE];
203 uint8_t sc_id_numlock;
204 uint8_t sc_id_capslock;
205 uint8_t sc_id_scrolllock;
207 uint8_t sc_repeat_key;
209 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
212 #define KEY_NONE 0x00
213 #define KEY_ERROR 0x01
216 #define KEY_RELEASE 0x400
217 #define KEY_INDEX(c) ((c) & 0xFF)
220 #define SCAN_RELEASE 0x80
221 #define SCAN_PREFIX_E0 0x100
222 #define SCAN_PREFIX_E1 0x200
223 #define SCAN_PREFIX_CTL 0x400
224 #define SCAN_PREFIX_SHIFT 0x800
225 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
226 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
227 #define SCAN_CHAR(c) ((c) & 0x7f)
229 #define UKBD_LOCK() USB_MTX_LOCK(&Giant)
230 #define UKBD_UNLOCK() USB_MTX_UNLOCK(&Giant)
231 #define UKBD_LOCK_ASSERT() USB_MTX_ASSERT(&Giant, MA_OWNED)
233 #define NN 0 /* no translation */
235 * Translate USB keycodes to AT keyboard scancodes.
238 * FIXME: Mac USB keyboard generates:
239 * 0x53: keypad NumLock/Clear
246 * USB Apple Keyboard JIS generates:
250 static const uint8_t ukbd_trtab[256] = {
251 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
252 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
253 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
254 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
255 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
256 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
257 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
258 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
259 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
260 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
261 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
262 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
263 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
264 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
265 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
266 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
267 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
268 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
269 129, 130, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
270 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
271 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
272 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
273 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
274 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
275 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
276 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
277 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
278 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
279 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
280 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
281 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
282 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
285 static const uint8_t ukbd_boot_desc[] = {
286 0x05, 0x01, 0x09, 0x06, 0xa1,
287 0x01, 0x05, 0x07, 0x19, 0xe0,
288 0x29, 0xe7, 0x15, 0x00, 0x25,
289 0x01, 0x75, 0x01, 0x95, 0x08,
290 0x81, 0x02, 0x95, 0x01, 0x75,
291 0x08, 0x81, 0x01, 0x95, 0x03,
292 0x75, 0x01, 0x05, 0x08, 0x19,
293 0x01, 0x29, 0x03, 0x91, 0x02,
294 0x95, 0x05, 0x75, 0x01, 0x91,
295 0x01, 0x95, 0x06, 0x75, 0x08,
296 0x15, 0x00, 0x26, 0xff, 0x00,
297 0x05, 0x07, 0x19, 0x00, 0x2a,
298 0xff, 0x00, 0x81, 0x00, 0xc0
302 static void ukbd_timeout(void *);
303 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
304 static int ukbd_set_typematic(keyboard_t *, int);
305 #ifdef UKBD_EMULATE_ATSCANCODE
306 static uint32_t ukbd_atkeycode(int, const uint64_t *);
307 static int ukbd_key2scan(struct ukbd_softc *, int, const uint64_t *, int);
309 static uint32_t ukbd_read_char(keyboard_t *, int);
310 static void ukbd_clear_state(keyboard_t *);
311 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
312 static int ukbd_enable(keyboard_t *);
313 static int ukbd_disable(keyboard_t *);
314 static void ukbd_interrupt(struct ukbd_softc *);
315 static void ukbd_event_keyinput(struct ukbd_softc *);
317 static device_probe_t ukbd_probe;
318 static device_attach_t ukbd_attach;
319 static device_detach_t ukbd_detach;
320 static device_resume_t ukbd_resume;
323 static evdev_event_t ukbd_ev_event;
325 static const struct evdev_methods ukbd_evdev_methods = {
326 .ev_event = ukbd_ev_event,
331 ukbd_any_key_pressed(struct ukbd_softc *sc)
336 for (i = 0; i != howmany(UKBD_NKEYCODE, 64); i++)
337 ret |= (sc->sc_odata.bitmap[i] != 0);
342 ukbd_any_key_valid(struct ukbd_softc *sc)
347 for (i = 0; i != howmany(UKBD_NKEYCODE, 64); i++)
348 ret |= (sc->sc_loc_key_valid[i] != 0);
353 ukbd_is_modifier_key(uint32_t key)
356 return (key >= 0xe0 && key <= 0xe7);
360 ukbd_start_timer(struct ukbd_softc *sc)
362 sbintime_t delay, now, prec;
366 /* check if initial delay passed and fallback to key repeat delay */
367 if (sc->sc_delay == 0)
368 sc->sc_delay = sc->sc_kbd.kb_delay2;
370 /* compute timeout */
371 delay = SBT_1MS * sc->sc_delay;
372 sc->sc_co_basetime += delay;
374 /* check if we are running behind */
375 if (sc->sc_co_basetime < now)
376 sc->sc_co_basetime = now;
378 /* This is rarely called, so prefer precision to efficiency. */
379 prec = qmin(delay >> 7, SBT_1MS * 10);
380 usb_callout_reset_sbt(&sc->sc_callout, sc->sc_co_basetime, prec,
381 ukbd_timeout, sc, C_ABSOLUTE);
385 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
390 DPRINTF("0x%02x (%d) %s\n", key, key,
391 (key & KEY_RELEASE) ? "released" : "pressed");
394 if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL)
395 evdev_push_event(sc->sc_evdev, EV_KEY,
396 evdev_hid2key(KEY_INDEX(key)), !(key & KEY_RELEASE));
399 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
400 sc->sc_input[sc->sc_inputtail] = key;
402 ++(sc->sc_inputtail);
403 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
404 sc->sc_inputtail = 0;
407 DPRINTF("input buffer is full\n");
412 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
416 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
417 ("ukbd_do_poll called when not polling\n"));
418 DPRINTFN(2, "polling\n");
420 if (USB_IN_POLLING_MODE_FUNC() == 0) {
422 * In this context the kernel is polling for input,
423 * but the USB subsystem works in normal interrupt-driven
424 * mode, so we just wait on the USB threads to do the job.
425 * Note that we currently hold the Giant, but it's also used
426 * as the transfer mtx, so we must release it while waiting.
428 while (sc->sc_inputs == 0) {
430 * Give USB threads a chance to run. Note that
431 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
433 kern_yield(PRI_UNCHANGED);
440 while (sc->sc_inputs == 0) {
441 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
443 /* Delay-optimised support for repetition of keys */
444 if (ukbd_any_key_pressed(sc)) {
445 /* a key is pressed - need timekeeping */
448 /* 1 millisecond has passed */
460 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
465 KASSERT((USB_IN_POLLING_MODE_FUNC() == 0) ||
466 (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
467 ("not polling in kdb or panic\n"));
469 if (sc->sc_inputs == 0 &&
470 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
471 /* start transfer, if not already started */
472 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT_0]);
473 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT_1]);
476 if (sc->sc_flags & UKBD_FLAG_POLLING)
477 ukbd_do_poll(sc, wait);
479 if (sc->sc_inputs == 0) {
482 c = sc->sc_input[sc->sc_inputhead];
484 ++(sc->sc_inputhead);
485 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
486 sc->sc_inputhead = 0;
493 ukbd_interrupt(struct ukbd_softc *sc)
495 const uint32_t now = sc->sc_time_ms;
500 /* Check for modifier key changes first */
501 for (key = 0xe0; key != 0xe8; key++) {
502 const uint64_t mask = 1ULL << (key % 64);
503 const uint64_t delta =
504 sc->sc_odata.bitmap[key / 64] ^
505 sc->sc_ndata.bitmap[key / 64];
508 if (sc->sc_odata.bitmap[key / 64] & mask)
509 ukbd_put_key(sc, key | KEY_RELEASE);
511 ukbd_put_key(sc, key | KEY_PRESS);
515 /* Check for key changes */
516 for (key = 0; key != UKBD_NKEYCODE; key++) {
517 const uint64_t mask = 1ULL << (key % 64);
518 const uint64_t delta =
519 sc->sc_odata.bitmap[key / 64] ^
520 sc->sc_ndata.bitmap[key / 64];
522 if (mask == 1 && delta == 0) {
524 continue; /* skip empty areas */
525 } else if (ukbd_is_modifier_key(key)) {
527 } else if (delta & mask) {
528 if (sc->sc_odata.bitmap[key / 64] & mask) {
529 ukbd_put_key(sc, key | KEY_RELEASE);
531 /* clear repeating key, if any */
532 if (sc->sc_repeat_key == key)
533 sc->sc_repeat_key = 0;
535 ukbd_put_key(sc, key | KEY_PRESS);
537 sc->sc_co_basetime = sbinuptime();
538 sc->sc_delay = sc->sc_kbd.kb_delay1;
539 ukbd_start_timer(sc);
541 /* set repeat time for last key */
542 sc->sc_repeat_time = now + sc->sc_kbd.kb_delay1;
543 sc->sc_repeat_key = key;
548 /* synchronize old data with new data */
549 sc->sc_odata = sc->sc_ndata;
551 /* check if last key is still pressed */
552 if (sc->sc_repeat_key != 0) {
553 const int32_t dtime = (sc->sc_repeat_time - now);
555 /* check if time has elapsed */
557 ukbd_put_key(sc, sc->sc_repeat_key | KEY_PRESS);
558 sc->sc_repeat_time = now + sc->sc_kbd.kb_delay2;
563 if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD && sc->sc_evdev != NULL)
564 evdev_sync(sc->sc_evdev);
567 /* wakeup keyboard system */
568 ukbd_event_keyinput(sc);
572 ukbd_event_keyinput(struct ukbd_softc *sc)
578 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
581 if (sc->sc_inputs == 0)
584 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
585 KBD_IS_BUSY(&sc->sc_kbd)) {
586 /* let the callback function process the input */
587 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
588 sc->sc_kbd.kb_callback.kc_arg);
590 /* read and discard the input, no one is waiting for it */
592 c = ukbd_read_char(&sc->sc_kbd, 0);
593 } while (c != NOKEY);
598 ukbd_timeout(void *arg)
600 struct ukbd_softc *sc = arg;
604 sc->sc_time_ms += sc->sc_delay;
609 /* Make sure any leftover key events gets read out */
610 ukbd_event_keyinput(sc);
612 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
613 ukbd_start_timer(sc);
618 ukbd_apple_fn(uint32_t keycode)
621 case 0x28: return 0x49; /* RETURN -> INSERT */
622 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
623 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
624 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
625 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
626 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
627 default: return keycode;
632 ukbd_apple_swap(uint32_t keycode)
635 case 0x35: return 0x64;
636 case 0x64: return 0x35;
637 default: return keycode;
642 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
644 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
645 struct usb_page_cache *pc;
654 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
655 pc = usbd_xfer_get_frame(xfer, 0);
657 switch (USB_GET_STATE(xfer)) {
658 case USB_ST_TRANSFERRED:
659 DPRINTF("actlen=%d bytes\n", len);
662 DPRINTF("zero length data\n");
666 if (sc->sc_kbd_id != 0) {
667 /* check and remove HID ID byte */
668 usbd_copy_out(pc, 0, &id, 1);
672 DPRINTF("zero length data\n");
680 if (len > UKBD_BUFFER_SIZE)
681 len = UKBD_BUFFER_SIZE;
684 usbd_copy_out(pc, offset, sc->sc_buffer, len);
686 /* clear temporary storage */
687 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
689 /* clear modifiers */
692 /* scan through HID data */
693 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
694 (id == sc->sc_id_apple_eject)) {
695 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
696 modifiers |= MOD_EJECT;
698 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
699 (id == sc->sc_id_apple_fn)) {
700 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
704 for (i = 0; i != UKBD_NKEYCODE; i++) {
705 const uint64_t valid = sc->sc_loc_key_valid[i / 64];
706 const uint64_t mask = 1ULL << (i % 64);
708 if (mask == 1 && valid == 0) {
710 continue; /* skip empty areas */
711 } else if (~valid & mask) {
712 continue; /* location is not valid */
713 } else if (id != sc->sc_id_loc_key[i]) {
714 continue; /* invalid HID ID */
716 struct hid_location tmp_loc = sc->sc_loc_key[0];
717 /* range check array size */
718 if (tmp_loc.count > UKBD_NKEYCODE)
719 tmp_loc.count = UKBD_NKEYCODE;
720 while (tmp_loc.count--) {
722 hid_get_udata(sc->sc_buffer, len, &tmp_loc);
723 /* advance to next location */
724 tmp_loc.pos += tmp_loc.size;
725 if (key == KEY_ERROR) {
726 DPRINTF("KEY_ERROR\n");
727 sc->sc_ndata = sc->sc_odata;
728 goto tr_setup; /* ignore */
730 if (modifiers & MOD_FN)
731 key = ukbd_apple_fn(key);
732 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP)
733 key = ukbd_apple_swap(key);
734 if (key == KEY_NONE || key >= UKBD_NKEYCODE)
736 /* set key in bitmap */
737 sc->sc_ndata.bitmap[key / 64] |= 1ULL << (key % 64);
739 } else if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_key[i])) {
742 if (modifiers & MOD_FN)
743 key = ukbd_apple_fn(key);
744 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP)
745 key = ukbd_apple_swap(key);
746 if (key == KEY_NONE || key == KEY_ERROR || key >= UKBD_NKEYCODE)
748 /* set key in bitmap */
749 sc->sc_ndata.bitmap[key / 64] |= 1ULL << (key % 64);
753 DPRINTF("modifiers = 0x%04x\n", modifiers);
754 for (i = 0; i != UKBD_NKEYCODE; i++) {
755 const uint64_t valid = sc->sc_ndata.bitmap[i / 64];
756 const uint64_t mask = 1ULL << (i % 64);
759 DPRINTF("Key 0x%02x pressed\n", i);
766 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
767 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
768 usbd_transfer_submit(xfer);
770 DPRINTF("input queue is full!\n");
775 DPRINTF("error=%s\n", usbd_errstr(error));
777 if (error != USB_ERR_CANCELLED) {
778 /* try to clear stall first */
779 usbd_xfer_set_stall(xfer);
787 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
789 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
790 struct usb_device_request req;
791 struct usb_page_cache *pc;
803 switch (USB_GET_STATE(xfer)) {
804 case USB_ST_TRANSFERRED:
806 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
808 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
810 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
811 req.bRequest = UR_SET_REPORT;
812 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
813 req.wIndex[0] = sc->sc_iface_no;
817 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
822 /* Assumption: All led bits must be in the same ID. */
824 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
825 if (sc->sc_leds & NLKED) {
826 hid_put_udata(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
827 &sc->sc_loc_numlock, 1);
829 id = sc->sc_id_numlock;
833 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
834 if (sc->sc_leds & SLKED) {
835 hid_put_udata(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
836 &sc->sc_loc_scrolllock, 1);
838 id = sc->sc_id_scrolllock;
842 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
843 if (sc->sc_leds & CLKED) {
844 hid_put_udata(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
845 &sc->sc_loc_capslock, 1);
847 id = sc->sc_id_capslock;
851 /* if no leds, nothing to do */
855 /* range check output report length */
856 len = sc->sc_led_size;
857 if (len > (UKBD_BUFFER_SIZE - 1))
858 len = (UKBD_BUFFER_SIZE - 1);
860 /* check if we need to prefix an ID byte */
861 sc->sc_buffer[0] = id;
863 pc = usbd_xfer_get_frame(xfer, 1);
866 usbd_copy_in(pc, 0, sc->sc_buffer, len);
868 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
870 req.wLength[0] = len;
871 usbd_xfer_set_frame_len(xfer, 1, len);
873 DPRINTF("len=%d, id=%d\n", len, id);
875 /* setup control request last */
876 pc = usbd_xfer_get_frame(xfer, 0);
877 usbd_copy_in(pc, 0, &req, sizeof(req));
878 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
880 /* start data transfer */
881 usbd_xfer_set_frames(xfer, 2);
882 usbd_transfer_submit(xfer);
886 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
891 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
893 .type = UE_INTERRUPT,
894 .endpoint = UE_ADDR_ANY,
895 .direction = UE_DIR_IN,
896 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
897 .bufsize = 0, /* use wMaxPacketSize */
898 .callback = &ukbd_intr_callback,
902 .type = UE_INTERRUPT,
903 .endpoint = UE_ADDR_ANY,
904 .direction = UE_DIR_IN,
905 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
906 .bufsize = 0, /* use wMaxPacketSize */
907 .callback = &ukbd_intr_callback,
912 .endpoint = 0x00, /* Control pipe */
913 .direction = UE_DIR_ANY,
914 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
915 .callback = &ukbd_set_leds_callback,
916 .timeout = 1000, /* 1 second */
920 /* A match on these entries will load ukbd */
921 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
922 {USB_IFACE_CLASS(UICLASS_HID),
923 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
924 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
928 ukbd_probe(device_t dev)
930 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
931 struct usb_attach_arg *uaa = device_get_ivars(dev);
942 if (uaa->usb_mode != USB_MODE_HOST) {
946 if (uaa->info.bInterfaceClass != UICLASS_HID)
949 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
952 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
953 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
954 return (BUS_PROBE_DEFAULT);
956 error = usbd_req_get_hid_desc(uaa->device, NULL,
957 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
962 if (hid_is_keyboard(d_ptr, d_len)) {
963 if (hid_is_mouse(d_ptr, d_len)) {
965 * NOTE: We currently don't support USB mouse
966 * and USB keyboard on the same USB endpoint.
967 * Let "ums" driver win.
971 error = BUS_PROBE_DEFAULT;
981 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
986 /* reset detected bits */
987 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
989 /* reset detected keys */
990 memset(sc->sc_loc_key_valid, 0, sizeof(sc->sc_loc_key_valid));
992 /* check if there is an ID byte */
993 sc->sc_kbd_size = hid_report_size_max(ptr, len,
994 hid_input, &sc->sc_kbd_id);
996 /* investigate if this is an Apple Keyboard */
997 if (hid_locate(ptr, len,
998 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
999 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1000 &sc->sc_id_apple_eject)) {
1001 if (flags & HIO_VARIABLE)
1002 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1003 UKBD_FLAG_APPLE_SWAP;
1004 DPRINTFN(1, "Found Apple eject-key\n");
1006 if (hid_locate(ptr, len,
1007 HID_USAGE2(0xFFFF, 0x0003),
1008 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1009 &sc->sc_id_apple_fn)) {
1010 if (flags & HIO_VARIABLE)
1011 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1012 DPRINTFN(1, "Found Apple FN-key\n");
1015 /* figure out event buffer */
1016 if (hid_locate(ptr, len,
1017 HID_USAGE2(HUP_KEYBOARD, 0x00),
1018 hid_input, 0, &sc->sc_loc_key[0], &flags,
1019 &sc->sc_id_loc_key[0])) {
1020 if (flags & HIO_VARIABLE) {
1021 DPRINTFN(1, "Ignoring keyboard event control\n");
1023 sc->sc_loc_key_valid[0] |= 1;
1024 DPRINTFN(1, "Found keyboard event array\n");
1028 /* figure out the keys */
1029 for (key = 1; key != UKBD_NKEYCODE; key++) {
1030 if (hid_locate(ptr, len,
1031 HID_USAGE2(HUP_KEYBOARD, key),
1032 hid_input, 0, &sc->sc_loc_key[key], &flags,
1033 &sc->sc_id_loc_key[key])) {
1034 if (flags & HIO_VARIABLE) {
1035 sc->sc_loc_key_valid[key / 64] |=
1037 DPRINTFN(1, "Found key 0x%02x\n", key);
1042 /* figure out leds on keyboard */
1043 sc->sc_led_size = hid_report_size_max(ptr, len,
1046 if (hid_locate(ptr, len,
1047 HID_USAGE2(HUP_LEDS, 0x01),
1048 hid_output, 0, &sc->sc_loc_numlock, &flags,
1049 &sc->sc_id_numlock)) {
1050 if (flags & HIO_VARIABLE)
1051 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1052 DPRINTFN(1, "Found keyboard numlock\n");
1054 if (hid_locate(ptr, len,
1055 HID_USAGE2(HUP_LEDS, 0x02),
1056 hid_output, 0, &sc->sc_loc_capslock, &flags,
1057 &sc->sc_id_capslock)) {
1058 if (flags & HIO_VARIABLE)
1059 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1060 DPRINTFN(1, "Found keyboard capslock\n");
1062 if (hid_locate(ptr, len,
1063 HID_USAGE2(HUP_LEDS, 0x03),
1064 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1065 &sc->sc_id_scrolllock)) {
1066 if (flags & HIO_VARIABLE)
1067 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1068 DPRINTFN(1, "Found keyboard scrolllock\n");
1073 ukbd_attach(device_t dev)
1075 struct ukbd_softc *sc = device_get_softc(dev);
1076 struct usb_attach_arg *uaa = device_get_ivars(dev);
1077 int unit = device_get_unit(dev);
1078 keyboard_t *kbd = &sc->sc_kbd;
1079 void *hid_ptr = NULL;
1083 #ifdef EVDEV_SUPPORT
1084 struct evdev_dev *evdev;
1092 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1094 kbd->kb_data = (void *)sc;
1096 device_set_usb_desc(dev);
1098 sc->sc_udev = uaa->device;
1099 sc->sc_iface = uaa->iface;
1100 sc->sc_iface_index = uaa->info.bIfaceIndex;
1101 sc->sc_iface_no = uaa->info.bIfaceNum;
1102 sc->sc_mode = K_XLATE;
1104 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1106 #ifdef UKBD_NO_POLLING
1107 err = usbd_transfer_setup(uaa->device,
1108 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1109 UKBD_N_TRANSFER, sc, &Giant);
1112 * Setup the UKBD USB transfers one by one, so they are memory
1113 * independent which allows for handling panics triggered by
1114 * the keyboard driver itself, typically via CTRL+ALT+ESC
1115 * sequences. Or if the USB keyboard driver was processing a
1116 * key at the moment of panic.
1118 for (n = 0; n != UKBD_N_TRANSFER; n++) {
1119 err = usbd_transfer_setup(uaa->device,
1120 &uaa->info.bIfaceIndex, sc->sc_xfer + n, ukbd_config + n,
1128 DPRINTF("error=%s\n", usbd_errstr(err));
1131 /* setup default keyboard maps */
1133 sc->sc_keymap = key_map;
1134 sc->sc_accmap = accent_map;
1135 for (n = 0; n < UKBD_NFKEY; n++) {
1136 sc->sc_fkeymap[n] = fkey_tab[n];
1139 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1140 sc->sc_fkeymap, UKBD_NFKEY);
1142 KBD_FOUND_DEVICE(kbd);
1144 ukbd_clear_state(kbd);
1147 * FIXME: set the initial value for lock keys in "sc_state"
1148 * according to the BIOS data?
1150 KBD_PROBE_DONE(kbd);
1152 /* get HID descriptor */
1153 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1154 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1157 DPRINTF("Parsing HID descriptor of %d bytes\n",
1160 ukbd_parse_hid(sc, hid_ptr, hid_len);
1162 free(hid_ptr, M_TEMP);
1165 /* check if we should use the boot protocol */
1166 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1167 (err != 0) || ukbd_any_key_valid(sc) == false) {
1168 DPRINTF("Forcing boot protocol\n");
1170 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1171 sc->sc_iface_index, 0);
1174 DPRINTF("Set protocol error=%s (ignored)\n",
1178 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1181 /* ignore if SETIDLE fails, hence it is not crucial */
1182 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1184 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1188 if (kbd_register(kbd) < 0) {
1191 KBD_CONFIG_DONE(kbd);
1195 #ifdef KBD_INSTALL_CDEV
1196 if (kbd_attach(kbd)) {
1201 #ifdef EVDEV_SUPPORT
1202 evdev = evdev_alloc();
1203 evdev_set_name(evdev, device_get_desc(dev));
1204 evdev_set_phys(evdev, device_get_nameunit(dev));
1205 evdev_set_id(evdev, BUS_USB, uaa->info.idVendor,
1206 uaa->info.idProduct, 0);
1207 evdev_set_serial(evdev, usb_get_serial(uaa->device));
1208 evdev_set_methods(evdev, kbd, &ukbd_evdev_methods);
1209 evdev_support_event(evdev, EV_SYN);
1210 evdev_support_event(evdev, EV_KEY);
1211 if (sc->sc_flags & (UKBD_FLAG_NUMLOCK | UKBD_FLAG_CAPSLOCK |
1212 UKBD_FLAG_SCROLLLOCK))
1213 evdev_support_event(evdev, EV_LED);
1214 evdev_support_event(evdev, EV_REP);
1216 for (i = 0x00; i <= 0xFF; i++)
1217 evdev_support_key(evdev, evdev_hid2key(i));
1218 if (sc->sc_flags & UKBD_FLAG_NUMLOCK)
1219 evdev_support_led(evdev, LED_NUML);
1220 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK)
1221 evdev_support_led(evdev, LED_CAPSL);
1222 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK)
1223 evdev_support_led(evdev, LED_SCROLLL);
1225 if (evdev_register_mtx(evdev, &Giant))
1228 sc->sc_evdev = evdev;
1231 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1234 kbdd_diag(kbd, bootverbose);
1238 /* check for polling rate override */
1239 rate = ukbd_pollrate;
1246 /* set new polling interval in ms */
1247 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT_0], rate);
1248 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT_1], rate);
1251 /* start the keyboard */
1252 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT_0]);
1253 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT_1]);
1255 return (0); /* success */
1259 return (ENXIO); /* error */
1263 ukbd_detach(device_t dev)
1265 struct ukbd_softc *sc = device_get_softc(dev);
1272 sc->sc_flags |= UKBD_FLAG_GONE;
1274 usb_callout_stop(&sc->sc_callout);
1276 /* kill any stuck keys */
1277 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1278 /* stop receiving events from the USB keyboard */
1279 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT_0]);
1280 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT_1]);
1282 /* release all leftover keys, if any */
1283 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1285 /* process releasing of all keys */
1289 ukbd_disable(&sc->sc_kbd);
1291 #ifdef KBD_INSTALL_CDEV
1292 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1293 error = kbd_detach(&sc->sc_kbd);
1295 /* usb attach cannot return an error */
1296 device_printf(dev, "WARNING: kbd_detach() "
1297 "returned non-zero! (ignored)\n");
1302 #ifdef EVDEV_SUPPORT
1303 evdev_free(sc->sc_evdev);
1306 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1307 error = kbd_unregister(&sc->sc_kbd);
1309 /* usb attach cannot return an error */
1310 device_printf(dev, "WARNING: kbd_unregister() "
1311 "returned non-zero! (ignored)\n");
1314 sc->sc_kbd.kb_flags = 0;
1316 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1318 usb_callout_drain(&sc->sc_callout);
1320 DPRINTF("%s: disconnected\n",
1321 device_get_nameunit(dev));
1327 ukbd_resume(device_t dev)
1329 struct ukbd_softc *sc = device_get_softc(dev);
1333 ukbd_clear_state(&sc->sc_kbd);
1338 #ifdef EVDEV_SUPPORT
1340 ukbd_ev_event(struct evdev_dev *evdev, uint16_t type, uint16_t code,
1343 keyboard_t *kbd = evdev_get_softc(evdev);
1345 if (evdev_rcpt_mask & EVDEV_RCPT_HW_KBD &&
1346 (type == EV_LED || type == EV_REP)) {
1348 kbd_ev_event(kbd, type, code, value);
1354 /* early keyboard probe, not supported */
1356 ukbd_configure(int flags)
1361 /* detect a keyboard, not used */
1363 ukbd__probe(int unit, void *arg, int flags)
1368 /* reset and initialize the device, not used */
1370 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1375 /* test the interface to the device, not used */
1377 ukbd_test_if(keyboard_t *kbd)
1382 /* finish using this keyboard, not used */
1384 ukbd_term(keyboard_t *kbd)
1389 /* keyboard interrupt routine, not used */
1391 ukbd_intr(keyboard_t *kbd, void *arg)
1396 /* lock the access to the keyboard, not used */
1398 ukbd_lock(keyboard_t *kbd, int lock)
1404 * Enable the access to the device; until this function is called,
1405 * the client cannot read from the keyboard.
1408 ukbd_enable(keyboard_t *kbd)
1418 /* disallow the access to the device */
1420 ukbd_disable(keyboard_t *kbd)
1424 KBD_DEACTIVATE(kbd);
1430 /* check if data is waiting */
1431 /* Currently unused. */
1433 ukbd_check(keyboard_t *kbd)
1435 struct ukbd_softc *sc = kbd->kb_data;
1439 if (!KBD_IS_ACTIVE(kbd))
1442 if (sc->sc_flags & UKBD_FLAG_POLLING)
1443 ukbd_do_poll(sc, 0);
1445 #ifdef UKBD_EMULATE_ATSCANCODE
1446 if (sc->sc_buffered_char[0]) {
1450 if (sc->sc_inputs > 0) {
1456 /* check if char is waiting */
1458 ukbd_check_char_locked(keyboard_t *kbd)
1460 struct ukbd_softc *sc = kbd->kb_data;
1464 if (!KBD_IS_ACTIVE(kbd))
1467 if ((sc->sc_composed_char > 0) &&
1468 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1471 return (ukbd_check(kbd));
1475 ukbd_check_char(keyboard_t *kbd)
1480 result = ukbd_check_char_locked(kbd);
1486 /* read one byte from the keyboard if it's allowed */
1487 /* Currently unused. */
1489 ukbd_read(keyboard_t *kbd, int wait)
1491 struct ukbd_softc *sc = kbd->kb_data;
1493 #ifdef UKBD_EMULATE_ATSCANCODE
1501 if (!KBD_IS_ACTIVE(kbd))
1504 #ifdef UKBD_EMULATE_ATSCANCODE
1505 if (sc->sc_buffered_char[0]) {
1506 scancode = sc->sc_buffered_char[0];
1507 if (scancode & SCAN_PREFIX) {
1508 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1509 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1511 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1512 sc->sc_buffered_char[1] = 0;
1515 #endif /* UKBD_EMULATE_ATSCANCODE */
1518 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1519 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1524 #ifdef UKBD_EMULATE_ATSCANCODE
1525 keycode = ukbd_atkeycode(usbcode, sc->sc_ndata.bitmap);
1526 if (keycode == NN) {
1529 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.bitmap,
1530 (usbcode & KEY_RELEASE)));
1531 #else /* !UKBD_EMULATE_ATSCANCODE */
1533 #endif /* UKBD_EMULATE_ATSCANCODE */
1536 /* read char from the keyboard */
1538 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1540 struct ukbd_softc *sc = kbd->kb_data;
1544 #ifdef UKBD_EMULATE_ATSCANCODE
1550 if (!KBD_IS_ACTIVE(kbd))
1555 /* do we have a composed char to return ? */
1557 if ((sc->sc_composed_char > 0) &&
1558 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1559 action = sc->sc_composed_char;
1560 sc->sc_composed_char = 0;
1562 if (action > 0xFF) {
1567 #ifdef UKBD_EMULATE_ATSCANCODE
1569 /* do we have a pending raw scan code? */
1571 if (sc->sc_mode == K_RAW) {
1572 scancode = sc->sc_buffered_char[0];
1574 if (scancode & SCAN_PREFIX) {
1575 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1576 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1578 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1579 sc->sc_buffered_char[1] = 0;
1583 #endif /* UKBD_EMULATE_ATSCANCODE */
1585 /* see if there is something in the keyboard port */
1587 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1588 if (usbcode == -1) {
1593 #ifdef UKBD_EMULATE_ATSCANCODE
1594 /* USB key index -> key code -> AT scan code */
1595 keycode = ukbd_atkeycode(usbcode, sc->sc_ndata.bitmap);
1596 if (keycode == NN) {
1599 /* return an AT scan code for the K_RAW mode */
1600 if (sc->sc_mode == K_RAW) {
1601 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.bitmap,
1602 (usbcode & KEY_RELEASE)));
1604 #else /* !UKBD_EMULATE_ATSCANCODE */
1606 /* return the byte as is for the K_RAW mode */
1607 if (sc->sc_mode == K_RAW) {
1610 /* USB key index -> key code */
1611 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1612 if (keycode == NN) {
1615 #endif /* UKBD_EMULATE_ATSCANCODE */
1618 case 0x38: /* left alt (compose key) */
1619 if (usbcode & KEY_RELEASE) {
1620 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1621 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1623 if (sc->sc_composed_char > 0xFF) {
1624 sc->sc_composed_char = 0;
1628 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1629 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1630 sc->sc_composed_char = 0;
1636 /* return the key code in the K_CODE mode */
1637 if (usbcode & KEY_RELEASE) {
1638 keycode |= SCAN_RELEASE;
1640 if (sc->sc_mode == K_CODE) {
1643 /* compose a character code */
1644 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1646 /* key pressed, process it */
1649 case 0x49: /* keypad 7,8,9 */
1650 sc->sc_composed_char *= 10;
1651 sc->sc_composed_char += keycode - 0x40;
1652 goto check_composed;
1656 case 0x4D: /* keypad 4,5,6 */
1657 sc->sc_composed_char *= 10;
1658 sc->sc_composed_char += keycode - 0x47;
1659 goto check_composed;
1663 case 0x51: /* keypad 1,2,3 */
1664 sc->sc_composed_char *= 10;
1665 sc->sc_composed_char += keycode - 0x4E;
1666 goto check_composed;
1668 case 0x52: /* keypad 0 */
1669 sc->sc_composed_char *= 10;
1670 goto check_composed;
1672 /* key released, no interest here */
1673 case SCAN_RELEASE | 0x47:
1674 case SCAN_RELEASE | 0x48:
1675 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1676 case SCAN_RELEASE | 0x4B:
1677 case SCAN_RELEASE | 0x4C:
1678 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1679 case SCAN_RELEASE | 0x4F:
1680 case SCAN_RELEASE | 0x50:
1681 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1682 case SCAN_RELEASE | 0x52: /* keypad 0 */
1685 case 0x38: /* left alt key */
1689 if (sc->sc_composed_char > 0) {
1690 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1691 sc->sc_composed_char = 0;
1697 /* keycode to key action */
1698 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1699 (keycode & SCAN_RELEASE),
1700 &sc->sc_state, &sc->sc_accents);
1701 if (action == NOKEY) {
1708 if (sc->sc_composed_char <= 0xFF) {
1715 /* Currently wait is always false. */
1717 ukbd_read_char(keyboard_t *kbd, int wait)
1722 keycode = ukbd_read_char_locked(kbd, wait);
1728 /* some useful control functions */
1730 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1732 struct ukbd_softc *sc = kbd->kb_data;
1734 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1735 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1743 case KDGKBMODE: /* get keyboard mode */
1744 *(int *)arg = sc->sc_mode;
1746 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1747 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1749 ival = IOCPARM_IVAL(arg);
1750 arg = (caddr_t)&ival;
1753 case KDSKBMODE: /* set keyboard mode */
1754 switch (*(int *)arg) {
1756 if (sc->sc_mode != K_XLATE) {
1757 /* make lock key state and LED state match */
1758 sc->sc_state &= ~LOCK_MASK;
1759 sc->sc_state |= KBD_LED_VAL(kbd);
1764 if (sc->sc_mode != *(int *)arg) {
1765 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1766 ukbd_clear_state(kbd);
1767 sc->sc_mode = *(int *)arg;
1775 case KDGETLED: /* get keyboard LED */
1776 *(int *)arg = KBD_LED_VAL(kbd);
1778 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1779 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1781 ival = IOCPARM_IVAL(arg);
1782 arg = (caddr_t)&ival;
1785 case KDSETLED: /* set keyboard LED */
1786 /* NOTE: lock key state in "sc_state" won't be changed */
1787 if (*(int *)arg & ~LOCK_MASK)
1792 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1793 if (sc->sc_mode == K_XLATE &&
1794 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1800 if (KBD_HAS_DEVICE(kbd))
1801 ukbd_set_leds(sc, i);
1803 KBD_LED_VAL(kbd) = *(int *)arg;
1805 case KDGKBSTATE: /* get lock key state */
1806 *(int *)arg = sc->sc_state & LOCK_MASK;
1808 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1809 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1811 ival = IOCPARM_IVAL(arg);
1812 arg = (caddr_t)&ival;
1815 case KDSKBSTATE: /* set lock key state */
1816 if (*(int *)arg & ~LOCK_MASK) {
1819 sc->sc_state &= ~LOCK_MASK;
1820 sc->sc_state |= *(int *)arg;
1822 /* set LEDs and quit */
1823 return (ukbd_ioctl(kbd, KDSETLED, arg));
1825 case KDSETREPEAT: /* set keyboard repeat rate (new
1827 if (!KBD_HAS_DEVICE(kbd)) {
1831 * Convert negative, zero and tiny args to the same limits
1832 * as atkbd. We could support delays of 1 msec, but
1833 * anything much shorter than the shortest atkbd value
1834 * of 250.34 is almost unusable as well as incompatible.
1836 kbd->kb_delay1 = imax(((int *)arg)[0], 250);
1837 kbd->kb_delay2 = imax(((int *)arg)[1], 34);
1838 #ifdef EVDEV_SUPPORT
1839 if (sc->sc_evdev != NULL)
1840 evdev_push_repeats(sc->sc_evdev, kbd);
1844 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1845 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1847 ival = IOCPARM_IVAL(arg);
1848 arg = (caddr_t)&ival;
1851 case KDSETRAD: /* set keyboard repeat rate (old
1853 return (ukbd_set_typematic(kbd, *(int *)arg));
1855 case PIO_KEYMAP: /* set keyboard translation table */
1856 case OPIO_KEYMAP: /* set keyboard translation table
1858 case PIO_KEYMAPENT: /* set keyboard translation table
1860 case PIO_DEADKEYMAP: /* set accent key translation table */
1864 return (genkbd_commonioctl(kbd, cmd, arg));
1871 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1876 * XXX Check if someone is calling us from a critical section:
1878 if (curthread->td_critnest != 0)
1882 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1883 * context where printf(9) can be called, which among other things
1884 * includes interrupt filters and threads with any kinds of locks
1885 * already held. For this reason it would be dangerous to acquire
1886 * the Giant here unconditionally. On the other hand we have to
1887 * have it to handle the ioctl.
1888 * So we make our best effort to auto-detect whether we can grab
1889 * the Giant or not. Blame syscons(4) for this.
1895 if (!mtx_owned(&Giant) && !USB_IN_POLLING_MODE_FUNC())
1896 return (EDEADLK); /* best I could come up with */
1900 result = ukbd_ioctl_locked(kbd, cmd, arg);
1906 /* clear the internal state of the keyboard */
1908 ukbd_clear_state(keyboard_t *kbd)
1910 struct ukbd_softc *sc = kbd->kb_data;
1914 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1915 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1917 sc->sc_composed_char = 0;
1918 #ifdef UKBD_EMULATE_ATSCANCODE
1919 sc->sc_buffered_char[0] = 0;
1920 sc->sc_buffered_char[1] = 0;
1922 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1923 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1924 sc->sc_repeat_time = 0;
1925 sc->sc_repeat_key = 0;
1928 /* save the internal state, not used */
1930 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1932 return (len == 0) ? 1 : -1;
1935 /* set the internal state, not used */
1937 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1943 ukbd_poll(keyboard_t *kbd, int on)
1945 struct ukbd_softc *sc = kbd->kb_data;
1949 * Keep a reference count on polling to allow recursive
1950 * cngrab() during a panic for example.
1954 else if (sc->sc_polling > 0)
1957 if (sc->sc_polling != 0) {
1958 sc->sc_flags |= UKBD_FLAG_POLLING;
1959 sc->sc_poll_thread = curthread;
1961 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1969 /* local functions */
1972 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1976 DPRINTF("leds=0x%02x\n", leds);
1978 #ifdef EVDEV_SUPPORT
1979 if (sc->sc_evdev != NULL)
1980 evdev_push_leds(sc->sc_evdev, leds);
1984 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1986 /* start transfer, if not already started */
1988 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1992 ukbd_set_typematic(keyboard_t *kbd, int code)
1994 #ifdef EVDEV_SUPPORT
1995 struct ukbd_softc *sc = kbd->kb_data;
1997 static const int delays[] = {250, 500, 750, 1000};
1998 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1999 68, 76, 84, 92, 100, 110, 118, 126,
2000 136, 152, 168, 184, 200, 220, 236, 252,
2001 272, 304, 336, 368, 400, 440, 472, 504};
2006 kbd->kb_delay1 = delays[(code >> 5) & 3];
2007 kbd->kb_delay2 = rates[code & 0x1f];
2008 #ifdef EVDEV_SUPPORT
2009 if (sc->sc_evdev != NULL)
2010 evdev_push_repeats(sc->sc_evdev, kbd);
2015 #ifdef UKBD_EMULATE_ATSCANCODE
2017 ukbd_atkeycode(int usbcode, const uint64_t *bitmap)
2021 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
2024 * Translate Alt-PrintScreen to SysRq.
2026 * Some or all AT keyboards connected through USB have already
2027 * mapped Alted PrintScreens to an unusual usbcode (0x8a).
2028 * ukbd_trtab translates this to 0x7e, and key2scan() would
2029 * translate that to 0x79 (Intl' 4). Assume that if we have
2030 * an Alted 0x7e here then it actually is an Alted PrintScreen.
2032 * The usual usbcode for all PrintScreens is 0x46. ukbd_trtab
2033 * translates this to 0x5c, so the Alt check to classify 0x5c
2036 if ((keycode == 0x5c || keycode == 0x7e) &&
2037 (UKBD_KEY_PRESSED(bitmap, 0xe2 /* ALT-L */) ||
2038 UKBD_KEY_PRESSED(bitmap, 0xe6 /* ALT-R */)))
2044 ukbd_key2scan(struct ukbd_softc *sc, int code, const uint64_t *bitmap, int up)
2046 static const int scan[] = {
2052 0x137, /* PrintScreen */
2062 0x151, /* PageDown */
2065 0x146, /* Pause/Break */
2066 0x15b, /* Win_L(Super_L) */
2067 0x15c, /* Win_R(Super_R) */
2068 0x15d, /* Application(Menu) */
2070 /* SUN TYPE 6 USB KEYBOARD */
2071 0x168, /* Sun Type 6 Help */
2072 0x15e, /* Sun Type 6 Stop */
2074 0x15f, /* Sun Type 6 Again */
2075 0x160, /* Sun Type 6 Props */
2076 0x161, /* Sun Type 6 Undo */
2077 0x162, /* Sun Type 6 Front */
2078 0x163, /* Sun Type 6 Copy */
2079 0x164, /* Sun Type 6 Open */
2080 0x165, /* Sun Type 6 Paste */
2081 0x166, /* Sun Type 6 Find */
2082 0x167, /* Sun Type 6 Cut */
2083 0x125, /* Sun Type 6 Mute */
2085 0x11f, /* Sun Type 6 VolumeDown */
2086 0x11e, /* Sun Type 6 VolumeUp */
2087 0x120, /* Sun Type 6 PowerDown */
2089 /* Japanese 106/109 keyboard */
2090 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2091 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2092 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2093 0x79, /* Keyboard Intl' 4 (Henkan) */
2094 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2095 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2096 0x71, /* Apple Keyboard JIS (Kana) */
2097 0x72, /* Apple Keyboard JIS (Eisu) */
2100 if ((code >= 89) && (code < (int)(89 + nitems(scan)))) {
2101 code = scan[code - 89];
2104 if (code == 0x137 && (!(
2105 UKBD_KEY_PRESSED(bitmap, 0xe0 /* CTRL-L */) ||
2106 UKBD_KEY_PRESSED(bitmap, 0xe4 /* CTRL-R */) ||
2107 UKBD_KEY_PRESSED(bitmap, 0xe1 /* SHIFT-L */) ||
2108 UKBD_KEY_PRESSED(bitmap, 0xe5 /* SHIFT-R */)))) {
2109 code |= SCAN_PREFIX_SHIFT;
2112 if ((code == 0x146) && (!(
2113 UKBD_KEY_PRESSED(bitmap, 0xe0 /* CTRL-L */) ||
2114 UKBD_KEY_PRESSED(bitmap, 0xe4 /* CTRL-R */)))) {
2115 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2117 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2119 if (code & SCAN_PREFIX) {
2120 if (code & SCAN_PREFIX_CTL) {
2122 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2123 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2124 } else if (code & SCAN_PREFIX_SHIFT) {
2126 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2127 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2129 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2130 sc->sc_buffered_char[1] = 0;
2132 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2138 #endif /* UKBD_EMULATE_ATSCANCODE */
2140 static keyboard_switch_t ukbdsw = {
2141 .probe = &ukbd__probe,
2145 .test_if = &ukbd_test_if,
2146 .enable = &ukbd_enable,
2147 .disable = &ukbd_disable,
2149 .check = &ukbd_check,
2150 .read_char = &ukbd_read_char,
2151 .check_char = &ukbd_check_char,
2152 .ioctl = &ukbd_ioctl,
2154 .clear_state = &ukbd_clear_state,
2155 .get_state = &ukbd_get_state,
2156 .set_state = &ukbd_set_state,
2160 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2163 ukbd_driver_load(module_t mod, int what, void *arg)
2167 kbd_add_driver(&ukbd_kbd_driver);
2170 kbd_delete_driver(&ukbd_kbd_driver);
2176 static devclass_t ukbd_devclass;
2178 static device_method_t ukbd_methods[] = {
2179 DEVMETHOD(device_probe, ukbd_probe),
2180 DEVMETHOD(device_attach, ukbd_attach),
2181 DEVMETHOD(device_detach, ukbd_detach),
2182 DEVMETHOD(device_resume, ukbd_resume),
2187 static driver_t ukbd_driver = {
2189 .methods = ukbd_methods,
2190 .size = sizeof(struct ukbd_softc),
2193 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2194 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2195 MODULE_DEPEND(ukbd, hid, 1, 1, 1);
2196 #ifdef EVDEV_SUPPORT
2197 MODULE_DEPEND(ukbd, evdev, 1, 1, 1);
2199 MODULE_VERSION(ukbd, 1);
2200 USB_PNP_HOST_INFO(ukbd_devs);