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;
96 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
97 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
98 &ukbd_debug, 0, "Debug level");
99 TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug);
100 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW | CTLFLAG_TUN,
101 &ukbd_no_leds, 0, "Disables setting of keyboard leds");
102 TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds);
105 #define UKBD_EMULATE_ATSCANCODE 1
106 #define UKBD_DRIVER_NAME "ukbd"
107 #define UKBD_NMOD 8 /* units */
108 #define UKBD_NKEYCODE 6 /* units */
109 #define UKBD_IN_BUF_SIZE (2*(UKBD_NMOD + (2*UKBD_NKEYCODE))) /* bytes */
110 #define UKBD_IN_BUF_FULL (UKBD_IN_BUF_SIZE / 2) /* bytes */
111 #define UKBD_NFKEY (sizeof(fkey_tab)/sizeof(fkey_tab[0])) /* units */
112 #define UKBD_BUFFER_SIZE 64 /* bytes */
116 #define MOD_CONTROL_L 0x01
117 #define MOD_CONTROL_R 0x10
118 #define MOD_SHIFT_L 0x02
119 #define MOD_SHIFT_R 0x20
120 #define MOD_ALT_L 0x04
121 #define MOD_ALT_R 0x40
122 #define MOD_WIN_L 0x08
123 #define MOD_WIN_R 0x80
125 #define MOD_EJECT 0x0100
126 #define MOD_FN 0x0200
127 uint8_t keycode[UKBD_NKEYCODE];
139 accentmap_t sc_accmap;
140 fkeytab_t sc_fkeymap[UKBD_NFKEY];
141 struct hid_location sc_loc_apple_eject;
142 struct hid_location sc_loc_apple_fn;
143 struct hid_location sc_loc_ctrl_l;
144 struct hid_location sc_loc_ctrl_r;
145 struct hid_location sc_loc_shift_l;
146 struct hid_location sc_loc_shift_r;
147 struct hid_location sc_loc_alt_l;
148 struct hid_location sc_loc_alt_r;
149 struct hid_location sc_loc_win_l;
150 struct hid_location sc_loc_win_r;
151 struct hid_location sc_loc_events;
152 struct hid_location sc_loc_numlock;
153 struct hid_location sc_loc_capslock;
154 struct hid_location sc_loc_scrolllock;
155 struct usb_callout sc_callout;
156 struct ukbd_data sc_ndata;
157 struct ukbd_data sc_odata;
159 struct thread *sc_poll_thread;
160 struct usb_device *sc_udev;
161 struct usb_interface *sc_iface;
162 struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
164 uint32_t sc_ntime[UKBD_NKEYCODE];
165 uint32_t sc_otime[UKBD_NKEYCODE];
166 uint32_t sc_input[UKBD_IN_BUF_SIZE]; /* input buffer */
168 uint32_t sc_composed_char; /* composed char code, if non-zero */
169 #ifdef UKBD_EMULATE_ATSCANCODE
170 uint32_t sc_buffered_char[2];
172 uint32_t sc_flags; /* flags */
173 #define UKBD_FLAG_COMPOSE 0x00000001
174 #define UKBD_FLAG_POLLING 0x00000002
175 #define UKBD_FLAG_SET_LEDS 0x00000004
176 #define UKBD_FLAG_ATTACHED 0x00000010
177 #define UKBD_FLAG_GONE 0x00000020
179 #define UKBD_FLAG_HID_MASK 0x003fffc0
180 #define UKBD_FLAG_APPLE_EJECT 0x00000040
181 #define UKBD_FLAG_APPLE_FN 0x00000080
182 #define UKBD_FLAG_APPLE_SWAP 0x00000100
183 #define UKBD_FLAG_TIMER_RUNNING 0x00000200
184 #define UKBD_FLAG_CTRL_L 0x00000400
185 #define UKBD_FLAG_CTRL_R 0x00000800
186 #define UKBD_FLAG_SHIFT_L 0x00001000
187 #define UKBD_FLAG_SHIFT_R 0x00002000
188 #define UKBD_FLAG_ALT_L 0x00004000
189 #define UKBD_FLAG_ALT_R 0x00008000
190 #define UKBD_FLAG_WIN_L 0x00010000
191 #define UKBD_FLAG_WIN_R 0x00020000
192 #define UKBD_FLAG_EVENTS 0x00040000
193 #define UKBD_FLAG_NUMLOCK 0x00080000
194 #define UKBD_FLAG_CAPSLOCK 0x00100000
195 #define UKBD_FLAG_SCROLLLOCK 0x00200000
197 int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
198 int sc_state; /* shift/lock key state */
199 int sc_accents; /* accent key index (> 0) */
204 uint16_t sc_inputhead;
205 uint16_t sc_inputtail;
206 uint16_t sc_modifiers;
208 uint8_t sc_leds; /* store for async led requests */
209 uint8_t sc_iface_index;
211 uint8_t sc_id_apple_eject;
212 uint8_t sc_id_apple_fn;
213 uint8_t sc_id_ctrl_l;
214 uint8_t sc_id_ctrl_r;
215 uint8_t sc_id_shift_l;
216 uint8_t sc_id_shift_r;
222 uint8_t sc_id_numlock;
223 uint8_t sc_id_capslock;
224 uint8_t sc_id_scrolllock;
225 uint8_t sc_id_events;
228 uint8_t sc_buffer[UKBD_BUFFER_SIZE];
231 #define KEY_ERROR 0x01
234 #define KEY_RELEASE 0x400
235 #define KEY_INDEX(c) ((c) & 0xFF)
238 #define SCAN_RELEASE 0x80
239 #define SCAN_PREFIX_E0 0x100
240 #define SCAN_PREFIX_E1 0x200
241 #define SCAN_PREFIX_CTL 0x400
242 #define SCAN_PREFIX_SHIFT 0x800
243 #define SCAN_PREFIX (SCAN_PREFIX_E0 | SCAN_PREFIX_E1 | \
244 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
245 #define SCAN_CHAR(c) ((c) & 0x7f)
247 #define UKBD_LOCK() mtx_lock(&Giant)
248 #define UKBD_UNLOCK() mtx_unlock(&Giant)
253 * Assert that the lock is held in all contexts
254 * where the code can be executed.
256 #define UKBD_LOCK_ASSERT() mtx_assert(&Giant, MA_OWNED)
259 * Assert that the lock is held in the contexts
260 * where it really has to be so.
262 #define UKBD_CTX_LOCK_ASSERT() \
264 if (!kdb_active && panicstr == NULL) \
265 mtx_assert(&Giant, MA_OWNED); \
269 #define UKBD_LOCK_ASSERT() (void)0
270 #define UKBD_CTX_LOCK_ASSERT() (void)0
278 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
279 {MOD_CONTROL_L, 0xe0},
280 {MOD_CONTROL_R, 0xe4},
289 #define NN 0 /* no translation */
291 * Translate USB keycodes to AT keyboard scancodes.
294 * FIXME: Mac USB keyboard generates:
295 * 0x53: keypad NumLock/Clear
302 static const uint8_t ukbd_trtab[256] = {
303 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */
304 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */
305 50, 49, 24, 25, 16, 19, 31, 20, /* 10 - 17 */
306 22, 47, 17, 45, 21, 44, 2, 3, /* 18 - 1F */
307 4, 5, 6, 7, 8, 9, 10, 11, /* 20 - 27 */
308 28, 1, 14, 15, 57, 12, 13, 26, /* 28 - 2F */
309 27, 43, 43, 39, 40, 41, 51, 52, /* 30 - 37 */
310 53, 58, 59, 60, 61, 62, 63, 64, /* 38 - 3F */
311 65, 66, 67, 68, 87, 88, 92, 70, /* 40 - 47 */
312 104, 102, 94, 96, 103, 99, 101, 98, /* 48 - 4F */
313 97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
314 89, 79, 80, 81, 75, 76, 77, 71, /* 58 - 5F */
315 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */
316 NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */
317 NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */
318 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */
319 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */
320 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */
321 NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */
322 NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */
323 NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */
324 NN, NN, NN, NN, NN, NN, NN, NN, /* A8 - AF */
325 NN, NN, NN, NN, NN, NN, NN, NN, /* B0 - B7 */
326 NN, NN, NN, NN, NN, NN, NN, NN, /* B8 - BF */
327 NN, NN, NN, NN, NN, NN, NN, NN, /* C0 - C7 */
328 NN, NN, NN, NN, NN, NN, NN, NN, /* C8 - CF */
329 NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
330 NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
331 29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
332 NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
333 NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
334 NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
337 static const uint8_t ukbd_boot_desc[] = {
338 0x05, 0x01, 0x09, 0x06, 0xa1,
339 0x01, 0x05, 0x07, 0x19, 0xe0,
340 0x29, 0xe7, 0x15, 0x00, 0x25,
341 0x01, 0x75, 0x01, 0x95, 0x08,
342 0x81, 0x02, 0x95, 0x01, 0x75,
343 0x08, 0x81, 0x01, 0x95, 0x03,
344 0x75, 0x01, 0x05, 0x08, 0x19,
345 0x01, 0x29, 0x03, 0x91, 0x02,
346 0x95, 0x05, 0x75, 0x01, 0x91,
347 0x01, 0x95, 0x06, 0x75, 0x08,
348 0x15, 0x00, 0x26, 0xff, 0x00,
349 0x05, 0x07, 0x19, 0x00, 0x2a,
350 0xff, 0x00, 0x81, 0x00, 0xc0
354 static void ukbd_timeout(void *);
355 static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
356 static int ukbd_set_typematic(keyboard_t *, int);
357 #ifdef UKBD_EMULATE_ATSCANCODE
358 static int ukbd_key2scan(struct ukbd_softc *, int, int, int);
360 static uint32_t ukbd_read_char(keyboard_t *, int);
361 static void ukbd_clear_state(keyboard_t *);
362 static int ukbd_ioctl(keyboard_t *, u_long, caddr_t);
363 static int ukbd_enable(keyboard_t *);
364 static int ukbd_disable(keyboard_t *);
365 static void ukbd_interrupt(struct ukbd_softc *);
366 static void ukbd_event_keyinput(struct ukbd_softc *);
368 static device_probe_t ukbd_probe;
369 static device_attach_t ukbd_attach;
370 static device_detach_t ukbd_detach;
371 static device_resume_t ukbd_resume;
374 ukbd_any_key_pressed(struct ukbd_softc *sc)
379 for (j = i = 0; i < UKBD_NKEYCODE; i++)
380 j |= sc->sc_odata.keycode[i];
386 ukbd_start_timer(struct ukbd_softc *sc)
388 sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
389 usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
393 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
396 UKBD_CTX_LOCK_ASSERT();
398 DPRINTF("0x%02x (%d) %s\n", key, key,
399 (key & KEY_RELEASE) ? "released" : "pressed");
401 if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
402 sc->sc_input[sc->sc_inputtail] = key;
404 ++(sc->sc_inputtail);
405 if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
406 sc->sc_inputtail = 0;
409 DPRINTF("input buffer is full\n");
414 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
417 UKBD_CTX_LOCK_ASSERT();
418 KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
419 ("ukbd_do_poll called when not polling\n"));
420 DPRINTFN(2, "polling\n");
422 if (!kdb_active && !SCHEDULER_STOPPED()) {
424 * In this context the kernel is polling for input,
425 * but the USB subsystem works in normal interrupt-driven
426 * mode, so we just wait on the USB threads to do the job.
427 * Note that we currently hold the Giant, but it's also used
428 * as the transfer mtx, so we must release it while waiting.
430 while (sc->sc_inputs == 0) {
432 * Give USB threads a chance to run. Note that
433 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
435 kern_yield(PRI_UNCHANGED);
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();
468 KASSERT((!kdb_active && !SCHEDULER_STOPPED())
469 || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
470 ("not polling in kdb or panic\n"));
472 if (sc->sc_inputs == 0) {
473 /* start transfer, if not already started */
474 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
477 if (sc->sc_flags & UKBD_FLAG_POLLING)
478 ukbd_do_poll(sc, wait);
480 if (sc->sc_inputs == 0) {
483 c = sc->sc_input[sc->sc_inputhead];
485 ++(sc->sc_inputhead);
486 if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
487 sc->sc_inputhead = 0;
494 ukbd_interrupt(struct ukbd_softc *sc)
498 uint32_t now = sc->sc_time_ms;
504 UKBD_CTX_LOCK_ASSERT();
506 if (sc->sc_ndata.keycode[0] == KEY_ERROR)
509 n_mod = sc->sc_ndata.modifiers;
510 o_mod = sc->sc_odata.modifiers;
511 if (n_mod != o_mod) {
512 for (i = 0; i < UKBD_NMOD; i++) {
513 if ((n_mod & ukbd_mods[i].mask) !=
514 (o_mod & ukbd_mods[i].mask)) {
515 ukbd_put_key(sc, ukbd_mods[i].key |
516 ((n_mod & ukbd_mods[i].mask) ?
517 KEY_PRESS : KEY_RELEASE));
521 /* Check for released keys. */
522 for (i = 0; i < UKBD_NKEYCODE; i++) {
523 key = sc->sc_odata.keycode[i];
527 for (j = 0; j < UKBD_NKEYCODE; j++) {
528 if (sc->sc_ndata.keycode[j] == 0) {
531 if (key == sc->sc_ndata.keycode[j]) {
535 ukbd_put_key(sc, key | KEY_RELEASE);
539 /* Check for pressed keys. */
540 for (i = 0; i < UKBD_NKEYCODE; i++) {
541 key = sc->sc_ndata.keycode[i];
545 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
546 for (j = 0; j < UKBD_NKEYCODE; j++) {
547 if (sc->sc_odata.keycode[j] == 0) {
550 if (key == sc->sc_odata.keycode[j]) {
552 /* key is still pressed */
554 sc->sc_ntime[i] = sc->sc_otime[j];
555 dtime = (sc->sc_otime[j] - now);
557 if (!(dtime & 0x80000000)) {
558 /* time has not elapsed */
561 sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
565 ukbd_put_key(sc, key | KEY_PRESS);
568 * If any other key is presently down, force its repeat to be
569 * well in the future (100s). This makes the last key to be
570 * pressed do the autorepeat.
572 for (j = 0; j != UKBD_NKEYCODE; j++) {
574 sc->sc_ntime[j] = now + (100 * 1000);
579 sc->sc_odata = sc->sc_ndata;
581 memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
583 ukbd_event_keyinput(sc);
587 ukbd_event_keyinput(struct ukbd_softc *sc)
591 UKBD_CTX_LOCK_ASSERT();
593 if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
596 if (sc->sc_inputs == 0)
599 if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
600 KBD_IS_BUSY(&sc->sc_kbd)) {
601 /* let the callback function process the input */
602 (sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
603 sc->sc_kbd.kb_callback.kc_arg);
605 /* read and discard the input, no one is waiting for it */
607 c = ukbd_read_char(&sc->sc_kbd, 0);
608 } while (c != NOKEY);
613 ukbd_timeout(void *arg)
615 struct ukbd_softc *sc = arg;
619 sc->sc_time_ms += 25; /* milliseconds */
623 /* Make sure any leftover key events gets read out */
624 ukbd_event_keyinput(sc);
626 if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
627 ukbd_start_timer(sc);
629 sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
634 ukbd_apple_fn(uint8_t keycode) {
636 case 0x28: return 0x49; /* RETURN -> INSERT */
637 case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
638 case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
639 case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
640 case 0x52: return 0x4b; /* UP ARROW -> PGUP */
641 case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
642 default: return keycode;
647 ukbd_apple_swap(uint8_t keycode) {
649 case 0x35: return 0x64;
650 case 0x64: return 0x35;
651 default: return keycode;
656 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
658 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
659 struct usb_page_cache *pc;
667 usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
668 pc = usbd_xfer_get_frame(xfer, 0);
670 switch (USB_GET_STATE(xfer)) {
671 case USB_ST_TRANSFERRED:
672 DPRINTF("actlen=%d bytes\n", len);
675 DPRINTF("zero length data\n");
679 if (sc->sc_kbd_id != 0) {
680 /* check and remove HID ID byte */
681 usbd_copy_out(pc, 0, &id, 1);
685 DPRINTF("zero length data\n");
693 if (len > UKBD_BUFFER_SIZE)
694 len = UKBD_BUFFER_SIZE;
697 usbd_copy_out(pc, offset, sc->sc_buffer, len);
699 /* clear temporary storage */
700 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
702 /* scan through HID data */
703 if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
704 (id == sc->sc_id_apple_eject)) {
705 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
706 sc->sc_modifiers |= MOD_EJECT;
708 sc->sc_modifiers &= ~MOD_EJECT;
710 if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
711 (id == sc->sc_id_apple_fn)) {
712 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
713 sc->sc_modifiers |= MOD_FN;
715 sc->sc_modifiers &= ~MOD_FN;
717 if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
718 (id == sc->sc_id_ctrl_l)) {
719 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
720 sc-> sc_modifiers |= MOD_CONTROL_L;
722 sc-> sc_modifiers &= ~MOD_CONTROL_L;
724 if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
725 (id == sc->sc_id_ctrl_r)) {
726 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
727 sc->sc_modifiers |= MOD_CONTROL_R;
729 sc->sc_modifiers &= ~MOD_CONTROL_R;
731 if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
732 (id == sc->sc_id_shift_l)) {
733 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
734 sc->sc_modifiers |= MOD_SHIFT_L;
736 sc->sc_modifiers &= ~MOD_SHIFT_L;
738 if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
739 (id == sc->sc_id_shift_r)) {
740 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
741 sc->sc_modifiers |= MOD_SHIFT_R;
743 sc->sc_modifiers &= ~MOD_SHIFT_R;
745 if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
746 (id == sc->sc_id_alt_l)) {
747 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
748 sc->sc_modifiers |= MOD_ALT_L;
750 sc->sc_modifiers &= ~MOD_ALT_L;
752 if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
753 (id == sc->sc_id_alt_r)) {
754 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
755 sc->sc_modifiers |= MOD_ALT_R;
757 sc->sc_modifiers &= ~MOD_ALT_R;
759 if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
760 (id == sc->sc_id_win_l)) {
761 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
762 sc->sc_modifiers |= MOD_WIN_L;
764 sc->sc_modifiers &= ~MOD_WIN_L;
766 if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
767 (id == sc->sc_id_win_r)) {
768 if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
769 sc->sc_modifiers |= MOD_WIN_R;
771 sc->sc_modifiers &= ~MOD_WIN_R;
774 sc->sc_ndata.modifiers = sc->sc_modifiers;
776 if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
777 (id == sc->sc_id_events)) {
778 i = sc->sc_loc_events.count;
779 if (i > UKBD_NKEYCODE)
784 sc->sc_ndata.keycode[i] =
785 hid_get_data(sc->sc_buffer + i, len - i,
791 DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
792 for (i = 0; i < UKBD_NKEYCODE; i++) {
793 if (sc->sc_ndata.keycode[i]) {
794 DPRINTF("[%d] = 0x%02x\n",
795 (int)i, (int)sc->sc_ndata.keycode[i]);
799 if (sc->sc_modifiers & MOD_FN) {
800 for (i = 0; i < UKBD_NKEYCODE; i++) {
801 sc->sc_ndata.keycode[i] =
802 ukbd_apple_fn(sc->sc_ndata.keycode[i]);
806 if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
807 for (i = 0; i < UKBD_NKEYCODE; i++) {
808 sc->sc_ndata.keycode[i] =
809 ukbd_apple_swap(sc->sc_ndata.keycode[i]);
815 if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
816 if (ukbd_any_key_pressed(sc)) {
817 ukbd_start_timer(sc);
823 if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
824 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
825 usbd_transfer_submit(xfer);
827 DPRINTF("input queue is full!\n");
832 DPRINTF("error=%s\n", usbd_errstr(error));
834 if (error != USB_ERR_CANCELLED) {
835 /* try to clear stall first */
836 usbd_xfer_set_stall(xfer);
844 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
846 struct ukbd_softc *sc = usbd_xfer_softc(xfer);
847 struct usb_device_request req;
848 struct usb_page_cache *pc;
860 switch (USB_GET_STATE(xfer)) {
861 case USB_ST_TRANSFERRED:
863 if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
865 sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
867 req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
868 req.bRequest = UR_SET_REPORT;
869 USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
870 req.wIndex[0] = sc->sc_iface_no;
874 memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
879 /* Assumption: All led bits must be in the same ID. */
881 if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
882 if (sc->sc_leds & NLKED) {
883 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
884 &sc->sc_loc_numlock, 1);
886 id = sc->sc_id_numlock;
890 if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
891 if (sc->sc_leds & SLKED) {
892 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
893 &sc->sc_loc_scrolllock, 1);
895 id = sc->sc_id_scrolllock;
899 if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
900 if (sc->sc_leds & CLKED) {
901 hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
902 &sc->sc_loc_capslock, 1);
904 id = sc->sc_id_capslock;
908 /* if no leds, nothing to do */
912 /* range check output report length */
913 len = sc->sc_led_size;
914 if (len > (UKBD_BUFFER_SIZE - 1))
915 len = (UKBD_BUFFER_SIZE - 1);
917 /* check if we need to prefix an ID byte */
918 sc->sc_buffer[0] = id;
920 pc = usbd_xfer_get_frame(xfer, 1);
923 usbd_copy_in(pc, 0, sc->sc_buffer, len);
925 usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
927 req.wLength[0] = len;
928 usbd_xfer_set_frame_len(xfer, 1, len);
930 DPRINTF("len=%d, id=%d\n", len, id);
932 /* setup control request last */
933 pc = usbd_xfer_get_frame(xfer, 0);
934 usbd_copy_in(pc, 0, &req, sizeof(req));
935 usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
937 /* start data transfer */
938 usbd_xfer_set_frames(xfer, 2);
939 usbd_transfer_submit(xfer);
943 DPRINTFN(1, "error=%s\n", usbd_errstr(error));
948 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
951 .type = UE_INTERRUPT,
952 .endpoint = UE_ADDR_ANY,
953 .direction = UE_DIR_IN,
954 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
955 .bufsize = 0, /* use wMaxPacketSize */
956 .callback = &ukbd_intr_callback,
961 .endpoint = 0x00, /* Control pipe */
962 .direction = UE_DIR_ANY,
963 .bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
964 .callback = &ukbd_set_leds_callback,
965 .timeout = 1000, /* 1 second */
969 /* A match on these entries will load ukbd */
970 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
971 {USB_IFACE_CLASS(UICLASS_HID),
972 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
973 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
977 ukbd_probe(device_t dev)
979 keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
980 struct usb_attach_arg *uaa = device_get_ivars(dev);
991 if (uaa->usb_mode != USB_MODE_HOST) {
995 if (uaa->info.bInterfaceClass != UICLASS_HID)
998 if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1001 if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1002 (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1003 return (BUS_PROBE_DEFAULT);
1005 error = usbd_req_get_hid_desc(uaa->device, NULL,
1006 &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1011 if (hid_is_keyboard(d_ptr, d_len)) {
1012 if (hid_is_mouse(d_ptr, d_len)) {
1014 * NOTE: We currently don't support USB mouse
1015 * and USB keyboard on the same USB endpoint.
1016 * Let "ums" driver win.
1020 error = BUS_PROBE_DEFAULT;
1025 free(d_ptr, M_TEMP);
1030 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1034 /* reset detected bits */
1035 sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1037 /* check if there is an ID byte */
1038 sc->sc_kbd_size = hid_report_size(ptr, len,
1039 hid_input, &sc->sc_kbd_id);
1041 /* investigate if this is an Apple Keyboard */
1042 if (hid_locate(ptr, len,
1043 HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1044 hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1045 &sc->sc_id_apple_eject)) {
1046 if (flags & HIO_VARIABLE)
1047 sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1048 UKBD_FLAG_APPLE_SWAP;
1049 DPRINTFN(1, "Found Apple eject-key\n");
1051 if (hid_locate(ptr, len,
1052 HID_USAGE2(0xFFFF, 0x0003),
1053 hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1054 &sc->sc_id_apple_fn)) {
1055 if (flags & HIO_VARIABLE)
1056 sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1057 DPRINTFN(1, "Found Apple FN-key\n");
1059 /* figure out some keys */
1060 if (hid_locate(ptr, len,
1061 HID_USAGE2(HUP_KEYBOARD, 0xE0),
1062 hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1063 &sc->sc_id_ctrl_l)) {
1064 if (flags & HIO_VARIABLE)
1065 sc->sc_flags |= UKBD_FLAG_CTRL_L;
1066 DPRINTFN(1, "Found left control\n");
1068 if (hid_locate(ptr, len,
1069 HID_USAGE2(HUP_KEYBOARD, 0xE4),
1070 hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1071 &sc->sc_id_ctrl_r)) {
1072 if (flags & HIO_VARIABLE)
1073 sc->sc_flags |= UKBD_FLAG_CTRL_R;
1074 DPRINTFN(1, "Found right control\n");
1076 if (hid_locate(ptr, len,
1077 HID_USAGE2(HUP_KEYBOARD, 0xE1),
1078 hid_input, 0, &sc->sc_loc_shift_l, &flags,
1079 &sc->sc_id_shift_l)) {
1080 if (flags & HIO_VARIABLE)
1081 sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1082 DPRINTFN(1, "Found left shift\n");
1084 if (hid_locate(ptr, len,
1085 HID_USAGE2(HUP_KEYBOARD, 0xE5),
1086 hid_input, 0, &sc->sc_loc_shift_r, &flags,
1087 &sc->sc_id_shift_r)) {
1088 if (flags & HIO_VARIABLE)
1089 sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1090 DPRINTFN(1, "Found right shift\n");
1092 if (hid_locate(ptr, len,
1093 HID_USAGE2(HUP_KEYBOARD, 0xE2),
1094 hid_input, 0, &sc->sc_loc_alt_l, &flags,
1095 &sc->sc_id_alt_l)) {
1096 if (flags & HIO_VARIABLE)
1097 sc->sc_flags |= UKBD_FLAG_ALT_L;
1098 DPRINTFN(1, "Found left alt\n");
1100 if (hid_locate(ptr, len,
1101 HID_USAGE2(HUP_KEYBOARD, 0xE6),
1102 hid_input, 0, &sc->sc_loc_alt_r, &flags,
1103 &sc->sc_id_alt_r)) {
1104 if (flags & HIO_VARIABLE)
1105 sc->sc_flags |= UKBD_FLAG_ALT_R;
1106 DPRINTFN(1, "Found right alt\n");
1108 if (hid_locate(ptr, len,
1109 HID_USAGE2(HUP_KEYBOARD, 0xE3),
1110 hid_input, 0, &sc->sc_loc_win_l, &flags,
1111 &sc->sc_id_win_l)) {
1112 if (flags & HIO_VARIABLE)
1113 sc->sc_flags |= UKBD_FLAG_WIN_L;
1114 DPRINTFN(1, "Found left GUI\n");
1116 if (hid_locate(ptr, len,
1117 HID_USAGE2(HUP_KEYBOARD, 0xE7),
1118 hid_input, 0, &sc->sc_loc_win_r, &flags,
1119 &sc->sc_id_win_r)) {
1120 if (flags & HIO_VARIABLE)
1121 sc->sc_flags |= UKBD_FLAG_WIN_R;
1122 DPRINTFN(1, "Found right GUI\n");
1124 /* figure out event buffer */
1125 if (hid_locate(ptr, len,
1126 HID_USAGE2(HUP_KEYBOARD, 0x00),
1127 hid_input, 0, &sc->sc_loc_events, &flags,
1128 &sc->sc_id_events)) {
1129 sc->sc_flags |= UKBD_FLAG_EVENTS;
1130 DPRINTFN(1, "Found keyboard events\n");
1133 /* figure out leds on keyboard */
1134 sc->sc_led_size = hid_report_size(ptr, len,
1137 if (hid_locate(ptr, len,
1138 HID_USAGE2(HUP_LEDS, 0x01),
1139 hid_output, 0, &sc->sc_loc_numlock, &flags,
1140 &sc->sc_id_numlock)) {
1141 if (flags & HIO_VARIABLE)
1142 sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1143 DPRINTFN(1, "Found keyboard numlock\n");
1145 if (hid_locate(ptr, len,
1146 HID_USAGE2(HUP_LEDS, 0x02),
1147 hid_output, 0, &sc->sc_loc_capslock, &flags,
1148 &sc->sc_id_capslock)) {
1149 if (flags & HIO_VARIABLE)
1150 sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1151 DPRINTFN(1, "Found keyboard capslock\n");
1153 if (hid_locate(ptr, len,
1154 HID_USAGE2(HUP_LEDS, 0x03),
1155 hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1156 &sc->sc_id_scrolllock)) {
1157 if (flags & HIO_VARIABLE)
1158 sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1159 DPRINTFN(1, "Found keyboard scrolllock\n");
1164 ukbd_attach(device_t dev)
1166 struct ukbd_softc *sc = device_get_softc(dev);
1167 struct usb_attach_arg *uaa = device_get_ivars(dev);
1168 int32_t unit = device_get_unit(dev);
1169 keyboard_t *kbd = &sc->sc_kbd;
1170 void *hid_ptr = NULL;
1177 kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1179 kbd->kb_data = (void *)sc;
1181 device_set_usb_desc(dev);
1183 sc->sc_udev = uaa->device;
1184 sc->sc_iface = uaa->iface;
1185 sc->sc_iface_index = uaa->info.bIfaceIndex;
1186 sc->sc_iface_no = uaa->info.bIfaceNum;
1187 sc->sc_mode = K_XLATE;
1189 usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1191 err = usbd_transfer_setup(uaa->device,
1192 &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1193 UKBD_N_TRANSFER, sc, &Giant);
1196 DPRINTF("error=%s\n", usbd_errstr(err));
1199 /* setup default keyboard maps */
1201 sc->sc_keymap = key_map;
1202 sc->sc_accmap = accent_map;
1203 for (n = 0; n < UKBD_NFKEY; n++) {
1204 sc->sc_fkeymap[n] = fkey_tab[n];
1207 kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1208 sc->sc_fkeymap, UKBD_NFKEY);
1210 KBD_FOUND_DEVICE(kbd);
1212 ukbd_clear_state(kbd);
1215 * FIXME: set the initial value for lock keys in "sc_state"
1216 * according to the BIOS data?
1218 KBD_PROBE_DONE(kbd);
1220 /* get HID descriptor */
1221 err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1222 &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1225 DPRINTF("Parsing HID descriptor of %d bytes\n",
1228 ukbd_parse_hid(sc, hid_ptr, hid_len);
1230 free(hid_ptr, M_TEMP);
1233 /* check if we should use the boot protocol */
1234 if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1235 (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1237 DPRINTF("Forcing boot protocol\n");
1239 err = usbd_req_set_protocol(sc->sc_udev, NULL,
1240 sc->sc_iface_index, 0);
1243 DPRINTF("Set protocol error=%s (ignored)\n",
1247 ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1250 /* ignore if SETIDLE fails, hence it is not crucial */
1251 usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1253 ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1257 if (kbd_register(kbd) < 0) {
1260 KBD_CONFIG_DONE(kbd);
1264 #ifdef KBD_INSTALL_CDEV
1265 if (kbd_attach(kbd)) {
1269 sc->sc_flags |= UKBD_FLAG_ATTACHED;
1272 genkbd_diag(kbd, bootverbose);
1275 /* start the keyboard */
1276 usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1278 return (0); /* success */
1282 return (ENXIO); /* error */
1286 ukbd_detach(device_t dev)
1288 struct ukbd_softc *sc = device_get_softc(dev);
1295 sc->sc_flags |= UKBD_FLAG_GONE;
1297 usb_callout_stop(&sc->sc_callout);
1299 ukbd_disable(&sc->sc_kbd);
1301 #ifdef KBD_INSTALL_CDEV
1302 if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1303 error = kbd_detach(&sc->sc_kbd);
1305 /* usb attach cannot return an error */
1306 device_printf(dev, "WARNING: kbd_detach() "
1307 "returned non-zero! (ignored)\n");
1311 if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1312 error = kbd_unregister(&sc->sc_kbd);
1314 /* usb attach cannot return an error */
1315 device_printf(dev, "WARNING: kbd_unregister() "
1316 "returned non-zero! (ignored)\n");
1319 sc->sc_kbd.kb_flags = 0;
1321 usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1323 usb_callout_drain(&sc->sc_callout);
1325 DPRINTF("%s: disconnected\n",
1326 device_get_nameunit(dev));
1332 ukbd_resume(device_t dev)
1334 struct ukbd_softc *sc = device_get_softc(dev);
1338 ukbd_clear_state(&sc->sc_kbd);
1343 /* early keyboard probe, not supported */
1345 ukbd_configure(int flags)
1350 /* detect a keyboard, not used */
1352 ukbd__probe(int unit, void *arg, int flags)
1357 /* reset and initialize the device, not used */
1359 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1364 /* test the interface to the device, not used */
1366 ukbd_test_if(keyboard_t *kbd)
1371 /* finish using this keyboard, not used */
1373 ukbd_term(keyboard_t *kbd)
1378 /* keyboard interrupt routine, not used */
1380 ukbd_intr(keyboard_t *kbd, void *arg)
1385 /* lock the access to the keyboard, not used */
1387 ukbd_lock(keyboard_t *kbd, int lock)
1393 * Enable the access to the device; until this function is called,
1394 * the client cannot read from the keyboard.
1397 ukbd_enable(keyboard_t *kbd)
1407 /* disallow the access to the device */
1409 ukbd_disable(keyboard_t *kbd)
1413 KBD_DEACTIVATE(kbd);
1419 /* check if data is waiting */
1420 /* Currently unused. */
1422 ukbd_check(keyboard_t *kbd)
1424 struct ukbd_softc *sc = kbd->kb_data;
1426 UKBD_CTX_LOCK_ASSERT();
1428 if (!KBD_IS_ACTIVE(kbd))
1431 if (sc->sc_flags & UKBD_FLAG_POLLING)
1432 ukbd_do_poll(sc, 0);
1434 #ifdef UKBD_EMULATE_ATSCANCODE
1435 if (sc->sc_buffered_char[0]) {
1439 if (sc->sc_inputs > 0) {
1445 /* check if char is waiting */
1447 ukbd_check_char_locked(keyboard_t *kbd)
1449 struct ukbd_softc *sc = kbd->kb_data;
1451 UKBD_CTX_LOCK_ASSERT();
1453 if (!KBD_IS_ACTIVE(kbd))
1456 if ((sc->sc_composed_char > 0) &&
1457 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1460 return (ukbd_check(kbd));
1464 ukbd_check_char(keyboard_t *kbd)
1469 result = ukbd_check_char_locked(kbd);
1475 /* read one byte from the keyboard if it's allowed */
1476 /* Currently unused. */
1478 ukbd_read(keyboard_t *kbd, int wait)
1480 struct ukbd_softc *sc = kbd->kb_data;
1482 #ifdef UKBD_EMULATE_ATSCANCODE
1488 UKBD_CTX_LOCK_ASSERT();
1490 if (!KBD_IS_ACTIVE(kbd))
1493 #ifdef UKBD_EMULATE_ATSCANCODE
1494 if (sc->sc_buffered_char[0]) {
1495 scancode = sc->sc_buffered_char[0];
1496 if (scancode & SCAN_PREFIX) {
1497 sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1498 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1500 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1501 sc->sc_buffered_char[1] = 0;
1504 #endif /* UKBD_EMULATE_ATSCANCODE */
1507 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1508 if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1513 #ifdef UKBD_EMULATE_ATSCANCODE
1514 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1515 if (keycode == NN) {
1518 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1519 (usbcode & KEY_RELEASE)));
1520 #else /* !UKBD_EMULATE_ATSCANCODE */
1522 #endif /* UKBD_EMULATE_ATSCANCODE */
1525 /* read char from the keyboard */
1527 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1529 struct ukbd_softc *sc = kbd->kb_data;
1533 #ifdef UKBD_EMULATE_ATSCANCODE
1537 UKBD_CTX_LOCK_ASSERT();
1539 if (!KBD_IS_ACTIVE(kbd))
1544 /* do we have a composed char to return ? */
1546 if ((sc->sc_composed_char > 0) &&
1547 (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1549 action = sc->sc_composed_char;
1550 sc->sc_composed_char = 0;
1552 if (action > 0xFF) {
1557 #ifdef UKBD_EMULATE_ATSCANCODE
1559 /* do we have a pending raw scan code? */
1561 if (sc->sc_mode == K_RAW) {
1562 scancode = sc->sc_buffered_char[0];
1564 if (scancode & SCAN_PREFIX) {
1565 sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1566 return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1568 sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1569 sc->sc_buffered_char[1] = 0;
1573 #endif /* UKBD_EMULATE_ATSCANCODE */
1575 /* see if there is something in the keyboard port */
1577 usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1578 if (usbcode == -1) {
1583 #ifdef UKBD_EMULATE_ATSCANCODE
1584 /* USB key index -> key code -> AT scan code */
1585 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1586 if (keycode == NN) {
1589 /* return an AT scan code for the K_RAW mode */
1590 if (sc->sc_mode == K_RAW) {
1591 return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1592 (usbcode & KEY_RELEASE)));
1594 #else /* !UKBD_EMULATE_ATSCANCODE */
1596 /* return the byte as is for the K_RAW mode */
1597 if (sc->sc_mode == K_RAW) {
1600 /* USB key index -> key code */
1601 keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1602 if (keycode == NN) {
1605 #endif /* UKBD_EMULATE_ATSCANCODE */
1608 case 0x38: /* left alt (compose key) */
1609 if (usbcode & KEY_RELEASE) {
1610 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1611 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1613 if (sc->sc_composed_char > 0xFF) {
1614 sc->sc_composed_char = 0;
1618 if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1619 sc->sc_flags |= UKBD_FLAG_COMPOSE;
1620 sc->sc_composed_char = 0;
1624 /* XXX: I don't like these... */
1625 case 0x5c: /* print screen */
1626 if (sc->sc_flags & ALTS) {
1627 keycode = 0x54; /* sysrq */
1630 case 0x68: /* pause/break */
1631 if (sc->sc_flags & CTLS) {
1632 keycode = 0x6c; /* break */
1637 /* return the key code in the K_CODE mode */
1638 if (usbcode & KEY_RELEASE) {
1639 keycode |= SCAN_RELEASE;
1641 if (sc->sc_mode == K_CODE) {
1644 /* compose a character code */
1645 if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1647 /* key pressed, process it */
1650 case 0x49: /* keypad 7,8,9 */
1651 sc->sc_composed_char *= 10;
1652 sc->sc_composed_char += keycode - 0x40;
1653 goto check_composed;
1657 case 0x4D: /* keypad 4,5,6 */
1658 sc->sc_composed_char *= 10;
1659 sc->sc_composed_char += keycode - 0x47;
1660 goto check_composed;
1664 case 0x51: /* keypad 1,2,3 */
1665 sc->sc_composed_char *= 10;
1666 sc->sc_composed_char += keycode - 0x4E;
1667 goto check_composed;
1669 case 0x52: /* keypad 0 */
1670 sc->sc_composed_char *= 10;
1671 goto check_composed;
1673 /* key released, no interest here */
1674 case SCAN_RELEASE | 0x47:
1675 case SCAN_RELEASE | 0x48:
1676 case SCAN_RELEASE | 0x49: /* keypad 7,8,9 */
1677 case SCAN_RELEASE | 0x4B:
1678 case SCAN_RELEASE | 0x4C:
1679 case SCAN_RELEASE | 0x4D: /* keypad 4,5,6 */
1680 case SCAN_RELEASE | 0x4F:
1681 case SCAN_RELEASE | 0x50:
1682 case SCAN_RELEASE | 0x51: /* keypad 1,2,3 */
1683 case SCAN_RELEASE | 0x52: /* keypad 0 */
1686 case 0x38: /* left alt key */
1690 if (sc->sc_composed_char > 0) {
1691 sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1692 sc->sc_composed_char = 0;
1698 /* keycode to key action */
1699 action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1700 (keycode & SCAN_RELEASE),
1701 &sc->sc_state, &sc->sc_accents);
1702 if (action == NOKEY) {
1709 if (sc->sc_composed_char <= 0xFF) {
1716 /* Currently wait is always false. */
1718 ukbd_read_char(keyboard_t *kbd, int wait)
1723 keycode = ukbd_read_char_locked(kbd, wait);
1729 /* some useful control functions */
1731 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1733 struct ukbd_softc *sc = kbd->kb_data;
1735 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1736 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1744 case KDGKBMODE: /* get keyboard mode */
1745 *(int *)arg = sc->sc_mode;
1747 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1748 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1750 ival = IOCPARM_IVAL(arg);
1751 arg = (caddr_t)&ival;
1754 case KDSKBMODE: /* set keyboard mode */
1755 switch (*(int *)arg) {
1757 if (sc->sc_mode != K_XLATE) {
1758 /* make lock key state and LED state match */
1759 sc->sc_state &= ~LOCK_MASK;
1760 sc->sc_state |= KBD_LED_VAL(kbd);
1765 if (sc->sc_mode != *(int *)arg) {
1766 if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1767 ukbd_clear_state(kbd);
1768 sc->sc_mode = *(int *)arg;
1776 case KDGETLED: /* get keyboard LED */
1777 *(int *)arg = KBD_LED_VAL(kbd);
1779 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1780 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1782 ival = IOCPARM_IVAL(arg);
1783 arg = (caddr_t)&ival;
1786 case KDSETLED: /* set keyboard LED */
1787 /* NOTE: lock key state in "sc_state" won't be changed */
1788 if (*(int *)arg & ~LOCK_MASK)
1793 /* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1794 if (sc->sc_mode == K_XLATE &&
1795 kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1801 if (KBD_HAS_DEVICE(kbd))
1802 ukbd_set_leds(sc, i);
1804 KBD_LED_VAL(kbd) = *(int *)arg;
1806 case KDGKBSTATE: /* get lock key state */
1807 *(int *)arg = sc->sc_state & LOCK_MASK;
1809 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1810 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1812 ival = IOCPARM_IVAL(arg);
1813 arg = (caddr_t)&ival;
1816 case KDSKBSTATE: /* set lock key state */
1817 if (*(int *)arg & ~LOCK_MASK) {
1820 sc->sc_state &= ~LOCK_MASK;
1821 sc->sc_state |= *(int *)arg;
1823 /* set LEDs and quit */
1824 return (ukbd_ioctl(kbd, KDSETLED, arg));
1826 case KDSETREPEAT: /* set keyboard repeat rate (new
1828 if (!KBD_HAS_DEVICE(kbd)) {
1831 if (((int *)arg)[1] < 0) {
1834 if (((int *)arg)[0] < 0) {
1837 if (((int *)arg)[0] < 200) /* fastest possible value */
1838 kbd->kb_delay1 = 200;
1840 kbd->kb_delay1 = ((int *)arg)[0];
1841 kbd->kb_delay2 = ((int *)arg)[1];
1844 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1845 defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1847 ival = IOCPARM_IVAL(arg);
1848 arg = (caddr_t)&ival;
1851 case KDSETRAD: /* set keyboard repeat rate (old
1853 return (ukbd_set_typematic(kbd, *(int *)arg));
1855 case PIO_KEYMAP: /* set keyboard translation table */
1856 case OPIO_KEYMAP: /* set keyboard translation table
1858 case PIO_KEYMAPENT: /* set keyboard translation table
1860 case PIO_DEADKEYMAP: /* set accent key translation table */
1864 return (genkbd_commonioctl(kbd, cmd, arg));
1871 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1876 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1877 * context where printf(9) can be called, which among other things
1878 * includes interrupt filters and threads with any kinds of locks
1879 * already held. For this reason it would be dangerous to acquire
1880 * the Giant here unconditionally. On the other hand we have to
1881 * have it to handle the ioctl.
1882 * So we make our best effort to auto-detect whether we can grab
1883 * the Giant or not. Blame syscons(4) for this.
1889 if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1890 return (EDEADLK); /* best I could come up with */
1894 result = ukbd_ioctl_locked(kbd, cmd, arg);
1901 /* clear the internal state of the keyboard */
1903 ukbd_clear_state(keyboard_t *kbd)
1905 struct ukbd_softc *sc = kbd->kb_data;
1907 UKBD_CTX_LOCK_ASSERT();
1909 sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1910 sc->sc_state &= LOCK_MASK; /* preserve locking key state */
1912 sc->sc_composed_char = 0;
1913 #ifdef UKBD_EMULATE_ATSCANCODE
1914 sc->sc_buffered_char[0] = 0;
1915 sc->sc_buffered_char[1] = 0;
1917 memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1918 memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1919 memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1920 memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1923 /* save the internal state, not used */
1925 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1927 return (len == 0) ? 1 : -1;
1930 /* set the internal state, not used */
1932 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1938 ukbd_poll(keyboard_t *kbd, int on)
1940 struct ukbd_softc *sc = kbd->kb_data;
1944 sc->sc_flags |= UKBD_FLAG_POLLING;
1945 sc->sc_poll_thread = curthread;
1947 sc->sc_flags &= ~UKBD_FLAG_POLLING;
1948 ukbd_start_timer(sc); /* start timer */
1955 /* local functions */
1958 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
1962 DPRINTF("leds=0x%02x\n", leds);
1965 sc->sc_flags |= UKBD_FLAG_SET_LEDS;
1967 /* start transfer, if not already started */
1969 usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
1973 ukbd_set_typematic(keyboard_t *kbd, int code)
1975 static const int delays[] = {250, 500, 750, 1000};
1976 static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
1977 68, 76, 84, 92, 100, 110, 118, 126,
1978 136, 152, 168, 184, 200, 220, 236, 252,
1979 272, 304, 336, 368, 400, 440, 472, 504};
1984 kbd->kb_delay1 = delays[(code >> 5) & 3];
1985 kbd->kb_delay2 = rates[code & 0x1f];
1989 #ifdef UKBD_EMULATE_ATSCANCODE
1991 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
1993 static const int scan[] = {
1999 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */
2009 0x151, /* PageDown */
2012 0x146, /* XXX Pause/Break */
2013 0x15b, /* Win_L(Super_L) */
2014 0x15c, /* Win_R(Super_R) */
2015 0x15d, /* Application(Menu) */
2017 /* SUN TYPE 6 USB KEYBOARD */
2018 0x168, /* Sun Type 6 Help */
2019 0x15e, /* Sun Type 6 Stop */
2021 0x15f, /* Sun Type 6 Again */
2022 0x160, /* Sun Type 6 Props */
2023 0x161, /* Sun Type 6 Undo */
2024 0x162, /* Sun Type 6 Front */
2025 0x163, /* Sun Type 6 Copy */
2026 0x164, /* Sun Type 6 Open */
2027 0x165, /* Sun Type 6 Paste */
2028 0x166, /* Sun Type 6 Find */
2029 0x167, /* Sun Type 6 Cut */
2030 0x125, /* Sun Type 6 Mute */
2032 0x11f, /* Sun Type 6 VolumeDown */
2033 0x11e, /* Sun Type 6 VolumeUp */
2034 0x120, /* Sun Type 6 PowerDown */
2036 /* Japanese 106/109 keyboard */
2037 0x73, /* Keyboard Intl' 1 (backslash / underscore) */
2038 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */
2039 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2040 0x79, /* Keyboard Intl' 4 (Henkan) */
2041 0x7b, /* Keyboard Intl' 5 (Muhenkan) */
2042 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2045 if ((code >= 89) && (code < (int)(89 + (sizeof(scan) / sizeof(scan[0]))))) {
2046 code = scan[code - 89];
2049 if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2050 code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2052 if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2053 code &= ~SCAN_PREFIX_SHIFT;
2055 code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2057 if (code & SCAN_PREFIX) {
2058 if (code & SCAN_PREFIX_CTL) {
2060 sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2061 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2062 } else if (code & SCAN_PREFIX_SHIFT) {
2064 sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2065 sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2067 sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2068 sc->sc_buffered_char[1] = 0;
2070 return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2076 #endif /* UKBD_EMULATE_ATSCANCODE */
2078 static keyboard_switch_t ukbdsw = {
2079 .probe = &ukbd__probe,
2083 .test_if = &ukbd_test_if,
2084 .enable = &ukbd_enable,
2085 .disable = &ukbd_disable,
2087 .check = &ukbd_check,
2088 .read_char = &ukbd_read_char,
2089 .check_char = &ukbd_check_char,
2090 .ioctl = &ukbd_ioctl,
2092 .clear_state = &ukbd_clear_state,
2093 .get_state = &ukbd_get_state,
2094 .set_state = &ukbd_set_state,
2095 .get_fkeystr = &genkbd_get_fkeystr,
2097 .diag = &genkbd_diag,
2100 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2103 ukbd_driver_load(module_t mod, int what, void *arg)
2107 kbd_add_driver(&ukbd_kbd_driver);
2110 kbd_delete_driver(&ukbd_kbd_driver);
2116 static devclass_t ukbd_devclass;
2118 static device_method_t ukbd_methods[] = {
2119 DEVMETHOD(device_probe, ukbd_probe),
2120 DEVMETHOD(device_attach, ukbd_attach),
2121 DEVMETHOD(device_detach, ukbd_detach),
2122 DEVMETHOD(device_resume, ukbd_resume),
2126 static driver_t ukbd_driver = {
2128 .methods = ukbd_methods,
2129 .size = sizeof(struct ukbd_softc),
2132 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2133 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2134 MODULE_VERSION(ukbd, 1);