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_RWTUN,
99 &ukbd_debug, 0, "Debug level");
100 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
101 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
102 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RWTUN,
103 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
106 #define UKBD_EMULATE_ATSCANCODE 1
107 #define UKBD_DRIVER_NAME "ukbd"
108 #define UKBD_NMOD 8 /* units */
109 #define UKBD_NKEYCODE 6 /* units */
110 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
111 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
112 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
113 #define UKBD_BUFFER_SIZE 64 /* bytes */
117 #define MOD_CONTROL_L 0x01
118 #define MOD_CONTROL_R 0x10
119 #define MOD_SHIFT_L 0x02
120 #define MOD_SHIFT_R 0x20
121 #define MOD_ALT_L 0x04
122 #define MOD_ALT_R 0x40
123 #define MOD_WIN_L 0x08
124 #define MOD_WIN_R 0x80
126 #define MOD_EJECT 0x0100
127 #define MOD_FN 0x0200
128 uint8_t keycode[UKBD_NKEYCODE];
140 accentmap_t sc_accmap;
141 fkeytab_t sc_fkeymap[UKBD_NFKEY];
142 struct hid_location sc_loc_apple_eject;
143 struct hid_location sc_loc_apple_fn;
144 struct hid_location sc_loc_ctrl_l;
145 struct hid_location sc_loc_ctrl_r;
146 struct hid_location sc_loc_shift_l;
147 struct hid_location sc_loc_shift_r;
148 struct hid_location sc_loc_alt_l;
149 struct hid_location sc_loc_alt_r;
150 struct hid_location sc_loc_win_l;
151 struct hid_location sc_loc_win_r;
152 struct hid_location sc_loc_events;
153 struct hid_location sc_loc_numlock;
154 struct hid_location sc_loc_capslock;
155 struct hid_location sc_loc_scrolllock;
156 struct usb_callout sc_callout;
157 struct ukbd_data sc_ndata;
158 struct ukbd_data sc_odata;
160 struct thread *sc_poll_thread;
161 struct usb_device *sc_udev;
162 struct usb_interface *sc_iface;
163 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
165 uint32_t sc_ntime[UKBD_NKEYCODE];
166 uint32_t sc_otime[UKBD_NKEYCODE];
167 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
169 uint32_t sc_composed_char; /* composed char code, if non-zero */
170 #ifdef UKBD_EMULATE_ATSCANCODE
171 uint32_t sc_buffered_char[2];
173 uint32_t sc_flags; /* flags */
174 #define UKBD_FLAG_COMPOSE 0x00000001
175 #define UKBD_FLAG_POLLING 0x00000002
176 #define UKBD_FLAG_SET_LEDS 0x00000004
177 #define UKBD_FLAG_ATTACHED 0x00000010
178 #define UKBD_FLAG_GONE 0x00000020
180 #define UKBD_FLAG_HID_MASK 0x003fffc0
181 #define UKBD_FLAG_APPLE_EJECT 0x00000040
182 #define UKBD_FLAG_APPLE_FN 0x00000080
183 #define UKBD_FLAG_APPLE_SWAP 0x00000100
184 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
185 #define UKBD_FLAG_CTRL_L 0x00000400
186 #define UKBD_FLAG_CTRL_R 0x00000800
187 #define UKBD_FLAG_SHIFT_L 0x00001000
188 #define UKBD_FLAG_SHIFT_R 0x00002000
189 #define UKBD_FLAG_ALT_L 0x00004000
190 #define UKBD_FLAG_ALT_R 0x00008000
191 #define UKBD_FLAG_WIN_L 0x00010000
192 #define UKBD_FLAG_WIN_R 0x00020000
193 #define UKBD_FLAG_EVENTS 0x00040000
194 #define UKBD_FLAG_NUMLOCK 0x00080000
195 #define UKBD_FLAG_CAPSLOCK 0x00100000
196 #define UKBD_FLAG_SCROLLLOCK 0x00200000
198 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
199 int sc_state; /* shift/lock key state */
200 int sc_accents; /* accent key index (> 0) */
205 uint16_t sc_inputhead;
206 uint16_t sc_inputtail;
207 uint16_t sc_modifiers;
209 uint8_t sc_leds; /* store for async led requests */
210 uint8_t sc_iface_index;
212 uint8_t sc_id_apple_eject;
213 uint8_t sc_id_apple_fn;
214 uint8_t sc_id_ctrl_l;
215 uint8_t sc_id_ctrl_r;
216 uint8_t sc_id_shift_l;
217 uint8_t sc_id_shift_r;
223 uint8_t sc_id_numlock;
224 uint8_t sc_id_capslock;
225 uint8_t sc_id_scrolllock;
226 uint8_t sc_id_events;
229 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
232 #define KEY_ERROR 0x01
235 #define KEY_RELEASE 0x400
236 #define KEY_INDEX(c) ((c) & 0xFF)
239 #define SCAN_RELEASE 0x80
240 #define SCAN_PREFIX_E0 0x100
241 #define SCAN_PREFIX_E1 0x200
242 #define SCAN_PREFIX_CTL 0x400
243 #define SCAN_PREFIX_SHIFT 0x800
244 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
245 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
246 #define SCAN_CHAR(c) ((c) & 0x7f)
248 #define UKBD_LOCK() mtx_lock(&Giant)
249 #define UKBD_UNLOCK() mtx_unlock(&Giant)
254 * Assert that the lock is held in all contexts
255 * where the code can be executed.
257 #define UKBD_LOCK_ASSERT() mtx_assert(&Giant, MA_OWNED)
260 * Assert that the lock is held in the contexts
261 * where it really has to be so.
263 #define UKBD_CTX_LOCK_ASSERT() \
265 if (!kdb_active && panicstr == NULL) \
266 mtx_assert(&Giant, MA_OWNED); \
270 #define UKBD_LOCK_ASSERT() (void)0
271 #define UKBD_CTX_LOCK_ASSERT() (void)0
279 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
280 {MOD_CONTROL_L, 0xe0},
281 {MOD_CONTROL_R, 0xe4},
290 #define NN 0 /* no translation */
292 * Translate USB keycodes to AT keyboard scancodes.
295 * FIXME: Mac USB keyboard generates:
296 * 0x53: keypad NumLock/Clear
303 static const uint8_t ukbd_trtab[256] = {
304 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
305 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
306 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
307 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
308 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
309 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
310 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
311 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
312 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
313 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
314 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
315 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
316 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
317 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
318 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
319 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
320 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
321 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
332 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
335 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
338 static const uint8_t ukbd_boot_desc[] = {
339 0x05, 0x01, 0x09, 0x06, 0xa1,
340 0x01, 0x05, 0x07, 0x19, 0xe0,
341 0x29, 0xe7, 0x15, 0x00, 0x25,
342 0x01, 0x75, 0x01, 0x95, 0x08,
343 0x81, 0x02, 0x95, 0x01, 0x75,
344 0x08, 0x81, 0x01, 0x95, 0x03,
345 0x75, 0x01, 0x05, 0x08, 0x19,
346 0x01, 0x29, 0x03, 0x91, 0x02,
347 0x95, 0x05, 0x75, 0x01, 0x91,
348 0x01, 0x95, 0x06, 0x75, 0x08,
349 0x15, 0x00, 0x26, 0xff, 0x00,
350 0x05, 0x07, 0x19, 0x00, 0x2a,
351 0xff, 0x00, 0x81, 0x00, 0xc0
355 static void ukbd_timeout(void *);
356 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
357 static int ukbd_set_typematic(keyboard_t *, int);
358 #ifdef UKBD_EMULATE_ATSCANCODE
359 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
361 static uint32_t ukbd_read_char(keyboard_t *, int);
362 static void ukbd_clear_state(keyboard_t *);
363 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
364 static int ukbd_enable(keyboard_t *);
365 static int ukbd_disable(keyboard_t *);
366 static void ukbd_interrupt(struct ukbd_softc *);
367 static void ukbd_event_keyinput(struct ukbd_softc *);
369 static device_probe_t ukbd_probe;
370 static device_attach_t ukbd_attach;
371 static device_detach_t ukbd_detach;
372 static device_resume_t ukbd_resume;
375 ukbd_any_key_pressed(struct ukbd_softc *sc)
380 for (j = i = 0; i < UKBD_NKEYCODE; i++)
381 j |= sc->sc_odata.keycode[i];
387 ukbd_start_timer(struct ukbd_softc *sc)
389 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
390 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
394 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
397 UKBD_CTX_LOCK_ASSERT();
399 DPRINTF("0x%02x (%d) %s\n", key, key,
400 (key & KEY_RELEASE) ? "released" : "pressed");
402 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
403 sc->sc_input[sc->sc_inputtail] = key;
405 ++(sc->sc_inputtail);
406 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
407 sc->sc_inputtail = 0;
410 DPRINTF("input buffer is full\n");
415 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
418 UKBD_CTX_LOCK_ASSERT();
419 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
420 ("ukbd_do_poll called when not polling\n"));
421 DPRINTFN(2, "polling\n");
423 if (!kdb_active && !SCHEDULER_STOPPED()) {
425 * In this context the kernel is polling for input,
426 * but the USB subsystem works in normal interrupt-driven
427 * mode, so we just wait on the USB threads to do the job.
428 * Note that we currently hold the Giant, but it's also used
429 * as the transfer mtx, so we must release it while waiting.
431 while (sc->sc_inputs == 0) {
433 * Give USB threads a chance to run. Note that
434 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
436 kern_yield(PRI_UNCHANGED);
443 while (sc->sc_inputs == 0) {
445 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
447 /* Delay-optimised support for repetition of keys */
448 if (ukbd_any_key_pressed(sc)) {
449 /* a key is pressed - need timekeeping */
452 /* 1 millisecond has passed */
464 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
468 UKBD_CTX_LOCK_ASSERT();
469 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
470 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
471 ("not polling in kdb or panic\n"));
473 if (sc->sc_inputs == 0 &&
474 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
475 /* start transfer, if not already started */
476 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
479 if (sc->sc_flags & UKBD_FLAG_POLLING)
480 ukbd_do_poll(sc, wait);
482 if (sc->sc_inputs == 0) {
485 c = sc->sc_input[sc->sc_inputhead];
487 ++(sc->sc_inputhead);
488 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
489 sc->sc_inputhead = 0;
496 ukbd_interrupt(struct ukbd_softc *sc)
500 uint32_t now = sc->sc_time_ms;
506 UKBD_CTX_LOCK_ASSERT();
508 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
511 n_mod = sc->sc_ndata.modifiers;
512 o_mod = sc->sc_odata.modifiers;
513 if (n_mod != o_mod) {
514 for (i = 0; i < UKBD_NMOD; i++) {
515 if ((n_mod & ukbd_mods[i].mask) !=
516 (o_mod & ukbd_mods[i].mask)) {
517 ukbd_put_key(sc, ukbd_mods[i].key |
518 ((n_mod & ukbd_mods[i].mask) ?
519 KEY_PRESS : KEY_RELEASE));
523 /* Check for released keys. */
524 for (i = 0; i < UKBD_NKEYCODE; i++) {
525 key = sc->sc_odata.keycode[i];
529 for (j = 0; j < UKBD_NKEYCODE; j++) {
530 if (sc->sc_ndata.keycode[j] == 0) {
533 if (key == sc->sc_ndata.keycode[j]) {
537 ukbd_put_key(sc, key | KEY_RELEASE);
541 /* Check for pressed keys. */
542 for (i = 0; i < UKBD_NKEYCODE; i++) {
543 key = sc->sc_ndata.keycode[i];
547 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
548 for (j = 0; j < UKBD_NKEYCODE; j++) {
549 if (sc->sc_odata.keycode[j] == 0) {
552 if (key == sc->sc_odata.keycode[j]) {
554 /* key is still pressed */
556 sc->sc_ntime[i] = sc->sc_otime[j];
557 dtime = (sc->sc_otime[j] - now);
559 if (!(dtime & 0x80000000)) {
560 /* time has not elapsed */
563 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
567 ukbd_put_key(sc, key | KEY_PRESS);
570 * If any other key is presently down, force its repeat to be
571 * well in the future (100s). This makes the last key to be
572 * pressed do the autorepeat.
574 for (j = 0; j != UKBD_NKEYCODE; j++) {
576 sc->sc_ntime[j] = now + (100 * 1000);
581 sc->sc_odata = sc->sc_ndata;
583 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
585 ukbd_event_keyinput(sc);
589 ukbd_event_keyinput(struct ukbd_softc *sc)
593 UKBD_CTX_LOCK_ASSERT();
595 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
598 if (sc->sc_inputs == 0)
601 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
602 KBD_IS_BUSY(&sc->sc_kbd)) {
603 /* let the callback function process the input */
604 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
605 sc->sc_kbd.kb_callback.kc_arg);
607 /* read and discard the input, no one is waiting for it */
609 c = ukbd_read_char(&sc->sc_kbd, 0);
610 } while (c != NOKEY);
615 ukbd_timeout(void *arg)
617 struct ukbd_softc *sc = arg;
621 sc->sc_time_ms += 25; /* milliseconds */
625 /* Make sure any leftover key events gets read out */
626 ukbd_event_keyinput(sc);
628 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
629 ukbd_start_timer(sc);
631 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
636 ukbd_apple_fn(uint8_t keycode) {
638 case 0x28: return 0x49; /* RETURN -> INSERT */
639 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
640 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
641 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
642 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
643 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
644 default: return keycode;
649 ukbd_apple_swap(uint8_t keycode) {
651 case 0x35: return 0x64;
652 case 0x64: return 0x35;
653 default: return keycode;
658 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
660 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
661 struct usb_page_cache *pc;
669 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
670 pc = usbd_xfer_get_frame(xfer, 0);
672 switch (USB_GET_STATE(xfer)) {
673 case USB_ST_TRANSFERRED:
674 DPRINTF("actlen=%d bytes\n", len);
677 DPRINTF("zero length data\n");
681 if (sc->sc_kbd_id != 0) {
682 /* check and remove HID ID byte */
683 usbd_copy_out(pc, 0, &id, 1);
687 DPRINTF("zero length data\n");
695 if (len > UKBD_BUFFER_SIZE)
696 len = UKBD_BUFFER_SIZE;
699 usbd_copy_out(pc, offset, sc->sc_buffer, len);
701 /* clear temporary storage */
702 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
704 /* scan through HID data */
705 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
706 (id == sc->sc_id_apple_eject)) {
707 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
708 sc->sc_modifiers |= MOD_EJECT;
710 sc->sc_modifiers &= ~MOD_EJECT;
712 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
713 (id == sc->sc_id_apple_fn)) {
714 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
715 sc->sc_modifiers |= MOD_FN;
717 sc->sc_modifiers &= ~MOD_FN;
719 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
720 (id == sc->sc_id_ctrl_l)) {
721 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
722 sc-> sc_modifiers |= MOD_CONTROL_L;
724 sc-> sc_modifiers &= ~MOD_CONTROL_L;
726 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
727 (id == sc->sc_id_ctrl_r)) {
728 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
729 sc->sc_modifiers |= MOD_CONTROL_R;
731 sc->sc_modifiers &= ~MOD_CONTROL_R;
733 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
734 (id == sc->sc_id_shift_l)) {
735 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
736 sc->sc_modifiers |= MOD_SHIFT_L;
738 sc->sc_modifiers &= ~MOD_SHIFT_L;
740 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
741 (id == sc->sc_id_shift_r)) {
742 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
743 sc->sc_modifiers |= MOD_SHIFT_R;
745 sc->sc_modifiers &= ~MOD_SHIFT_R;
747 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
748 (id == sc->sc_id_alt_l)) {
749 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
750 sc->sc_modifiers |= MOD_ALT_L;
752 sc->sc_modifiers &= ~MOD_ALT_L;
754 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
755 (id == sc->sc_id_alt_r)) {
756 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
757 sc->sc_modifiers |= MOD_ALT_R;
759 sc->sc_modifiers &= ~MOD_ALT_R;
761 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
762 (id == sc->sc_id_win_l)) {
763 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
764 sc->sc_modifiers |= MOD_WIN_L;
766 sc->sc_modifiers &= ~MOD_WIN_L;
768 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
769 (id == sc->sc_id_win_r)) {
770 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
771 sc->sc_modifiers |= MOD_WIN_R;
773 sc->sc_modifiers &= ~MOD_WIN_R;
776 sc->sc_ndata.modifiers = sc->sc_modifiers;
778 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
779 (id == sc->sc_id_events)) {
780 i = sc->sc_loc_events.count;
781 if (i > UKBD_NKEYCODE)
786 sc->sc_ndata.keycode[i] =
787 hid_get_data(sc->sc_buffer + i, len - i,
793 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
794 for (i = 0; i < UKBD_NKEYCODE; i++) {
795 if (sc->sc_ndata.keycode[i]) {
796 DPRINTF("[%d] = 0x%02x\n",
797 (int)i, (int)sc->sc_ndata.keycode[i]);
801 if (sc->sc_modifiers & MOD_FN) {
802 for (i = 0; i < UKBD_NKEYCODE; i++) {
803 sc->sc_ndata.keycode[i] =
804 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
808 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
809 for (i = 0; i < UKBD_NKEYCODE; i++) {
810 sc->sc_ndata.keycode[i] =
811 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
817 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
818 if (ukbd_any_key_pressed(sc)) {
819 ukbd_start_timer(sc);
825 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
826 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
827 usbd_transfer_submit(xfer);
829 DPRINTF("input queue is full!\n");
834 DPRINTF("error=%s\n", usbd_errstr(error));
836 if (error != USB_ERR_CANCELLED) {
837 /* try to clear stall first */
838 usbd_xfer_set_stall(xfer);
846 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
848 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
849 struct usb_device_request req;
850 struct usb_page_cache *pc;
862 switch (USB_GET_STATE(xfer)) {
863 case USB_ST_TRANSFERRED:
865 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
867 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
869 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
870 req.bRequest = UR_SET_REPORT;
871 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
872 req.wIndex[0] = sc->sc_iface_no;
876 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
881 /* Assumption: All led bits must be in the same ID. */
883 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
884 if (sc->sc_leds & NLKED) {
885 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
886 &sc->sc_loc_numlock, 1);
888 id = sc->sc_id_numlock;
892 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
893 if (sc->sc_leds & SLKED) {
894 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
895 &sc->sc_loc_scrolllock, 1);
897 id = sc->sc_id_scrolllock;
901 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
902 if (sc->sc_leds & CLKED) {
903 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
904 &sc->sc_loc_capslock, 1);
906 id = sc->sc_id_capslock;
910 /* if no leds, nothing to do */
914 /* range check output report length */
915 len = sc->sc_led_size;
916 if (len > (UKBD_BUFFER_SIZE - 1))
917 len = (UKBD_BUFFER_SIZE - 1);
919 /* check if we need to prefix an ID byte */
920 sc->sc_buffer[0] = id;
922 pc = usbd_xfer_get_frame(xfer, 1);
925 usbd_copy_in(pc, 0, sc->sc_buffer, len);
927 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
929 req.wLength[0] = len;
930 usbd_xfer_set_frame_len(xfer, 1, len);
932 DPRINTF("len=%d, id=%d\n", len, id);
934 /* setup control request last */
935 pc = usbd_xfer_get_frame(xfer, 0);
936 usbd_copy_in(pc, 0, &req, sizeof(req));
937 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
939 /* start data transfer */
940 usbd_xfer_set_frames(xfer, 2);
941 usbd_transfer_submit(xfer);
945 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
950 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
953 .type = UE_INTERRUPT,
954 .endpoint = UE_ADDR_ANY,
955 .direction = UE_DIR_IN,
956 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
957 .bufsize = 0, /* use wMaxPacketSize */
958 .callback = &ukbd_intr_callback,
963 .endpoint = 0x00, /* Control pipe */
964 .direction = UE_DIR_ANY,
965 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
966 .callback = &ukbd_set_leds_callback,
967 .timeout = 1000, /* 1 second */
971 /* A match on these entries will load ukbd */
972 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
973 {USB_IFACE_CLASS(UICLASS_HID),
974 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
975 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
979 ukbd_probe(device_t dev)
981 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
982 struct usb_attach_arg *uaa = device_get_ivars(dev);
993 if (uaa->usb_mode != USB_MODE_HOST) {
997 if (uaa->info.bInterfaceClass != UICLASS_HID)
1000 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1003 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1004 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1005 return (BUS_PROBE_DEFAULT);
1007 error = usbd_req_get_hid_desc(uaa->device, NULL,
1008 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1013 if (hid_is_keyboard(d_ptr, d_len)) {
1014 if (hid_is_mouse(d_ptr, d_len)) {
1016 * NOTE: We currently don't support USB mouse
1017 * and USB keyboard on the same USB endpoint.
1018 * Let "ums" driver win.
1022 error = BUS_PROBE_DEFAULT;
1027 free(d_ptr, M_TEMP);
1032 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1036 /* reset detected bits */
1037 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1039 /* check if there is an ID byte */
1040 sc->sc_kbd_size = hid_report_size(ptr, len,
1041 hid_input, &sc->sc_kbd_id);
1043 /* investigate if this is an Apple Keyboard */
1044 if (hid_locate(ptr, len,
1045 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1046 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1047 &sc->sc_id_apple_eject)) {
1048 if (flags & HIO_VARIABLE)
1049 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1050 UKBD_FLAG_APPLE_SWAP;
1051 DPRINTFN(1, "Found Apple eject-key\n");
1053 if (hid_locate(ptr, len,
1054 HID_USAGE2(0xFFFF, 0x0003),
1055 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1056 &sc->sc_id_apple_fn)) {
1057 if (flags & HIO_VARIABLE)
1058 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1059 DPRINTFN(1, "Found Apple FN-key\n");
1061 /* figure out some keys */
1062 if (hid_locate(ptr, len,
1063 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1064 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1065 &sc->sc_id_ctrl_l)) {
1066 if (flags & HIO_VARIABLE)
1067 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1068 DPRINTFN(1, "Found left control\n");
1070 if (hid_locate(ptr, len,
1071 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1072 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1073 &sc->sc_id_ctrl_r)) {
1074 if (flags & HIO_VARIABLE)
1075 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1076 DPRINTFN(1, "Found right control\n");
1078 if (hid_locate(ptr, len,
1079 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1080 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1081 &sc->sc_id_shift_l)) {
1082 if (flags & HIO_VARIABLE)
1083 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1084 DPRINTFN(1, "Found left shift\n");
1086 if (hid_locate(ptr, len,
1087 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1088 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1089 &sc->sc_id_shift_r)) {
1090 if (flags & HIO_VARIABLE)
1091 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1092 DPRINTFN(1, "Found right shift\n");
1094 if (hid_locate(ptr, len,
1095 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1096 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1097 &sc->sc_id_alt_l)) {
1098 if (flags & HIO_VARIABLE)
1099 sc->sc_flags |= UKBD_FLAG_ALT_L;
1100 DPRINTFN(1, "Found left alt\n");
1102 if (hid_locate(ptr, len,
1103 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1104 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1105 &sc->sc_id_alt_r)) {
1106 if (flags & HIO_VARIABLE)
1107 sc->sc_flags |= UKBD_FLAG_ALT_R;
1108 DPRINTFN(1, "Found right alt\n");
1110 if (hid_locate(ptr, len,
1111 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1112 hid_input, 0, &sc->sc_loc_win_l, &flags,
1113 &sc->sc_id_win_l)) {
1114 if (flags & HIO_VARIABLE)
1115 sc->sc_flags |= UKBD_FLAG_WIN_L;
1116 DPRINTFN(1, "Found left GUI\n");
1118 if (hid_locate(ptr, len,
1119 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1120 hid_input, 0, &sc->sc_loc_win_r, &flags,
1121 &sc->sc_id_win_r)) {
1122 if (flags & HIO_VARIABLE)
1123 sc->sc_flags |= UKBD_FLAG_WIN_R;
1124 DPRINTFN(1, "Found right GUI\n");
1126 /* figure out event buffer */
1127 if (hid_locate(ptr, len,
1128 HID_USAGE2(HUP_KEYBOARD, 0x00),
1129 hid_input, 0, &sc->sc_loc_events, &flags,
1130 &sc->sc_id_events)) {
1131 if (flags & HIO_VARIABLE) {
1132 DPRINTFN(1, "Ignoring keyboard event control\n");
1134 sc->sc_flags |= UKBD_FLAG_EVENTS;
1135 DPRINTFN(1, "Found keyboard event array\n");
1139 /* figure out leds on keyboard */
1140 sc->sc_led_size = hid_report_size(ptr, len,
1143 if (hid_locate(ptr, len,
1144 HID_USAGE2(HUP_LEDS, 0x01),
1145 hid_output, 0, &sc->sc_loc_numlock, &flags,
1146 &sc->sc_id_numlock)) {
1147 if (flags & HIO_VARIABLE)
1148 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1149 DPRINTFN(1, "Found keyboard numlock\n");
1151 if (hid_locate(ptr, len,
1152 HID_USAGE2(HUP_LEDS, 0x02),
1153 hid_output, 0, &sc->sc_loc_capslock, &flags,
1154 &sc->sc_id_capslock)) {
1155 if (flags & HIO_VARIABLE)
1156 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1157 DPRINTFN(1, "Found keyboard capslock\n");
1159 if (hid_locate(ptr, len,
1160 HID_USAGE2(HUP_LEDS, 0x03),
1161 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1162 &sc->sc_id_scrolllock)) {
1163 if (flags & HIO_VARIABLE)
1164 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1165 DPRINTFN(1, "Found keyboard scrolllock\n");
1170 ukbd_attach(device_t dev)
1172 struct ukbd_softc *sc = device_get_softc(dev);
1173 struct usb_attach_arg *uaa = device_get_ivars(dev);
1174 int unit = device_get_unit(dev);
1175 keyboard_t *kbd = &sc->sc_kbd;
1176 void *hid_ptr = NULL;
1185 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1187 kbd->kb_data = (void *)sc;
1189 device_set_usb_desc(dev);
1191 sc->sc_udev = uaa->device;
1192 sc->sc_iface = uaa->iface;
1193 sc->sc_iface_index = uaa->info.bIfaceIndex;
1194 sc->sc_iface_no = uaa->info.bIfaceNum;
1195 sc->sc_mode = K_XLATE;
1197 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1199 err = usbd_transfer_setup(uaa->device,
1200 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1201 UKBD_N_TRANSFER, sc, &Giant);
1204 DPRINTF("error=%s\n", usbd_errstr(err));
1207 /* setup default keyboard maps */
1209 sc->sc_keymap = key_map;
1210 sc->sc_accmap = accent_map;
1211 for (n = 0; n < UKBD_NFKEY; n++) {
1212 sc->sc_fkeymap[n] = fkey_tab[n];
1215 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1216 sc->sc_fkeymap, UKBD_NFKEY);
1218 KBD_FOUND_DEVICE(kbd);
1220 ukbd_clear_state(kbd);
1223 * FIXME: set the initial value for lock keys in "sc_state"
1224 * according to the BIOS data?
1226 KBD_PROBE_DONE(kbd);
1228 /* get HID descriptor */
1229 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1230 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1233 DPRINTF("Parsing HID descriptor of %d bytes\n",
1236 ukbd_parse_hid(sc, hid_ptr, hid_len);
1238 free(hid_ptr, M_TEMP);
1241 /* check if we should use the boot protocol */
1242 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1243 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1245 DPRINTF("Forcing boot protocol\n");
1247 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1248 sc->sc_iface_index, 0);
1251 DPRINTF("Set protocol error=%s (ignored)\n",
1255 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1258 /* ignore if SETIDLE fails, hence it is not crucial */
1259 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1261 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1265 if (kbd_register(kbd) < 0) {
1268 KBD_CONFIG_DONE(kbd);
1272 #ifdef KBD_INSTALL_CDEV
1273 if (kbd_attach(kbd)) {
1277 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1280 genkbd_diag(kbd, bootverbose);
1284 /* check for polling rate override */
1285 rate = ukbd_pollrate;
1292 /* set new polling interval in ms */
1293 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1296 /* start the keyboard */
1297 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1299 return (0); /* success */
1303 return (ENXIO); /* error */
1307 ukbd_detach(device_t dev)
1309 struct ukbd_softc *sc = device_get_softc(dev);
1316 sc->sc_flags |= UKBD_FLAG_GONE;
1318 usb_callout_stop(&sc->sc_callout);
1320 /* kill any stuck keys */
1321 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1322 /* stop receiving events from the USB keyboard */
1323 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1325 /* release all leftover keys, if any */
1326 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1328 /* process releasing of all keys */
1332 ukbd_disable(&sc->sc_kbd);
1334 #ifdef KBD_INSTALL_CDEV
1335 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1336 error = kbd_detach(&sc->sc_kbd);
1338 /* usb attach cannot return an error */
1339 device_printf(dev, "WARNING: kbd_detach() "
1340 "returned non-zero! (ignored)\n");
1344 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1345 error = kbd_unregister(&sc->sc_kbd);
1347 /* usb attach cannot return an error */
1348 device_printf(dev, "WARNING: kbd_unregister() "
1349 "returned non-zero! (ignored)\n");
1352 sc->sc_kbd.kb_flags = 0;
1354 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1356 usb_callout_drain(&sc->sc_callout);
1358 DPRINTF("%s: disconnected\n",
1359 device_get_nameunit(dev));
1365 ukbd_resume(device_t dev)
1367 struct ukbd_softc *sc = device_get_softc(dev);
1371 ukbd_clear_state(&sc->sc_kbd);
1376 /* early keyboard probe, not supported */
1378 ukbd_configure(int flags)
1383 /* detect a keyboard, not used */
1385 ukbd__probe(int unit, void *arg, int flags)
1390 /* reset and initialize the device, not used */
1392 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1397 /* test the interface to the device, not used */
1399 ukbd_test_if(keyboard_t *kbd)
1404 /* finish using this keyboard, not used */
1406 ukbd_term(keyboard_t *kbd)
1411 /* keyboard interrupt routine, not used */
1413 ukbd_intr(keyboard_t *kbd, void *arg)
1418 /* lock the access to the keyboard, not used */
1420 ukbd_lock(keyboard_t *kbd, int lock)
1426 * Enable the access to the device; until this function is called,
1427 * the client cannot read from the keyboard.
1430 ukbd_enable(keyboard_t *kbd)
1440 /* disallow the access to the device */
1442 ukbd_disable(keyboard_t *kbd)
1446 KBD_DEACTIVATE(kbd);
1452 /* check if data is waiting */
1453 /* Currently unused. */
1455 ukbd_check(keyboard_t *kbd)
1457 struct ukbd_softc *sc = kbd->kb_data;
1459 UKBD_CTX_LOCK_ASSERT();
1461 if (!KBD_IS_ACTIVE(kbd))
1464 if (sc->sc_flags & UKBD_FLAG_POLLING)
1465 ukbd_do_poll(sc, 0);
1467 #ifdef UKBD_EMULATE_ATSCANCODE
1468 if (sc->sc_buffered_char[0]) {
1472 if (sc->sc_inputs > 0) {
1478 /* check if char is waiting */
1480 ukbd_check_char_locked(keyboard_t *kbd)
1482 struct ukbd_softc *sc = kbd->kb_data;
1484 UKBD_CTX_LOCK_ASSERT();
1486 if (!KBD_IS_ACTIVE(kbd))
1489 if ((sc->sc_composed_char > 0) &&
1490 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1493 return (ukbd_check(kbd));
1497 ukbd_check_char(keyboard_t *kbd)
1502 result = ukbd_check_char_locked(kbd);
1508 /* read one byte from the keyboard if it's allowed */
1509 /* Currently unused. */
1511 ukbd_read(keyboard_t *kbd, int wait)
1513 struct ukbd_softc *sc = kbd->kb_data;
1515 #ifdef UKBD_EMULATE_ATSCANCODE
1521 UKBD_CTX_LOCK_ASSERT();
1523 if (!KBD_IS_ACTIVE(kbd))
1526 #ifdef UKBD_EMULATE_ATSCANCODE
1527 if (sc->sc_buffered_char[0]) {
1528 scancode = sc->sc_buffered_char[0];
1529 if (scancode & SCAN_PREFIX) {
1530 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1531 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1533 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1534 sc->sc_buffered_char[1] = 0;
1537 #endif /* UKBD_EMULATE_ATSCANCODE */
1540 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1541 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1546 #ifdef UKBD_EMULATE_ATSCANCODE
1547 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1548 if (keycode == NN) {
1551 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1552 (usbcode & KEY_RELEASE)));
1553 #else /* !UKBD_EMULATE_ATSCANCODE */
1555 #endif /* UKBD_EMULATE_ATSCANCODE */
1558 /* read char from the keyboard */
1560 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1562 struct ukbd_softc *sc = kbd->kb_data;
1566 #ifdef UKBD_EMULATE_ATSCANCODE
1570 UKBD_CTX_LOCK_ASSERT();
1572 if (!KBD_IS_ACTIVE(kbd))
1577 /* do we have a composed char to return ? */
1579 if ((sc->sc_composed_char > 0) &&
1580 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1582 action = sc->sc_composed_char;
1583 sc->sc_composed_char = 0;
1585 if (action > 0xFF) {
1590 #ifdef UKBD_EMULATE_ATSCANCODE
1592 /* do we have a pending raw scan code? */
1594 if (sc->sc_mode == K_RAW) {
1595 scancode = sc->sc_buffered_char[0];
1597 if (scancode & SCAN_PREFIX) {
1598 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1599 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1601 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1602 sc->sc_buffered_char[1] = 0;
1606 #endif /* UKBD_EMULATE_ATSCANCODE */
1608 /* see if there is something in the keyboard port */
1610 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1611 if (usbcode == -1) {
1616 #ifdef UKBD_EMULATE_ATSCANCODE
1617 /* USB key index -> key code -> AT scan code */
1618 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1619 if (keycode == NN) {
1622 /* return an AT scan code for the K_RAW mode */
1623 if (sc->sc_mode == K_RAW) {
1624 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1625 (usbcode & KEY_RELEASE)));
1627 #else /* !UKBD_EMULATE_ATSCANCODE */
1629 /* return the byte as is for the K_RAW mode */
1630 if (sc->sc_mode == K_RAW) {
1633 /* USB key index -> key code */
1634 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1635 if (keycode == NN) {
1638 #endif /* UKBD_EMULATE_ATSCANCODE */
1641 case 0x38: /* left alt (compose key) */
1642 if (usbcode & KEY_RELEASE) {
1643 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1644 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1646 if (sc->sc_composed_char > 0xFF) {
1647 sc->sc_composed_char = 0;
1651 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1652 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1653 sc->sc_composed_char = 0;
1657 /* XXX: I don't like these... */
1658 case 0x5c: /* print screen */
1659 if (sc->sc_flags & ALTS) {
1660 keycode = 0x54; /* sysrq */
1663 case 0x68: /* pause/break */
1664 if (sc->sc_flags & CTLS) {
1665 keycode = 0x6c; /* break */
1670 /* return the key code in the K_CODE mode */
1671 if (usbcode & KEY_RELEASE) {
1672 keycode |= SCAN_RELEASE;
1674 if (sc->sc_mode == K_CODE) {
1677 /* compose a character code */
1678 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1680 /* key pressed, process it */
1683 case 0x49: /* keypad 7,8,9 */
1684 sc->sc_composed_char *= 10;
1685 sc->sc_composed_char += keycode - 0x40;
1686 goto check_composed;
1690 case 0x4D: /* keypad 4,5,6 */
1691 sc->sc_composed_char *= 10;
1692 sc->sc_composed_char += keycode - 0x47;
1693 goto check_composed;
1697 case 0x51: /* keypad 1,2,3 */
1698 sc->sc_composed_char *= 10;
1699 sc->sc_composed_char += keycode - 0x4E;
1700 goto check_composed;
1702 case 0x52: /* keypad 0 */
1703 sc->sc_composed_char *= 10;
1704 goto check_composed;
1706 /* key released, no interest here */
1707 case SCAN_RELEASE | 0x47:
1708 case SCAN_RELEASE | 0x48:
1709 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1710 case SCAN_RELEASE | 0x4B:
1711 case SCAN_RELEASE | 0x4C:
1712 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1713 case SCAN_RELEASE | 0x4F:
1714 case SCAN_RELEASE | 0x50:
1715 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1716 case SCAN_RELEASE | 0x52: /* keypad 0 */
1719 case 0x38: /* left alt key */
1723 if (sc->sc_composed_char > 0) {
1724 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1725 sc->sc_composed_char = 0;
1731 /* keycode to key action */
1732 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1733 (keycode & SCAN_RELEASE),
1734 &sc->sc_state, &sc->sc_accents);
1735 if (action == NOKEY) {
1742 if (sc->sc_composed_char <= 0xFF) {
1749 /* Currently wait is always false. */
1751 ukbd_read_char(keyboard_t *kbd, int wait)
1756 keycode = ukbd_read_char_locked(kbd, wait);
1762 /* some useful control functions */
1764 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1766 struct ukbd_softc *sc = kbd->kb_data;
1768 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1769 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1777 case KDGKBMODE: /* get keyboard mode */
1778 *(int *)arg = sc->sc_mode;
1780 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1781 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1783 ival = IOCPARM_IVAL(arg);
1784 arg = (caddr_t)&ival;
1787 case KDSKBMODE: /* set keyboard mode */
1788 switch (*(int *)arg) {
1790 if (sc->sc_mode != K_XLATE) {
1791 /* make lock key state and LED state match */
1792 sc->sc_state &= ~LOCK_MASK;
1793 sc->sc_state |= KBD_LED_VAL(kbd);
1798 if (sc->sc_mode != *(int *)arg) {
1799 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1800 ukbd_clear_state(kbd);
1801 sc->sc_mode = *(int *)arg;
1809 case KDGETLED: /* get keyboard LED */
1810 *(int *)arg = KBD_LED_VAL(kbd);
1812 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1813 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1815 ival = IOCPARM_IVAL(arg);
1816 arg = (caddr_t)&ival;
1819 case KDSETLED: /* set keyboard LED */
1820 /* NOTE: lock key state in "sc_state" won't be changed */
1821 if (*(int *)arg & ~LOCK_MASK)
1826 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1827 if (sc->sc_mode == K_XLATE &&
1828 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1834 if (KBD_HAS_DEVICE(kbd))
1835 ukbd_set_leds(sc, i);
1837 KBD_LED_VAL(kbd) = *(int *)arg;
1839 case KDGKBSTATE: /* get lock key state */
1840 *(int *)arg = sc->sc_state & LOCK_MASK;
1842 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1843 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1845 ival = IOCPARM_IVAL(arg);
1846 arg = (caddr_t)&ival;
1849 case KDSKBSTATE: /* set lock key state */
1850 if (*(int *)arg & ~LOCK_MASK) {
1853 sc->sc_state &= ~LOCK_MASK;
1854 sc->sc_state |= *(int *)arg;
1856 /* set LEDs and quit */
1857 return (ukbd_ioctl(kbd, KDSETLED, arg));
1859 case KDSETREPEAT: /* set keyboard repeat rate (new
1861 if (!KBD_HAS_DEVICE(kbd)) {
1864 if (((int *)arg)[1] < 0) {
1867 if (((int *)arg)[0] < 0) {
1870 if (((int *)arg)[0] < 200) /* fastest possible value */
1871 kbd->kb_delay1 = 200;
1873 kbd->kb_delay1 = ((int *)arg)[0];
1874 kbd->kb_delay2 = ((int *)arg)[1];
1877 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1878 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1880 ival = IOCPARM_IVAL(arg);
1881 arg = (caddr_t)&ival;
1884 case KDSETRAD: /* set keyboard repeat rate (old
1886 return (ukbd_set_typematic(kbd, *(int *)arg));
1888 case PIO_KEYMAP: /* set keyboard translation table */
1889 case OPIO_KEYMAP: /* set keyboard translation table
1891 case PIO_KEYMAPENT: /* set keyboard translation table
1893 case PIO_DEADKEYMAP: /* set accent key translation table */
1897 return (genkbd_commonioctl(kbd, cmd, arg));
1904 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1909 * XXX Check if someone is calling us from a critical section:
1911 if (curthread->td_critnest != 0)
1915 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1916 * context where printf(9) can be called, which among other things
1917 * includes interrupt filters and threads with any kinds of locks
1918 * already held. For this reason it would be dangerous to acquire
1919 * the Giant here unconditionally. On the other hand we have to
1920 * have it to handle the ioctl.
1921 * So we make our best effort to auto-detect whether we can grab
1922 * the Giant or not. Blame syscons(4) for this.
1928 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1929 return (EDEADLK); /* best I could come up with */
1933 result = ukbd_ioctl_locked(kbd, cmd, arg);
1940 /* clear the internal state of the keyboard */
1942 ukbd_clear_state(keyboard_t *kbd)
1944 struct ukbd_softc *sc = kbd->kb_data;
1946 UKBD_CTX_LOCK_ASSERT();
1948 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1949 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1951 sc->sc_composed_char = 0;
1952 #ifdef UKBD_EMULATE_ATSCANCODE
1953 sc->sc_buffered_char[0] = 0;
1954 sc->sc_buffered_char[1] = 0;
1956 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1957 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1958 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1959 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1962 /* save the internal state, not used */
1964 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1966 return (len == 0) ? 1 : -1;
1969 /* set the internal state, not used */
1971 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1977 ukbd_poll(keyboard_t *kbd, int on)
1979 struct ukbd_softc *sc = kbd->kb_data;
1983 sc->sc_flags |= UKBD_FLAG_POLLING;
1984 sc->sc_poll_thread = curthread;
1986 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1987 ukbd_start_timer(sc); /* start timer */
1994 /* local functions */
1997 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2001 DPRINTF("leds=0x%02x\n", leds);
2004 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2006 /* start transfer, if not already started */
2008 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2012 ukbd_set_typematic(keyboard_t *kbd, int code)
2014 static const int delays[] = {250, 500, 750, 1000};
2015 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2016 68, 76, 84, 92, 100, 110, 118, 126,
2017 136, 152, 168, 184, 200, 220, 236, 252,
2018 272, 304, 336, 368, 400, 440, 472, 504};
2023 kbd->kb_delay1 = delays[(code >> 5) & 3];
2024 kbd->kb_delay2 = rates[code & 0x1f];
2028 #ifdef UKBD_EMULATE_ATSCANCODE
2030 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2032 static const int scan[] = {
2038 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2048 0x151, /* PageDown */
2051 0x146, /* XXX Pause/Break */
2052 0x15b, /* Win_L(Super_L) */
2053 0x15c, /* Win_R(Super_R) */
2054 0x15d, /* Application(Menu) */
2056 /* SUN TYPE 6 USB KEYBOARD */
2057 0x168, /* Sun Type 6 Help */
2058 0x15e, /* Sun Type 6 Stop */
2060 0x15f, /* Sun Type 6 Again */
2061 0x160, /* Sun Type 6 Props */
2062 0x161, /* Sun Type 6 Undo */
2063 0x162, /* Sun Type 6 Front */
2064 0x163, /* Sun Type 6 Copy */
2065 0x164, /* Sun Type 6 Open */
2066 0x165, /* Sun Type 6 Paste */
2067 0x166, /* Sun Type 6 Find */
2068 0x167, /* Sun Type 6 Cut */
2069 0x125, /* Sun Type 6 Mute */
2071 0x11f, /* Sun Type 6 VolumeDown */
2072 0x11e, /* Sun Type 6 VolumeUp */
2073 0x120, /* Sun Type 6 PowerDown */
2075 /* Japanese 106/109 keyboard */
2076 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2077 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2078 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2079 0x79, /* Keyboard Intl' 4 (Henkan) */
2080 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2081 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2084 if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2085 code = scan[code - 89];
2088 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2089 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2091 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2092 code &= ~SCAN_PREFIX_SHIFT;
2094 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2096 if (code & SCAN_PREFIX) {
2097 if (code & SCAN_PREFIX_CTL) {
2099 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2100 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2101 } else if (code & SCAN_PREFIX_SHIFT) {
2103 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2104 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2106 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2107 sc->sc_buffered_char[1] = 0;
2109 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2115 #endif /* UKBD_EMULATE_ATSCANCODE */
2117 static keyboard_switch_t ukbdsw = {
2118 .probe = &ukbd__probe,
2122 .test_if = &ukbd_test_if,
2123 .enable = &ukbd_enable,
2124 .disable = &ukbd_disable,
2126 .check = &ukbd_check,
2127 .read_char = &ukbd_read_char,
2128 .check_char = &ukbd_check_char,
2129 .ioctl = &ukbd_ioctl,
2131 .clear_state = &ukbd_clear_state,
2132 .get_state = &ukbd_get_state,
2133 .set_state = &ukbd_set_state,
2134 .get_fkeystr = &genkbd_get_fkeystr,
2136 .diag = &genkbd_diag,
2139 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2142 ukbd_driver_load(module_t mod, int what, void *arg)
2146 kbd_add_driver(&ukbd_kbd_driver);
2149 kbd_delete_driver(&ukbd_kbd_driver);
2155 static devclass_t ukbd_devclass;
2157 static device_method_t ukbd_methods[] = {
2158 DEVMETHOD(device_probe, ukbd_probe),
2159 DEVMETHOD(device_attach, ukbd_attach),
2160 DEVMETHOD(device_detach, ukbd_detach),
2161 DEVMETHOD(device_resume, ukbd_resume),
2166 static driver_t ukbd_driver = {
2168 .methods = ukbd_methods,
2169 .size = sizeof(struct ukbd_softc),
2172 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2173 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2174 MODULE_VERSION(ukbd, 1);