2 __FBSDID("$FreeBSD: head/sys/dev/usb/input/ukbd.c 262972 2014-03-10 08:52:30Z hselasky $");
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
43 #include <sys/stdint.h>
44 #include <sys/param.h>
45 #include <sys/queue.h>
46 #include <sys/types.h>
47 #include <sys/systm.h>
48 #include <sys/kernel.h>
50 #include <sys/module.h>
52 #include <sys/condvar.h>
53 #include <sys/sysctl.h>
54 #include <sys/unistd.h>
55 #include <sys/callout.h>
56 #include <sys/malloc.h>
59 #include <sys/sched.h>
60 #include <sys/thread2.h>
62 #include <bus/u4b/usb.h>
63 #include <bus/u4b/usbdi.h>
64 #include <bus/u4b/usbdi_util.h>
65 #include <bus/u4b/usbhid.h>
67 #define USB_DEBUG_VAR ukbd_debug
68 #include <bus/u4b/usb_debug.h>
70 #include <bus/u4b/quirk/usb_quirk.h>
72 #include <sys/ioccom.h>
73 #include <sys/filio.h>
77 #include <dev/misc/kbd/kbdreg.h>
79 /* the initial key map, accent map and fkey strings */
80 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
81 #define KBD_DFLT_KEYMAP
85 /* the following file must be included after "ukbdmap.h" */
86 #include <dev/misc/kbd/kbdtables.h>
89 static int ukbd_debug = 0;
90 static int ukbd_no_leds = 0;
91 static int ukbd_pollrate = 0;
93 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
94 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW,
95 &ukbd_debug, 0, "Debug level");
96 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW,
97 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
98 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW,
99 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
101 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
102 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
103 TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
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];
141 accentmap_t sc_accmap;
142 fkeytab_t sc_fkeymap[UKBD_NFKEY];
143 struct hid_location sc_loc_apple_eject;
144 struct hid_location sc_loc_apple_fn;
145 struct hid_location sc_loc_ctrl_l;
146 struct hid_location sc_loc_ctrl_r;
147 struct hid_location sc_loc_shift_l;
148 struct hid_location sc_loc_shift_r;
149 struct hid_location sc_loc_alt_l;
150 struct hid_location sc_loc_alt_r;
151 struct hid_location sc_loc_win_l;
152 struct hid_location sc_loc_win_r;
153 struct hid_location sc_loc_events;
154 struct hid_location sc_loc_numlock;
155 struct hid_location sc_loc_capslock;
156 struct hid_location sc_loc_scrolllock;
157 struct usb_callout sc_callout;
158 struct ukbd_data sc_ndata;
159 struct ukbd_data sc_odata;
161 struct thread *sc_poll_thread;
162 struct usb_device *sc_udev;
163 struct usb_interface *sc_iface;
164 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
166 uint32_t sc_ntime[UKBD_NKEYCODE];
167 uint32_t sc_otime[UKBD_NKEYCODE];
168 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
170 uint32_t sc_composed_char; /* composed char code, if non-zero */
171 #ifdef UKBD_EMULATE_ATSCANCODE
172 uint32_t sc_buffered_char[2];
174 uint32_t sc_flags; /* flags */
175 #define UKBD_FLAG_COMPOSE 0x00000001
176 #define UKBD_FLAG_POLLING 0x00000002
177 #define UKBD_FLAG_SET_LEDS 0x00000004
178 #define UKBD_FLAG_ATTACHED 0x00000010
179 #define UKBD_FLAG_GONE 0x00000020
181 #define UKBD_FLAG_HID_MASK 0x003fffc0
182 #define UKBD_FLAG_APPLE_EJECT 0x00000040
183 #define UKBD_FLAG_APPLE_FN 0x00000080
184 #define UKBD_FLAG_APPLE_SWAP 0x00000100
185 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
186 #define UKBD_FLAG_CTRL_L 0x00000400
187 #define UKBD_FLAG_CTRL_R 0x00000800
188 #define UKBD_FLAG_SHIFT_L 0x00001000
189 #define UKBD_FLAG_SHIFT_R 0x00002000
190 #define UKBD_FLAG_ALT_L 0x00004000
191 #define UKBD_FLAG_ALT_R 0x00008000
192 #define UKBD_FLAG_WIN_L 0x00010000
193 #define UKBD_FLAG_WIN_R 0x00020000
194 #define UKBD_FLAG_EVENTS 0x00040000
195 #define UKBD_FLAG_NUMLOCK 0x00080000
196 #define UKBD_FLAG_CAPSLOCK 0x00100000
197 #define UKBD_FLAG_SCROLLLOCK 0x00200000
199 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
200 int sc_state; /* shift/lock key state */
201 int sc_accents; /* accent key index (> 0) */
206 uint16_t sc_inputhead;
207 uint16_t sc_inputtail;
208 uint16_t sc_modifiers;
210 uint8_t sc_leds; /* store for async led requests */
211 uint8_t sc_iface_index;
213 uint8_t sc_id_apple_eject;
214 uint8_t sc_id_apple_fn;
215 uint8_t sc_id_ctrl_l;
216 uint8_t sc_id_ctrl_r;
217 uint8_t sc_id_shift_l;
218 uint8_t sc_id_shift_r;
224 uint8_t sc_id_numlock;
225 uint8_t sc_id_capslock;
226 uint8_t sc_id_scrolllock;
227 uint8_t sc_id_events;
230 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
233 #define KEY_ERROR 0x01
236 #define KEY_RELEASE 0x400
237 #define KEY_INDEX(c) ((c) & 0xFF)
240 #define SCAN_RELEASE 0x80
241 #define SCAN_PREFIX_E0 0x100
242 #define SCAN_PREFIX_E1 0x200
243 #define SCAN_PREFIX_CTL 0x400
244 #define SCAN_PREFIX_SHIFT 0x800
245 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
246 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
247 #define SCAN_CHAR(c) ((c) & 0x7f)
249 #define UKBD_LOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_EXCLUSIVE)
250 #define UKBD_UNLOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_RELEASE)
255 * Assert that the lock is held in all contexts
256 * where the code can be executed.
258 #define UKBD_LOCK_ASSERT()
261 * Assert that the lock is held in the contexts
262 * where it really has to be so.
264 #define UKBD_CTX_LOCK_ASSERT()
267 #define UKBD_LOCK_ASSERT() (void)0
268 #define UKBD_CTX_LOCK_ASSERT() (void)0
276 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
277 {MOD_CONTROL_L, 0xe0},
278 {MOD_CONTROL_R, 0xe4},
287 #define NN 0 /* no translation */
289 * Translate USB keycodes to AT keyboard scancodes.
292 * FIXME: Mac USB keyboard generates:
293 * 0x53: keypad NumLock/Clear
300 static const uint8_t ukbd_trtab[256] = {
301 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
302 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
303 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
304 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
305 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
306 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
307 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
308 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
309 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
310 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
311 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
312 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
313 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
314 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
315 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
316 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
317 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
318 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
319 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
320 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
329 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
335 static const uint8_t ukbd_boot_desc[] = {
336 0x05, 0x01, 0x09, 0x06, 0xa1,
337 0x01, 0x05, 0x07, 0x19, 0xe0,
338 0x29, 0xe7, 0x15, 0x00, 0x25,
339 0x01, 0x75, 0x01, 0x95, 0x08,
340 0x81, 0x02, 0x95, 0x01, 0x75,
341 0x08, 0x81, 0x01, 0x95, 0x03,
342 0x75, 0x01, 0x05, 0x08, 0x19,
343 0x01, 0x29, 0x03, 0x91, 0x02,
344 0x95, 0x05, 0x75, 0x01, 0x91,
345 0x01, 0x95, 0x06, 0x75, 0x08,
346 0x15, 0x00, 0x26, 0xff, 0x00,
347 0x05, 0x07, 0x19, 0x00, 0x2a,
348 0xff, 0x00, 0x81, 0x00, 0xc0
352 static void ukbd_timeout(void *);
353 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
354 static int ukbd_set_typematic(keyboard_t *, int);
355 #ifdef UKBD_EMULATE_ATSCANCODE
356 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
358 static uint32_t ukbd_read_char(keyboard_t *, int);
359 static void ukbd_clear_state(keyboard_t *);
360 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
361 static int ukbd_enable(keyboard_t *);
362 static int ukbd_disable(keyboard_t *);
363 static void ukbd_interrupt(struct ukbd_softc *);
364 static void ukbd_event_keyinput(struct ukbd_softc *);
366 static device_probe_t ukbd_probe;
367 static device_attach_t ukbd_attach;
368 static device_detach_t ukbd_detach;
369 static device_resume_t ukbd_resume;
372 ukbd_any_key_pressed(struct ukbd_softc *sc)
377 for (j = i = 0; i < UKBD_NKEYCODE; i++)
378 j |= sc->sc_odata.keycode[i];
384 ukbd_start_timer(struct ukbd_softc *sc)
386 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
387 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
391 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
394 UKBD_CTX_LOCK_ASSERT();
396 DPRINTF("0x%02x (%d) %s\n", key, key,
397 (key & KEY_RELEASE) ? "released" : "pressed");
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)
415 UKBD_CTX_LOCK_ASSERT();
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 (!kdb_active && !SCHEDULER_STOPPED()) {
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.
441 while (sc->sc_inputs == 0) {
443 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
445 /* Delay-optimised support for repetition of keys */
446 if (ukbd_any_key_pressed(sc)) {
447 /* a key is pressed - need timekeeping */
450 /* 1 millisecond has passed */
462 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
466 UKBD_CTX_LOCK_ASSERT();
468 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
469 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
470 ("not polling in kdb or panic\n"));
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 kfree(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 int32_t 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,
1186 unit, 0, KB_PRI_USB, 0, 0);
1188 kbd->kb_data = (void *)sc;
1190 device_set_usb_desc(dev);
1192 sc->sc_udev = uaa->device;
1193 sc->sc_iface = uaa->iface;
1194 sc->sc_iface_index = uaa->info.bIfaceIndex;
1195 sc->sc_iface_no = uaa->info.bIfaceNum;
1196 sc->sc_mode = K_XLATE;
1198 usb_callout_init_mtx(&sc->sc_callout, &kbd->kb_lock, 0);
1200 err = usbd_transfer_setup(uaa->device,
1201 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1202 UKBD_N_TRANSFER, sc, &sc->sc_kbd.kb_lock);
1205 DPRINTF("error=%s\n", usbd_errstr(err));
1208 /* setup default keyboard maps */
1210 sc->sc_keymap = key_map;
1211 sc->sc_accmap = accent_map;
1212 for (n = 0; n < UKBD_NFKEY; n++) {
1213 sc->sc_fkeymap[n] = fkey_tab[n];
1216 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1217 sc->sc_fkeymap, UKBD_NFKEY);
1219 KBD_FOUND_DEVICE(kbd);
1221 ukbd_clear_state(kbd);
1224 * FIXME: set the initial value for lock keys in "sc_state"
1225 * according to the BIOS data?
1227 KBD_PROBE_DONE(kbd);
1229 /* get HID descriptor */
1230 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1231 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1234 DPRINTF("Parsing HID descriptor of %d bytes\n",
1237 ukbd_parse_hid(sc, hid_ptr, hid_len);
1239 kfree(hid_ptr, M_TEMP);
1242 /* check if we should use the boot protocol */
1243 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1244 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1246 DPRINTF("Forcing boot protocol\n");
1248 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1249 sc->sc_iface_index, 0);
1252 DPRINTF("Set protocol error=%s (ignored)\n",
1256 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1259 /* ignore if SETIDLE fails, hence it is not crucial */
1260 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1262 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1266 if (kbd_register(kbd) < 0) {
1269 KBD_CONFIG_DONE(kbd);
1273 #ifdef KBD_INSTALL_CDEV
1274 if (kbd_attach(kbd)) {
1278 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1281 genkbd_diag(kbd, bootverbose);
1285 /* check for polling rate override */
1286 rate = ukbd_pollrate;
1293 /* set new polling interval in ms */
1294 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1297 /* start the keyboard */
1298 /* XXX mp locking added */
1300 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1303 return (0); /* success */
1306 return (ENXIO); /* error */
1310 ukbd_detach(device_t dev)
1312 struct ukbd_softc *sc = device_get_softc(dev);
1320 sc->sc_flags |= UKBD_FLAG_GONE;
1322 usb_callout_stop(&sc->sc_callout);
1324 /* kill any stuck keys */
1325 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1326 /* stop receiving events from the USB keyboard */
1327 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1329 /* release all leftover keys, if any */
1330 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1332 /* process releasing of all keys */
1336 ukbd_disable(&sc->sc_kbd);
1339 * XXX make sure this is in the correct place here,
1340 * it was taken from below the second if()
1342 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1343 usb_callout_drain(&sc->sc_callout);
1345 #ifdef KBD_INSTALL_CDEV
1346 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1347 error = kbd_detach(&sc->sc_kbd);
1349 /* usb attach cannot return an error */
1350 device_printf(dev, "WARNING: kbd_detach() "
1351 "returned non-zero! (ignored)\n");
1355 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1357 * kbd_unregister requires kb_lock to be held
1358 * but lockuninits it then
1361 error = kbd_unregister(&sc->sc_kbd);
1363 /* usb attach cannot return an error */
1364 device_printf(dev, "WARNING: kbd_unregister() "
1365 "returned non-zero! (ignored)\n");
1368 sc->sc_kbd.kb_flags = 0;
1372 DPRINTF("%s: disconnected\n",
1373 device_get_nameunit(dev));
1379 ukbd_resume(device_t dev)
1381 struct ukbd_softc *sc = device_get_softc(dev);
1385 ukbd_clear_state(&sc->sc_kbd);
1390 /* early keyboard probe, not supported */
1392 ukbd_configure(int flags)
1397 /* detect a keyboard, not used */
1399 ukbd__probe(int unit, void *arg, int flags)
1404 /* reset and initialize the device, not used */
1406 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1411 /* test the interface to the device, not used */
1413 ukbd_test_if(keyboard_t *kbd)
1418 /* finish using this keyboard, not used */
1420 ukbd_term(keyboard_t *kbd)
1425 /* keyboard interrupt routine, not used */
1427 ukbd_intr(keyboard_t *kbd, void *arg)
1432 /* lock the access to the keyboard, not used */
1434 ukbd_lock(keyboard_t *kbd, int lock)
1440 * Enable the access to the device; until this function is called,
1441 * the client cannot read from the keyboard.
1444 ukbd_enable(keyboard_t *kbd)
1453 /* disallow the access to the device */
1455 ukbd_disable(keyboard_t *kbd)
1458 KBD_DEACTIVATE(kbd);
1464 /* check if data is waiting */
1465 /* Currently unused. */
1467 ukbd_check(keyboard_t *kbd)
1469 struct ukbd_softc *sc = kbd->kb_data;
1471 UKBD_CTX_LOCK_ASSERT();
1473 if (!KBD_IS_ACTIVE(kbd))
1476 if (sc->sc_flags & UKBD_FLAG_POLLING)
1477 ukbd_do_poll(sc, 0);
1479 #ifdef UKBD_EMULATE_ATSCANCODE
1480 if (sc->sc_buffered_char[0]) {
1484 if (sc->sc_inputs > 0) {
1490 /* check if char is waiting */
1492 ukbd_check_char_locked(keyboard_t *kbd)
1494 struct ukbd_softc *sc = kbd->kb_data;
1496 UKBD_CTX_LOCK_ASSERT();
1498 if (!KBD_IS_ACTIVE(kbd))
1501 if ((sc->sc_composed_char > 0) &&
1502 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1505 return (ukbd_check(kbd));
1509 ukbd_check_char(keyboard_t *kbd)
1513 struct ukbd_softc *sc = kbd->kb_data;
1517 result = ukbd_check_char_locked(kbd);
1525 /* read one byte from the keyboard if it's allowed */
1526 /* Currently unused. */
1528 ukbd_read(keyboard_t *kbd, int wait)
1530 struct ukbd_softc *sc = kbd->kb_data;
1532 #ifdef UKBD_EMULATE_ATSCANCODE
1538 UKBD_CTX_LOCK_ASSERT();
1540 if (!KBD_IS_ACTIVE(kbd))
1543 #ifdef UKBD_EMULATE_ATSCANCODE
1544 if (sc->sc_buffered_char[0]) {
1545 scancode = sc->sc_buffered_char[0];
1546 if (scancode & SCAN_PREFIX) {
1547 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1548 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1550 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1551 sc->sc_buffered_char[1] = 0;
1554 #endif /* UKBD_EMULATE_ATSCANCODE */
1557 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1558 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1563 #ifdef UKBD_EMULATE_ATSCANCODE
1564 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1565 if (keycode == NN) {
1568 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1569 (usbcode & KEY_RELEASE)));
1570 #else /* !UKBD_EMULATE_ATSCANCODE */
1572 #endif /* UKBD_EMULATE_ATSCANCODE */
1575 /* read char from the keyboard */
1577 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1579 struct ukbd_softc *sc = kbd->kb_data;
1583 #ifdef UKBD_EMULATE_ATSCANCODE
1587 UKBD_CTX_LOCK_ASSERT();
1589 if (!KBD_IS_ACTIVE(kbd))
1594 /* do we have a composed char to return ? */
1596 if ((sc->sc_composed_char > 0) &&
1597 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1599 action = sc->sc_composed_char;
1600 sc->sc_composed_char = 0;
1602 if (action > 0xFF) {
1607 #ifdef UKBD_EMULATE_ATSCANCODE
1609 /* do we have a pending raw scan code? */
1611 if (sc->sc_mode == K_RAW) {
1612 scancode = sc->sc_buffered_char[0];
1614 if (scancode & SCAN_PREFIX) {
1615 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1616 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1618 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1619 sc->sc_buffered_char[1] = 0;
1623 #endif /* UKBD_EMULATE_ATSCANCODE */
1625 /* see if there is something in the keyboard port */
1627 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1628 if (usbcode == -1) {
1633 #ifdef UKBD_EMULATE_ATSCANCODE
1634 /* USB key index -> key code -> AT scan code */
1635 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1636 if (keycode == NN) {
1639 /* return an AT scan code for the K_RAW mode */
1640 if (sc->sc_mode == K_RAW) {
1641 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1642 (usbcode & KEY_RELEASE)));
1644 #else /* !UKBD_EMULATE_ATSCANCODE */
1646 /* return the byte as is for the K_RAW mode */
1647 if (sc->sc_mode == K_RAW) {
1650 /* USB key index -> key code */
1651 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1652 if (keycode == NN) {
1655 #endif /* UKBD_EMULATE_ATSCANCODE */
1658 case 0x38: /* left alt (compose key) */
1659 if (usbcode & KEY_RELEASE) {
1660 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1661 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1663 if (sc->sc_composed_char > 0xFF) {
1664 sc->sc_composed_char = 0;
1668 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1669 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1670 sc->sc_composed_char = 0;
1674 /* XXX: I don't like these... */
1675 case 0x5c: /* print screen */
1676 if (sc->sc_flags & ALTS) {
1677 keycode = 0x54; /* sysrq */
1680 case 0x68: /* pause/break */
1681 if (sc->sc_flags & CTLS) {
1682 keycode = 0x6c; /* break */
1687 /* return the key code in the K_CODE mode */
1688 if (usbcode & KEY_RELEASE) {
1689 keycode |= SCAN_RELEASE;
1691 if (sc->sc_mode == K_CODE) {
1694 /* compose a character code */
1695 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1697 /* key pressed, process it */
1700 case 0x49: /* keypad 7,8,9 */
1701 sc->sc_composed_char *= 10;
1702 sc->sc_composed_char += keycode - 0x40;
1703 goto check_composed;
1707 case 0x4D: /* keypad 4,5,6 */
1708 sc->sc_composed_char *= 10;
1709 sc->sc_composed_char += keycode - 0x47;
1710 goto check_composed;
1714 case 0x51: /* keypad 1,2,3 */
1715 sc->sc_composed_char *= 10;
1716 sc->sc_composed_char += keycode - 0x4E;
1717 goto check_composed;
1719 case 0x52: /* keypad 0 */
1720 sc->sc_composed_char *= 10;
1721 goto check_composed;
1723 /* key released, no interest here */
1724 case SCAN_RELEASE | 0x47:
1725 case SCAN_RELEASE | 0x48:
1726 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1727 case SCAN_RELEASE | 0x4B:
1728 case SCAN_RELEASE | 0x4C:
1729 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1730 case SCAN_RELEASE | 0x4F:
1731 case SCAN_RELEASE | 0x50:
1732 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1733 case SCAN_RELEASE | 0x52: /* keypad 0 */
1736 case 0x38: /* left alt key */
1740 if (sc->sc_composed_char > 0) {
1741 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1742 sc->sc_composed_char = 0;
1748 /* keycode to key action */
1749 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1750 (keycode & SCAN_RELEASE),
1751 &sc->sc_state, &sc->sc_accents);
1752 if (action == NOKEY) {
1759 if (sc->sc_composed_char <= 0xFF) {
1766 /* Currently wait is always false. */
1768 ukbd_read_char(keyboard_t *kbd, int wait)
1772 struct ukbd_softc *sc = kbd->kb_data;
1776 keycode = ukbd_read_char_locked(kbd, wait);
1784 /* some useful control functions */
1786 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1788 struct ukbd_softc *sc = kbd->kb_data;
1792 case KDGKBMODE: /* get keyboard mode */
1793 *(int *)arg = sc->sc_mode;
1795 case KDSKBMODE: /* set keyboard mode */
1796 switch (*(int *)arg) {
1798 if (sc->sc_mode != K_XLATE) {
1799 /* make lock key state and LED state match */
1800 sc->sc_state &= ~LOCK_MASK;
1801 sc->sc_state |= KBD_LED_VAL(kbd);
1806 if (sc->sc_mode != *(int *)arg) {
1807 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1808 ukbd_clear_state(kbd);
1809 sc->sc_mode = *(int *)arg;
1817 case KDGETLED: /* get keyboard LED */
1818 *(int *)arg = KBD_LED_VAL(kbd);
1820 case KDSETLED: /* set keyboard LED */
1821 /* NOTE: lock key state in "sc_state" won't be changed */
1822 if (*(int *)arg & ~LOCK_MASK)
1827 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1828 if (sc->sc_mode == K_XLATE &&
1829 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1835 if (KBD_HAS_DEVICE(kbd))
1836 ukbd_set_leds(sc, i);
1838 KBD_LED_VAL(kbd) = *(int *)arg;
1840 case KDGKBSTATE: /* get lock key state */
1841 *(int *)arg = sc->sc_state & LOCK_MASK;
1843 case KDSKBSTATE: /* set lock key state */
1844 if (*(int *)arg & ~LOCK_MASK) {
1847 sc->sc_state &= ~LOCK_MASK;
1848 sc->sc_state |= *(int *)arg;
1850 /* set LEDs and quit */
1851 return (ukbd_ioctl(kbd, KDSETLED, arg));
1853 case KDSETREPEAT: /* set keyboard repeat rate (new
1855 if (!KBD_HAS_DEVICE(kbd)) {
1858 if (((int *)arg)[1] < 0) {
1861 if (((int *)arg)[0] < 0) {
1864 if (((int *)arg)[0] < 200) /* fastest possible value */
1865 kbd->kb_delay1 = 200;
1867 kbd->kb_delay1 = ((int *)arg)[0];
1868 kbd->kb_delay2 = ((int *)arg)[1];
1871 case KDSETRAD: /* set keyboard repeat rate (old
1873 return (ukbd_set_typematic(kbd, *(int *)arg));
1875 case PIO_KEYMAP: /* set keyboard translation table */
1876 case PIO_KEYMAPENT: /* set keyboard translation table
1878 case PIO_DEADKEYMAP: /* set accent key translation table */
1882 return (genkbd_commonioctl(kbd, cmd, arg));
1889 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1892 struct ukbd_softc *sc = kbd->kb_data;
1895 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1896 * context where printf(9) can be called, which among other things
1897 * includes interrupt filters and threads with any kinds of locks
1898 * already held. For this reason it would be dangerous to acquire
1899 * the Giant here unconditionally. On the other hand we have to
1900 * have it to handle the ioctl.
1901 * So we make our best effort to auto-detect whether we can grab
1902 * the Giant or not. Blame syscons(4) for this.
1908 if(!lockowned(&kbd->kb_lock)) {
1909 return (EDEADLK); /* best I could come up with */
1914 result = ukbd_ioctl_locked(kbd, cmd, arg);
1921 /* clear the internal state of the keyboard */
1923 ukbd_clear_state(keyboard_t *kbd)
1925 struct ukbd_softc *sc = kbd->kb_data;
1927 UKBD_CTX_LOCK_ASSERT();
1929 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1930 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1932 sc->sc_composed_char = 0;
1933 #ifdef UKBD_EMULATE_ATSCANCODE
1934 sc->sc_buffered_char[0] = 0;
1935 sc->sc_buffered_char[1] = 0;
1937 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1938 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1939 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1940 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1943 /* save the internal state, not used */
1945 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1947 return (len == 0) ? 1 : -1;
1950 /* set the internal state, not used */
1952 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1958 ukbd_poll(keyboard_t *kbd, int on)
1960 struct ukbd_softc *sc = kbd->kb_data;
1964 sc->sc_flags |= UKBD_FLAG_POLLING;
1965 sc->sc_poll_thread = curthread;
1967 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1968 ukbd_start_timer(sc); /* start timer */
1975 /* local functions */
1978 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1981 DPRINTF("leds=0x%02x\n", 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 static const int delays[] = {250, 500, 750, 1000};
1995 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1996 68, 76, 84, 92, 100, 110, 118, 126,
1997 136, 152, 168, 184, 200, 220, 236, 252,
1998 272, 304, 336, 368, 400, 440, 472, 504};
2003 kbd->kb_delay1 = delays[(code >> 5) & 3];
2004 kbd->kb_delay2 = rates[code & 0x1f];
2008 #ifdef UKBD_EMULATE_ATSCANCODE
2010 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2012 static const int scan[] = {
2018 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2028 0x151, /* PageDown */
2031 0x146, /* XXX Pause/Break */
2032 0x15b, /* Win_L(Super_L) */
2033 0x15c, /* Win_R(Super_R) */
2034 0x15d, /* Application(Menu) */
2036 /* SUN TYPE 6 USB KEYBOARD */
2037 0x168, /* Sun Type 6 Help */
2038 0x15e, /* Sun Type 6 Stop */
2040 0x15f, /* Sun Type 6 Again */
2041 0x160, /* Sun Type 6 Props */
2042 0x161, /* Sun Type 6 Undo */
2043 0x162, /* Sun Type 6 Front */
2044 0x163, /* Sun Type 6 Copy */
2045 0x164, /* Sun Type 6 Open */
2046 0x165, /* Sun Type 6 Paste */
2047 0x166, /* Sun Type 6 Find */
2048 0x167, /* Sun Type 6 Cut */
2049 0x125, /* Sun Type 6 Mute */
2051 0x11f, /* Sun Type 6 VolumeDown */
2052 0x11e, /* Sun Type 6 VolumeUp */
2053 0x120, /* Sun Type 6 PowerDown */
2055 /* Japanese 106/109 keyboard */
2056 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2057 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2058 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2059 0x79, /* Keyboard Intl' 4 (Henkan) */
2060 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2061 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2064 if ((code >= 89) && (code < (int)(89 + NELEM(scan)))) {
2065 code = scan[code - 89];
2068 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2069 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2071 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2072 code &= ~SCAN_PREFIX_SHIFT;
2074 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2076 if (code & SCAN_PREFIX) {
2077 if (code & SCAN_PREFIX_CTL) {
2079 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2080 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2081 } else if (code & SCAN_PREFIX_SHIFT) {
2083 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2084 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2086 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2087 sc->sc_buffered_char[1] = 0;
2089 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2095 #endif /* UKBD_EMULATE_ATSCANCODE */
2097 static keyboard_switch_t ukbdsw = {
2098 .probe = &ukbd__probe,
2102 .test_if = &ukbd_test_if,
2103 .enable = &ukbd_enable,
2104 .disable = &ukbd_disable,
2106 .check = &ukbd_check,
2107 .read_char = &ukbd_read_char,
2108 .check_char = &ukbd_check_char,
2109 .ioctl = &ukbd_ioctl,
2111 .clear_state = &ukbd_clear_state,
2112 .get_state = &ukbd_get_state,
2113 .set_state = &ukbd_set_state,
2114 .get_fkeystr = &genkbd_get_fkeystr,
2116 .diag = &genkbd_diag,
2119 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2122 ukbd_driver_load(module_t mod, int what, void *arg)
2126 kbd_add_driver(&ukbd_kbd_driver);
2129 kbd_delete_driver(&ukbd_kbd_driver);
2135 static devclass_t ukbd_devclass;
2137 static device_method_t ukbd_methods[] = {
2138 DEVMETHOD(device_probe, ukbd_probe),
2139 DEVMETHOD(device_attach, ukbd_attach),
2140 DEVMETHOD(device_detach, ukbd_detach),
2141 DEVMETHOD(device_resume, ukbd_resume),
2145 static driver_t ukbd_driver = {
2147 .methods = ukbd_methods,
2148 .size = sizeof(struct ukbd_softc),
2151 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, NULL);
2152 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2153 MODULE_VERSION(ukbd, 1);