6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at
11 * Carlstedt Research & Technology.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
37 * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
40 #include "opt_compat.h"
44 #include <sys/stdint.h>
45 #include <sys/stddef.h>
46 #include <sys/param.h>
47 #include <sys/queue.h>
48 #include <sys/types.h>
49 #include <sys/systm.h>
50 #include <sys/kernel.h>
52 #include <sys/module.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
63 #include <sys/sched.h>
66 #include <dev/usb/usb.h>
67 #include <dev/usb/usbdi.h>
68 #include <dev/usb/usbdi_util.h>
69 #include <dev/usb/usbhid.h>
71 #define USB_DEBUG_VAR ukbd_debug
72 #include <dev/usb/usb_debug.h>
74 #include <dev/usb/quirk/usb_quirk.h>
76 #include <sys/ioccom.h>
77 #include <sys/filio.h>
81 #include <dev/kbd/kbdreg.h>
83 /* the initial key map, accent map and fkey strings */
84 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
85 #define KBD_DFLT_KEYMAP
89 /* the following file must be included after "ukbdmap.h" */
90 #include <dev/kbd/kbdtables.h>
93 static int ukbd_debug = 0;
94 static int ukbd_no_leds = 0;
95 static int ukbd_pollrate = 0;
97 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
98 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
99 &ukbd_debug, 0, "Debug level");
100 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
101 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
102 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
103 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
104 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RW | CTLFLAG_TUN,
105 &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
106 TUNABLE_INT("hw.usb.ukbd.pollrate", &ukbd_pollrate);
109 #define UKBD_EMULATE_ATSCANCODE 1
110 #define UKBD_DRIVER_NAME "ukbd"
111 #define UKBD_NMOD 8 /* units */
112 #define UKBD_NKEYCODE 6 /* units */
113 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
114 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
115 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
116 #define UKBD_BUFFER_SIZE 64 /* bytes */
120 #define MOD_CONTROL_L 0x01
121 #define MOD_CONTROL_R 0x10
122 #define MOD_SHIFT_L 0x02
123 #define MOD_SHIFT_R 0x20
124 #define MOD_ALT_L 0x04
125 #define MOD_ALT_R 0x40
126 #define MOD_WIN_L 0x08
127 #define MOD_WIN_R 0x80
129 #define MOD_EJECT 0x0100
130 #define MOD_FN 0x0200
131 uint8_t keycode[UKBD_NKEYCODE];
143 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() mtx_lock(&Giant)
252 #define UKBD_UNLOCK() mtx_unlock(&Giant)
257 * Assert that the lock is held in all contexts
258 * where the code can be executed.
260 #define UKBD_LOCK_ASSERT() mtx_assert(&Giant, MA_OWNED)
263 * Assert that the lock is held in the contexts
264 * where it really has to be so.
266 #define UKBD_CTX_LOCK_ASSERT() \
268 if (!kdb_active && panicstr == NULL) \
269 mtx_assert(&Giant, MA_OWNED); \
273 #define UKBD_LOCK_ASSERT() (void)0
274 #define UKBD_CTX_LOCK_ASSERT() (void)0
282 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
283 {MOD_CONTROL_L, 0xe0},
284 {MOD_CONTROL_R, 0xe4},
293 #define NN 0 /* no translation */
295 * Translate USB keycodes to AT keyboard scancodes.
298 * FIXME: Mac USB keyboard generates:
299 * 0x53: keypad NumLock/Clear
306 * USB Apple Keyboard JIS generates:
310 static const uint8_t ukbd_trtab[256] = {
311 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
312 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
313 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
314 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
315 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
316 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
317 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
318 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
319 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
320 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
321 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
322 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
323 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
325 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
326 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
327 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
328 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
329 129, 130, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
331 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
335 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
336 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
337 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
338 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
339 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
340 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
341 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
342 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
345 static const uint8_t ukbd_boot_desc[] = {
346 0x05, 0x01, 0x09, 0x06, 0xa1,
347 0x01, 0x05, 0x07, 0x19, 0xe0,
348 0x29, 0xe7, 0x15, 0x00, 0x25,
349 0x01, 0x75, 0x01, 0x95, 0x08,
350 0x81, 0x02, 0x95, 0x01, 0x75,
351 0x08, 0x81, 0x01, 0x95, 0x03,
352 0x75, 0x01, 0x05, 0x08, 0x19,
353 0x01, 0x29, 0x03, 0x91, 0x02,
354 0x95, 0x05, 0x75, 0x01, 0x91,
355 0x01, 0x95, 0x06, 0x75, 0x08,
356 0x15, 0x00, 0x26, 0xff, 0x00,
357 0x05, 0x07, 0x19, 0x00, 0x2a,
358 0xff, 0x00, 0x81, 0x00, 0xc0
362 static void ukbd_timeout(void *);
363 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
364 static int ukbd_set_typematic(keyboard_t *, int);
365 #ifdef UKBD_EMULATE_ATSCANCODE
366 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
368 static uint32_t ukbd_read_char(keyboard_t *, int);
369 static void ukbd_clear_state(keyboard_t *);
370 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
371 static int ukbd_enable(keyboard_t *);
372 static int ukbd_disable(keyboard_t *);
373 static void ukbd_interrupt(struct ukbd_softc *);
374 static void ukbd_event_keyinput(struct ukbd_softc *);
376 static device_probe_t ukbd_probe;
377 static device_attach_t ukbd_attach;
378 static device_detach_t ukbd_detach;
379 static device_resume_t ukbd_resume;
382 ukbd_any_key_pressed(struct ukbd_softc *sc)
387 for (j = i = 0; i < UKBD_NKEYCODE; i++)
388 j |= sc->sc_odata.keycode[i];
394 ukbd_start_timer(struct ukbd_softc *sc)
396 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
397 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
401 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
404 UKBD_CTX_LOCK_ASSERT();
406 DPRINTF("0x%02x (%d) %s\n", key, key,
407 (key & KEY_RELEASE) ? "released" : "pressed");
409 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
410 sc->sc_input[sc->sc_inputtail] = key;
412 ++(sc->sc_inputtail);
413 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
414 sc->sc_inputtail = 0;
417 DPRINTF("input buffer is full\n");
422 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
425 UKBD_CTX_LOCK_ASSERT();
426 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
427 ("ukbd_do_poll called when not polling\n"));
428 DPRINTFN(2, "polling\n");
430 if (!kdb_active && !SCHEDULER_STOPPED()) {
432 * In this context the kernel is polling for input,
433 * but the USB subsystem works in normal interrupt-driven
434 * mode, so we just wait on the USB threads to do the job.
435 * Note that we currently hold the Giant, but it's also used
436 * as the transfer mtx, so we must release it while waiting.
438 while (sc->sc_inputs == 0) {
440 * Give USB threads a chance to run. Note that
441 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
443 kern_yield(PRI_UNCHANGED);
450 while (sc->sc_inputs == 0) {
452 usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
454 /* Delay-optimised support for repetition of keys */
455 if (ukbd_any_key_pressed(sc)) {
456 /* a key is pressed - need timekeeping */
459 /* 1 millisecond has passed */
471 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
475 UKBD_CTX_LOCK_ASSERT();
476 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
477 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
478 ("not polling in kdb or panic\n"));
480 if (sc->sc_inputs == 0 &&
481 (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
482 /* start transfer, if not already started */
483 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
486 if (sc->sc_flags & UKBD_FLAG_POLLING)
487 ukbd_do_poll(sc, wait);
489 if (sc->sc_inputs == 0) {
492 c = sc->sc_input[sc->sc_inputhead];
494 ++(sc->sc_inputhead);
495 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
496 sc->sc_inputhead = 0;
503 ukbd_interrupt(struct ukbd_softc *sc)
507 uint32_t now = sc->sc_time_ms;
513 UKBD_CTX_LOCK_ASSERT();
515 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
518 n_mod = sc->sc_ndata.modifiers;
519 o_mod = sc->sc_odata.modifiers;
520 if (n_mod != o_mod) {
521 for (i = 0; i < UKBD_NMOD; i++) {
522 if ((n_mod & ukbd_mods[i].mask) !=
523 (o_mod & ukbd_mods[i].mask)) {
524 ukbd_put_key(sc, ukbd_mods[i].key |
525 ((n_mod & ukbd_mods[i].mask) ?
526 KEY_PRESS : KEY_RELEASE));
530 /* Check for released keys. */
531 for (i = 0; i < UKBD_NKEYCODE; i++) {
532 key = sc->sc_odata.keycode[i];
536 for (j = 0; j < UKBD_NKEYCODE; j++) {
537 if (sc->sc_ndata.keycode[j] == 0) {
540 if (key == sc->sc_ndata.keycode[j]) {
544 ukbd_put_key(sc, key | KEY_RELEASE);
548 /* Check for pressed keys. */
549 for (i = 0; i < UKBD_NKEYCODE; i++) {
550 key = sc->sc_ndata.keycode[i];
554 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
555 for (j = 0; j < UKBD_NKEYCODE; j++) {
556 if (sc->sc_odata.keycode[j] == 0) {
559 if (key == sc->sc_odata.keycode[j]) {
561 /* key is still pressed */
563 sc->sc_ntime[i] = sc->sc_otime[j];
564 dtime = (sc->sc_otime[j] - now);
566 if (!(dtime & 0x80000000)) {
567 /* time has not elapsed */
570 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
574 ukbd_put_key(sc, key | KEY_PRESS);
577 * If any other key is presently down, force its repeat to be
578 * well in the future (100s). This makes the last key to be
579 * pressed do the autorepeat.
581 for (j = 0; j != UKBD_NKEYCODE; j++) {
583 sc->sc_ntime[j] = now + (100 * 1000);
588 sc->sc_odata = sc->sc_ndata;
590 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
592 ukbd_event_keyinput(sc);
596 ukbd_event_keyinput(struct ukbd_softc *sc)
600 UKBD_CTX_LOCK_ASSERT();
602 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
605 if (sc->sc_inputs == 0)
608 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
609 KBD_IS_BUSY(&sc->sc_kbd)) {
610 /* let the callback function process the input */
611 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
612 sc->sc_kbd.kb_callback.kc_arg);
614 /* read and discard the input, no one is waiting for it */
616 c = ukbd_read_char(&sc->sc_kbd, 0);
617 } while (c != NOKEY);
622 ukbd_timeout(void *arg)
624 struct ukbd_softc *sc = arg;
628 sc->sc_time_ms += 25; /* milliseconds */
632 /* Make sure any leftover key events gets read out */
633 ukbd_event_keyinput(sc);
635 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
636 ukbd_start_timer(sc);
638 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
643 ukbd_apple_fn(uint8_t keycode) {
645 case 0x28: return 0x49; /* RETURN -> INSERT */
646 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
647 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
648 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
649 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
650 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
651 default: return keycode;
656 ukbd_apple_swap(uint8_t keycode) {
658 case 0x35: return 0x64;
659 case 0x64: return 0x35;
660 default: return keycode;
665 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
667 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
668 struct usb_page_cache *pc;
676 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
677 pc = usbd_xfer_get_frame(xfer, 0);
679 switch (USB_GET_STATE(xfer)) {
680 case USB_ST_TRANSFERRED:
681 DPRINTF("actlen=%d bytes\n", len);
684 DPRINTF("zero length data\n");
688 if (sc->sc_kbd_id != 0) {
689 /* check and remove HID ID byte */
690 usbd_copy_out(pc, 0, &id, 1);
694 DPRINTF("zero length data\n");
702 if (len > UKBD_BUFFER_SIZE)
703 len = UKBD_BUFFER_SIZE;
706 usbd_copy_out(pc, offset, sc->sc_buffer, len);
708 /* clear temporary storage */
709 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
711 /* scan through HID data */
712 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
713 (id == sc->sc_id_apple_eject)) {
714 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
715 sc->sc_modifiers |= MOD_EJECT;
717 sc->sc_modifiers &= ~MOD_EJECT;
719 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
720 (id == sc->sc_id_apple_fn)) {
721 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
722 sc->sc_modifiers |= MOD_FN;
724 sc->sc_modifiers &= ~MOD_FN;
726 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
727 (id == sc->sc_id_ctrl_l)) {
728 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
729 sc-> sc_modifiers |= MOD_CONTROL_L;
731 sc-> sc_modifiers &= ~MOD_CONTROL_L;
733 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
734 (id == sc->sc_id_ctrl_r)) {
735 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
736 sc->sc_modifiers |= MOD_CONTROL_R;
738 sc->sc_modifiers &= ~MOD_CONTROL_R;
740 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
741 (id == sc->sc_id_shift_l)) {
742 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
743 sc->sc_modifiers |= MOD_SHIFT_L;
745 sc->sc_modifiers &= ~MOD_SHIFT_L;
747 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
748 (id == sc->sc_id_shift_r)) {
749 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
750 sc->sc_modifiers |= MOD_SHIFT_R;
752 sc->sc_modifiers &= ~MOD_SHIFT_R;
754 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
755 (id == sc->sc_id_alt_l)) {
756 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
757 sc->sc_modifiers |= MOD_ALT_L;
759 sc->sc_modifiers &= ~MOD_ALT_L;
761 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
762 (id == sc->sc_id_alt_r)) {
763 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
764 sc->sc_modifiers |= MOD_ALT_R;
766 sc->sc_modifiers &= ~MOD_ALT_R;
768 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
769 (id == sc->sc_id_win_l)) {
770 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
771 sc->sc_modifiers |= MOD_WIN_L;
773 sc->sc_modifiers &= ~MOD_WIN_L;
775 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
776 (id == sc->sc_id_win_r)) {
777 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
778 sc->sc_modifiers |= MOD_WIN_R;
780 sc->sc_modifiers &= ~MOD_WIN_R;
783 sc->sc_ndata.modifiers = sc->sc_modifiers;
785 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
786 (id == sc->sc_id_events)) {
787 i = sc->sc_loc_events.count;
788 if (i > UKBD_NKEYCODE)
793 sc->sc_ndata.keycode[i] =
794 hid_get_data(sc->sc_buffer + i, len - i,
800 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
801 for (i = 0; i < UKBD_NKEYCODE; i++) {
802 if (sc->sc_ndata.keycode[i]) {
803 DPRINTF("[%d] = 0x%02x\n",
804 (int)i, (int)sc->sc_ndata.keycode[i]);
808 if (sc->sc_modifiers & MOD_FN) {
809 for (i = 0; i < UKBD_NKEYCODE; i++) {
810 sc->sc_ndata.keycode[i] =
811 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
815 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
816 for (i = 0; i < UKBD_NKEYCODE; i++) {
817 sc->sc_ndata.keycode[i] =
818 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
824 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
825 if (ukbd_any_key_pressed(sc)) {
826 ukbd_start_timer(sc);
832 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
833 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
834 usbd_transfer_submit(xfer);
836 DPRINTF("input queue is full!\n");
841 DPRINTF("error=%s\n", usbd_errstr(error));
843 if (error != USB_ERR_CANCELLED) {
844 /* try to clear stall first */
845 usbd_xfer_set_stall(xfer);
853 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
855 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
856 struct usb_device_request req;
857 struct usb_page_cache *pc;
869 switch (USB_GET_STATE(xfer)) {
870 case USB_ST_TRANSFERRED:
872 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
874 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
876 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
877 req.bRequest = UR_SET_REPORT;
878 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
879 req.wIndex[0] = sc->sc_iface_no;
883 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
888 /* Assumption: All led bits must be in the same ID. */
890 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
891 if (sc->sc_leds & NLKED) {
892 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
893 &sc->sc_loc_numlock, 1);
895 id = sc->sc_id_numlock;
899 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
900 if (sc->sc_leds & SLKED) {
901 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
902 &sc->sc_loc_scrolllock, 1);
904 id = sc->sc_id_scrolllock;
908 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
909 if (sc->sc_leds & CLKED) {
910 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
911 &sc->sc_loc_capslock, 1);
913 id = sc->sc_id_capslock;
917 /* if no leds, nothing to do */
921 /* range check output report length */
922 len = sc->sc_led_size;
923 if (len > (UKBD_BUFFER_SIZE - 1))
924 len = (UKBD_BUFFER_SIZE - 1);
926 /* check if we need to prefix an ID byte */
927 sc->sc_buffer[0] = id;
929 pc = usbd_xfer_get_frame(xfer, 1);
932 usbd_copy_in(pc, 0, sc->sc_buffer, len);
934 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
936 req.wLength[0] = len;
937 usbd_xfer_set_frame_len(xfer, 1, len);
939 DPRINTF("len=%d, id=%d\n", len, id);
941 /* setup control request last */
942 pc = usbd_xfer_get_frame(xfer, 0);
943 usbd_copy_in(pc, 0, &req, sizeof(req));
944 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
946 /* start data transfer */
947 usbd_xfer_set_frames(xfer, 2);
948 usbd_transfer_submit(xfer);
952 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
957 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
960 .type = UE_INTERRUPT,
961 .endpoint = UE_ADDR_ANY,
962 .direction = UE_DIR_IN,
963 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
964 .bufsize = 0, /* use wMaxPacketSize */
965 .callback = &ukbd_intr_callback,
970 .endpoint = 0x00, /* Control pipe */
971 .direction = UE_DIR_ANY,
972 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
973 .callback = &ukbd_set_leds_callback,
974 .timeout = 1000, /* 1 second */
978 /* A match on these entries will load ukbd */
979 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
980 {USB_IFACE_CLASS(UICLASS_HID),
981 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
982 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
986 ukbd_probe(device_t dev)
988 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
989 struct usb_attach_arg *uaa = device_get_ivars(dev);
1000 if (uaa->usb_mode != USB_MODE_HOST) {
1004 if (uaa->info.bInterfaceClass != UICLASS_HID)
1007 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1010 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1011 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1012 return (BUS_PROBE_DEFAULT);
1014 error = usbd_req_get_hid_desc(uaa->device, NULL,
1015 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1020 if (hid_is_keyboard(d_ptr, d_len)) {
1021 if (hid_is_mouse(d_ptr, d_len)) {
1023 * NOTE: We currently don't support USB mouse
1024 * and USB keyboard on the same USB endpoint.
1025 * Let "ums" driver win.
1029 error = BUS_PROBE_DEFAULT;
1034 free(d_ptr, M_TEMP);
1039 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1043 /* reset detected bits */
1044 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1046 /* check if there is an ID byte */
1047 sc->sc_kbd_size = hid_report_size(ptr, len,
1048 hid_input, &sc->sc_kbd_id);
1050 /* investigate if this is an Apple Keyboard */
1051 if (hid_locate(ptr, len,
1052 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1053 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1054 &sc->sc_id_apple_eject)) {
1055 if (flags & HIO_VARIABLE)
1056 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1057 UKBD_FLAG_APPLE_SWAP;
1058 DPRINTFN(1, "Found Apple eject-key\n");
1060 if (hid_locate(ptr, len,
1061 HID_USAGE2(0xFFFF, 0x0003),
1062 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1063 &sc->sc_id_apple_fn)) {
1064 if (flags & HIO_VARIABLE)
1065 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1066 DPRINTFN(1, "Found Apple FN-key\n");
1068 /* figure out some keys */
1069 if (hid_locate(ptr, len,
1070 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1071 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1072 &sc->sc_id_ctrl_l)) {
1073 if (flags & HIO_VARIABLE)
1074 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1075 DPRINTFN(1, "Found left control\n");
1077 if (hid_locate(ptr, len,
1078 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1079 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1080 &sc->sc_id_ctrl_r)) {
1081 if (flags & HIO_VARIABLE)
1082 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1083 DPRINTFN(1, "Found right control\n");
1085 if (hid_locate(ptr, len,
1086 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1087 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1088 &sc->sc_id_shift_l)) {
1089 if (flags & HIO_VARIABLE)
1090 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1091 DPRINTFN(1, "Found left shift\n");
1093 if (hid_locate(ptr, len,
1094 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1095 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1096 &sc->sc_id_shift_r)) {
1097 if (flags & HIO_VARIABLE)
1098 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1099 DPRINTFN(1, "Found right shift\n");
1101 if (hid_locate(ptr, len,
1102 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1103 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1104 &sc->sc_id_alt_l)) {
1105 if (flags & HIO_VARIABLE)
1106 sc->sc_flags |= UKBD_FLAG_ALT_L;
1107 DPRINTFN(1, "Found left alt\n");
1109 if (hid_locate(ptr, len,
1110 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1111 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1112 &sc->sc_id_alt_r)) {
1113 if (flags & HIO_VARIABLE)
1114 sc->sc_flags |= UKBD_FLAG_ALT_R;
1115 DPRINTFN(1, "Found right alt\n");
1117 if (hid_locate(ptr, len,
1118 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1119 hid_input, 0, &sc->sc_loc_win_l, &flags,
1120 &sc->sc_id_win_l)) {
1121 if (flags & HIO_VARIABLE)
1122 sc->sc_flags |= UKBD_FLAG_WIN_L;
1123 DPRINTFN(1, "Found left GUI\n");
1125 if (hid_locate(ptr, len,
1126 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1127 hid_input, 0, &sc->sc_loc_win_r, &flags,
1128 &sc->sc_id_win_r)) {
1129 if (flags & HIO_VARIABLE)
1130 sc->sc_flags |= UKBD_FLAG_WIN_R;
1131 DPRINTFN(1, "Found right GUI\n");
1133 /* figure out event buffer */
1134 if (hid_locate(ptr, len,
1135 HID_USAGE2(HUP_KEYBOARD, 0x00),
1136 hid_input, 0, &sc->sc_loc_events, &flags,
1137 &sc->sc_id_events)) {
1138 if (flags & HIO_VARIABLE) {
1139 DPRINTFN(1, "Ignoring keyboard event control\n");
1141 sc->sc_flags |= UKBD_FLAG_EVENTS;
1142 DPRINTFN(1, "Found keyboard event array\n");
1146 /* figure out leds on keyboard */
1147 sc->sc_led_size = hid_report_size(ptr, len,
1150 if (hid_locate(ptr, len,
1151 HID_USAGE2(HUP_LEDS, 0x01),
1152 hid_output, 0, &sc->sc_loc_numlock, &flags,
1153 &sc->sc_id_numlock)) {
1154 if (flags & HIO_VARIABLE)
1155 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1156 DPRINTFN(1, "Found keyboard numlock\n");
1158 if (hid_locate(ptr, len,
1159 HID_USAGE2(HUP_LEDS, 0x02),
1160 hid_output, 0, &sc->sc_loc_capslock, &flags,
1161 &sc->sc_id_capslock)) {
1162 if (flags & HIO_VARIABLE)
1163 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1164 DPRINTFN(1, "Found keyboard capslock\n");
1166 if (hid_locate(ptr, len,
1167 HID_USAGE2(HUP_LEDS, 0x03),
1168 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1169 &sc->sc_id_scrolllock)) {
1170 if (flags & HIO_VARIABLE)
1171 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1172 DPRINTFN(1, "Found keyboard scrolllock\n");
1177 ukbd_attach(device_t dev)
1179 struct ukbd_softc *sc = device_get_softc(dev);
1180 struct usb_attach_arg *uaa = device_get_ivars(dev);
1181 int unit = device_get_unit(dev);
1182 keyboard_t *kbd = &sc->sc_kbd;
1183 void *hid_ptr = NULL;
1192 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1194 kbd->kb_data = (void *)sc;
1196 device_set_usb_desc(dev);
1198 sc->sc_udev = uaa->device;
1199 sc->sc_iface = uaa->iface;
1200 sc->sc_iface_index = uaa->info.bIfaceIndex;
1201 sc->sc_iface_no = uaa->info.bIfaceNum;
1202 sc->sc_mode = K_XLATE;
1204 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1206 err = usbd_transfer_setup(uaa->device,
1207 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1208 UKBD_N_TRANSFER, sc, &Giant);
1211 DPRINTF("error=%s\n", usbd_errstr(err));
1214 /* setup default keyboard maps */
1216 sc->sc_keymap = key_map;
1217 sc->sc_accmap = accent_map;
1218 for (n = 0; n < UKBD_NFKEY; n++) {
1219 sc->sc_fkeymap[n] = fkey_tab[n];
1222 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1223 sc->sc_fkeymap, UKBD_NFKEY);
1225 KBD_FOUND_DEVICE(kbd);
1227 ukbd_clear_state(kbd);
1230 * FIXME: set the initial value for lock keys in "sc_state"
1231 * according to the BIOS data?
1233 KBD_PROBE_DONE(kbd);
1235 /* get HID descriptor */
1236 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1237 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1240 DPRINTF("Parsing HID descriptor of %d bytes\n",
1243 ukbd_parse_hid(sc, hid_ptr, hid_len);
1245 free(hid_ptr, M_TEMP);
1248 /* check if we should use the boot protocol */
1249 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1250 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1252 DPRINTF("Forcing boot protocol\n");
1254 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1255 sc->sc_iface_index, 0);
1258 DPRINTF("Set protocol error=%s (ignored)\n",
1262 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1265 /* ignore if SETIDLE fails, hence it is not crucial */
1266 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1268 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1272 if (kbd_register(kbd) < 0) {
1275 KBD_CONFIG_DONE(kbd);
1279 #ifdef KBD_INSTALL_CDEV
1280 if (kbd_attach(kbd)) {
1284 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1287 genkbd_diag(kbd, bootverbose);
1291 /* check for polling rate override */
1292 rate = ukbd_pollrate;
1299 /* set new polling interval in ms */
1300 usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1303 /* start the keyboard */
1304 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1306 return (0); /* success */
1310 return (ENXIO); /* error */
1314 ukbd_detach(device_t dev)
1316 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);
1341 #ifdef KBD_INSTALL_CDEV
1342 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1343 error = kbd_detach(&sc->sc_kbd);
1345 /* usb attach cannot return an error */
1346 device_printf(dev, "WARNING: kbd_detach() "
1347 "returned non-zero! (ignored)\n");
1351 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1352 error = kbd_unregister(&sc->sc_kbd);
1354 /* usb attach cannot return an error */
1355 device_printf(dev, "WARNING: kbd_unregister() "
1356 "returned non-zero! (ignored)\n");
1359 sc->sc_kbd.kb_flags = 0;
1361 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1363 usb_callout_drain(&sc->sc_callout);
1365 DPRINTF("%s: disconnected\n",
1366 device_get_nameunit(dev));
1372 ukbd_resume(device_t dev)
1374 struct ukbd_softc *sc = device_get_softc(dev);
1378 ukbd_clear_state(&sc->sc_kbd);
1383 /* early keyboard probe, not supported */
1385 ukbd_configure(int flags)
1390 /* detect a keyboard, not used */
1392 ukbd__probe(int unit, void *arg, int flags)
1397 /* reset and initialize the device, not used */
1399 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1404 /* test the interface to the device, not used */
1406 ukbd_test_if(keyboard_t *kbd)
1411 /* finish using this keyboard, not used */
1413 ukbd_term(keyboard_t *kbd)
1418 /* keyboard interrupt routine, not used */
1420 ukbd_intr(keyboard_t *kbd, void *arg)
1425 /* lock the access to the keyboard, not used */
1427 ukbd_lock(keyboard_t *kbd, int lock)
1433 * Enable the access to the device; until this function is called,
1434 * the client cannot read from the keyboard.
1437 ukbd_enable(keyboard_t *kbd)
1447 /* disallow the access to the device */
1449 ukbd_disable(keyboard_t *kbd)
1453 KBD_DEACTIVATE(kbd);
1459 /* check if data is waiting */
1460 /* Currently unused. */
1462 ukbd_check(keyboard_t *kbd)
1464 struct ukbd_softc *sc = kbd->kb_data;
1466 UKBD_CTX_LOCK_ASSERT();
1468 if (!KBD_IS_ACTIVE(kbd))
1471 if (sc->sc_flags & UKBD_FLAG_POLLING)
1472 ukbd_do_poll(sc, 0);
1474 #ifdef UKBD_EMULATE_ATSCANCODE
1475 if (sc->sc_buffered_char[0]) {
1479 if (sc->sc_inputs > 0) {
1485 /* check if char is waiting */
1487 ukbd_check_char_locked(keyboard_t *kbd)
1489 struct ukbd_softc *sc = kbd->kb_data;
1491 UKBD_CTX_LOCK_ASSERT();
1493 if (!KBD_IS_ACTIVE(kbd))
1496 if ((sc->sc_composed_char > 0) &&
1497 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1500 return (ukbd_check(kbd));
1504 ukbd_check_char(keyboard_t *kbd)
1509 result = ukbd_check_char_locked(kbd);
1515 /* read one byte from the keyboard if it's allowed */
1516 /* Currently unused. */
1518 ukbd_read(keyboard_t *kbd, int wait)
1520 struct ukbd_softc *sc = kbd->kb_data;
1522 #ifdef UKBD_EMULATE_ATSCANCODE
1528 UKBD_CTX_LOCK_ASSERT();
1530 if (!KBD_IS_ACTIVE(kbd))
1533 #ifdef UKBD_EMULATE_ATSCANCODE
1534 if (sc->sc_buffered_char[0]) {
1535 scancode = sc->sc_buffered_char[0];
1536 if (scancode & SCAN_PREFIX) {
1537 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1538 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1540 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1541 sc->sc_buffered_char[1] = 0;
1544 #endif /* UKBD_EMULATE_ATSCANCODE */
1547 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1548 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1553 #ifdef UKBD_EMULATE_ATSCANCODE
1554 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1555 if (keycode == NN) {
1558 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1559 (usbcode & KEY_RELEASE)));
1560 #else /* !UKBD_EMULATE_ATSCANCODE */
1562 #endif /* UKBD_EMULATE_ATSCANCODE */
1565 /* read char from the keyboard */
1567 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1569 struct ukbd_softc *sc = kbd->kb_data;
1573 #ifdef UKBD_EMULATE_ATSCANCODE
1577 UKBD_CTX_LOCK_ASSERT();
1579 if (!KBD_IS_ACTIVE(kbd))
1584 /* do we have a composed char to return ? */
1586 if ((sc->sc_composed_char > 0) &&
1587 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1589 action = sc->sc_composed_char;
1590 sc->sc_composed_char = 0;
1592 if (action > 0xFF) {
1597 #ifdef UKBD_EMULATE_ATSCANCODE
1599 /* do we have a pending raw scan code? */
1601 if (sc->sc_mode == K_RAW) {
1602 scancode = sc->sc_buffered_char[0];
1604 if (scancode & SCAN_PREFIX) {
1605 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1606 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1608 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1609 sc->sc_buffered_char[1] = 0;
1613 #endif /* UKBD_EMULATE_ATSCANCODE */
1615 /* see if there is something in the keyboard port */
1617 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1618 if (usbcode == -1) {
1623 #ifdef UKBD_EMULATE_ATSCANCODE
1624 /* USB key index -> key code -> AT scan code */
1625 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1626 if (keycode == NN) {
1629 /* return an AT scan code for the K_RAW mode */
1630 if (sc->sc_mode == K_RAW) {
1631 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1632 (usbcode & KEY_RELEASE)));
1634 #else /* !UKBD_EMULATE_ATSCANCODE */
1636 /* return the byte as is for the K_RAW mode */
1637 if (sc->sc_mode == K_RAW) {
1640 /* USB key index -> key code */
1641 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1642 if (keycode == NN) {
1645 #endif /* UKBD_EMULATE_ATSCANCODE */
1648 case 0x38: /* left alt (compose key) */
1649 if (usbcode & KEY_RELEASE) {
1650 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1651 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1653 if (sc->sc_composed_char > 0xFF) {
1654 sc->sc_composed_char = 0;
1658 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1659 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1660 sc->sc_composed_char = 0;
1664 /* XXX: I don't like these... */
1665 case 0x5c: /* print screen */
1666 if (sc->sc_flags & ALTS) {
1667 keycode = 0x54; /* sysrq */
1670 case 0x68: /* pause/break */
1671 if (sc->sc_flags & CTLS) {
1672 keycode = 0x6c; /* break */
1677 /* return the key code in the K_CODE mode */
1678 if (usbcode & KEY_RELEASE) {
1679 keycode |= SCAN_RELEASE;
1681 if (sc->sc_mode == K_CODE) {
1684 /* compose a character code */
1685 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1687 /* key pressed, process it */
1690 case 0x49: /* keypad 7,8,9 */
1691 sc->sc_composed_char *= 10;
1692 sc->sc_composed_char += keycode - 0x40;
1693 goto check_composed;
1697 case 0x4D: /* keypad 4,5,6 */
1698 sc->sc_composed_char *= 10;
1699 sc->sc_composed_char += keycode - 0x47;
1700 goto check_composed;
1704 case 0x51: /* keypad 1,2,3 */
1705 sc->sc_composed_char *= 10;
1706 sc->sc_composed_char += keycode - 0x4E;
1707 goto check_composed;
1709 case 0x52: /* keypad 0 */
1710 sc->sc_composed_char *= 10;
1711 goto check_composed;
1713 /* key released, no interest here */
1714 case SCAN_RELEASE | 0x47:
1715 case SCAN_RELEASE | 0x48:
1716 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1717 case SCAN_RELEASE | 0x4B:
1718 case SCAN_RELEASE | 0x4C:
1719 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1720 case SCAN_RELEASE | 0x4F:
1721 case SCAN_RELEASE | 0x50:
1722 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1723 case SCAN_RELEASE | 0x52: /* keypad 0 */
1726 case 0x38: /* left alt key */
1730 if (sc->sc_composed_char > 0) {
1731 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1732 sc->sc_composed_char = 0;
1738 /* keycode to key action */
1739 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1740 (keycode & SCAN_RELEASE),
1741 &sc->sc_state, &sc->sc_accents);
1742 if (action == NOKEY) {
1749 if (sc->sc_composed_char <= 0xFF) {
1756 /* Currently wait is always false. */
1758 ukbd_read_char(keyboard_t *kbd, int wait)
1763 keycode = ukbd_read_char_locked(kbd, wait);
1769 /* some useful control functions */
1771 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1773 struct ukbd_softc *sc = kbd->kb_data;
1775 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1776 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1784 case KDGKBMODE: /* get keyboard mode */
1785 *(int *)arg = sc->sc_mode;
1787 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1788 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1790 ival = IOCPARM_IVAL(arg);
1791 arg = (caddr_t)&ival;
1794 case KDSKBMODE: /* set keyboard mode */
1795 switch (*(int *)arg) {
1797 if (sc->sc_mode != K_XLATE) {
1798 /* make lock key state and LED state match */
1799 sc->sc_state &= ~LOCK_MASK;
1800 sc->sc_state |= KBD_LED_VAL(kbd);
1805 if (sc->sc_mode != *(int *)arg) {
1806 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1807 ukbd_clear_state(kbd);
1808 sc->sc_mode = *(int *)arg;
1816 case KDGETLED: /* get keyboard LED */
1817 *(int *)arg = KBD_LED_VAL(kbd);
1819 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1820 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1822 ival = IOCPARM_IVAL(arg);
1823 arg = (caddr_t)&ival;
1826 case KDSETLED: /* set keyboard LED */
1827 /* NOTE: lock key state in "sc_state" won't be changed */
1828 if (*(int *)arg & ~LOCK_MASK)
1833 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1834 if (sc->sc_mode == K_XLATE &&
1835 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1841 if (KBD_HAS_DEVICE(kbd))
1842 ukbd_set_leds(sc, i);
1844 KBD_LED_VAL(kbd) = *(int *)arg;
1846 case KDGKBSTATE: /* get lock key state */
1847 *(int *)arg = sc->sc_state & LOCK_MASK;
1849 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1850 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1852 ival = IOCPARM_IVAL(arg);
1853 arg = (caddr_t)&ival;
1856 case KDSKBSTATE: /* set lock key state */
1857 if (*(int *)arg & ~LOCK_MASK) {
1860 sc->sc_state &= ~LOCK_MASK;
1861 sc->sc_state |= *(int *)arg;
1863 /* set LEDs and quit */
1864 return (ukbd_ioctl(kbd, KDSETLED, arg));
1866 case KDSETREPEAT: /* set keyboard repeat rate (new
1868 if (!KBD_HAS_DEVICE(kbd)) {
1871 if (((int *)arg)[1] < 0) {
1874 if (((int *)arg)[0] < 0) {
1877 if (((int *)arg)[0] < 200) /* fastest possible value */
1878 kbd->kb_delay1 = 200;
1880 kbd->kb_delay1 = ((int *)arg)[0];
1881 kbd->kb_delay2 = ((int *)arg)[1];
1884 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1885 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1887 ival = IOCPARM_IVAL(arg);
1888 arg = (caddr_t)&ival;
1891 case KDSETRAD: /* set keyboard repeat rate (old
1893 return (ukbd_set_typematic(kbd, *(int *)arg));
1895 case PIO_KEYMAP: /* set keyboard translation table */
1896 case OPIO_KEYMAP: /* set keyboard translation table
1898 case PIO_KEYMAPENT: /* set keyboard translation table
1900 case PIO_DEADKEYMAP: /* set accent key translation table */
1904 return (genkbd_commonioctl(kbd, cmd, arg));
1911 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1916 * XXX Check of someone is calling us from a critical section:
1918 if (curthread->td_critnest != 0)
1922 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1923 * context where printf(9) can be called, which among other things
1924 * includes interrupt filters and threads with any kinds of locks
1925 * already held. For this reason it would be dangerous to acquire
1926 * the Giant here unconditionally. On the other hand we have to
1927 * have it to handle the ioctl.
1928 * So we make our best effort to auto-detect whether we can grab
1929 * the Giant or not. Blame syscons(4) for this.
1935 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1936 return (EDEADLK); /* best I could come up with */
1940 result = ukbd_ioctl_locked(kbd, cmd, arg);
1947 /* clear the internal state of the keyboard */
1949 ukbd_clear_state(keyboard_t *kbd)
1951 struct ukbd_softc *sc = kbd->kb_data;
1953 UKBD_CTX_LOCK_ASSERT();
1955 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1956 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1958 sc->sc_composed_char = 0;
1959 #ifdef UKBD_EMULATE_ATSCANCODE
1960 sc->sc_buffered_char[0] = 0;
1961 sc->sc_buffered_char[1] = 0;
1963 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1964 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1965 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1966 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1969 /* save the internal state, not used */
1971 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1973 return (len == 0) ? 1 : -1;
1976 /* set the internal state, not used */
1978 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1984 ukbd_poll(keyboard_t *kbd, int on)
1986 struct ukbd_softc *sc = kbd->kb_data;
1990 sc->sc_flags |= UKBD_FLAG_POLLING;
1991 sc->sc_poll_thread = curthread;
1993 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1994 ukbd_start_timer(sc); /* start timer */
2001 /* local functions */
2004 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2008 DPRINTF("leds=0x%02x\n", leds);
2011 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2013 /* start transfer, if not already started */
2015 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2019 ukbd_set_typematic(keyboard_t *kbd, int code)
2021 static const int delays[] = {250, 500, 750, 1000};
2022 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2023 68, 76, 84, 92, 100, 110, 118, 126,
2024 136, 152, 168, 184, 200, 220, 236, 252,
2025 272, 304, 336, 368, 400, 440, 472, 504};
2030 kbd->kb_delay1 = delays[(code >> 5) & 3];
2031 kbd->kb_delay2 = rates[code & 0x1f];
2035 #ifdef UKBD_EMULATE_ATSCANCODE
2037 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2039 static const int scan[] = {
2045 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2055 0x151, /* PageDown */
2058 0x146, /* XXX Pause/Break */
2059 0x15b, /* Win_L(Super_L) */
2060 0x15c, /* Win_R(Super_R) */
2061 0x15d, /* Application(Menu) */
2063 /* SUN TYPE 6 USB KEYBOARD */
2064 0x168, /* Sun Type 6 Help */
2065 0x15e, /* Sun Type 6 Stop */
2067 0x15f, /* Sun Type 6 Again */
2068 0x160, /* Sun Type 6 Props */
2069 0x161, /* Sun Type 6 Undo */
2070 0x162, /* Sun Type 6 Front */
2071 0x163, /* Sun Type 6 Copy */
2072 0x164, /* Sun Type 6 Open */
2073 0x165, /* Sun Type 6 Paste */
2074 0x166, /* Sun Type 6 Find */
2075 0x167, /* Sun Type 6 Cut */
2076 0x125, /* Sun Type 6 Mute */
2078 0x11f, /* Sun Type 6 VolumeDown */
2079 0x11e, /* Sun Type 6 VolumeUp */
2080 0x120, /* Sun Type 6 PowerDown */
2082 /* Japanese 106/109 keyboard */
2083 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2084 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2085 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2086 0x79, /* Keyboard Intl' 4 (Henkan) */
2087 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2088 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2089 0x71, /* Apple Keyboard JIS (Kana) */
2090 0x72, /* Apple Keyboard JIS (Eisu) */
2093 if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2094 code = scan[code - 89];
2097 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2098 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2100 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2101 code &= ~SCAN_PREFIX_SHIFT;
2103 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2105 if (code & SCAN_PREFIX) {
2106 if (code & SCAN_PREFIX_CTL) {
2108 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2109 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2110 } else if (code & SCAN_PREFIX_SHIFT) {
2112 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2113 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2115 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2116 sc->sc_buffered_char[1] = 0;
2118 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2124 #endif /* UKBD_EMULATE_ATSCANCODE */
2126 static keyboard_switch_t ukbdsw = {
2127 .probe = &ukbd__probe,
2131 .test_if = &ukbd_test_if,
2132 .enable = &ukbd_enable,
2133 .disable = &ukbd_disable,
2135 .check = &ukbd_check,
2136 .read_char = &ukbd_read_char,
2137 .check_char = &ukbd_check_char,
2138 .ioctl = &ukbd_ioctl,
2140 .clear_state = &ukbd_clear_state,
2141 .get_state = &ukbd_get_state,
2142 .set_state = &ukbd_set_state,
2143 .get_fkeystr = &genkbd_get_fkeystr,
2145 .diag = &genkbd_diag,
2148 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2151 ukbd_driver_load(module_t mod, int what, void *arg)
2155 kbd_add_driver(&ukbd_kbd_driver);
2158 kbd_delete_driver(&ukbd_kbd_driver);
2164 static devclass_t ukbd_devclass;
2166 static device_method_t ukbd_methods[] = {
2167 DEVMETHOD(device_probe, ukbd_probe),
2168 DEVMETHOD(device_attach, ukbd_attach),
2169 DEVMETHOD(device_detach, ukbd_detach),
2170 DEVMETHOD(device_resume, ukbd_resume),
2175 static driver_t ukbd_driver = {
2177 .methods = ukbd_methods,
2178 .size = sizeof(struct ukbd_softc),
2181 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2182 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2183 MODULE_VERSION(ukbd, 1);