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;
143 fkeytab_t sc_fkeymap[UKBD_NFKEY];
144 struct hid_location sc_loc_apple_eject;
145 struct hid_location sc_loc_apple_fn;
146 struct hid_location sc_loc_ctrl_l;
147 struct hid_location sc_loc_ctrl_r;
148 struct hid_location sc_loc_shift_l;
149 struct hid_location sc_loc_shift_r;
150 struct hid_location sc_loc_alt_l;
151 struct hid_location sc_loc_alt_r;
152 struct hid_location sc_loc_win_l;
153 struct hid_location sc_loc_win_r;
154 struct hid_location sc_loc_events;
155 struct hid_location sc_loc_numlock;
156 struct hid_location sc_loc_capslock;
157 struct hid_location sc_loc_scrolllock;
158 struct usb_callout sc_callout;
159 struct ukbd_data sc_ndata;
160 struct ukbd_data sc_odata;
162 struct thread *sc_poll_thread;
163 struct usb_device *sc_udev;
164 struct usb_interface *sc_iface;
165 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
167 uint32_t sc_ntime[UKBD_NKEYCODE];
168 uint32_t sc_otime[UKBD_NKEYCODE];
169 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
171 uint32_t sc_composed_char; /* composed char code, if non-zero */
172 #ifdef UKBD_EMULATE_ATSCANCODE
173 uint32_t sc_buffered_char[2];
175 uint32_t sc_flags; /* flags */
176 #define UKBD_FLAG_COMPOSE 0x00000001
177 #define UKBD_FLAG_POLLING 0x00000002
178 #define UKBD_FLAG_SET_LEDS 0x00000004
179 #define UKBD_FLAG_ATTACHED 0x00000010
180 #define UKBD_FLAG_GONE 0x00000020
182 #define UKBD_FLAG_HID_MASK 0x003fffc0
183 #define UKBD_FLAG_APPLE_EJECT 0x00000040
184 #define UKBD_FLAG_APPLE_FN 0x00000080
185 #define UKBD_FLAG_APPLE_SWAP 0x00000100
186 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
187 #define UKBD_FLAG_CTRL_L 0x00000400
188 #define UKBD_FLAG_CTRL_R 0x00000800
189 #define UKBD_FLAG_SHIFT_L 0x00001000
190 #define UKBD_FLAG_SHIFT_R 0x00002000
191 #define UKBD_FLAG_ALT_L 0x00004000
192 #define UKBD_FLAG_ALT_R 0x00008000
193 #define UKBD_FLAG_WIN_L 0x00010000
194 #define UKBD_FLAG_WIN_R 0x00020000
195 #define UKBD_FLAG_EVENTS 0x00040000
196 #define UKBD_FLAG_NUMLOCK 0x00080000
197 #define UKBD_FLAG_CAPSLOCK 0x00100000
198 #define UKBD_FLAG_SCROLLLOCK 0x00200000
200 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
201 int sc_state; /* shift/lock key state */
202 int sc_accents; /* accent key index (> 0) */
207 uint16_t sc_inputhead;
208 uint16_t sc_inputtail;
209 uint16_t sc_modifiers;
211 uint8_t sc_leds; /* store for async led requests */
212 uint8_t sc_iface_index;
214 uint8_t sc_id_apple_eject;
215 uint8_t sc_id_apple_fn;
216 uint8_t sc_id_ctrl_l;
217 uint8_t sc_id_ctrl_r;
218 uint8_t sc_id_shift_l;
219 uint8_t sc_id_shift_r;
225 uint8_t sc_id_numlock;
226 uint8_t sc_id_capslock;
227 uint8_t sc_id_scrolllock;
228 uint8_t sc_id_events;
231 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
234 #define KEY_ERROR 0x01
237 #define KEY_RELEASE 0x400
238 #define KEY_INDEX(c) ((c) & 0xFF)
241 #define SCAN_RELEASE 0x80
242 #define SCAN_PREFIX_E0 0x100
243 #define SCAN_PREFIX_E1 0x200
244 #define SCAN_PREFIX_CTL 0x400
245 #define SCAN_PREFIX_SHIFT 0x800
246 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
247 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
248 #define SCAN_CHAR(c) ((c) & 0x7f)
250 #define UKBD_LOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_EXCLUSIVE)
251 #define UKBD_UNLOCK(sc) lockmgr(&(sc)->sc_kbd.kb_lock, LK_RELEASE)
256 * Assert that the lock is held in all contexts
257 * where the code can be executed.
259 #define UKBD_LOCK_ASSERT()
262 * Assert that the lock is held in the contexts
263 * where it really has to be so.
265 #define UKBD_CTX_LOCK_ASSERT()
268 #define UKBD_LOCK_ASSERT() (void)0
269 #define UKBD_CTX_LOCK_ASSERT() (void)0
277 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
278 {MOD_CONTROL_L, 0xe0},
279 {MOD_CONTROL_R, 0xe4},
288 #define NN 0 /* no translation */
290 * Translate USB keycodes to AT keyboard scancodes.
293 * FIXME: Mac USB keyboard generates:
294 * 0x53: keypad NumLock/Clear
301 static const uint8_t ukbd_trtab[256] = {
302 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
303 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
304 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
305 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
306 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
307 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
308 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
309 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
310 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
311 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
312 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
313 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
314 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
315 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
316 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
317 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
318 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
319 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
320 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
330 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
336 static const uint8_t ukbd_boot_desc[] = {
337 0x05, 0x01, 0x09, 0x06, 0xa1,
338 0x01, 0x05, 0x07, 0x19, 0xe0,
339 0x29, 0xe7, 0x15, 0x00, 0x25,
340 0x01, 0x75, 0x01, 0x95, 0x08,
341 0x81, 0x02, 0x95, 0x01, 0x75,
342 0x08, 0x81, 0x01, 0x95, 0x03,
343 0x75, 0x01, 0x05, 0x08, 0x19,
344 0x01, 0x29, 0x03, 0x91, 0x02,
345 0x95, 0x05, 0x75, 0x01, 0x91,
346 0x01, 0x95, 0x06, 0x75, 0x08,
347 0x15, 0x00, 0x26, 0xff, 0x00,
348 0x05, 0x07, 0x19, 0x00, 0x2a,
349 0xff, 0x00, 0x81, 0x00, 0xc0
353 static void ukbd_timeout(void *);
354 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
355 static int ukbd_set_typematic(keyboard_t *, int);
356 #ifdef UKBD_EMULATE_ATSCANCODE
357 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
359 static uint32_t ukbd_read_char(keyboard_t *, int);
360 static void ukbd_clear_state(keyboard_t *);
361 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
362 static int ukbd_enable(keyboard_t *);
363 static int ukbd_disable(keyboard_t *);
364 static void ukbd_interrupt(struct ukbd_softc *);
365 static void ukbd_event_keyinput(struct ukbd_softc *);
367 static device_probe_t ukbd_probe;
368 static device_attach_t ukbd_attach;
369 static device_detach_t ukbd_detach;
370 static device_resume_t ukbd_resume;
373 ukbd_any_key_pressed(struct ukbd_softc *sc)
378 for (j = i = 0; i < UKBD_NKEYCODE; i++)
379 j |= sc->sc_odata.keycode[i];
385 ukbd_start_timer(struct ukbd_softc *sc)
387 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
388 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
392 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
395 UKBD_CTX_LOCK_ASSERT();
397 DPRINTF("0x%02x (%d) %s\n", key, key,
398 (key & KEY_RELEASE) ? "released" : "pressed");
400 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
401 sc->sc_input[sc->sc_inputtail] = key;
403 ++(sc->sc_inputtail);
404 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
405 sc->sc_inputtail = 0;
408 DPRINTF("input buffer is full\n");
413 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
416 UKBD_CTX_LOCK_ASSERT();
417 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
418 ("ukbd_do_poll called when not polling\n"));
419 DPRINTFN(2, "polling\n");
421 if (!kdb_active && !SCHEDULER_STOPPED()) {
423 * In this context the kernel is polling for input,
424 * but the USB subsystem works in normal interrupt-driven
425 * mode, so we just wait on the USB threads to do the job.
426 * Note that we currently hold the Giant, but it's also used
427 * as the transfer mtx, so we must release it while waiting.
429 while (sc->sc_inputs == 0) {
431 * Give USB threads a chance to run. Note that
432 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
442 while (sc->sc_inputs == 0) {
444 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
446 /* Delay-optimised support for repetition of keys */
447 if (ukbd_any_key_pressed(sc)) {
448 /* a key is pressed - need timekeeping */
451 /* 1 millisecond has passed */
463 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
467 UKBD_CTX_LOCK_ASSERT();
469 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
470 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
471 ("not polling in kdb or panic\n"));
474 if (sc->sc_inputs == 0 &&
475 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
476 /* start transfer, if not already started */
477 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
480 if (sc->sc_flags & UKBD_FLAG_POLLING)
481 ukbd_do_poll(sc, wait);
483 if (sc->sc_inputs == 0) {
486 c = sc->sc_input[sc->sc_inputhead];
488 ++(sc->sc_inputhead);
489 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
490 sc->sc_inputhead = 0;
497 ukbd_interrupt(struct ukbd_softc *sc)
501 uint32_t now = sc->sc_time_ms;
507 UKBD_CTX_LOCK_ASSERT();
509 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
512 n_mod = sc->sc_ndata.modifiers;
513 o_mod = sc->sc_odata.modifiers;
514 if (n_mod != o_mod) {
515 for (i = 0; i < UKBD_NMOD; i++) {
516 if ((n_mod & ukbd_mods[i].mask) !=
517 (o_mod & ukbd_mods[i].mask)) {
518 ukbd_put_key(sc, ukbd_mods[i].key |
519 ((n_mod & ukbd_mods[i].mask) ?
520 KEY_PRESS : KEY_RELEASE));
524 /* Check for released keys. */
525 for (i = 0; i < UKBD_NKEYCODE; i++) {
526 key = sc->sc_odata.keycode[i];
530 for (j = 0; j < UKBD_NKEYCODE; j++) {
531 if (sc->sc_ndata.keycode[j] == 0) {
534 if (key == sc->sc_ndata.keycode[j]) {
538 ukbd_put_key(sc, key | KEY_RELEASE);
542 /* Check for pressed keys. */
543 for (i = 0; i < UKBD_NKEYCODE; i++) {
544 key = sc->sc_ndata.keycode[i];
548 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
549 for (j = 0; j < UKBD_NKEYCODE; j++) {
550 if (sc->sc_odata.keycode[j] == 0) {
553 if (key == sc->sc_odata.keycode[j]) {
555 /* key is still pressed */
557 sc->sc_ntime[i] = sc->sc_otime[j];
558 dtime = (sc->sc_otime[j] - now);
560 if (!(dtime & 0x80000000)) {
561 /* time has not elapsed */
564 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
568 ukbd_put_key(sc, key | KEY_PRESS);
571 * If any other key is presently down, force its repeat to be
572 * well in the future (100s). This makes the last key to be
573 * pressed do the autorepeat.
575 for (j = 0; j != UKBD_NKEYCODE; j++) {
577 sc->sc_ntime[j] = now + (100 * 1000);
582 sc->sc_odata = sc->sc_ndata;
584 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
586 ukbd_event_keyinput(sc);
590 ukbd_event_keyinput(struct ukbd_softc *sc)
594 UKBD_CTX_LOCK_ASSERT();
596 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
599 if (sc->sc_inputs == 0)
602 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
603 KBD_IS_BUSY(&sc->sc_kbd)) {
604 /* let the callback function process the input */
605 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
606 sc->sc_kbd.kb_callback.kc_arg);
608 /* read and discard the input, no one is waiting for it */
610 c = ukbd_read_char(&sc->sc_kbd, 0);
611 } while (c != NOKEY);
616 ukbd_timeout(void *arg)
618 struct ukbd_softc *sc = arg;
622 sc->sc_time_ms += 25; /* milliseconds */
626 /* Make sure any leftover key events gets read out */
627 ukbd_event_keyinput(sc);
629 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
630 ukbd_start_timer(sc);
632 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
637 ukbd_apple_fn(uint8_t keycode) {
639 case 0x28: return 0x49; /* RETURN -> INSERT */
640 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
641 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
642 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
643 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
644 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
645 default: return keycode;
650 ukbd_apple_swap(uint8_t keycode) {
652 case 0x35: return 0x64;
653 case 0x64: return 0x35;
654 default: return keycode;
659 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
661 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
662 struct usb_page_cache *pc;
670 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
671 pc = usbd_xfer_get_frame(xfer, 0);
673 switch (USB_GET_STATE(xfer)) {
674 case USB_ST_TRANSFERRED:
675 DPRINTF("actlen=%d bytes\n", len);
678 DPRINTF("zero length data\n");
682 if (sc->sc_kbd_id != 0) {
683 /* check and remove HID ID byte */
684 usbd_copy_out(pc, 0, &id, 1);
688 DPRINTF("zero length data\n");
696 if (len > UKBD_BUFFER_SIZE)
697 len = UKBD_BUFFER_SIZE;
700 usbd_copy_out(pc, offset, sc->sc_buffer, len);
702 /* clear temporary storage */
703 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
705 /* scan through HID data */
706 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
707 (id == sc->sc_id_apple_eject)) {
708 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
709 sc->sc_modifiers |= MOD_EJECT;
711 sc->sc_modifiers &= ~MOD_EJECT;
713 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
714 (id == sc->sc_id_apple_fn)) {
715 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
716 sc->sc_modifiers |= MOD_FN;
718 sc->sc_modifiers &= ~MOD_FN;
720 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
721 (id == sc->sc_id_ctrl_l)) {
722 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
723 sc-> sc_modifiers |= MOD_CONTROL_L;
725 sc-> sc_modifiers &= ~MOD_CONTROL_L;
727 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
728 (id == sc->sc_id_ctrl_r)) {
729 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
730 sc->sc_modifiers |= MOD_CONTROL_R;
732 sc->sc_modifiers &= ~MOD_CONTROL_R;
734 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
735 (id == sc->sc_id_shift_l)) {
736 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
737 sc->sc_modifiers |= MOD_SHIFT_L;
739 sc->sc_modifiers &= ~MOD_SHIFT_L;
741 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
742 (id == sc->sc_id_shift_r)) {
743 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
744 sc->sc_modifiers |= MOD_SHIFT_R;
746 sc->sc_modifiers &= ~MOD_SHIFT_R;
748 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
749 (id == sc->sc_id_alt_l)) {
750 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
751 sc->sc_modifiers |= MOD_ALT_L;
753 sc->sc_modifiers &= ~MOD_ALT_L;
755 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
756 (id == sc->sc_id_alt_r)) {
757 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
758 sc->sc_modifiers |= MOD_ALT_R;
760 sc->sc_modifiers &= ~MOD_ALT_R;
762 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
763 (id == sc->sc_id_win_l)) {
764 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
765 sc->sc_modifiers |= MOD_WIN_L;
767 sc->sc_modifiers &= ~MOD_WIN_L;
769 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
770 (id == sc->sc_id_win_r)) {
771 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
772 sc->sc_modifiers |= MOD_WIN_R;
774 sc->sc_modifiers &= ~MOD_WIN_R;
777 sc->sc_ndata.modifiers = sc->sc_modifiers;
779 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
780 (id == sc->sc_id_events)) {
781 i = sc->sc_loc_events.count;
782 if (i > UKBD_NKEYCODE)
787 sc->sc_ndata.keycode[i] =
788 hid_get_data(sc->sc_buffer + i, len - i,
794 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
795 for (i = 0; i < UKBD_NKEYCODE; i++) {
796 if (sc->sc_ndata.keycode[i]) {
797 DPRINTF("[%d] = 0x%02x\n",
798 (int)i, (int)sc->sc_ndata.keycode[i]);
802 if (sc->sc_modifiers & MOD_FN) {
803 for (i = 0; i < UKBD_NKEYCODE; i++) {
804 sc->sc_ndata.keycode[i] =
805 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
809 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
810 for (i = 0; i < UKBD_NKEYCODE; i++) {
811 sc->sc_ndata.keycode[i] =
812 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
818 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
819 if (ukbd_any_key_pressed(sc)) {
820 ukbd_start_timer(sc);
826 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
827 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
828 usbd_transfer_submit(xfer);
830 DPRINTF("input queue is full!\n");
835 DPRINTF("error=%s\n", usbd_errstr(error));
837 if (error != USB_ERR_CANCELLED) {
838 /* try to clear stall first */
839 usbd_xfer_set_stall(xfer);
847 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
849 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
850 struct usb_device_request req;
851 struct usb_page_cache *pc;
863 switch (USB_GET_STATE(xfer)) {
864 case USB_ST_TRANSFERRED:
866 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
868 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
870 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
871 req.bRequest = UR_SET_REPORT;
872 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
873 req.wIndex[0] = sc->sc_iface_no;
877 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
882 /* Assumption: All led bits must be in the same ID. */
884 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
885 if (sc->sc_leds & NLKED) {
886 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
887 &sc->sc_loc_numlock, 1);
889 id = sc->sc_id_numlock;
893 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
894 if (sc->sc_leds & SLKED) {
895 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
896 &sc->sc_loc_scrolllock, 1);
898 id = sc->sc_id_scrolllock;
902 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
903 if (sc->sc_leds & CLKED) {
904 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
905 &sc->sc_loc_capslock, 1);
907 id = sc->sc_id_capslock;
911 /* if no leds, nothing to do */
915 /* range check output report length */
916 len = sc->sc_led_size;
917 if (len > (UKBD_BUFFER_SIZE - 1))
918 len = (UKBD_BUFFER_SIZE - 1);
920 /* check if we need to prefix an ID byte */
921 sc->sc_buffer[0] = id;
923 pc = usbd_xfer_get_frame(xfer, 1);
926 usbd_copy_in(pc, 0, sc->sc_buffer, len);
928 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
930 req.wLength[0] = len;
931 usbd_xfer_set_frame_len(xfer, 1, len);
933 DPRINTF("len=%d, id=%d\n", len, id);
935 /* setup control request last */
936 pc = usbd_xfer_get_frame(xfer, 0);
937 usbd_copy_in(pc, 0, &req, sizeof(req));
938 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
940 /* start data transfer */
941 usbd_xfer_set_frames(xfer, 2);
942 usbd_transfer_submit(xfer);
946 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
951 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
954 .type = UE_INTERRUPT,
955 .endpoint = UE_ADDR_ANY,
956 .direction = UE_DIR_IN,
957 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
958 .bufsize = 0, /* use wMaxPacketSize */
959 .callback = &ukbd_intr_callback,
964 .endpoint = 0x00, /* Control pipe */
965 .direction = UE_DIR_ANY,
966 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
967 .callback = &ukbd_set_leds_callback,
968 .timeout = 1000, /* 1 second */
972 /* A match on these entries will load ukbd */
973 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
974 {USB_IFACE_CLASS(UICLASS_HID),
975 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
976 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
980 ukbd_probe(device_t dev)
982 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
983 struct usb_attach_arg *uaa = device_get_ivars(dev);
994 if (uaa->usb_mode != USB_MODE_HOST) {
998 if (uaa->info.bInterfaceClass != UICLASS_HID)
1001 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1004 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1005 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1006 return (BUS_PROBE_DEFAULT);
1008 error = usbd_req_get_hid_desc(uaa->device, NULL,
1009 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1014 if (hid_is_keyboard(d_ptr, d_len)) {
1015 if (hid_is_mouse(d_ptr, d_len)) {
1017 * NOTE: We currently don't support USB mouse
1018 * and USB keyboard on the same USB endpoint.
1019 * Let "ums" driver win.
1023 error = BUS_PROBE_DEFAULT;
1028 kfree(d_ptr, M_TEMP);
1033 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1037 /* reset detected bits */
1038 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1040 /* check if there is an ID byte */
1041 sc->sc_kbd_size = hid_report_size(ptr, len,
1042 hid_input, &sc->sc_kbd_id);
1044 /* investigate if this is an Apple Keyboard */
1045 if (hid_locate(ptr, len,
1046 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1047 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1048 &sc->sc_id_apple_eject)) {
1049 if (flags & HIO_VARIABLE)
1050 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1051 UKBD_FLAG_APPLE_SWAP;
1052 DPRINTFN(1, "Found Apple eject-key\n");
1054 if (hid_locate(ptr, len,
1055 HID_USAGE2(0xFFFF, 0x0003),
1056 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1057 &sc->sc_id_apple_fn)) {
1058 if (flags & HIO_VARIABLE)
1059 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1060 DPRINTFN(1, "Found Apple FN-key\n");
1062 /* figure out some keys */
1063 if (hid_locate(ptr, len,
1064 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1065 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1066 &sc->sc_id_ctrl_l)) {
1067 if (flags & HIO_VARIABLE)
1068 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1069 DPRINTFN(1, "Found left control\n");
1071 if (hid_locate(ptr, len,
1072 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1073 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1074 &sc->sc_id_ctrl_r)) {
1075 if (flags & HIO_VARIABLE)
1076 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1077 DPRINTFN(1, "Found right control\n");
1079 if (hid_locate(ptr, len,
1080 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1081 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1082 &sc->sc_id_shift_l)) {
1083 if (flags & HIO_VARIABLE)
1084 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1085 DPRINTFN(1, "Found left shift\n");
1087 if (hid_locate(ptr, len,
1088 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1089 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1090 &sc->sc_id_shift_r)) {
1091 if (flags & HIO_VARIABLE)
1092 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1093 DPRINTFN(1, "Found right shift\n");
1095 if (hid_locate(ptr, len,
1096 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1097 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1098 &sc->sc_id_alt_l)) {
1099 if (flags & HIO_VARIABLE)
1100 sc->sc_flags |= UKBD_FLAG_ALT_L;
1101 DPRINTFN(1, "Found left alt\n");
1103 if (hid_locate(ptr, len,
1104 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1105 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1106 &sc->sc_id_alt_r)) {
1107 if (flags & HIO_VARIABLE)
1108 sc->sc_flags |= UKBD_FLAG_ALT_R;
1109 DPRINTFN(1, "Found right alt\n");
1111 if (hid_locate(ptr, len,
1112 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1113 hid_input, 0, &sc->sc_loc_win_l, &flags,
1114 &sc->sc_id_win_l)) {
1115 if (flags & HIO_VARIABLE)
1116 sc->sc_flags |= UKBD_FLAG_WIN_L;
1117 DPRINTFN(1, "Found left GUI\n");
1119 if (hid_locate(ptr, len,
1120 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1121 hid_input, 0, &sc->sc_loc_win_r, &flags,
1122 &sc->sc_id_win_r)) {
1123 if (flags & HIO_VARIABLE)
1124 sc->sc_flags |= UKBD_FLAG_WIN_R;
1125 DPRINTFN(1, "Found right GUI\n");
1127 /* figure out event buffer */
1128 if (hid_locate(ptr, len,
1129 HID_USAGE2(HUP_KEYBOARD, 0x00),
1130 hid_input, 0, &sc->sc_loc_events, &flags,
1131 &sc->sc_id_events)) {
1132 if (flags & HIO_VARIABLE) {
1133 DPRINTFN(1, "Ignoring keyboard event control\n");
1135 sc->sc_flags |= UKBD_FLAG_EVENTS;
1136 DPRINTFN(1, "Found keyboard event array\n");
1140 /* figure out leds on keyboard */
1141 sc->sc_led_size = hid_report_size(ptr, len,
1144 if (hid_locate(ptr, len,
1145 HID_USAGE2(HUP_LEDS, 0x01),
1146 hid_output, 0, &sc->sc_loc_numlock, &flags,
1147 &sc->sc_id_numlock)) {
1148 if (flags & HIO_VARIABLE)
1149 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1150 DPRINTFN(1, "Found keyboard numlock\n");
1152 if (hid_locate(ptr, len,
1153 HID_USAGE2(HUP_LEDS, 0x02),
1154 hid_output, 0, &sc->sc_loc_capslock, &flags,
1155 &sc->sc_id_capslock)) {
1156 if (flags & HIO_VARIABLE)
1157 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1158 DPRINTFN(1, "Found keyboard capslock\n");
1160 if (hid_locate(ptr, len,
1161 HID_USAGE2(HUP_LEDS, 0x03),
1162 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1163 &sc->sc_id_scrolllock)) {
1164 if (flags & HIO_VARIABLE)
1165 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1166 DPRINTFN(1, "Found keyboard scrolllock\n");
1171 ukbd_attach(device_t dev)
1173 struct ukbd_softc *sc = device_get_softc(dev);
1174 struct usb_attach_arg *uaa = device_get_ivars(dev);
1175 int32_t unit = device_get_unit(dev);
1176 keyboard_t *kbd = &sc->sc_kbd;
1177 void *hid_ptr = NULL;
1186 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER,
1187 unit, 0, KB_PRI_USB, 0, 0);
1189 kbd->kb_data = (void *)sc;
1191 device_set_usb_desc(dev);
1193 sc->sc_udev = uaa->device;
1194 sc->sc_iface = uaa->iface;
1195 sc->sc_iface_index = uaa->info.bIfaceIndex;
1196 sc->sc_iface_no = uaa->info.bIfaceNum;
1197 sc->sc_mode = K_XLATE;
1199 usb_callout_init_mtx(&sc->sc_callout, &kbd->kb_lock, 0);
1201 err = usbd_transfer_setup(uaa->device,
1202 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1203 UKBD_N_TRANSFER, sc, &sc->sc_kbd.kb_lock);
1206 DPRINTF("error=%s\n", usbd_errstr(err));
1209 /* setup default keyboard maps */
1211 sc->sc_keymap = key_map;
1212 sc->sc_accmap = accent_map;
1213 for (n = 0; n < UKBD_NFKEY; n++) {
1214 sc->sc_fkeymap[n] = fkey_tab[n];
1217 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1218 sc->sc_fkeymap, UKBD_NFKEY);
1220 KBD_FOUND_DEVICE(kbd);
1222 ukbd_clear_state(kbd);
1225 * FIXME: set the initial value for lock keys in "sc_state"
1226 * according to the BIOS data?
1228 KBD_PROBE_DONE(kbd);
1230 /* get HID descriptor */
1231 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1232 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1235 DPRINTF("Parsing HID descriptor of %d bytes\n",
1238 ukbd_parse_hid(sc, hid_ptr, hid_len);
1240 kfree(hid_ptr, M_TEMP);
1243 /* check if we should use the boot protocol */
1244 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1245 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1247 DPRINTF("Forcing boot protocol\n");
1249 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1250 sc->sc_iface_index, 0);
1253 DPRINTF("Set protocol error=%s (ignored)\n",
1257 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1260 /* ignore if SETIDLE fails, hence it is not crucial */
1261 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1263 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1267 if (kbd_register(kbd) < 0) {
1270 KBD_CONFIG_DONE(kbd);
1274 #ifdef KBD_INSTALL_CDEV
1275 if (kbd_attach(kbd)) {
1279 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1282 genkbd_diag(kbd, bootverbose);
1286 /* check for polling rate override */
1287 rate = ukbd_pollrate;
1294 /* set new polling interval in ms */
1295 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1298 /* start the keyboard */
1299 /* XXX mp locking added */
1301 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1304 return (0); /* success */
1307 return (ENXIO); /* error */
1311 ukbd_detach(device_t dev)
1313 struct ukbd_softc *sc = device_get_softc(dev);
1321 sc->sc_flags |= UKBD_FLAG_GONE;
1323 usb_callout_stop(&sc->sc_callout);
1325 /* kill any stuck keys */
1326 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1327 /* stop receiving events from the USB keyboard */
1328 usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1330 /* release all leftover keys, if any */
1331 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1333 /* process releasing of all keys */
1337 ukbd_disable(&sc->sc_kbd);
1340 * XXX make sure this is in the correct place here,
1341 * it was taken from below the second if()
1343 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1344 usb_callout_drain(&sc->sc_callout);
1346 #ifdef KBD_INSTALL_CDEV
1347 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1348 error = kbd_detach(&sc->sc_kbd);
1350 /* usb attach cannot return an error */
1351 device_printf(dev, "WARNING: kbd_detach() "
1352 "returned non-zero! (ignored)\n");
1356 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1358 * kbd_unregister requires kb_lock to be held
1359 * but lockuninits it then
1362 error = kbd_unregister(&sc->sc_kbd);
1364 /* usb attach cannot return an error */
1365 device_printf(dev, "WARNING: kbd_unregister() "
1366 "returned non-zero! (ignored)\n");
1369 sc->sc_kbd.kb_flags = 0;
1373 DPRINTF("%s: disconnected\n",
1374 device_get_nameunit(dev));
1380 ukbd_resume(device_t dev)
1382 struct ukbd_softc *sc = device_get_softc(dev);
1386 ukbd_clear_state(&sc->sc_kbd);
1391 /* early keyboard probe, not supported */
1393 ukbd_configure(int flags)
1398 /* detect a keyboard, not used */
1400 ukbd__probe(int unit, void *arg, int flags)
1405 /* reset and initialize the device, not used */
1407 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1412 /* test the interface to the device, not used */
1414 ukbd_test_if(keyboard_t *kbd)
1419 /* finish using this keyboard, not used */
1421 ukbd_term(keyboard_t *kbd)
1426 /* keyboard interrupt routine, not used */
1428 ukbd_intr(keyboard_t *kbd, void *arg)
1433 /* lock the access to the keyboard, not used */
1435 ukbd_lock(keyboard_t *kbd, int lock)
1441 * Enable the access to the device; until this function is called,
1442 * the client cannot read from the keyboard.
1445 ukbd_enable(keyboard_t *kbd)
1454 /* disallow the access to the device */
1456 ukbd_disable(keyboard_t *kbd)
1459 KBD_DEACTIVATE(kbd);
1465 /* check if data is waiting */
1466 /* Currently unused. */
1468 ukbd_check(keyboard_t *kbd)
1470 struct ukbd_softc *sc = kbd->kb_data;
1472 UKBD_CTX_LOCK_ASSERT();
1474 if (!KBD_IS_ACTIVE(kbd))
1477 if (sc->sc_flags & UKBD_FLAG_POLLING)
1478 ukbd_do_poll(sc, 0);
1480 #ifdef UKBD_EMULATE_ATSCANCODE
1481 if (sc->sc_buffered_char[0]) {
1485 if (sc->sc_inputs > 0) {
1491 /* check if char is waiting */
1493 ukbd_check_char_locked(keyboard_t *kbd)
1495 struct ukbd_softc *sc = kbd->kb_data;
1497 UKBD_CTX_LOCK_ASSERT();
1499 if (!KBD_IS_ACTIVE(kbd))
1502 if ((sc->sc_composed_char > 0) &&
1503 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1506 return (ukbd_check(kbd));
1510 ukbd_check_char(keyboard_t *kbd)
1514 struct ukbd_softc *sc = kbd->kb_data;
1518 result = ukbd_check_char_locked(kbd);
1526 /* read one byte from the keyboard if it's allowed */
1527 /* Currently unused. */
1529 ukbd_read(keyboard_t *kbd, int wait)
1531 struct ukbd_softc *sc = kbd->kb_data;
1533 #ifdef UKBD_EMULATE_ATSCANCODE
1539 UKBD_CTX_LOCK_ASSERT();
1541 if (!KBD_IS_ACTIVE(kbd))
1544 #ifdef UKBD_EMULATE_ATSCANCODE
1545 if (sc->sc_buffered_char[0]) {
1546 scancode = sc->sc_buffered_char[0];
1547 if (scancode & SCAN_PREFIX) {
1548 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1549 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1551 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1552 sc->sc_buffered_char[1] = 0;
1555 #endif /* UKBD_EMULATE_ATSCANCODE */
1558 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1559 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1564 #ifdef UKBD_EMULATE_ATSCANCODE
1565 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1566 if (keycode == NN) {
1569 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1570 (usbcode & KEY_RELEASE)));
1571 #else /* !UKBD_EMULATE_ATSCANCODE */
1573 #endif /* UKBD_EMULATE_ATSCANCODE */
1576 /* read char from the keyboard */
1578 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1580 struct ukbd_softc *sc = kbd->kb_data;
1584 #ifdef UKBD_EMULATE_ATSCANCODE
1588 UKBD_CTX_LOCK_ASSERT();
1590 if (!KBD_IS_ACTIVE(kbd))
1595 /* do we have a composed char to return ? */
1597 if ((sc->sc_composed_char > 0) &&
1598 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1600 action = sc->sc_composed_char;
1601 sc->sc_composed_char = 0;
1603 if (action > 0xFF) {
1608 #ifdef UKBD_EMULATE_ATSCANCODE
1610 /* do we have a pending raw scan code? */
1612 if (sc->sc_mode == K_RAW) {
1613 scancode = sc->sc_buffered_char[0];
1615 if (scancode & SCAN_PREFIX) {
1616 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1617 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1619 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1620 sc->sc_buffered_char[1] = 0;
1624 #endif /* UKBD_EMULATE_ATSCANCODE */
1626 /* see if there is something in the keyboard port */
1628 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1629 if (usbcode == -1) {
1634 #ifdef UKBD_EMULATE_ATSCANCODE
1635 /* USB key index -> key code -> AT scan code */
1636 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1637 if (keycode == NN) {
1640 /* return an AT scan code for the K_RAW mode */
1641 if (sc->sc_mode == K_RAW) {
1642 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1643 (usbcode & KEY_RELEASE)));
1645 #else /* !UKBD_EMULATE_ATSCANCODE */
1647 /* return the byte as is for the K_RAW mode */
1648 if (sc->sc_mode == K_RAW) {
1651 /* USB key index -> key code */
1652 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1653 if (keycode == NN) {
1656 #endif /* UKBD_EMULATE_ATSCANCODE */
1659 case 0x38: /* left alt (compose key) */
1660 if (usbcode & KEY_RELEASE) {
1661 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1662 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1664 if (sc->sc_composed_char > 0xFF) {
1665 sc->sc_composed_char = 0;
1669 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1670 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1671 sc->sc_composed_char = 0;
1675 /* XXX: I don't like these... */
1676 case 0x5c: /* print screen */
1677 if (sc->sc_flags & ALTS) {
1678 keycode = 0x54; /* sysrq */
1681 case 0x68: /* pause/break */
1682 if (sc->sc_flags & CTLS) {
1683 keycode = 0x6c; /* break */
1688 /* return the key code in the K_CODE mode */
1689 if (usbcode & KEY_RELEASE) {
1690 keycode |= SCAN_RELEASE;
1692 if (sc->sc_mode == K_CODE) {
1695 /* compose a character code */
1696 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1698 /* key pressed, process it */
1701 case 0x49: /* keypad 7,8,9 */
1702 sc->sc_composed_char *= 10;
1703 sc->sc_composed_char += keycode - 0x40;
1704 goto check_composed;
1708 case 0x4D: /* keypad 4,5,6 */
1709 sc->sc_composed_char *= 10;
1710 sc->sc_composed_char += keycode - 0x47;
1711 goto check_composed;
1715 case 0x51: /* keypad 1,2,3 */
1716 sc->sc_composed_char *= 10;
1717 sc->sc_composed_char += keycode - 0x4E;
1718 goto check_composed;
1720 case 0x52: /* keypad 0 */
1721 sc->sc_composed_char *= 10;
1722 goto check_composed;
1724 /* key released, no interest here */
1725 case SCAN_RELEASE | 0x47:
1726 case SCAN_RELEASE | 0x48:
1727 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1728 case SCAN_RELEASE | 0x4B:
1729 case SCAN_RELEASE | 0x4C:
1730 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1731 case SCAN_RELEASE | 0x4F:
1732 case SCAN_RELEASE | 0x50:
1733 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1734 case SCAN_RELEASE | 0x52: /* keypad 0 */
1737 case 0x38: /* left alt key */
1741 if (sc->sc_composed_char > 0) {
1742 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1743 sc->sc_composed_char = 0;
1749 /* keycode to key action */
1750 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1751 (keycode & SCAN_RELEASE),
1752 &sc->sc_state, &sc->sc_accents);
1753 if (action == NOKEY) {
1760 if (sc->sc_composed_char <= 0xFF) {
1767 /* Currently wait is always false. */
1769 ukbd_read_char(keyboard_t *kbd, int wait)
1773 struct ukbd_softc *sc = kbd->kb_data;
1777 keycode = ukbd_read_char_locked(kbd, wait);
1785 /* some useful control functions */
1787 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1789 struct ukbd_softc *sc = kbd->kb_data;
1792 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1793 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1800 case KDGKBMODE: /* get keyboard mode */
1801 *(int *)arg = sc->sc_mode;
1804 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1805 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1807 ival = IOCPARM_IVAL(arg);
1808 arg = (caddr_t)&ival;
1812 case KDSKBMODE: /* set keyboard mode */
1813 switch (*(int *)arg) {
1815 if (sc->sc_mode != K_XLATE) {
1816 /* make lock key state and LED state match */
1817 sc->sc_state &= ~LOCK_MASK;
1818 sc->sc_state |= KBD_LED_VAL(kbd);
1823 if (sc->sc_mode != *(int *)arg) {
1824 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1825 ukbd_clear_state(kbd);
1826 sc->sc_mode = *(int *)arg;
1834 case KDGETLED: /* get keyboard LED */
1835 *(int *)arg = KBD_LED_VAL(kbd);
1838 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1839 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1841 ival = IOCPARM_IVAL(arg);
1842 arg = (caddr_t)&ival;
1846 case KDSETLED: /* set keyboard LED */
1847 /* NOTE: lock key state in "sc_state" won't be changed */
1848 if (*(int *)arg & ~LOCK_MASK)
1853 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1854 if (sc->sc_mode == K_XLATE &&
1855 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1861 if (KBD_HAS_DEVICE(kbd))
1862 ukbd_set_leds(sc, i);
1864 KBD_LED_VAL(kbd) = *(int *)arg;
1866 case KDGKBSTATE: /* get lock key state */
1867 *(int *)arg = sc->sc_state & LOCK_MASK;
1870 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1871 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1873 ival = IOCPARM_IVAL(arg);
1874 arg = (caddr_t)&ival;
1878 case KDSKBSTATE: /* set lock key state */
1879 if (*(int *)arg & ~LOCK_MASK) {
1882 sc->sc_state &= ~LOCK_MASK;
1883 sc->sc_state |= *(int *)arg;
1885 /* set LEDs and quit */
1886 return (ukbd_ioctl(kbd, KDSETLED, arg));
1888 case KDSETREPEAT: /* set keyboard repeat rate (new
1890 if (!KBD_HAS_DEVICE(kbd)) {
1893 if (((int *)arg)[1] < 0) {
1896 if (((int *)arg)[0] < 0) {
1899 if (((int *)arg)[0] < 200) /* fastest possible value */
1900 kbd->kb_delay1 = 200;
1902 kbd->kb_delay1 = ((int *)arg)[0];
1903 kbd->kb_delay2 = ((int *)arg)[1];
1907 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1908 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1910 ival = IOCPARM_IVAL(arg);
1911 arg = (caddr_t)&ival;
1915 case KDSETRAD: /* set keyboard repeat rate (old
1917 return (ukbd_set_typematic(kbd, *(int *)arg));
1919 case PIO_KEYMAP: /* set keyboard translation table */
1920 case PIO_KEYMAPENT: /* set keyboard translation table
1922 case PIO_DEADKEYMAP: /* set accent key translation table */
1926 return (genkbd_commonioctl(kbd, cmd, arg));
1933 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1936 struct ukbd_softc *sc = kbd->kb_data;
1939 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1940 * context where printf(9) can be called, which among other things
1941 * includes interrupt filters and threads with any kinds of locks
1942 * already held. For this reason it would be dangerous to acquire
1943 * the Giant here unconditionally. On the other hand we have to
1944 * have it to handle the ioctl.
1945 * So we make our best effort to auto-detect whether we can grab
1946 * the Giant or not. Blame syscons(4) for this.
1952 if(!lockowned(&kbd->kb_lock)) {
1953 return (EDEADLK); /* best I could come up with */
1958 result = ukbd_ioctl_locked(kbd, cmd, arg);
1965 /* clear the internal state of the keyboard */
1967 ukbd_clear_state(keyboard_t *kbd)
1969 struct ukbd_softc *sc = kbd->kb_data;
1971 UKBD_CTX_LOCK_ASSERT();
1973 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1974 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1976 sc->sc_composed_char = 0;
1977 #ifdef UKBD_EMULATE_ATSCANCODE
1978 sc->sc_buffered_char[0] = 0;
1979 sc->sc_buffered_char[1] = 0;
1981 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1982 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1983 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1984 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1987 /* save the internal state, not used */
1989 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1991 return (len == 0) ? 1 : -1;
1994 /* set the internal state, not used */
1996 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
2002 ukbd_poll(keyboard_t *kbd, int on)
2004 struct ukbd_softc *sc = kbd->kb_data;
2008 sc->sc_flags |= UKBD_FLAG_POLLING;
2009 sc->sc_poll_thread = curthread;
2011 sc->sc_flags &= ~UKBD_FLAG_POLLING;
2012 ukbd_start_timer(sc); /* start timer */
2019 /* local functions */
2022 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2025 DPRINTF("leds=0x%02x\n", leds);
2028 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2030 /* start transfer, if not already started */
2032 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2036 ukbd_set_typematic(keyboard_t *kbd, int code)
2038 static const int delays[] = {250, 500, 750, 1000};
2039 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2040 68, 76, 84, 92, 100, 110, 118, 126,
2041 136, 152, 168, 184, 200, 220, 236, 252,
2042 272, 304, 336, 368, 400, 440, 472, 504};
2047 kbd->kb_delay1 = delays[(code >> 5) & 3];
2048 kbd->kb_delay2 = rates[code & 0x1f];
2052 #ifdef UKBD_EMULATE_ATSCANCODE
2054 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2056 static const int scan[] = {
2062 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2072 0x151, /* PageDown */
2075 0x146, /* XXX Pause/Break */
2076 0x15b, /* Win_L(Super_L) */
2077 0x15c, /* Win_R(Super_R) */
2078 0x15d, /* Application(Menu) */
2080 /* SUN TYPE 6 USB KEYBOARD */
2081 0x168, /* Sun Type 6 Help */
2082 0x15e, /* Sun Type 6 Stop */
2084 0x15f, /* Sun Type 6 Again */
2085 0x160, /* Sun Type 6 Props */
2086 0x161, /* Sun Type 6 Undo */
2087 0x162, /* Sun Type 6 Front */
2088 0x163, /* Sun Type 6 Copy */
2089 0x164, /* Sun Type 6 Open */
2090 0x165, /* Sun Type 6 Paste */
2091 0x166, /* Sun Type 6 Find */
2092 0x167, /* Sun Type 6 Cut */
2093 0x125, /* Sun Type 6 Mute */
2095 0x11f, /* Sun Type 6 VolumeDown */
2096 0x11e, /* Sun Type 6 VolumeUp */
2097 0x120, /* Sun Type 6 PowerDown */
2099 /* Japanese 106/109 keyboard */
2100 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2101 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2102 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2103 0x79, /* Keyboard Intl' 4 (Henkan) */
2104 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2105 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2108 if ((code >= 89) && (code < (int)(89 + NELEM(scan)))) {
2109 code = scan[code - 89];
2112 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2113 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2115 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2116 code &= ~SCAN_PREFIX_SHIFT;
2118 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2120 if (code & SCAN_PREFIX) {
2121 if (code & SCAN_PREFIX_CTL) {
2123 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2124 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2125 } else if (code & SCAN_PREFIX_SHIFT) {
2127 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2128 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2130 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2131 sc->sc_buffered_char[1] = 0;
2133 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2139 #endif /* UKBD_EMULATE_ATSCANCODE */
2141 static keyboard_switch_t ukbdsw = {
2142 .probe = &ukbd__probe,
2146 .test_if = &ukbd_test_if,
2147 .enable = &ukbd_enable,
2148 .disable = &ukbd_disable,
2150 .check = &ukbd_check,
2151 .read_char = &ukbd_read_char,
2152 .check_char = &ukbd_check_char,
2153 .ioctl = &ukbd_ioctl,
2155 .clear_state = &ukbd_clear_state,
2156 .get_state = &ukbd_get_state,
2157 .set_state = &ukbd_set_state,
2158 .get_fkeystr = &genkbd_get_fkeystr,
2160 .diag = &genkbd_diag,
2163 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2166 ukbd_driver_load(module_t mod, int what, void *arg)
2170 kbd_add_driver(&ukbd_kbd_driver);
2173 kbd_delete_driver(&ukbd_kbd_driver);
2179 static devclass_t ukbd_devclass;
2181 static device_method_t ukbd_methods[] = {
2182 DEVMETHOD(device_probe, ukbd_probe),
2183 DEVMETHOD(device_attach, ukbd_attach),
2184 DEVMETHOD(device_detach, ukbd_detach),
2185 DEVMETHOD(device_resume, ukbd_resume),
2189 static driver_t ukbd_driver = {
2191 .methods = ukbd_methods,
2192 .size = sizeof(struct ukbd_softc),
2195 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, NULL);
2196 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2197 MODULE_VERSION(ukbd, 1);