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
40 #include "opt_compat.h"
44 #include <sys/stdint.h>
45 #include <sys/param.h>
46 #include <sys/queue.h>
47 #include <sys/types.h>
48 #include <sys/systm.h>
49 #include <sys/kernel.h>
51 #include <sys/module.h>
53 #include <sys/condvar.h>
54 #include <sys/sysctl.h>
55 #include <sys/unistd.h>
56 #include <sys/callout.h>
57 #include <sys/malloc.h>
60 #include <sys/sched.h>
61 #include <sys/thread2.h>
63 #include <bus/u4b/usb.h>
64 #include <bus/u4b/usbdi.h>
65 #include <bus/u4b/usbdi_util.h>
66 #include <bus/u4b/usbhid.h>
68 #define USB_DEBUG_VAR ukbd_debug
69 #include <bus/u4b/usb_debug.h>
71 #include <bus/u4b/quirk/usb_quirk.h>
73 #include <sys/ioccom.h>
74 #include <sys/filio.h>
78 #include <dev/misc/kbd/kbdreg.h>
80 /* the initial key map, accent map and fkey strings */
81 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
82 #define KBD_DFLT_KEYMAP
86 /* the following file must be included after "ukbdmap.h" */
87 #include <dev/misc/kbd/kbdtables.h>
90 static int ukbd_debug = 0;
91 static int ukbd_no_leds = 0;
92 static int ukbd_pollrate = 0;
94 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
95 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW,
96 &ukbd_debug, 0, "Debug level");
97 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW,
98 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
99 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW,
100 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
102 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
103 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
104 TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
107 #define UKBD_EMULATE_ATSCANCODE 1
108 #define UKBD_DRIVER_NAME "ukbd"
109 #define UKBD_NMOD 8 /* units */
110 #define UKBD_NKEYCODE 6 /* units */
111 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
112 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
113 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
114 #define UKBD_BUFFER_SIZE 64 /* bytes */
118 #define MOD_CONTROL_L 0x01
119 #define MOD_CONTROL_R 0x10
120 #define MOD_SHIFT_L 0x02
121 #define MOD_SHIFT_R 0x20
122 #define MOD_ALT_L 0x04
123 #define MOD_ALT_R 0x40
124 #define MOD_WIN_L 0x08
125 #define MOD_WIN_R 0x80
127 #define MOD_EJECT 0x0100
128 #define MOD_FN 0x0200
129 uint8_t keycode[UKBD_NKEYCODE];
142 accentmap_t sc_accmap;
144 fkeytab_t sc_fkeymap[UKBD_NFKEY];
145 struct hid_location sc_loc_apple_eject;
146 struct hid_location sc_loc_apple_fn;
147 struct hid_location sc_loc_ctrl_l;
148 struct hid_location sc_loc_ctrl_r;
149 struct hid_location sc_loc_shift_l;
150 struct hid_location sc_loc_shift_r;
151 struct hid_location sc_loc_alt_l;
152 struct hid_location sc_loc_alt_r;
153 struct hid_location sc_loc_win_l;
154 struct hid_location sc_loc_win_r;
155 struct hid_location sc_loc_events;
156 struct hid_location sc_loc_numlock;
157 struct hid_location sc_loc_capslock;
158 struct hid_location sc_loc_scrolllock;
159 struct usb_callout sc_callout;
160 struct ukbd_data sc_ndata;
161 struct ukbd_data sc_odata;
163 struct thread *sc_poll_thread;
164 struct usb_device *sc_udev;
165 struct usb_interface *sc_iface;
166 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
168 uint32_t sc_ntime[UKBD_NKEYCODE];
169 uint32_t sc_otime[UKBD_NKEYCODE];
170 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
172 uint32_t sc_composed_char; /* composed char code, if non-zero */
173 #ifdef UKBD_EMULATE_ATSCANCODE
174 uint32_t sc_buffered_char[2];
176 uint32_t sc_flags; /* flags */
177 #define UKBD_FLAG_COMPOSE 0x00000001
178 #define UKBD_FLAG_POLLING 0x00000002
179 #define UKBD_FLAG_SET_LEDS 0x00000004
180 #define UKBD_FLAG_ATTACHED 0x00000010
181 #define UKBD_FLAG_GONE 0x00000020
183 #define UKBD_FLAG_HID_MASK 0x003fffc0
184 #define UKBD_FLAG_APPLE_EJECT 0x00000040
185 #define UKBD_FLAG_APPLE_FN 0x00000080
186 #define UKBD_FLAG_APPLE_SWAP 0x00000100
187 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
188 #define UKBD_FLAG_CTRL_L 0x00000400
189 #define UKBD_FLAG_CTRL_R 0x00000800
190 #define UKBD_FLAG_SHIFT_L 0x00001000
191 #define UKBD_FLAG_SHIFT_R 0x00002000
192 #define UKBD_FLAG_ALT_L 0x00004000
193 #define UKBD_FLAG_ALT_R 0x00008000
194 #define UKBD_FLAG_WIN_L 0x00010000
195 #define UKBD_FLAG_WIN_R 0x00020000
196 #define UKBD_FLAG_EVENTS 0x00040000
197 #define UKBD_FLAG_NUMLOCK 0x00080000
198 #define UKBD_FLAG_CAPSLOCK 0x00100000
199 #define UKBD_FLAG_SCROLLLOCK 0x00200000
201 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
202 int sc_state; /* shift/lock key state */
203 int sc_accents; /* accent key index (> 0) */
208 uint16_t sc_inputhead;
209 uint16_t sc_inputtail;
210 uint16_t sc_modifiers;
212 uint8_t sc_leds; /* store for async led requests */
213 uint8_t sc_iface_index;
215 uint8_t sc_id_apple_eject;
216 uint8_t sc_id_apple_fn;
217 uint8_t sc_id_ctrl_l;
218 uint8_t sc_id_ctrl_r;
219 uint8_t sc_id_shift_l;
220 uint8_t sc_id_shift_r;
226 uint8_t sc_id_numlock;
227 uint8_t sc_id_capslock;
228 uint8_t sc_id_scrolllock;
229 uint8_t sc_id_events;
232 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
235 #define KEY_ERROR 0x01
238 #define KEY_RELEASE 0x400
239 #define KEY_INDEX(c) ((c) & 0xFF)
242 #define SCAN_RELEASE 0x80
243 #define SCAN_PREFIX_E0 0x100
244 #define SCAN_PREFIX_E1 0x200
245 #define SCAN_PREFIX_CTL 0x400
246 #define SCAN_PREFIX_SHIFT 0x800
247 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
248 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
249 #define SCAN_CHAR(c) ((c) & 0x7f)
251 #define UKBD_LOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_EXCLUSIVE)
252 #define UKBD_UNLOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_RELEASE)
257 * Assert that the lock is held in all contexts
258 * where the code can be executed.
260 #define UKBD_LOCK_ASSERT()
263 * Assert that the lock is held in the contexts
264 * where it really has to be so.
266 #define UKBD_CTX_LOCK_ASSERT()
269 #define UKBD_LOCK_ASSERT() (void)0
270 #define UKBD_CTX_LOCK_ASSERT() (void)0
278 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
279 {MOD_CONTROL_L, 0xe0},
280 {MOD_CONTROL_R, 0xe4},
289 #define NN 0 /* no translation */
291 * Translate USB keycodes to AT keyboard scancodes.
294 * FIXME: Mac USB keyboard generates:
295 * 0x53: keypad NumLock/Clear
302 static const uint8_t ukbd_trtab[256] = {
303 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
304 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
305 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
306 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
307 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
308 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
309 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
310 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
311 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
312 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
313 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
314 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
315 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
316 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
317 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
318 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
319 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
320 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
331 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
337 static const uint8_t ukbd_boot_desc[] = {
338 0x05, 0x01, 0x09, 0x06, 0xa1,
339 0x01, 0x05, 0x07, 0x19, 0xe0,
340 0x29, 0xe7, 0x15, 0x00, 0x25,
341 0x01, 0x75, 0x01, 0x95, 0x08,
342 0x81, 0x02, 0x95, 0x01, 0x75,
343 0x08, 0x81, 0x01, 0x95, 0x03,
344 0x75, 0x01, 0x05, 0x08, 0x19,
345 0x01, 0x29, 0x03, 0x91, 0x02,
346 0x95, 0x05, 0x75, 0x01, 0x91,
347 0x01, 0x95, 0x06, 0x75, 0x08,
348 0x15, 0x00, 0x26, 0xff, 0x00,
349 0x05, 0x07, 0x19, 0x00, 0x2a,
350 0xff, 0x00, 0x81, 0x00, 0xc0
354 static void ukbd_timeout(void *);
355 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
356 static int ukbd_set_typematic(keyboard_t *, int);
357 #ifdef UKBD_EMULATE_ATSCANCODE
358 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
360 static uint32_t ukbd_read_char(keyboard_t *, int);
361 static void ukbd_clear_state(keyboard_t *);
362 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
363 static int ukbd_enable(keyboard_t *);
364 static int ukbd_disable(keyboard_t *);
365 static void ukbd_interrupt(struct ukbd_softc *);
366 static void ukbd_event_keyinput(struct ukbd_softc *);
368 static device_probe_t ukbd_probe;
369 static device_attach_t ukbd_attach;
370 static device_detach_t ukbd_detach;
371 static device_resume_t ukbd_resume;
374 ukbd_any_key_pressed(struct ukbd_softc *sc)
379 for (j = i = 0; i < UKBD_NKEYCODE; i++)
380 j |= sc->sc_odata.keycode[i];
386 ukbd_start_timer(struct ukbd_softc *sc)
388 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
389 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
393 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
396 UKBD_CTX_LOCK_ASSERT();
398 DPRINTF("0x%02x (%d) %s\n", key, key,
399 (key & KEY_RELEASE) ? "released" : "pressed");
401 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
402 sc->sc_input[sc->sc_inputtail] = key;
404 ++(sc->sc_inputtail);
405 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
406 sc->sc_inputtail = 0;
409 DPRINTF("input buffer is full\n");
414 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
417 UKBD_CTX_LOCK_ASSERT();
418 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
419 ("ukbd_do_poll called when not polling\n"));
420 DPRINTFN(2, "polling\n");
422 if (!kdb_active && !SCHEDULER_STOPPED()) {
424 * In this context the kernel is polling for input,
425 * but the USB subsystem works in normal interrupt-driven
426 * mode, so we just wait on the USB threads to do the job.
427 * Note that we currently hold the Giant, but it's also used
428 * as the transfer mtx, so we must release it while waiting.
430 while (sc->sc_inputs == 0) {
432 * Give USB threads a chance to run. Note that
433 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
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();
470 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
471 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
472 ("not polling in kdb or panic\n"));
475 if (sc->sc_inputs == 0 &&
476 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
477 /* start transfer, if not already started */
478 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
481 if (sc->sc_flags & UKBD_FLAG_POLLING)
482 ukbd_do_poll(sc, wait);
484 if (sc->sc_inputs == 0) {
487 c = sc->sc_input[sc->sc_inputhead];
489 ++(sc->sc_inputhead);
490 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
491 sc->sc_inputhead = 0;
498 ukbd_interrupt(struct ukbd_softc *sc)
502 uint32_t now = sc->sc_time_ms;
508 UKBD_CTX_LOCK_ASSERT();
510 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
513 n_mod = sc->sc_ndata.modifiers;
514 o_mod = sc->sc_odata.modifiers;
515 if (n_mod != o_mod) {
516 for (i = 0; i < UKBD_NMOD; i++) {
517 if ((n_mod & ukbd_mods[i].mask) !=
518 (o_mod & ukbd_mods[i].mask)) {
519 ukbd_put_key(sc, ukbd_mods[i].key |
520 ((n_mod & ukbd_mods[i].mask) ?
521 KEY_PRESS : KEY_RELEASE));
525 /* Check for released keys. */
526 for (i = 0; i < UKBD_NKEYCODE; i++) {
527 key = sc->sc_odata.keycode[i];
531 for (j = 0; j < UKBD_NKEYCODE; j++) {
532 if (sc->sc_ndata.keycode[j] == 0) {
535 if (key == sc->sc_ndata.keycode[j]) {
539 ukbd_put_key(sc, key | KEY_RELEASE);
543 /* Check for pressed keys. */
544 for (i = 0; i < UKBD_NKEYCODE; i++) {
545 key = sc->sc_ndata.keycode[i];
549 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
550 for (j = 0; j < UKBD_NKEYCODE; j++) {
551 if (sc->sc_odata.keycode[j] == 0) {
554 if (key == sc->sc_odata.keycode[j]) {
556 /* key is still pressed */
558 sc->sc_ntime[i] = sc->sc_otime[j];
559 dtime = (sc->sc_otime[j] - now);
561 if (!(dtime & 0x80000000)) {
562 /* time has not elapsed */
565 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
569 ukbd_put_key(sc, key | KEY_PRESS);
572 * If any other key is presently down, force its repeat to be
573 * well in the future (100s). This makes the last key to be
574 * pressed do the autorepeat.
576 for (j = 0; j != UKBD_NKEYCODE; j++) {
578 sc->sc_ntime[j] = now + (100 * 1000);
583 sc->sc_odata = sc->sc_ndata;
585 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
587 ukbd_event_keyinput(sc);
591 ukbd_event_keyinput(struct ukbd_softc *sc)
595 UKBD_CTX_LOCK_ASSERT();
597 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
600 if (sc->sc_inputs == 0)
603 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
604 KBD_IS_BUSY(&sc->sc_kbd)) {
605 /* let the callback function process the input */
606 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
607 sc->sc_kbd.kb_callback.kc_arg);
609 /* read and discard the input, no one is waiting for it */
611 c = ukbd_read_char(&sc->sc_kbd, 0);
612 } while (c != NOKEY);
617 ukbd_timeout(void *arg)
619 struct ukbd_softc *sc = arg;
623 sc->sc_time_ms += 25; /* milliseconds */
627 /* Make sure any leftover key events gets read out */
628 ukbd_event_keyinput(sc);
630 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
631 ukbd_start_timer(sc);
633 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
638 ukbd_apple_fn(uint8_t keycode) {
640 case 0x28: return 0x49; /* RETURN -> INSERT */
641 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
642 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
643 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
644 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
645 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
646 default: return keycode;
651 ukbd_apple_swap(uint8_t keycode) {
653 case 0x35: return 0x64;
654 case 0x64: return 0x35;
655 default: return keycode;
660 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
662 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
663 struct usb_page_cache *pc;
671 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
672 pc = usbd_xfer_get_frame(xfer, 0);
674 switch (USB_GET_STATE(xfer)) {
675 case USB_ST_TRANSFERRED:
676 DPRINTF("actlen=%d bytes\n", len);
679 DPRINTF("zero length data\n");
683 if (sc->sc_kbd_id != 0) {
684 /* check and remove HID ID byte */
685 usbd_copy_out(pc, 0, &id, 1);
689 DPRINTF("zero length data\n");
697 if (len > UKBD_BUFFER_SIZE)
698 len = UKBD_BUFFER_SIZE;
701 usbd_copy_out(pc, offset, sc->sc_buffer, len);
703 /* clear temporary storage */
704 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
706 /* scan through HID data */
707 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
708 (id == sc->sc_id_apple_eject)) {
709 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
710 sc->sc_modifiers |= MOD_EJECT;
712 sc->sc_modifiers &= ~MOD_EJECT;
714 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
715 (id == sc->sc_id_apple_fn)) {
716 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
717 sc->sc_modifiers |= MOD_FN;
719 sc->sc_modifiers &= ~MOD_FN;
721 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
722 (id == sc->sc_id_ctrl_l)) {
723 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
724 sc-> sc_modifiers |= MOD_CONTROL_L;
726 sc-> sc_modifiers &= ~MOD_CONTROL_L;
728 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
729 (id == sc->sc_id_ctrl_r)) {
730 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
731 sc->sc_modifiers |= MOD_CONTROL_R;
733 sc->sc_modifiers &= ~MOD_CONTROL_R;
735 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
736 (id == sc->sc_id_shift_l)) {
737 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
738 sc->sc_modifiers |= MOD_SHIFT_L;
740 sc->sc_modifiers &= ~MOD_SHIFT_L;
742 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
743 (id == sc->sc_id_shift_r)) {
744 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
745 sc->sc_modifiers |= MOD_SHIFT_R;
747 sc->sc_modifiers &= ~MOD_SHIFT_R;
749 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
750 (id == sc->sc_id_alt_l)) {
751 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
752 sc->sc_modifiers |= MOD_ALT_L;
754 sc->sc_modifiers &= ~MOD_ALT_L;
756 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
757 (id == sc->sc_id_alt_r)) {
758 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
759 sc->sc_modifiers |= MOD_ALT_R;
761 sc->sc_modifiers &= ~MOD_ALT_R;
763 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
764 (id == sc->sc_id_win_l)) {
765 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
766 sc->sc_modifiers |= MOD_WIN_L;
768 sc->sc_modifiers &= ~MOD_WIN_L;
770 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
771 (id == sc->sc_id_win_r)) {
772 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
773 sc->sc_modifiers |= MOD_WIN_R;
775 sc->sc_modifiers &= ~MOD_WIN_R;
778 sc->sc_ndata.modifiers = sc->sc_modifiers;
780 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
781 (id == sc->sc_id_events)) {
782 i = sc->sc_loc_events.count;
783 if (i > UKBD_NKEYCODE)
788 sc->sc_ndata.keycode[i] =
789 hid_get_data(sc->sc_buffer + i, len - i,
795 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
796 for (i = 0; i < UKBD_NKEYCODE; i++) {
797 if (sc->sc_ndata.keycode[i]) {
798 DPRINTF("[%d] = 0x%02x\n",
799 (int)i, (int)sc->sc_ndata.keycode[i]);
803 if (sc->sc_modifiers & MOD_FN) {
804 for (i = 0; i < UKBD_NKEYCODE; i++) {
805 sc->sc_ndata.keycode[i] =
806 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
810 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
811 for (i = 0; i < UKBD_NKEYCODE; i++) {
812 sc->sc_ndata.keycode[i] =
813 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
819 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
820 if (ukbd_any_key_pressed(sc)) {
821 ukbd_start_timer(sc);
827 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
828 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
829 usbd_transfer_submit(xfer);
831 DPRINTF("input queue is full!\n");
836 DPRINTF("error=%s\n", usbd_errstr(error));
838 if (error != USB_ERR_CANCELLED) {
839 /* try to clear stall first */
840 usbd_xfer_set_stall(xfer);
848 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
850 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
851 struct usb_device_request req;
852 struct usb_page_cache *pc;
864 switch (USB_GET_STATE(xfer)) {
865 case USB_ST_TRANSFERRED:
867 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
869 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
871 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
872 req.bRequest = UR_SET_REPORT;
873 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
874 req.wIndex[0] = sc->sc_iface_no;
878 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
883 /* Assumption: All led bits must be in the same ID. */
885 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
886 if (sc->sc_leds & NLKED) {
887 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
888 &sc->sc_loc_numlock, 1);
890 id = sc->sc_id_numlock;
894 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
895 if (sc->sc_leds & SLKED) {
896 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
897 &sc->sc_loc_scrolllock, 1);
899 id = sc->sc_id_scrolllock;
903 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
904 if (sc->sc_leds & CLKED) {
905 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
906 &sc->sc_loc_capslock, 1);
908 id = sc->sc_id_capslock;
912 /* if no leds, nothing to do */
916 /* range check output report length */
917 len = sc->sc_led_size;
918 if (len > (UKBD_BUFFER_SIZE - 1))
919 len = (UKBD_BUFFER_SIZE - 1);
921 /* check if we need to prefix an ID byte */
922 sc->sc_buffer[0] = id;
924 pc = usbd_xfer_get_frame(xfer, 1);
927 usbd_copy_in(pc, 0, sc->sc_buffer, len);
929 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
931 req.wLength[0] = len;
932 usbd_xfer_set_frame_len(xfer, 1, len);
934 DPRINTF("len=%d, id=%d\n", len, id);
936 /* setup control request last */
937 pc = usbd_xfer_get_frame(xfer, 0);
938 usbd_copy_in(pc, 0, &req, sizeof(req));
939 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
941 /* start data transfer */
942 usbd_xfer_set_frames(xfer, 2);
943 usbd_transfer_submit(xfer);
947 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
952 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
955 .type = UE_INTERRUPT,
956 .endpoint = UE_ADDR_ANY,
957 .direction = UE_DIR_IN,
958 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
959 .bufsize = 0, /* use wMaxPacketSize */
960 .callback = &ukbd_intr_callback,
965 .endpoint = 0x00, /* Control pipe */
966 .direction = UE_DIR_ANY,
967 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
968 .callback = &ukbd_set_leds_callback,
969 .timeout = 1000, /* 1 second */
973 /* A match on these entries will load ukbd */
974 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
975 {USB_IFACE_CLASS(UICLASS_HID),
976 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
977 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
981 ukbd_probe(device_t dev)
983 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
984 struct usb_attach_arg *uaa = device_get_ivars(dev);
995 if (uaa->usb_mode != USB_MODE_HOST) {
999 if (uaa->info.bInterfaceClass != UICLASS_HID)
1002 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1005 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1006 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1007 return (BUS_PROBE_DEFAULT);
1009 error = usbd_req_get_hid_desc(uaa->device, NULL,
1010 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1015 if (hid_is_keyboard(d_ptr, d_len)) {
1016 if (hid_is_mouse(d_ptr, d_len)) {
1018 * NOTE: We currently don't support USB mouse
1019 * and USB keyboard on the same USB endpoint.
1020 * Let "ums" driver win.
1024 error = BUS_PROBE_DEFAULT;
1029 kfree(d_ptr, M_TEMP);
1034 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1038 /* reset detected bits */
1039 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1041 /* check if there is an ID byte */
1042 sc->sc_kbd_size = hid_report_size(ptr, len,
1043 hid_input, &sc->sc_kbd_id);
1045 /* investigate if this is an Apple Keyboard */
1046 if (hid_locate(ptr, len,
1047 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1048 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1049 &sc->sc_id_apple_eject)) {
1050 if (flags & HIO_VARIABLE)
1051 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1052 UKBD_FLAG_APPLE_SWAP;
1053 DPRINTFN(1, "Found Apple eject-key\n");
1055 if (hid_locate(ptr, len,
1056 HID_USAGE2(0xFFFF, 0x0003),
1057 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1058 &sc->sc_id_apple_fn)) {
1059 if (flags & HIO_VARIABLE)
1060 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1061 DPRINTFN(1, "Found Apple FN-key\n");
1063 /* figure out some keys */
1064 if (hid_locate(ptr, len,
1065 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1066 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1067 &sc->sc_id_ctrl_l)) {
1068 if (flags & HIO_VARIABLE)
1069 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1070 DPRINTFN(1, "Found left control\n");
1072 if (hid_locate(ptr, len,
1073 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1074 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1075 &sc->sc_id_ctrl_r)) {
1076 if (flags & HIO_VARIABLE)
1077 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1078 DPRINTFN(1, "Found right control\n");
1080 if (hid_locate(ptr, len,
1081 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1082 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1083 &sc->sc_id_shift_l)) {
1084 if (flags & HIO_VARIABLE)
1085 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1086 DPRINTFN(1, "Found left shift\n");
1088 if (hid_locate(ptr, len,
1089 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1090 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1091 &sc->sc_id_shift_r)) {
1092 if (flags & HIO_VARIABLE)
1093 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1094 DPRINTFN(1, "Found right shift\n");
1096 if (hid_locate(ptr, len,
1097 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1098 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1099 &sc->sc_id_alt_l)) {
1100 if (flags & HIO_VARIABLE)
1101 sc->sc_flags |= UKBD_FLAG_ALT_L;
1102 DPRINTFN(1, "Found left alt\n");
1104 if (hid_locate(ptr, len,
1105 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1106 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1107 &sc->sc_id_alt_r)) {
1108 if (flags & HIO_VARIABLE)
1109 sc->sc_flags |= UKBD_FLAG_ALT_R;
1110 DPRINTFN(1, "Found right alt\n");
1112 if (hid_locate(ptr, len,
1113 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1114 hid_input, 0, &sc->sc_loc_win_l, &flags,
1115 &sc->sc_id_win_l)) {
1116 if (flags & HIO_VARIABLE)
1117 sc->sc_flags |= UKBD_FLAG_WIN_L;
1118 DPRINTFN(1, "Found left GUI\n");
1120 if (hid_locate(ptr, len,
1121 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1122 hid_input, 0, &sc->sc_loc_win_r, &flags,
1123 &sc->sc_id_win_r)) {
1124 if (flags & HIO_VARIABLE)
1125 sc->sc_flags |= UKBD_FLAG_WIN_R;
1126 DPRINTFN(1, "Found right GUI\n");
1128 /* figure out event buffer */
1129 if (hid_locate(ptr, len,
1130 HID_USAGE2(HUP_KEYBOARD, 0x00),
1131 hid_input, 0, &sc->sc_loc_events, &flags,
1132 &sc->sc_id_events)) {
1133 if (flags & HIO_VARIABLE) {
1134 DPRINTFN(1, "Ignoring keyboard event control\n");
1136 sc->sc_flags |= UKBD_FLAG_EVENTS;
1137 DPRINTFN(1, "Found keyboard event array\n");
1141 /* figure out leds on keyboard */
1142 sc->sc_led_size = hid_report_size(ptr, len,
1145 if (hid_locate(ptr, len,
1146 HID_USAGE2(HUP_LEDS, 0x01),
1147 hid_output, 0, &sc->sc_loc_numlock, &flags,
1148 &sc->sc_id_numlock)) {
1149 if (flags & HIO_VARIABLE)
1150 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1151 DPRINTFN(1, "Found keyboard numlock\n");
1153 if (hid_locate(ptr, len,
1154 HID_USAGE2(HUP_LEDS, 0x02),
1155 hid_output, 0, &sc->sc_loc_capslock, &flags,
1156 &sc->sc_id_capslock)) {
1157 if (flags & HIO_VARIABLE)
1158 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1159 DPRINTFN(1, "Found keyboard capslock\n");
1161 if (hid_locate(ptr, len,
1162 HID_USAGE2(HUP_LEDS, 0x03),
1163 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1164 &sc->sc_id_scrolllock)) {
1165 if (flags & HIO_VARIABLE)
1166 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1167 DPRINTFN(1, "Found keyboard scrolllock\n");
1172 ukbd_attach(device_t dev)
1174 struct ukbd_softc *sc = device_get_softc(dev);
1175 struct usb_attach_arg *uaa = device_get_ivars(dev);
1176 int32_t unit = device_get_unit(dev);
1177 keyboard_t *kbd = &sc->sc_kbd;
1178 void *hid_ptr = NULL;
1187 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER,
1188 unit, 0, KB_PRI_USB, 0, 0);
1190 kbd->kb_data = (void *)sc;
1192 device_set_usb_desc(dev);
1194 sc->sc_udev = uaa->device;
1195 sc->sc_iface = uaa->iface;
1196 sc->sc_iface_index = uaa->info.bIfaceIndex;
1197 sc->sc_iface_no = uaa->info.bIfaceNum;
1198 sc->sc_mode = K_XLATE;
1200 usb_callout_init_mtx(&sc->sc_callout, &kbd->kb_lock, 0);
1202 err = usbd_transfer_setup(uaa->device,
1203 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1204 UKBD_N_TRANSFER, sc, &sc->sc_kbd.kb_lock);
1207 DPRINTF("error=%s\n", usbd_errstr(err));
1210 /* setup default keyboard maps */
1212 sc->sc_keymap = key_map;
1213 sc->sc_accmap = accent_map;
1214 for (n = 0; n < UKBD_NFKEY; n++) {
1215 sc->sc_fkeymap[n] = fkey_tab[n];
1218 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1219 sc->sc_fkeymap, UKBD_NFKEY);
1221 KBD_FOUND_DEVICE(kbd);
1223 ukbd_clear_state(kbd);
1226 * FIXME: set the initial value for lock keys in "sc_state"
1227 * according to the BIOS data?
1229 KBD_PROBE_DONE(kbd);
1231 /* get HID descriptor */
1232 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1233 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1236 DPRINTF("Parsing HID descriptor of %d bytes\n",
1239 ukbd_parse_hid(sc, hid_ptr, hid_len);
1241 kfree(hid_ptr, M_TEMP);
1244 /* check if we should use the boot protocol */
1245 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1246 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1248 DPRINTF("Forcing boot protocol\n");
1250 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1251 sc->sc_iface_index, 0);
1254 DPRINTF("Set protocol error=%s (ignored)\n",
1258 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1261 /* ignore if SETIDLE fails, hence it is not crucial */
1262 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1264 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1268 if (kbd_register(kbd) < 0) {
1271 KBD_CONFIG_DONE(kbd);
1275 #ifdef KBD_INSTALL_CDEV
1276 if (kbd_attach(kbd)) {
1280 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1283 genkbd_diag(kbd, bootverbose);
1287 /* check for polling rate override */
1288 rate = ukbd_pollrate;
1295 /* set new polling interval in ms */
1296 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1299 /* start the keyboard */
1300 /* XXX mp locking added */
1302 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1306 return (0); /* success */
1309 return (ENXIO); /* error */
1313 ukbd_detach(device_t dev)
1315 struct ukbd_softc *sc = device_get_softc(dev);
1323 sc->sc_flags |= UKBD_FLAG_GONE;
1325 usb_callout_stop(&sc->sc_callout);
1327 /* kill any stuck keys */
1328 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1329 /* stop receiving events from the USB keyboard */
1330 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1332 /* release all leftover keys, if any */
1333 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1335 /* process releasing of all keys */
1339 ukbd_disable(&sc->sc_kbd);
1342 * XXX make sure this is in the correct place here,
1343 * it was taken from below the second if()
1345 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1346 usb_callout_drain(&sc->sc_callout);
1348 #ifdef KBD_INSTALL_CDEV
1349 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1350 error = kbd_detach(&sc->sc_kbd);
1352 /* usb attach cannot return an error */
1353 device_printf(dev, "WARNING: kbd_detach() "
1354 "returned non-zero! (ignored)\n");
1358 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1360 * kbd_unregister requires kb_lock to be held
1361 * but lockuninits it then
1364 error = kbd_unregister(&sc->sc_kbd);
1366 /* usb attach cannot return an error */
1367 device_printf(dev, "WARNING: kbd_unregister() "
1368 "returned non-zero! (ignored)\n");
1371 sc->sc_kbd.kb_flags = 0;
1376 DPRINTF("%s: disconnected\n",
1377 device_get_nameunit(dev));
1383 ukbd_resume(device_t dev)
1385 struct ukbd_softc *sc = device_get_softc(dev);
1389 ukbd_clear_state(&sc->sc_kbd);
1394 /* early keyboard probe, not supported */
1396 ukbd_configure(int flags)
1401 /* detect a keyboard, not used */
1403 ukbd__probe(int unit, void *arg, int flags)
1408 /* reset and initialize the device, not used */
1410 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1415 /* test the interface to the device, not used */
1417 ukbd_test_if(keyboard_t *kbd)
1422 /* finish using this keyboard, not used */
1424 ukbd_term(keyboard_t *kbd)
1429 /* keyboard interrupt routine, not used */
1431 ukbd_intr(keyboard_t *kbd, void *arg)
1436 /* lock the access to the keyboard, not used */
1438 ukbd_lock(keyboard_t *kbd, int lock)
1444 * Enable the access to the device; until this function is called,
1445 * the client cannot read from the keyboard.
1448 ukbd_enable(keyboard_t *kbd)
1457 /* disallow the access to the device */
1459 ukbd_disable(keyboard_t *kbd)
1462 KBD_DEACTIVATE(kbd);
1468 /* check if data is waiting */
1469 /* Currently unused. */
1471 ukbd_check(keyboard_t *kbd)
1473 struct ukbd_softc *sc = kbd->kb_data;
1475 UKBD_CTX_LOCK_ASSERT();
1477 if (!KBD_IS_ACTIVE(kbd))
1480 if (sc->sc_flags & UKBD_FLAG_POLLING)
1481 ukbd_do_poll(sc, 0);
1483 #ifdef UKBD_EMULATE_ATSCANCODE
1484 if (sc->sc_buffered_char[0]) {
1488 if (sc->sc_inputs > 0) {
1494 /* check if char is waiting */
1496 ukbd_check_char_locked(keyboard_t *kbd)
1498 struct ukbd_softc *sc = kbd->kb_data;
1500 UKBD_CTX_LOCK_ASSERT();
1502 if (!KBD_IS_ACTIVE(kbd))
1505 if ((sc->sc_composed_char > 0) &&
1506 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1509 return (ukbd_check(kbd));
1513 ukbd_check_char(keyboard_t *kbd)
1517 struct ukbd_softc *sc = kbd->kb_data;
1521 result = ukbd_check_char_locked(kbd);
1529 /* read one byte from the keyboard if it's allowed */
1530 /* Currently unused. */
1532 ukbd_read(keyboard_t *kbd, int wait)
1534 struct ukbd_softc *sc = kbd->kb_data;
1536 #ifdef UKBD_EMULATE_ATSCANCODE
1542 UKBD_CTX_LOCK_ASSERT();
1544 if (!KBD_IS_ACTIVE(kbd))
1547 #ifdef UKBD_EMULATE_ATSCANCODE
1548 if (sc->sc_buffered_char[0]) {
1549 scancode = sc->sc_buffered_char[0];
1550 if (scancode & SCAN_PREFIX) {
1551 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1552 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1554 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1555 sc->sc_buffered_char[1] = 0;
1558 #endif /* UKBD_EMULATE_ATSCANCODE */
1561 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1562 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1567 #ifdef UKBD_EMULATE_ATSCANCODE
1568 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1569 if (keycode == NN) {
1572 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1573 (usbcode & KEY_RELEASE)));
1574 #else /* !UKBD_EMULATE_ATSCANCODE */
1576 #endif /* UKBD_EMULATE_ATSCANCODE */
1579 /* read char from the keyboard */
1581 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1583 struct ukbd_softc *sc = kbd->kb_data;
1587 #ifdef UKBD_EMULATE_ATSCANCODE
1591 UKBD_CTX_LOCK_ASSERT();
1593 if (!KBD_IS_ACTIVE(kbd))
1598 /* do we have a composed char to return ? */
1600 if ((sc->sc_composed_char > 0) &&
1601 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1603 action = sc->sc_composed_char;
1604 sc->sc_composed_char = 0;
1606 if (action > 0xFF) {
1611 #ifdef UKBD_EMULATE_ATSCANCODE
1613 /* do we have a pending raw scan code? */
1615 if (sc->sc_mode == K_RAW) {
1616 scancode = sc->sc_buffered_char[0];
1618 if (scancode & SCAN_PREFIX) {
1619 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1620 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1622 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1623 sc->sc_buffered_char[1] = 0;
1627 #endif /* UKBD_EMULATE_ATSCANCODE */
1629 /* see if there is something in the keyboard port */
1631 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1632 if (usbcode == -1) {
1637 #ifdef UKBD_EMULATE_ATSCANCODE
1638 /* USB key index -> key code -> AT scan code */
1639 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1640 if (keycode == NN) {
1643 /* return an AT scan code for the K_RAW mode */
1644 if (sc->sc_mode == K_RAW) {
1645 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1646 (usbcode & KEY_RELEASE)));
1648 #else /* !UKBD_EMULATE_ATSCANCODE */
1650 /* return the byte as is for the K_RAW mode */
1651 if (sc->sc_mode == K_RAW) {
1654 /* USB key index -> key code */
1655 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1656 if (keycode == NN) {
1659 #endif /* UKBD_EMULATE_ATSCANCODE */
1662 case 0x38: /* left alt (compose key) */
1663 if (usbcode & KEY_RELEASE) {
1664 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1665 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1667 if (sc->sc_composed_char > 0xFF) {
1668 sc->sc_composed_char = 0;
1672 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1673 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1674 sc->sc_composed_char = 0;
1678 /* XXX: I don't like these... */
1679 case 0x5c: /* print screen */
1680 if (sc->sc_flags & ALTS) {
1681 keycode = 0x54; /* sysrq */
1684 case 0x68: /* pause/break */
1685 if (sc->sc_flags & CTLS) {
1686 keycode = 0x6c; /* break */
1691 /* return the key code in the K_CODE mode */
1692 if (usbcode & KEY_RELEASE) {
1693 keycode |= SCAN_RELEASE;
1695 if (sc->sc_mode == K_CODE) {
1698 /* compose a character code */
1699 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1701 /* key pressed, process it */
1704 case 0x49: /* keypad 7,8,9 */
1705 sc->sc_composed_char *= 10;
1706 sc->sc_composed_char += keycode - 0x40;
1707 goto check_composed;
1711 case 0x4D: /* keypad 4,5,6 */
1712 sc->sc_composed_char *= 10;
1713 sc->sc_composed_char += keycode - 0x47;
1714 goto check_composed;
1718 case 0x51: /* keypad 1,2,3 */
1719 sc->sc_composed_char *= 10;
1720 sc->sc_composed_char += keycode - 0x4E;
1721 goto check_composed;
1723 case 0x52: /* keypad 0 */
1724 sc->sc_composed_char *= 10;
1725 goto check_composed;
1727 /* key released, no interest here */
1728 case SCAN_RELEASE | 0x47:
1729 case SCAN_RELEASE | 0x48:
1730 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1731 case SCAN_RELEASE | 0x4B:
1732 case SCAN_RELEASE | 0x4C:
1733 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1734 case SCAN_RELEASE | 0x4F:
1735 case SCAN_RELEASE | 0x50:
1736 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1737 case SCAN_RELEASE | 0x52: /* keypad 0 */
1740 case 0x38: /* left alt key */
1744 if (sc->sc_composed_char > 0) {
1745 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1746 sc->sc_composed_char = 0;
1752 /* keycode to key action */
1753 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1754 (keycode & SCAN_RELEASE),
1755 &sc->sc_state, &sc->sc_accents);
1756 if (action == NOKEY) {
1763 if (sc->sc_composed_char <= 0xFF) {
1770 /* Currently wait is always false. */
1772 ukbd_read_char(keyboard_t *kbd, int wait)
1776 struct ukbd_softc *sc = kbd->kb_data;
1780 keycode = ukbd_read_char_locked(kbd, wait);
1788 /* some useful control functions */
1790 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1792 struct ukbd_softc *sc = kbd->kb_data;
1795 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1796 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1803 case KDGKBMODE: /* get keyboard mode */
1804 *(int *)arg = sc->sc_mode;
1807 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1808 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1810 ival = IOCPARM_IVAL(arg);
1811 arg = (caddr_t)&ival;
1815 case KDSKBMODE: /* set keyboard mode */
1816 switch (*(int *)arg) {
1818 if (sc->sc_mode != K_XLATE) {
1819 /* make lock key state and LED state match */
1820 sc->sc_state &= ~LOCK_MASK;
1821 sc->sc_state |= KBD_LED_VAL(kbd);
1826 if (sc->sc_mode != *(int *)arg) {
1827 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1828 ukbd_clear_state(kbd);
1829 sc->sc_mode = *(int *)arg;
1837 case KDGETLED: /* get keyboard LED */
1838 *(int *)arg = KBD_LED_VAL(kbd);
1841 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1842 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1844 ival = IOCPARM_IVAL(arg);
1845 arg = (caddr_t)&ival;
1849 case KDSETLED: /* set keyboard LED */
1850 /* NOTE: lock key state in "sc_state" won't be changed */
1851 if (*(int *)arg & ~LOCK_MASK)
1856 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1857 if (sc->sc_mode == K_XLATE &&
1858 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1864 if (KBD_HAS_DEVICE(kbd))
1865 ukbd_set_leds(sc, i);
1867 KBD_LED_VAL(kbd) = *(int *)arg;
1869 case KDGKBSTATE: /* get lock key state */
1870 *(int *)arg = sc->sc_state & LOCK_MASK;
1873 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1874 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1876 ival = IOCPARM_IVAL(arg);
1877 arg = (caddr_t)&ival;
1881 case KDSKBSTATE: /* set lock key state */
1882 if (*(int *)arg & ~LOCK_MASK) {
1885 sc->sc_state &= ~LOCK_MASK;
1886 sc->sc_state |= *(int *)arg;
1888 /* set LEDs and quit */
1889 return (ukbd_ioctl(kbd, KDSETLED, arg));
1891 case KDSETREPEAT: /* set keyboard repeat rate (new
1893 if (!KBD_HAS_DEVICE(kbd)) {
1896 if (((int *)arg)[1] < 0) {
1899 if (((int *)arg)[0] < 0) {
1902 if (((int *)arg)[0] < 200) /* fastest possible value */
1903 kbd->kb_delay1 = 200;
1905 kbd->kb_delay1 = ((int *)arg)[0];
1906 kbd->kb_delay2 = ((int *)arg)[1];
1910 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1911 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1913 ival = IOCPARM_IVAL(arg);
1914 arg = (caddr_t)&ival;
1918 case KDSETRAD: /* set keyboard repeat rate (old
1920 return (ukbd_set_typematic(kbd, *(int *)arg));
1922 case PIO_KEYMAP: /* set keyboard translation table */
1923 case PIO_KEYMAPENT: /* set keyboard translation table
1925 case PIO_DEADKEYMAP: /* set accent key translation table */
1929 return (genkbd_commonioctl(kbd, cmd, arg));
1936 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1939 struct ukbd_softc *sc = kbd->kb_data;
1942 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1943 * context where printf(9) can be called, which among other things
1944 * includes interrupt filters and threads with any kinds of locks
1945 * already held. For this reason it would be dangerous to acquire
1946 * the Giant here unconditionally. On the other hand we have to
1947 * have it to handle the ioctl.
1948 * So we make our best effort to auto-detect whether we can grab
1949 * the Giant or not. Blame syscons(4) for this.
1955 if(!lockowned(&kbd->kb_lock)) {
1956 return (EDEADLK); /* best I could come up with */
1961 result = ukbd_ioctl_locked(kbd, cmd, arg);
1968 /* clear the internal state of the keyboard */
1970 ukbd_clear_state(keyboard_t *kbd)
1972 struct ukbd_softc *sc = kbd->kb_data;
1974 UKBD_CTX_LOCK_ASSERT();
1976 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1977 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1979 sc->sc_composed_char = 0;
1980 #ifdef UKBD_EMULATE_ATSCANCODE
1981 sc->sc_buffered_char[0] = 0;
1982 sc->sc_buffered_char[1] = 0;
1984 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1985 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1986 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1987 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1990 /* save the internal state, not used */
1992 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1994 return (len == 0) ? 1 : -1;
1997 /* set the internal state, not used */
1999 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
2005 ukbd_poll(keyboard_t *kbd, int on)
2007 struct ukbd_softc *sc = kbd->kb_data;
2011 sc->sc_flags |= UKBD_FLAG_POLLING;
2012 sc->sc_poll_thread = curthread;
2014 sc->sc_flags &= ~UKBD_FLAG_POLLING;
2015 ukbd_start_timer(sc); /* start timer */
2022 /* local functions */
2025 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2028 DPRINTF("leds=0x%02x\n", leds);
2031 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2033 /* start transfer, if not already started */
2035 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2039 ukbd_set_typematic(keyboard_t *kbd, int code)
2041 static const int delays[] = {250, 500, 750, 1000};
2042 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2043 68, 76, 84, 92, 100, 110, 118, 126,
2044 136, 152, 168, 184, 200, 220, 236, 252,
2045 272, 304, 336, 368, 400, 440, 472, 504};
2050 kbd->kb_delay1 = delays[(code >> 5) & 3];
2051 kbd->kb_delay2 = rates[code & 0x1f];
2055 #ifdef UKBD_EMULATE_ATSCANCODE
2057 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2059 static const int scan[] = {
2065 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2075 0x151, /* PageDown */
2078 0x146, /* XXX Pause/Break */
2079 0x15b, /* Win_L(Super_L) */
2080 0x15c, /* Win_R(Super_R) */
2081 0x15d, /* Application(Menu) */
2083 /* SUN TYPE 6 USB KEYBOARD */
2084 0x168, /* Sun Type 6 Help */
2085 0x15e, /* Sun Type 6 Stop */
2087 0x15f, /* Sun Type 6 Again */
2088 0x160, /* Sun Type 6 Props */
2089 0x161, /* Sun Type 6 Undo */
2090 0x162, /* Sun Type 6 Front */
2091 0x163, /* Sun Type 6 Copy */
2092 0x164, /* Sun Type 6 Open */
2093 0x165, /* Sun Type 6 Paste */
2094 0x166, /* Sun Type 6 Find */
2095 0x167, /* Sun Type 6 Cut */
2096 0x125, /* Sun Type 6 Mute */
2098 0x11f, /* Sun Type 6 VolumeDown */
2099 0x11e, /* Sun Type 6 VolumeUp */
2100 0x120, /* Sun Type 6 PowerDown */
2102 /* Japanese 106/109 keyboard */
2103 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2104 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2105 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2106 0x79, /* Keyboard Intl' 4 (Henkan) */
2107 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2108 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2111 if ((code >= 89) && (code < (int)(89 + NELEM(scan)))) {
2112 code = scan[code - 89];
2115 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2116 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2118 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2119 code &= ~SCAN_PREFIX_SHIFT;
2121 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2123 if (code & SCAN_PREFIX) {
2124 if (code & SCAN_PREFIX_CTL) {
2126 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2127 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2128 } else if (code & SCAN_PREFIX_SHIFT) {
2130 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2131 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2133 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2134 sc->sc_buffered_char[1] = 0;
2136 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2142 #endif /* UKBD_EMULATE_ATSCANCODE */
2144 static keyboard_switch_t ukbdsw = {
2145 .probe = &ukbd__probe,
2149 .test_if = &ukbd_test_if,
2150 .enable = &ukbd_enable,
2151 .disable = &ukbd_disable,
2153 .check = &ukbd_check,
2154 .read_char = &ukbd_read_char,
2155 .check_char = &ukbd_check_char,
2156 .ioctl = &ukbd_ioctl,
2158 .clear_state = &ukbd_clear_state,
2159 .get_state = &ukbd_get_state,
2160 .set_state = &ukbd_set_state,
2161 .get_fkeystr = &genkbd_get_fkeystr,
2163 .diag = &genkbd_diag,
2166 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2169 ukbd_driver_load(module_t mod, int what, void *arg)
2173 kbd_add_driver(&ukbd_kbd_driver);
2176 kbd_delete_driver(&ukbd_kbd_driver);
2182 static devclass_t ukbd_devclass;
2184 static device_method_t ukbd_methods[] = {
2185 DEVMETHOD(device_probe, ukbd_probe),
2186 DEVMETHOD(device_attach, ukbd_attach),
2187 DEVMETHOD(device_detach, ukbd_detach),
2188 DEVMETHOD(device_resume, ukbd_resume),
2192 static driver_t ukbd_driver = {
2194 .methods = ukbd_methods,
2195 .size = sizeof(struct ukbd_softc),
2198 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, NULL);
2199 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2200 MODULE_VERSION(ukbd, 1);