xref: /freebsd/sys/dev/usb/input/ukbd.c (revision fed1ca4b719c56c930f2259d80663cd34be812bb)
1 #include <sys/cdefs.h>
2 __FBSDID("$FreeBSD$");
3 
4 
5 /*-
6  * Copyright (c) 1998 The NetBSD Foundation, Inc.
7  * All rights reserved.
8  *
9  * This code is derived from software contributed to The NetBSD Foundation
10  * by Lennart Augustsson (lennart@augustsson.net) at
11  * Carlstedt Research & Technology.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
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.
21  *
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.
33  *
34  */
35 
36 /*
37  * HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
38  */
39 
40 #include "opt_compat.h"
41 #include "opt_kbd.h"
42 #include "opt_ukbd.h"
43 
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>
51 #include <sys/bus.h>
52 #include <sys/module.h>
53 #include <sys/lock.h>
54 #include <sys/mutex.h>
55 #include <sys/condvar.h>
56 #include <sys/sysctl.h>
57 #include <sys/sx.h>
58 #include <sys/unistd.h>
59 #include <sys/callout.h>
60 #include <sys/malloc.h>
61 #include <sys/priv.h>
62 #include <sys/proc.h>
63 #include <sys/sched.h>
64 #include <sys/kdb.h>
65 
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>
70 
71 #define	USB_DEBUG_VAR ukbd_debug
72 #include <dev/usb/usb_debug.h>
73 
74 #include <dev/usb/quirk/usb_quirk.h>
75 
76 #include <sys/ioccom.h>
77 #include <sys/filio.h>
78 #include <sys/tty.h>
79 #include <sys/kbio.h>
80 
81 #include <dev/kbd/kbdreg.h>
82 
83 /* the initial key map, accent map and fkey strings */
84 #if defined(UKBD_DFLT_KEYMAP) && !defined(KLD_MODULE)
85 #define	KBD_DFLT_KEYMAP
86 #include "ukbdmap.h"
87 #endif
88 
89 /* the following file must be included after "ukbdmap.h" */
90 #include <dev/kbd/kbdtables.h>
91 
92 #ifdef USB_DEBUG
93 static int ukbd_debug = 0;
94 static int ukbd_no_leds = 0;
95 static int ukbd_pollrate = 0;
96 
97 static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB keyboard");
98 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RWTUN,
99     &ukbd_debug, 0, "Debug level");
100 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
101     &ukbd_no_leds, 0, "Disables setting of keyboard leds");
102 SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RWTUN,
103     &ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
104 #endif
105 
106 #define	UKBD_EMULATE_ATSCANCODE	       1
107 #define	UKBD_DRIVER_NAME          "ukbd"
108 #define	UKBD_NMOD                     8	/* units */
109 #define	UKBD_NKEYCODE                 6	/* units */
110 #define	UKBD_IN_BUF_SIZE  (2*(UKBD_NMOD + (2*UKBD_NKEYCODE)))	/* bytes */
111 #define	UKBD_IN_BUF_FULL  (UKBD_IN_BUF_SIZE / 2)	/* bytes */
112 #define	UKBD_NFKEY        (sizeof(fkey_tab)/sizeof(fkey_tab[0]))	/* units */
113 #define	UKBD_BUFFER_SIZE	      64	/* bytes */
114 
115 struct ukbd_data {
116 	uint16_t	modifiers;
117 #define	MOD_CONTROL_L	0x01
118 #define	MOD_CONTROL_R	0x10
119 #define	MOD_SHIFT_L	0x02
120 #define	MOD_SHIFT_R	0x20
121 #define	MOD_ALT_L	0x04
122 #define	MOD_ALT_R	0x40
123 #define	MOD_WIN_L	0x08
124 #define	MOD_WIN_R	0x80
125 /* internal */
126 #define	MOD_EJECT	0x0100
127 #define	MOD_FN		0x0200
128 	uint8_t	keycode[UKBD_NKEYCODE];
129 };
130 
131 enum {
132 	UKBD_INTR_DT,
133 	UKBD_CTRL_LED,
134 	UKBD_N_TRANSFER,
135 };
136 
137 struct ukbd_softc {
138 	keyboard_t sc_kbd;
139 	keymap_t sc_keymap;
140 	accentmap_t sc_accmap;
141 	fkeytab_t sc_fkeymap[UKBD_NFKEY];
142 	struct hid_location sc_loc_apple_eject;
143 	struct hid_location sc_loc_apple_fn;
144 	struct hid_location sc_loc_ctrl_l;
145 	struct hid_location sc_loc_ctrl_r;
146 	struct hid_location sc_loc_shift_l;
147 	struct hid_location sc_loc_shift_r;
148 	struct hid_location sc_loc_alt_l;
149 	struct hid_location sc_loc_alt_r;
150 	struct hid_location sc_loc_win_l;
151 	struct hid_location sc_loc_win_r;
152 	struct hid_location sc_loc_events;
153 	struct hid_location sc_loc_numlock;
154 	struct hid_location sc_loc_capslock;
155 	struct hid_location sc_loc_scrolllock;
156 	struct usb_callout sc_callout;
157 	struct ukbd_data sc_ndata;
158 	struct ukbd_data sc_odata;
159 
160 	struct thread *sc_poll_thread;
161 	struct usb_device *sc_udev;
162 	struct usb_interface *sc_iface;
163 	struct usb_xfer *sc_xfer[UKBD_N_TRANSFER];
164 
165 	uint32_t sc_ntime[UKBD_NKEYCODE];
166 	uint32_t sc_otime[UKBD_NKEYCODE];
167 	uint32_t sc_input[UKBD_IN_BUF_SIZE];	/* input buffer */
168 	uint32_t sc_time_ms;
169 	uint32_t sc_composed_char;	/* composed char code, if non-zero */
170 #ifdef UKBD_EMULATE_ATSCANCODE
171 	uint32_t sc_buffered_char[2];
172 #endif
173 	uint32_t sc_flags;		/* flags */
174 #define	UKBD_FLAG_COMPOSE	0x00000001
175 #define	UKBD_FLAG_POLLING	0x00000002
176 #define	UKBD_FLAG_SET_LEDS	0x00000004
177 #define	UKBD_FLAG_ATTACHED	0x00000010
178 #define	UKBD_FLAG_GONE		0x00000020
179 
180 #define	UKBD_FLAG_HID_MASK	0x003fffc0
181 #define	UKBD_FLAG_APPLE_EJECT	0x00000040
182 #define	UKBD_FLAG_APPLE_FN	0x00000080
183 #define	UKBD_FLAG_APPLE_SWAP	0x00000100
184 #define	UKBD_FLAG_TIMER_RUNNING	0x00000200
185 #define	UKBD_FLAG_CTRL_L	0x00000400
186 #define	UKBD_FLAG_CTRL_R	0x00000800
187 #define	UKBD_FLAG_SHIFT_L	0x00001000
188 #define	UKBD_FLAG_SHIFT_R	0x00002000
189 #define	UKBD_FLAG_ALT_L		0x00004000
190 #define	UKBD_FLAG_ALT_R		0x00008000
191 #define	UKBD_FLAG_WIN_L		0x00010000
192 #define	UKBD_FLAG_WIN_R		0x00020000
193 #define	UKBD_FLAG_EVENTS	0x00040000
194 #define	UKBD_FLAG_NUMLOCK	0x00080000
195 #define	UKBD_FLAG_CAPSLOCK	0x00100000
196 #define	UKBD_FLAG_SCROLLLOCK 	0x00200000
197 
198 	int	sc_mode;		/* input mode (K_XLATE,K_RAW,K_CODE) */
199 	int	sc_state;		/* shift/lock key state */
200 	int	sc_accents;		/* accent key index (> 0) */
201 	int	sc_led_size;
202 	int	sc_kbd_size;
203 
204 	uint16_t sc_inputs;
205 	uint16_t sc_inputhead;
206 	uint16_t sc_inputtail;
207 	uint16_t sc_modifiers;
208 
209 	uint8_t	sc_leds;		/* store for async led requests */
210 	uint8_t	sc_iface_index;
211 	uint8_t	sc_iface_no;
212 	uint8_t sc_id_apple_eject;
213 	uint8_t sc_id_apple_fn;
214 	uint8_t sc_id_ctrl_l;
215 	uint8_t sc_id_ctrl_r;
216 	uint8_t sc_id_shift_l;
217 	uint8_t sc_id_shift_r;
218 	uint8_t sc_id_alt_l;
219 	uint8_t sc_id_alt_r;
220 	uint8_t sc_id_win_l;
221 	uint8_t sc_id_win_r;
222 	uint8_t sc_id_event;
223 	uint8_t sc_id_numlock;
224 	uint8_t sc_id_capslock;
225 	uint8_t sc_id_scrolllock;
226 	uint8_t sc_id_events;
227 	uint8_t sc_kbd_id;
228 
229 	uint8_t sc_buffer[UKBD_BUFFER_SIZE];
230 };
231 
232 #define	KEY_ERROR	  0x01
233 
234 #define	KEY_PRESS	  0
235 #define	KEY_RELEASE	  0x400
236 #define	KEY_INDEX(c)	  ((c) & 0xFF)
237 
238 #define	SCAN_PRESS	  0
239 #define	SCAN_RELEASE	  0x80
240 #define	SCAN_PREFIX_E0	  0x100
241 #define	SCAN_PREFIX_E1	  0x200
242 #define	SCAN_PREFIX_CTL	  0x400
243 #define	SCAN_PREFIX_SHIFT 0x800
244 #define	SCAN_PREFIX	(SCAN_PREFIX_E0  | SCAN_PREFIX_E1 | \
245 			 SCAN_PREFIX_CTL | SCAN_PREFIX_SHIFT)
246 #define	SCAN_CHAR(c)	((c) & 0x7f)
247 
248 #define	UKBD_LOCK()	mtx_lock(&Giant)
249 #define	UKBD_UNLOCK()	mtx_unlock(&Giant)
250 
251 #ifdef	INVARIANTS
252 
253 /*
254  * Assert that the lock is held in all contexts
255  * where the code can be executed.
256  */
257 #define	UKBD_LOCK_ASSERT()	mtx_assert(&Giant, MA_OWNED)
258 
259 /*
260  * Assert that the lock is held in the contexts
261  * where it really has to be so.
262  */
263 #define	UKBD_CTX_LOCK_ASSERT()			 	\
264 	do {						\
265 		if (!kdb_active && panicstr == NULL)	\
266 			mtx_assert(&Giant, MA_OWNED);	\
267 	} while (0)
268 #else
269 
270 #define UKBD_LOCK_ASSERT()	(void)0
271 #define UKBD_CTX_LOCK_ASSERT()	(void)0
272 
273 #endif
274 
275 struct ukbd_mods {
276 	uint32_t mask, key;
277 };
278 
279 static const struct ukbd_mods ukbd_mods[UKBD_NMOD] = {
280 	{MOD_CONTROL_L, 0xe0},
281 	{MOD_CONTROL_R, 0xe4},
282 	{MOD_SHIFT_L, 0xe1},
283 	{MOD_SHIFT_R, 0xe5},
284 	{MOD_ALT_L, 0xe2},
285 	{MOD_ALT_R, 0xe6},
286 	{MOD_WIN_L, 0xe3},
287 	{MOD_WIN_R, 0xe7},
288 };
289 
290 #define	NN 0				/* no translation */
291 /*
292  * Translate USB keycodes to AT keyboard scancodes.
293  */
294 /*
295  * FIXME: Mac USB keyboard generates:
296  * 0x53: keypad NumLock/Clear
297  * 0x66: Power
298  * 0x67: keypad =
299  * 0x68: F13
300  * 0x69: F14
301  * 0x6a: F15
302  *
303  * USB Apple Keyboard JIS generates:
304  * 0x90: Kana
305  * 0x91: Eisu
306  */
307 static const uint8_t ukbd_trtab[256] = {
308 	0, 0, 0, 0, 30, 48, 46, 32,	/* 00 - 07 */
309 	18, 33, 34, 35, 23, 36, 37, 38,	/* 08 - 0F */
310 	50, 49, 24, 25, 16, 19, 31, 20,	/* 10 - 17 */
311 	22, 47, 17, 45, 21, 44, 2, 3,	/* 18 - 1F */
312 	4, 5, 6, 7, 8, 9, 10, 11,	/* 20 - 27 */
313 	28, 1, 14, 15, 57, 12, 13, 26,	/* 28 - 2F */
314 	27, 43, 43, 39, 40, 41, 51, 52,	/* 30 - 37 */
315 	53, 58, 59, 60, 61, 62, 63, 64,	/* 38 - 3F */
316 	65, 66, 67, 68, 87, 88, 92, 70,	/* 40 - 47 */
317 	104, 102, 94, 96, 103, 99, 101, 98,	/* 48 - 4F */
318 	97, 100, 95, 69, 91, 55, 74, 78,/* 50 - 57 */
319 	89, 79, 80, 81, 75, 76, 77, 71,	/* 58 - 5F */
320 	72, 73, 82, 83, 86, 107, 122, NN,	/* 60 - 67 */
321 	NN, NN, NN, NN, NN, NN, NN, NN,	/* 68 - 6F */
322 	NN, NN, NN, NN, 115, 108, 111, 113,	/* 70 - 77 */
323 	109, 110, 112, 118, 114, 116, 117, 119,	/* 78 - 7F */
324 	121, 120, NN, NN, NN, NN, NN, 123,	/* 80 - 87 */
325 	124, 125, 126, 127, 128, NN, NN, NN,	/* 88 - 8F */
326 	129, 130, NN, NN, NN, NN, NN, NN,	/* 90 - 97 */
327 	NN, NN, NN, NN, NN, NN, NN, NN,	/* 98 - 9F */
328 	NN, NN, NN, NN, NN, NN, NN, NN,	/* A0 - A7 */
329 	NN, NN, NN, NN, NN, NN, NN, NN,	/* A8 - AF */
330 	NN, NN, NN, NN, NN, NN, NN, NN,	/* B0 - B7 */
331 	NN, NN, NN, NN, NN, NN, NN, NN,	/* B8 - BF */
332 	NN, NN, NN, NN, NN, NN, NN, NN,	/* C0 - C7 */
333 	NN, NN, NN, NN, NN, NN, NN, NN,	/* C8 - CF */
334 	NN, NN, NN, NN, NN, NN, NN, NN,	/* D0 - D7 */
335 	NN, NN, NN, NN, NN, NN, NN, NN,	/* D8 - DF */
336 	29, 42, 56, 105, 90, 54, 93, 106,	/* E0 - E7 */
337 	NN, NN, NN, NN, NN, NN, NN, NN,	/* E8 - EF */
338 	NN, NN, NN, NN, NN, NN, NN, NN,	/* F0 - F7 */
339 	NN, NN, NN, NN, NN, NN, NN, NN,	/* F8 - FF */
340 };
341 
342 static const uint8_t ukbd_boot_desc[] = {
343 	0x05, 0x01, 0x09, 0x06, 0xa1,
344 	0x01, 0x05, 0x07, 0x19, 0xe0,
345 	0x29, 0xe7, 0x15, 0x00, 0x25,
346 	0x01, 0x75, 0x01, 0x95, 0x08,
347 	0x81, 0x02, 0x95, 0x01, 0x75,
348 	0x08, 0x81, 0x01, 0x95, 0x03,
349 	0x75, 0x01, 0x05, 0x08, 0x19,
350 	0x01, 0x29, 0x03, 0x91, 0x02,
351 	0x95, 0x05, 0x75, 0x01, 0x91,
352 	0x01, 0x95, 0x06, 0x75, 0x08,
353 	0x15, 0x00, 0x26, 0xff, 0x00,
354 	0x05, 0x07, 0x19, 0x00, 0x2a,
355 	0xff, 0x00, 0x81, 0x00, 0xc0
356 };
357 
358 /* prototypes */
359 static void	ukbd_timeout(void *);
360 static void	ukbd_set_leds(struct ukbd_softc *, uint8_t);
361 static int	ukbd_set_typematic(keyboard_t *, int);
362 #ifdef UKBD_EMULATE_ATSCANCODE
363 static int	ukbd_key2scan(struct ukbd_softc *, int, int, int);
364 #endif
365 static uint32_t	ukbd_read_char(keyboard_t *, int);
366 static void	ukbd_clear_state(keyboard_t *);
367 static int	ukbd_ioctl(keyboard_t *, u_long, caddr_t);
368 static int	ukbd_enable(keyboard_t *);
369 static int	ukbd_disable(keyboard_t *);
370 static void	ukbd_interrupt(struct ukbd_softc *);
371 static void	ukbd_event_keyinput(struct ukbd_softc *);
372 
373 static device_probe_t ukbd_probe;
374 static device_attach_t ukbd_attach;
375 static device_detach_t ukbd_detach;
376 static device_resume_t ukbd_resume;
377 
378 static uint8_t
379 ukbd_any_key_pressed(struct ukbd_softc *sc)
380 {
381 	uint8_t i;
382 	uint8_t j;
383 
384 	for (j = i = 0; i < UKBD_NKEYCODE; i++)
385 		j |= sc->sc_odata.keycode[i];
386 
387 	return (j ? 1 : 0);
388 }
389 
390 static void
391 ukbd_start_timer(struct ukbd_softc *sc)
392 {
393 	sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
394 	usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
395 }
396 
397 static void
398 ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
399 {
400 
401 	UKBD_CTX_LOCK_ASSERT();
402 
403 	DPRINTF("0x%02x (%d) %s\n", key, key,
404 	    (key & KEY_RELEASE) ? "released" : "pressed");
405 
406 	if (sc->sc_inputs < UKBD_IN_BUF_SIZE) {
407 		sc->sc_input[sc->sc_inputtail] = key;
408 		++(sc->sc_inputs);
409 		++(sc->sc_inputtail);
410 		if (sc->sc_inputtail >= UKBD_IN_BUF_SIZE) {
411 			sc->sc_inputtail = 0;
412 		}
413 	} else {
414 		DPRINTF("input buffer is full\n");
415 	}
416 }
417 
418 static void
419 ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
420 {
421 
422 	UKBD_CTX_LOCK_ASSERT();
423 	KASSERT((sc->sc_flags & UKBD_FLAG_POLLING) != 0,
424 	    ("ukbd_do_poll called when not polling\n"));
425 	DPRINTFN(2, "polling\n");
426 
427 	if (!kdb_active && !SCHEDULER_STOPPED()) {
428 		/*
429 		 * In this context the kernel is polling for input,
430 		 * but the USB subsystem works in normal interrupt-driven
431 		 * mode, so we just wait on the USB threads to do the job.
432 		 * Note that we currently hold the Giant, but it's also used
433 		 * as the transfer mtx, so we must release it while waiting.
434 		 */
435 		while (sc->sc_inputs == 0) {
436 			/*
437 			 * Give USB threads a chance to run.  Note that
438 			 * kern_yield performs DROP_GIANT + PICKUP_GIANT.
439 			 */
440 			kern_yield(PRI_UNCHANGED);
441 			if (!wait)
442 				break;
443 		}
444 		return;
445 	}
446 
447 	while (sc->sc_inputs == 0) {
448 
449 		usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
450 
451 		/* Delay-optimised support for repetition of keys */
452 		if (ukbd_any_key_pressed(sc)) {
453 			/* a key is pressed - need timekeeping */
454 			DELAY(1000);
455 
456 			/* 1 millisecond has passed */
457 			sc->sc_time_ms += 1;
458 		}
459 
460 		ukbd_interrupt(sc);
461 
462 		if (!wait)
463 			break;
464 	}
465 }
466 
467 static int32_t
468 ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
469 {
470 	int32_t c;
471 
472 	UKBD_CTX_LOCK_ASSERT();
473 	KASSERT((!kdb_active && !SCHEDULER_STOPPED())
474 	    || (sc->sc_flags & UKBD_FLAG_POLLING) != 0,
475 	    ("not polling in kdb or panic\n"));
476 
477 	if (sc->sc_inputs == 0 &&
478 	    (sc->sc_flags & UKBD_FLAG_GONE) == 0) {
479 		/* start transfer, if not already started */
480 		usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
481 	}
482 
483 	if (sc->sc_flags & UKBD_FLAG_POLLING)
484 		ukbd_do_poll(sc, wait);
485 
486 	if (sc->sc_inputs == 0) {
487 		c = -1;
488 	} else {
489 		c = sc->sc_input[sc->sc_inputhead];
490 		--(sc->sc_inputs);
491 		++(sc->sc_inputhead);
492 		if (sc->sc_inputhead >= UKBD_IN_BUF_SIZE) {
493 			sc->sc_inputhead = 0;
494 		}
495 	}
496 	return (c);
497 }
498 
499 static void
500 ukbd_interrupt(struct ukbd_softc *sc)
501 {
502 	uint32_t n_mod;
503 	uint32_t o_mod;
504 	uint32_t now = sc->sc_time_ms;
505 	uint32_t dtime;
506 	uint8_t key;
507 	uint8_t i;
508 	uint8_t j;
509 
510 	UKBD_CTX_LOCK_ASSERT();
511 
512 	if (sc->sc_ndata.keycode[0] == KEY_ERROR)
513 		return;
514 
515 	n_mod = sc->sc_ndata.modifiers;
516 	o_mod = sc->sc_odata.modifiers;
517 	if (n_mod != o_mod) {
518 		for (i = 0; i < UKBD_NMOD; i++) {
519 			if ((n_mod & ukbd_mods[i].mask) !=
520 			    (o_mod & ukbd_mods[i].mask)) {
521 				ukbd_put_key(sc, ukbd_mods[i].key |
522 				    ((n_mod & ukbd_mods[i].mask) ?
523 				    KEY_PRESS : KEY_RELEASE));
524 			}
525 		}
526 	}
527 	/* Check for released keys. */
528 	for (i = 0; i < UKBD_NKEYCODE; i++) {
529 		key = sc->sc_odata.keycode[i];
530 		if (key == 0) {
531 			continue;
532 		}
533 		for (j = 0; j < UKBD_NKEYCODE; j++) {
534 			if (sc->sc_ndata.keycode[j] == 0) {
535 				continue;
536 			}
537 			if (key == sc->sc_ndata.keycode[j]) {
538 				goto rfound;
539 			}
540 		}
541 		ukbd_put_key(sc, key | KEY_RELEASE);
542 rfound:	;
543 	}
544 
545 	/* Check for pressed keys. */
546 	for (i = 0; i < UKBD_NKEYCODE; i++) {
547 		key = sc->sc_ndata.keycode[i];
548 		if (key == 0) {
549 			continue;
550 		}
551 		sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay1;
552 		for (j = 0; j < UKBD_NKEYCODE; j++) {
553 			if (sc->sc_odata.keycode[j] == 0) {
554 				continue;
555 			}
556 			if (key == sc->sc_odata.keycode[j]) {
557 
558 				/* key is still pressed */
559 
560 				sc->sc_ntime[i] = sc->sc_otime[j];
561 				dtime = (sc->sc_otime[j] - now);
562 
563 				if (!(dtime & 0x80000000)) {
564 					/* time has not elapsed */
565 					goto pfound;
566 				}
567 				sc->sc_ntime[i] = now + sc->sc_kbd.kb_delay2;
568 				break;
569 			}
570 		}
571 		ukbd_put_key(sc, key | KEY_PRESS);
572 
573 		/*
574                  * If any other key is presently down, force its repeat to be
575                  * well in the future (100s).  This makes the last key to be
576                  * pressed do the autorepeat.
577                  */
578 		for (j = 0; j != UKBD_NKEYCODE; j++) {
579 			if (j != i)
580 				sc->sc_ntime[j] = now + (100 * 1000);
581 		}
582 pfound:	;
583 	}
584 
585 	sc->sc_odata = sc->sc_ndata;
586 
587 	memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime));
588 
589 	ukbd_event_keyinput(sc);
590 }
591 
592 static void
593 ukbd_event_keyinput(struct ukbd_softc *sc)
594 {
595 	int c;
596 
597 	UKBD_CTX_LOCK_ASSERT();
598 
599 	if ((sc->sc_flags & UKBD_FLAG_POLLING) != 0)
600 		return;
601 
602 	if (sc->sc_inputs == 0)
603 		return;
604 
605 	if (KBD_IS_ACTIVE(&sc->sc_kbd) &&
606 	    KBD_IS_BUSY(&sc->sc_kbd)) {
607 		/* let the callback function process the input */
608 		(sc->sc_kbd.kb_callback.kc_func) (&sc->sc_kbd, KBDIO_KEYINPUT,
609 		    sc->sc_kbd.kb_callback.kc_arg);
610 	} else {
611 		/* read and discard the input, no one is waiting for it */
612 		do {
613 			c = ukbd_read_char(&sc->sc_kbd, 0);
614 		} while (c != NOKEY);
615 	}
616 }
617 
618 static void
619 ukbd_timeout(void *arg)
620 {
621 	struct ukbd_softc *sc = arg;
622 
623 	UKBD_LOCK_ASSERT();
624 
625 	sc->sc_time_ms += 25;	/* milliseconds */
626 
627 	ukbd_interrupt(sc);
628 
629 	/* Make sure any leftover key events gets read out */
630 	ukbd_event_keyinput(sc);
631 
632 	if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) {
633 		ukbd_start_timer(sc);
634 	} else {
635 		sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
636 	}
637 }
638 
639 static uint8_t
640 ukbd_apple_fn(uint8_t keycode) {
641 	switch (keycode) {
642 	case 0x28: return 0x49; /* RETURN -> INSERT */
643 	case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
644 	case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
645 	case 0x4f: return 0x4d; /* RIGHT ARROW -> END */
646 	case 0x52: return 0x4b; /* UP ARROW -> PGUP */
647 	case 0x51: return 0x4e; /* DOWN ARROW -> PGDN */
648 	default: return keycode;
649 	}
650 }
651 
652 static uint8_t
653 ukbd_apple_swap(uint8_t keycode) {
654 	switch (keycode) {
655 	case 0x35: return 0x64;
656 	case 0x64: return 0x35;
657 	default: return keycode;
658 	}
659 }
660 
661 static void
662 ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
663 {
664 	struct ukbd_softc *sc = usbd_xfer_softc(xfer);
665 	struct usb_page_cache *pc;
666 	uint8_t i;
667 	uint8_t offset;
668 	uint8_t id;
669 	int len;
670 
671 	UKBD_LOCK_ASSERT();
672 
673 	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
674 	pc = usbd_xfer_get_frame(xfer, 0);
675 
676 	switch (USB_GET_STATE(xfer)) {
677 	case USB_ST_TRANSFERRED:
678 		DPRINTF("actlen=%d bytes\n", len);
679 
680 		if (len == 0) {
681 			DPRINTF("zero length data\n");
682 			goto tr_setup;
683 		}
684 
685 		if (sc->sc_kbd_id != 0) {
686 			/* check and remove HID ID byte */
687 			usbd_copy_out(pc, 0, &id, 1);
688 			offset = 1;
689 			len--;
690 			if (len == 0) {
691 				DPRINTF("zero length data\n");
692 				goto tr_setup;
693 			}
694 		} else {
695 			offset = 0;
696 			id = 0;
697 		}
698 
699 		if (len > UKBD_BUFFER_SIZE)
700 			len = UKBD_BUFFER_SIZE;
701 
702 		/* get data */
703 		usbd_copy_out(pc, offset, sc->sc_buffer, len);
704 
705 		/* clear temporary storage */
706 		memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
707 
708 		/* scan through HID data */
709 		if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
710 		    (id == sc->sc_id_apple_eject)) {
711 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
712 				sc->sc_modifiers |= MOD_EJECT;
713 			else
714 				sc->sc_modifiers &= ~MOD_EJECT;
715 		}
716 		if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
717 		    (id == sc->sc_id_apple_fn)) {
718 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
719 				sc->sc_modifiers |= MOD_FN;
720 			else
721 				sc->sc_modifiers &= ~MOD_FN;
722 		}
723 		if ((sc->sc_flags & UKBD_FLAG_CTRL_L) &&
724 		    (id == sc->sc_id_ctrl_l)) {
725 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_l))
726 			  sc->	sc_modifiers |= MOD_CONTROL_L;
727 			else
728 			  sc->	sc_modifiers &= ~MOD_CONTROL_L;
729 		}
730 		if ((sc->sc_flags & UKBD_FLAG_CTRL_R) &&
731 		    (id == sc->sc_id_ctrl_r)) {
732 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_ctrl_r))
733 				sc->sc_modifiers |= MOD_CONTROL_R;
734 			else
735 				sc->sc_modifiers &= ~MOD_CONTROL_R;
736 		}
737 		if ((sc->sc_flags & UKBD_FLAG_SHIFT_L) &&
738 		    (id == sc->sc_id_shift_l)) {
739 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_l))
740 				sc->sc_modifiers |= MOD_SHIFT_L;
741 			else
742 				sc->sc_modifiers &= ~MOD_SHIFT_L;
743 		}
744 		if ((sc->sc_flags & UKBD_FLAG_SHIFT_R) &&
745 		    (id == sc->sc_id_shift_r)) {
746 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_shift_r))
747 				sc->sc_modifiers |= MOD_SHIFT_R;
748 			else
749 				sc->sc_modifiers &= ~MOD_SHIFT_R;
750 		}
751 		if ((sc->sc_flags & UKBD_FLAG_ALT_L) &&
752 		    (id == sc->sc_id_alt_l)) {
753 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_l))
754 				sc->sc_modifiers |= MOD_ALT_L;
755 			else
756 				sc->sc_modifiers &= ~MOD_ALT_L;
757 		}
758 		if ((sc->sc_flags & UKBD_FLAG_ALT_R) &&
759 		    (id == sc->sc_id_alt_r)) {
760 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_alt_r))
761 				sc->sc_modifiers |= MOD_ALT_R;
762 			else
763 				sc->sc_modifiers &= ~MOD_ALT_R;
764 		}
765 		if ((sc->sc_flags & UKBD_FLAG_WIN_L) &&
766 		    (id == sc->sc_id_win_l)) {
767 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_l))
768 				sc->sc_modifiers |= MOD_WIN_L;
769 			else
770 				sc->sc_modifiers &= ~MOD_WIN_L;
771 		}
772 		if ((sc->sc_flags & UKBD_FLAG_WIN_R) &&
773 		    (id == sc->sc_id_win_r)) {
774 			if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_win_r))
775 				sc->sc_modifiers |= MOD_WIN_R;
776 			else
777 				sc->sc_modifiers &= ~MOD_WIN_R;
778 		}
779 
780 		sc->sc_ndata.modifiers = sc->sc_modifiers;
781 
782 		if ((sc->sc_flags & UKBD_FLAG_EVENTS) &&
783 		    (id == sc->sc_id_events)) {
784 			i = sc->sc_loc_events.count;
785 			if (i > UKBD_NKEYCODE)
786 				i = UKBD_NKEYCODE;
787 			if (i > len)
788 				i = len;
789 			while (i--) {
790 				sc->sc_ndata.keycode[i] =
791 				    hid_get_data(sc->sc_buffer + i, len - i,
792 				    &sc->sc_loc_events);
793 			}
794 		}
795 
796 #ifdef USB_DEBUG
797 		DPRINTF("modifiers = 0x%04x\n", (int)sc->sc_modifiers);
798 		for (i = 0; i < UKBD_NKEYCODE; i++) {
799 			if (sc->sc_ndata.keycode[i]) {
800 				DPRINTF("[%d] = 0x%02x\n",
801 				    (int)i, (int)sc->sc_ndata.keycode[i]);
802 			}
803 		}
804 #endif
805 		if (sc->sc_modifiers & MOD_FN) {
806 			for (i = 0; i < UKBD_NKEYCODE; i++) {
807 				sc->sc_ndata.keycode[i] =
808 				    ukbd_apple_fn(sc->sc_ndata.keycode[i]);
809 			}
810 		}
811 
812 		if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP) {
813 			for (i = 0; i < UKBD_NKEYCODE; i++) {
814 				sc->sc_ndata.keycode[i] =
815 				    ukbd_apple_swap(sc->sc_ndata.keycode[i]);
816 			}
817 		}
818 
819 		ukbd_interrupt(sc);
820 
821 		if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
822 			if (ukbd_any_key_pressed(sc)) {
823 				ukbd_start_timer(sc);
824 			}
825 		}
826 
827 	case USB_ST_SETUP:
828 tr_setup:
829 		if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
830 			usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
831 			usbd_transfer_submit(xfer);
832 		} else {
833 			DPRINTF("input queue is full!\n");
834 		}
835 		break;
836 
837 	default:			/* Error */
838 		DPRINTF("error=%s\n", usbd_errstr(error));
839 
840 		if (error != USB_ERR_CANCELLED) {
841 			/* try to clear stall first */
842 			usbd_xfer_set_stall(xfer);
843 			goto tr_setup;
844 		}
845 		break;
846 	}
847 }
848 
849 static void
850 ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
851 {
852 	struct ukbd_softc *sc = usbd_xfer_softc(xfer);
853 	struct usb_device_request req;
854 	struct usb_page_cache *pc;
855 	uint8_t id;
856 	uint8_t any;
857 	int len;
858 
859 	UKBD_LOCK_ASSERT();
860 
861 #ifdef USB_DEBUG
862 	if (ukbd_no_leds)
863 		return;
864 #endif
865 
866 	switch (USB_GET_STATE(xfer)) {
867 	case USB_ST_TRANSFERRED:
868 	case USB_ST_SETUP:
869 		if (!(sc->sc_flags & UKBD_FLAG_SET_LEDS))
870 			break;
871 		sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
872 
873 		req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
874 		req.bRequest = UR_SET_REPORT;
875 		USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
876 		req.wIndex[0] = sc->sc_iface_no;
877 		req.wIndex[1] = 0;
878 		req.wLength[1] = 0;
879 
880 		memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
881 
882 		id = 0;
883 		any = 0;
884 
885 		/* Assumption: All led bits must be in the same ID. */
886 
887 		if (sc->sc_flags & UKBD_FLAG_NUMLOCK) {
888 			if (sc->sc_leds & NLKED) {
889 				hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
890 				    &sc->sc_loc_numlock, 1);
891 			}
892 			id = sc->sc_id_numlock;
893 			any = 1;
894 		}
895 
896 		if (sc->sc_flags & UKBD_FLAG_SCROLLLOCK) {
897 			if (sc->sc_leds & SLKED) {
898 				hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
899 				    &sc->sc_loc_scrolllock, 1);
900 			}
901 			id = sc->sc_id_scrolllock;
902 			any = 1;
903 		}
904 
905 		if (sc->sc_flags & UKBD_FLAG_CAPSLOCK) {
906 			if (sc->sc_leds & CLKED) {
907 				hid_put_data_unsigned(sc->sc_buffer + 1, UKBD_BUFFER_SIZE - 1,
908 				    &sc->sc_loc_capslock, 1);
909 			}
910 			id = sc->sc_id_capslock;
911 			any = 1;
912 		}
913 
914 		/* if no leds, nothing to do */
915 		if (!any)
916 			break;
917 
918 		/* range check output report length */
919 		len = sc->sc_led_size;
920 		if (len > (UKBD_BUFFER_SIZE - 1))
921 			len = (UKBD_BUFFER_SIZE - 1);
922 
923 		/* check if we need to prefix an ID byte */
924 		sc->sc_buffer[0] = id;
925 
926 		pc = usbd_xfer_get_frame(xfer, 1);
927 		if (id != 0) {
928 			len++;
929 			usbd_copy_in(pc, 0, sc->sc_buffer, len);
930 		} else {
931 			usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
932 		}
933 		req.wLength[0] = len;
934 		usbd_xfer_set_frame_len(xfer, 1, len);
935 
936 		DPRINTF("len=%d, id=%d\n", len, id);
937 
938 		/* setup control request last */
939 		pc = usbd_xfer_get_frame(xfer, 0);
940 		usbd_copy_in(pc, 0, &req, sizeof(req));
941 		usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
942 
943 		/* start data transfer */
944 		usbd_xfer_set_frames(xfer, 2);
945 		usbd_transfer_submit(xfer);
946 		break;
947 
948 	default:			/* Error */
949 		DPRINTFN(1, "error=%s\n", usbd_errstr(error));
950 		break;
951 	}
952 }
953 
954 static const struct usb_config ukbd_config[UKBD_N_TRANSFER] = {
955 
956 	[UKBD_INTR_DT] = {
957 		.type = UE_INTERRUPT,
958 		.endpoint = UE_ADDR_ANY,
959 		.direction = UE_DIR_IN,
960 		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
961 		.bufsize = 0,	/* use wMaxPacketSize */
962 		.callback = &ukbd_intr_callback,
963 	},
964 
965 	[UKBD_CTRL_LED] = {
966 		.type = UE_CONTROL,
967 		.endpoint = 0x00,	/* Control pipe */
968 		.direction = UE_DIR_ANY,
969 		.bufsize = sizeof(struct usb_device_request) + UKBD_BUFFER_SIZE,
970 		.callback = &ukbd_set_leds_callback,
971 		.timeout = 1000,	/* 1 second */
972 	},
973 };
974 
975 /* A match on these entries will load ukbd */
976 static const STRUCT_USB_HOST_ID __used ukbd_devs[] = {
977 	{USB_IFACE_CLASS(UICLASS_HID),
978 	 USB_IFACE_SUBCLASS(UISUBCLASS_BOOT),
979 	 USB_IFACE_PROTOCOL(UIPROTO_BOOT_KEYBOARD),},
980 };
981 
982 static int
983 ukbd_probe(device_t dev)
984 {
985 	keyboard_switch_t *sw = kbd_get_switch(UKBD_DRIVER_NAME);
986 	struct usb_attach_arg *uaa = device_get_ivars(dev);
987 	void *d_ptr;
988 	int error;
989 	uint16_t d_len;
990 
991 	UKBD_LOCK_ASSERT();
992 	DPRINTFN(11, "\n");
993 
994 	if (sw == NULL) {
995 		return (ENXIO);
996 	}
997 	if (uaa->usb_mode != USB_MODE_HOST) {
998 		return (ENXIO);
999 	}
1000 
1001 	if (uaa->info.bInterfaceClass != UICLASS_HID)
1002 		return (ENXIO);
1003 
1004 	if (usb_test_quirk(uaa, UQ_KBD_IGNORE))
1005 		return (ENXIO);
1006 
1007 	if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) &&
1008 	    (uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD))
1009 		return (BUS_PROBE_DEFAULT);
1010 
1011 	error = usbd_req_get_hid_desc(uaa->device, NULL,
1012 	    &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex);
1013 
1014 	if (error)
1015 		return (ENXIO);
1016 
1017 	if (hid_is_keyboard(d_ptr, d_len)) {
1018 		if (hid_is_mouse(d_ptr, d_len)) {
1019 			/*
1020 			 * NOTE: We currently don't support USB mouse
1021 			 * and USB keyboard on the same USB endpoint.
1022 			 * Let "ums" driver win.
1023 			 */
1024 			error = ENXIO;
1025 		} else {
1026 			error = BUS_PROBE_DEFAULT;
1027 		}
1028 	} else {
1029 		error = ENXIO;
1030 	}
1031 	free(d_ptr, M_TEMP);
1032 	return (error);
1033 }
1034 
1035 static void
1036 ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
1037 {
1038 	uint32_t flags;
1039 
1040 	/* reset detected bits */
1041 	sc->sc_flags &= ~UKBD_FLAG_HID_MASK;
1042 
1043 	/* check if there is an ID byte */
1044 	sc->sc_kbd_size = hid_report_size(ptr, len,
1045 	    hid_input, &sc->sc_kbd_id);
1046 
1047 	/* investigate if this is an Apple Keyboard */
1048 	if (hid_locate(ptr, len,
1049 	    HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
1050 	    hid_input, 0, &sc->sc_loc_apple_eject, &flags,
1051 	    &sc->sc_id_apple_eject)) {
1052 		if (flags & HIO_VARIABLE)
1053 			sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
1054 			    UKBD_FLAG_APPLE_SWAP;
1055 		DPRINTFN(1, "Found Apple eject-key\n");
1056 	}
1057 	if (hid_locate(ptr, len,
1058 	    HID_USAGE2(0xFFFF, 0x0003),
1059 	    hid_input, 0, &sc->sc_loc_apple_fn, &flags,
1060 	    &sc->sc_id_apple_fn)) {
1061 		if (flags & HIO_VARIABLE)
1062 			sc->sc_flags |= UKBD_FLAG_APPLE_FN;
1063 		DPRINTFN(1, "Found Apple FN-key\n");
1064 	}
1065 	/* figure out some keys */
1066 	if (hid_locate(ptr, len,
1067 	    HID_USAGE2(HUP_KEYBOARD, 0xE0),
1068 	    hid_input, 0, &sc->sc_loc_ctrl_l, &flags,
1069 	    &sc->sc_id_ctrl_l)) {
1070 		if (flags & HIO_VARIABLE)
1071 			sc->sc_flags |= UKBD_FLAG_CTRL_L;
1072 		DPRINTFN(1, "Found left control\n");
1073 	}
1074 	if (hid_locate(ptr, len,
1075 	    HID_USAGE2(HUP_KEYBOARD, 0xE4),
1076 	    hid_input, 0, &sc->sc_loc_ctrl_r, &flags,
1077 	    &sc->sc_id_ctrl_r)) {
1078 		if (flags & HIO_VARIABLE)
1079 			sc->sc_flags |= UKBD_FLAG_CTRL_R;
1080 		DPRINTFN(1, "Found right control\n");
1081 	}
1082 	if (hid_locate(ptr, len,
1083 	    HID_USAGE2(HUP_KEYBOARD, 0xE1),
1084 	    hid_input, 0, &sc->sc_loc_shift_l, &flags,
1085 	    &sc->sc_id_shift_l)) {
1086 		if (flags & HIO_VARIABLE)
1087 			sc->sc_flags |= UKBD_FLAG_SHIFT_L;
1088 		DPRINTFN(1, "Found left shift\n");
1089 	}
1090 	if (hid_locate(ptr, len,
1091 	    HID_USAGE2(HUP_KEYBOARD, 0xE5),
1092 	    hid_input, 0, &sc->sc_loc_shift_r, &flags,
1093 	    &sc->sc_id_shift_r)) {
1094 		if (flags & HIO_VARIABLE)
1095 			sc->sc_flags |= UKBD_FLAG_SHIFT_R;
1096 		DPRINTFN(1, "Found right shift\n");
1097 	}
1098 	if (hid_locate(ptr, len,
1099 	    HID_USAGE2(HUP_KEYBOARD, 0xE2),
1100 	    hid_input, 0, &sc->sc_loc_alt_l, &flags,
1101 	    &sc->sc_id_alt_l)) {
1102 		if (flags & HIO_VARIABLE)
1103 			sc->sc_flags |= UKBD_FLAG_ALT_L;
1104 		DPRINTFN(1, "Found left alt\n");
1105 	}
1106 	if (hid_locate(ptr, len,
1107 	    HID_USAGE2(HUP_KEYBOARD, 0xE6),
1108 	    hid_input, 0, &sc->sc_loc_alt_r, &flags,
1109 	    &sc->sc_id_alt_r)) {
1110 		if (flags & HIO_VARIABLE)
1111 			sc->sc_flags |= UKBD_FLAG_ALT_R;
1112 		DPRINTFN(1, "Found right alt\n");
1113 	}
1114 	if (hid_locate(ptr, len,
1115 	    HID_USAGE2(HUP_KEYBOARD, 0xE3),
1116 	    hid_input, 0, &sc->sc_loc_win_l, &flags,
1117 	    &sc->sc_id_win_l)) {
1118 		if (flags & HIO_VARIABLE)
1119 			sc->sc_flags |= UKBD_FLAG_WIN_L;
1120 		DPRINTFN(1, "Found left GUI\n");
1121 	}
1122 	if (hid_locate(ptr, len,
1123 	    HID_USAGE2(HUP_KEYBOARD, 0xE7),
1124 	    hid_input, 0, &sc->sc_loc_win_r, &flags,
1125 	    &sc->sc_id_win_r)) {
1126 		if (flags & HIO_VARIABLE)
1127 			sc->sc_flags |= UKBD_FLAG_WIN_R;
1128 		DPRINTFN(1, "Found right GUI\n");
1129 	}
1130 	/* figure out event buffer */
1131 	if (hid_locate(ptr, len,
1132 	    HID_USAGE2(HUP_KEYBOARD, 0x00),
1133 	    hid_input, 0, &sc->sc_loc_events, &flags,
1134 	    &sc->sc_id_events)) {
1135 		if (flags & HIO_VARIABLE) {
1136 			DPRINTFN(1, "Ignoring keyboard event control\n");
1137 		} else {
1138 			sc->sc_flags |= UKBD_FLAG_EVENTS;
1139 			DPRINTFN(1, "Found keyboard event array\n");
1140 		}
1141 	}
1142 
1143 	/* figure out leds on keyboard */
1144 	sc->sc_led_size = hid_report_size(ptr, len,
1145 	    hid_output, NULL);
1146 
1147 	if (hid_locate(ptr, len,
1148 	    HID_USAGE2(HUP_LEDS, 0x01),
1149 	    hid_output, 0, &sc->sc_loc_numlock, &flags,
1150 	    &sc->sc_id_numlock)) {
1151 		if (flags & HIO_VARIABLE)
1152 			sc->sc_flags |= UKBD_FLAG_NUMLOCK;
1153 		DPRINTFN(1, "Found keyboard numlock\n");
1154 	}
1155 	if (hid_locate(ptr, len,
1156 	    HID_USAGE2(HUP_LEDS, 0x02),
1157 	    hid_output, 0, &sc->sc_loc_capslock, &flags,
1158 	    &sc->sc_id_capslock)) {
1159 		if (flags & HIO_VARIABLE)
1160 			sc->sc_flags |= UKBD_FLAG_CAPSLOCK;
1161 		DPRINTFN(1, "Found keyboard capslock\n");
1162 	}
1163 	if (hid_locate(ptr, len,
1164 	    HID_USAGE2(HUP_LEDS, 0x03),
1165 	    hid_output, 0, &sc->sc_loc_scrolllock, &flags,
1166 	    &sc->sc_id_scrolllock)) {
1167 		if (flags & HIO_VARIABLE)
1168 			sc->sc_flags |= UKBD_FLAG_SCROLLLOCK;
1169 		DPRINTFN(1, "Found keyboard scrolllock\n");
1170 	}
1171 }
1172 
1173 static int
1174 ukbd_attach(device_t dev)
1175 {
1176 	struct ukbd_softc *sc = device_get_softc(dev);
1177 	struct usb_attach_arg *uaa = device_get_ivars(dev);
1178 	int unit = device_get_unit(dev);
1179 	keyboard_t *kbd = &sc->sc_kbd;
1180 	void *hid_ptr = NULL;
1181 	usb_error_t err;
1182 	uint16_t n;
1183 	uint16_t hid_len;
1184 #ifdef USB_DEBUG
1185 	int rate;
1186 #endif
1187 	UKBD_LOCK_ASSERT();
1188 
1189 	kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
1190 
1191 	kbd->kb_data = (void *)sc;
1192 
1193 	device_set_usb_desc(dev);
1194 
1195 	sc->sc_udev = uaa->device;
1196 	sc->sc_iface = uaa->iface;
1197 	sc->sc_iface_index = uaa->info.bIfaceIndex;
1198 	sc->sc_iface_no = uaa->info.bIfaceNum;
1199 	sc->sc_mode = K_XLATE;
1200 
1201 	usb_callout_init_mtx(&sc->sc_callout, &Giant, 0);
1202 
1203 	err = usbd_transfer_setup(uaa->device,
1204 	    &uaa->info.bIfaceIndex, sc->sc_xfer, ukbd_config,
1205 	    UKBD_N_TRANSFER, sc, &Giant);
1206 
1207 	if (err) {
1208 		DPRINTF("error=%s\n", usbd_errstr(err));
1209 		goto detach;
1210 	}
1211 	/* setup default keyboard maps */
1212 
1213 	sc->sc_keymap = key_map;
1214 	sc->sc_accmap = accent_map;
1215 	for (n = 0; n < UKBD_NFKEY; n++) {
1216 		sc->sc_fkeymap[n] = fkey_tab[n];
1217 	}
1218 
1219 	kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
1220 	    sc->sc_fkeymap, UKBD_NFKEY);
1221 
1222 	KBD_FOUND_DEVICE(kbd);
1223 
1224 	ukbd_clear_state(kbd);
1225 
1226 	/*
1227 	 * FIXME: set the initial value for lock keys in "sc_state"
1228 	 * according to the BIOS data?
1229 	 */
1230 	KBD_PROBE_DONE(kbd);
1231 
1232 	/* get HID descriptor */
1233 	err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr,
1234 	    &hid_len, M_TEMP, uaa->info.bIfaceIndex);
1235 
1236 	if (err == 0) {
1237 		DPRINTF("Parsing HID descriptor of %d bytes\n",
1238 		    (int)hid_len);
1239 
1240 		ukbd_parse_hid(sc, hid_ptr, hid_len);
1241 
1242 		free(hid_ptr, M_TEMP);
1243 	}
1244 
1245 	/* check if we should use the boot protocol */
1246 	if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO) ||
1247 	    (err != 0) || (!(sc->sc_flags & UKBD_FLAG_EVENTS))) {
1248 
1249 		DPRINTF("Forcing boot protocol\n");
1250 
1251 		err = usbd_req_set_protocol(sc->sc_udev, NULL,
1252 			sc->sc_iface_index, 0);
1253 
1254 		if (err != 0) {
1255 			DPRINTF("Set protocol error=%s (ignored)\n",
1256 			    usbd_errstr(err));
1257 		}
1258 
1259 		ukbd_parse_hid(sc, ukbd_boot_desc, sizeof(ukbd_boot_desc));
1260 	}
1261 
1262 	/* ignore if SETIDLE fails, hence it is not crucial */
1263 	usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
1264 
1265 	ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
1266 
1267 	KBD_INIT_DONE(kbd);
1268 
1269 	if (kbd_register(kbd) < 0) {
1270 		goto detach;
1271 	}
1272 	KBD_CONFIG_DONE(kbd);
1273 
1274 	ukbd_enable(kbd);
1275 
1276 #ifdef KBD_INSTALL_CDEV
1277 	if (kbd_attach(kbd)) {
1278 		goto detach;
1279 	}
1280 #endif
1281 	sc->sc_flags |= UKBD_FLAG_ATTACHED;
1282 
1283 	if (bootverbose) {
1284 		genkbd_diag(kbd, bootverbose);
1285 	}
1286 
1287 #ifdef USB_DEBUG
1288 	/* check for polling rate override */
1289 	rate = ukbd_pollrate;
1290 	if (rate > 0) {
1291 		if (rate > 1000)
1292 			rate = 1;
1293 		else
1294 			rate = 1000 / rate;
1295 
1296 		/* set new polling interval in ms */
1297 		usbd_xfer_set_interval(sc->sc_xfer[UKBD_INTR_DT], rate);
1298 	}
1299 #endif
1300 	/* start the keyboard */
1301 	usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
1302 
1303 	return (0);			/* success */
1304 
1305 detach:
1306 	ukbd_detach(dev);
1307 	return (ENXIO);			/* error */
1308 }
1309 
1310 static int
1311 ukbd_detach(device_t dev)
1312 {
1313 	struct ukbd_softc *sc = device_get_softc(dev);
1314 	int error;
1315 
1316 	UKBD_LOCK_ASSERT();
1317 
1318 	DPRINTF("\n");
1319 
1320 	sc->sc_flags |= UKBD_FLAG_GONE;
1321 
1322 	usb_callout_stop(&sc->sc_callout);
1323 
1324 	/* kill any stuck keys */
1325 	if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1326 		/* stop receiving events from the USB keyboard */
1327 		usbd_transfer_stop(sc->sc_xfer[UKBD_INTR_DT]);
1328 
1329 		/* release all leftover keys, if any */
1330 		memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1331 
1332 		/* process releasing of all keys */
1333 		ukbd_interrupt(sc);
1334 	}
1335 
1336 	ukbd_disable(&sc->sc_kbd);
1337 
1338 #ifdef KBD_INSTALL_CDEV
1339 	if (sc->sc_flags & UKBD_FLAG_ATTACHED) {
1340 		error = kbd_detach(&sc->sc_kbd);
1341 		if (error) {
1342 			/* usb attach cannot return an error */
1343 			device_printf(dev, "WARNING: kbd_detach() "
1344 			    "returned non-zero! (ignored)\n");
1345 		}
1346 	}
1347 #endif
1348 	if (KBD_IS_CONFIGURED(&sc->sc_kbd)) {
1349 		error = kbd_unregister(&sc->sc_kbd);
1350 		if (error) {
1351 			/* usb attach cannot return an error */
1352 			device_printf(dev, "WARNING: kbd_unregister() "
1353 			    "returned non-zero! (ignored)\n");
1354 		}
1355 	}
1356 	sc->sc_kbd.kb_flags = 0;
1357 
1358 	usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER);
1359 
1360 	usb_callout_drain(&sc->sc_callout);
1361 
1362 	DPRINTF("%s: disconnected\n",
1363 	    device_get_nameunit(dev));
1364 
1365 	return (0);
1366 }
1367 
1368 static int
1369 ukbd_resume(device_t dev)
1370 {
1371 	struct ukbd_softc *sc = device_get_softc(dev);
1372 
1373 	UKBD_LOCK_ASSERT();
1374 
1375 	ukbd_clear_state(&sc->sc_kbd);
1376 
1377 	return (0);
1378 }
1379 
1380 /* early keyboard probe, not supported */
1381 static int
1382 ukbd_configure(int flags)
1383 {
1384 	return (0);
1385 }
1386 
1387 /* detect a keyboard, not used */
1388 static int
1389 ukbd__probe(int unit, void *arg, int flags)
1390 {
1391 	return (ENXIO);
1392 }
1393 
1394 /* reset and initialize the device, not used */
1395 static int
1396 ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
1397 {
1398 	return (ENXIO);
1399 }
1400 
1401 /* test the interface to the device, not used */
1402 static int
1403 ukbd_test_if(keyboard_t *kbd)
1404 {
1405 	return (0);
1406 }
1407 
1408 /* finish using this keyboard, not used */
1409 static int
1410 ukbd_term(keyboard_t *kbd)
1411 {
1412 	return (ENXIO);
1413 }
1414 
1415 /* keyboard interrupt routine, not used */
1416 static int
1417 ukbd_intr(keyboard_t *kbd, void *arg)
1418 {
1419 	return (0);
1420 }
1421 
1422 /* lock the access to the keyboard, not used */
1423 static int
1424 ukbd_lock(keyboard_t *kbd, int lock)
1425 {
1426 	return (1);
1427 }
1428 
1429 /*
1430  * Enable the access to the device; until this function is called,
1431  * the client cannot read from the keyboard.
1432  */
1433 static int
1434 ukbd_enable(keyboard_t *kbd)
1435 {
1436 
1437 	UKBD_LOCK();
1438 	KBD_ACTIVATE(kbd);
1439 	UKBD_UNLOCK();
1440 
1441 	return (0);
1442 }
1443 
1444 /* disallow the access to the device */
1445 static int
1446 ukbd_disable(keyboard_t *kbd)
1447 {
1448 
1449 	UKBD_LOCK();
1450 	KBD_DEACTIVATE(kbd);
1451 	UKBD_UNLOCK();
1452 
1453 	return (0);
1454 }
1455 
1456 /* check if data is waiting */
1457 /* Currently unused. */
1458 static int
1459 ukbd_check(keyboard_t *kbd)
1460 {
1461 	struct ukbd_softc *sc = kbd->kb_data;
1462 
1463 	UKBD_CTX_LOCK_ASSERT();
1464 
1465 	if (!KBD_IS_ACTIVE(kbd))
1466 		return (0);
1467 
1468 	if (sc->sc_flags & UKBD_FLAG_POLLING)
1469 		ukbd_do_poll(sc, 0);
1470 
1471 #ifdef UKBD_EMULATE_ATSCANCODE
1472 	if (sc->sc_buffered_char[0]) {
1473 		return (1);
1474 	}
1475 #endif
1476 	if (sc->sc_inputs > 0) {
1477 		return (1);
1478 	}
1479 	return (0);
1480 }
1481 
1482 /* check if char is waiting */
1483 static int
1484 ukbd_check_char_locked(keyboard_t *kbd)
1485 {
1486 	struct ukbd_softc *sc = kbd->kb_data;
1487 
1488 	UKBD_CTX_LOCK_ASSERT();
1489 
1490 	if (!KBD_IS_ACTIVE(kbd))
1491 		return (0);
1492 
1493 	if ((sc->sc_composed_char > 0) &&
1494 	    (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1495 		return (1);
1496 	}
1497 	return (ukbd_check(kbd));
1498 }
1499 
1500 static int
1501 ukbd_check_char(keyboard_t *kbd)
1502 {
1503 	int result;
1504 
1505 	UKBD_LOCK();
1506 	result = ukbd_check_char_locked(kbd);
1507 	UKBD_UNLOCK();
1508 
1509 	return (result);
1510 }
1511 
1512 /* read one byte from the keyboard if it's allowed */
1513 /* Currently unused. */
1514 static int
1515 ukbd_read(keyboard_t *kbd, int wait)
1516 {
1517 	struct ukbd_softc *sc = kbd->kb_data;
1518 	int32_t usbcode;
1519 #ifdef UKBD_EMULATE_ATSCANCODE
1520 	uint32_t keycode;
1521 	uint32_t scancode;
1522 
1523 #endif
1524 
1525 	UKBD_CTX_LOCK_ASSERT();
1526 
1527 	if (!KBD_IS_ACTIVE(kbd))
1528 		return (-1);
1529 
1530 #ifdef UKBD_EMULATE_ATSCANCODE
1531 	if (sc->sc_buffered_char[0]) {
1532 		scancode = sc->sc_buffered_char[0];
1533 		if (scancode & SCAN_PREFIX) {
1534 			sc->sc_buffered_char[0] &= ~SCAN_PREFIX;
1535 			return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1536 		}
1537 		sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1538 		sc->sc_buffered_char[1] = 0;
1539 		return (scancode);
1540 	}
1541 #endif					/* UKBD_EMULATE_ATSCANCODE */
1542 
1543 	/* XXX */
1544 	usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1545 	if (!KBD_IS_ACTIVE(kbd) || (usbcode == -1))
1546 		return (-1);
1547 
1548 	++(kbd->kb_count);
1549 
1550 #ifdef UKBD_EMULATE_ATSCANCODE
1551 	keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1552 	if (keycode == NN) {
1553 		return -1;
1554 	}
1555 	return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1556 	    (usbcode & KEY_RELEASE)));
1557 #else					/* !UKBD_EMULATE_ATSCANCODE */
1558 	return (usbcode);
1559 #endif					/* UKBD_EMULATE_ATSCANCODE */
1560 }
1561 
1562 /* read char from the keyboard */
1563 static uint32_t
1564 ukbd_read_char_locked(keyboard_t *kbd, int wait)
1565 {
1566 	struct ukbd_softc *sc = kbd->kb_data;
1567 	uint32_t action;
1568 	uint32_t keycode;
1569 	int32_t usbcode;
1570 #ifdef UKBD_EMULATE_ATSCANCODE
1571 	uint32_t scancode;
1572 #endif
1573 
1574 	UKBD_CTX_LOCK_ASSERT();
1575 
1576 	if (!KBD_IS_ACTIVE(kbd))
1577 		return (NOKEY);
1578 
1579 next_code:
1580 
1581 	/* do we have a composed char to return ? */
1582 
1583 	if ((sc->sc_composed_char > 0) &&
1584 	    (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
1585 
1586 		action = sc->sc_composed_char;
1587 		sc->sc_composed_char = 0;
1588 
1589 		if (action > 0xFF) {
1590 			goto errkey;
1591 		}
1592 		goto done;
1593 	}
1594 #ifdef UKBD_EMULATE_ATSCANCODE
1595 
1596 	/* do we have a pending raw scan code? */
1597 
1598 	if (sc->sc_mode == K_RAW) {
1599 		scancode = sc->sc_buffered_char[0];
1600 		if (scancode) {
1601 			if (scancode & SCAN_PREFIX) {
1602 				sc->sc_buffered_char[0] = (scancode & ~SCAN_PREFIX);
1603 				return ((scancode & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
1604 			}
1605 			sc->sc_buffered_char[0] = sc->sc_buffered_char[1];
1606 			sc->sc_buffered_char[1] = 0;
1607 			return (scancode);
1608 		}
1609 	}
1610 #endif					/* UKBD_EMULATE_ATSCANCODE */
1611 
1612 	/* see if there is something in the keyboard port */
1613 	/* XXX */
1614 	usbcode = ukbd_get_key(sc, (wait == FALSE) ? 0 : 1);
1615 	if (usbcode == -1) {
1616 		return (NOKEY);
1617 	}
1618 	++kbd->kb_count;
1619 
1620 #ifdef UKBD_EMULATE_ATSCANCODE
1621 	/* USB key index -> key code -> AT scan code */
1622 	keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1623 	if (keycode == NN) {
1624 		return (NOKEY);
1625 	}
1626 	/* return an AT scan code for the K_RAW mode */
1627 	if (sc->sc_mode == K_RAW) {
1628 		return (ukbd_key2scan(sc, keycode, sc->sc_ndata.modifiers,
1629 		    (usbcode & KEY_RELEASE)));
1630 	}
1631 #else					/* !UKBD_EMULATE_ATSCANCODE */
1632 
1633 	/* return the byte as is for the K_RAW mode */
1634 	if (sc->sc_mode == K_RAW) {
1635 		return (usbcode);
1636 	}
1637 	/* USB key index -> key code */
1638 	keycode = ukbd_trtab[KEY_INDEX(usbcode)];
1639 	if (keycode == NN) {
1640 		return (NOKEY);
1641 	}
1642 #endif					/* UKBD_EMULATE_ATSCANCODE */
1643 
1644 	switch (keycode) {
1645 	case 0x38:			/* left alt (compose key) */
1646 		if (usbcode & KEY_RELEASE) {
1647 			if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1648 				sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1649 
1650 				if (sc->sc_composed_char > 0xFF) {
1651 					sc->sc_composed_char = 0;
1652 				}
1653 			}
1654 		} else {
1655 			if (!(sc->sc_flags & UKBD_FLAG_COMPOSE)) {
1656 				sc->sc_flags |= UKBD_FLAG_COMPOSE;
1657 				sc->sc_composed_char = 0;
1658 			}
1659 		}
1660 		break;
1661 		/* XXX: I don't like these... */
1662 	case 0x5c:			/* print screen */
1663 		if (sc->sc_flags & ALTS) {
1664 			keycode = 0x54;	/* sysrq */
1665 		}
1666 		break;
1667 	case 0x68:			/* pause/break */
1668 		if (sc->sc_flags & CTLS) {
1669 			keycode = 0x6c;	/* break */
1670 		}
1671 		break;
1672 	}
1673 
1674 	/* return the key code in the K_CODE mode */
1675 	if (usbcode & KEY_RELEASE) {
1676 		keycode |= SCAN_RELEASE;
1677 	}
1678 	if (sc->sc_mode == K_CODE) {
1679 		return (keycode);
1680 	}
1681 	/* compose a character code */
1682 	if (sc->sc_flags & UKBD_FLAG_COMPOSE) {
1683 		switch (keycode) {
1684 			/* key pressed, process it */
1685 		case 0x47:
1686 		case 0x48:
1687 		case 0x49:		/* keypad 7,8,9 */
1688 			sc->sc_composed_char *= 10;
1689 			sc->sc_composed_char += keycode - 0x40;
1690 			goto check_composed;
1691 
1692 		case 0x4B:
1693 		case 0x4C:
1694 		case 0x4D:		/* keypad 4,5,6 */
1695 			sc->sc_composed_char *= 10;
1696 			sc->sc_composed_char += keycode - 0x47;
1697 			goto check_composed;
1698 
1699 		case 0x4F:
1700 		case 0x50:
1701 		case 0x51:		/* keypad 1,2,3 */
1702 			sc->sc_composed_char *= 10;
1703 			sc->sc_composed_char += keycode - 0x4E;
1704 			goto check_composed;
1705 
1706 		case 0x52:		/* keypad 0 */
1707 			sc->sc_composed_char *= 10;
1708 			goto check_composed;
1709 
1710 			/* key released, no interest here */
1711 		case SCAN_RELEASE | 0x47:
1712 		case SCAN_RELEASE | 0x48:
1713 		case SCAN_RELEASE | 0x49:	/* keypad 7,8,9 */
1714 		case SCAN_RELEASE | 0x4B:
1715 		case SCAN_RELEASE | 0x4C:
1716 		case SCAN_RELEASE | 0x4D:	/* keypad 4,5,6 */
1717 		case SCAN_RELEASE | 0x4F:
1718 		case SCAN_RELEASE | 0x50:
1719 		case SCAN_RELEASE | 0x51:	/* keypad 1,2,3 */
1720 		case SCAN_RELEASE | 0x52:	/* keypad 0 */
1721 			goto next_code;
1722 
1723 		case 0x38:		/* left alt key */
1724 			break;
1725 
1726 		default:
1727 			if (sc->sc_composed_char > 0) {
1728 				sc->sc_flags &= ~UKBD_FLAG_COMPOSE;
1729 				sc->sc_composed_char = 0;
1730 				goto errkey;
1731 			}
1732 			break;
1733 		}
1734 	}
1735 	/* keycode to key action */
1736 	action = genkbd_keyaction(kbd, SCAN_CHAR(keycode),
1737 	    (keycode & SCAN_RELEASE),
1738 	    &sc->sc_state, &sc->sc_accents);
1739 	if (action == NOKEY) {
1740 		goto next_code;
1741 	}
1742 done:
1743 	return (action);
1744 
1745 check_composed:
1746 	if (sc->sc_composed_char <= 0xFF) {
1747 		goto next_code;
1748 	}
1749 errkey:
1750 	return (ERRKEY);
1751 }
1752 
1753 /* Currently wait is always false. */
1754 static uint32_t
1755 ukbd_read_char(keyboard_t *kbd, int wait)
1756 {
1757 	uint32_t keycode;
1758 
1759 	UKBD_LOCK();
1760 	keycode = ukbd_read_char_locked(kbd, wait);
1761 	UKBD_UNLOCK();
1762 
1763 	return (keycode);
1764 }
1765 
1766 /* some useful control functions */
1767 static int
1768 ukbd_ioctl_locked(keyboard_t *kbd, u_long cmd, caddr_t arg)
1769 {
1770 	struct ukbd_softc *sc = kbd->kb_data;
1771 	int i;
1772 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1773     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1774 	int ival;
1775 
1776 #endif
1777 
1778 	UKBD_LOCK_ASSERT();
1779 
1780 	switch (cmd) {
1781 	case KDGKBMODE:		/* get keyboard mode */
1782 		*(int *)arg = sc->sc_mode;
1783 		break;
1784 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1785     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1786 	case _IO('K', 7):
1787 		ival = IOCPARM_IVAL(arg);
1788 		arg = (caddr_t)&ival;
1789 		/* FALLTHROUGH */
1790 #endif
1791 	case KDSKBMODE:		/* set keyboard mode */
1792 		switch (*(int *)arg) {
1793 		case K_XLATE:
1794 			if (sc->sc_mode != K_XLATE) {
1795 				/* make lock key state and LED state match */
1796 				sc->sc_state &= ~LOCK_MASK;
1797 				sc->sc_state |= KBD_LED_VAL(kbd);
1798 			}
1799 			/* FALLTHROUGH */
1800 		case K_RAW:
1801 		case K_CODE:
1802 			if (sc->sc_mode != *(int *)arg) {
1803 				if ((sc->sc_flags & UKBD_FLAG_POLLING) == 0)
1804 					ukbd_clear_state(kbd);
1805 				sc->sc_mode = *(int *)arg;
1806 			}
1807 			break;
1808 		default:
1809 			return (EINVAL);
1810 		}
1811 		break;
1812 
1813 	case KDGETLED:			/* get keyboard LED */
1814 		*(int *)arg = KBD_LED_VAL(kbd);
1815 		break;
1816 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1817     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1818 	case _IO('K', 66):
1819 		ival = IOCPARM_IVAL(arg);
1820 		arg = (caddr_t)&ival;
1821 		/* FALLTHROUGH */
1822 #endif
1823 	case KDSETLED:			/* set keyboard LED */
1824 		/* NOTE: lock key state in "sc_state" won't be changed */
1825 		if (*(int *)arg & ~LOCK_MASK)
1826 			return (EINVAL);
1827 
1828 		i = *(int *)arg;
1829 
1830 		/* replace CAPS LED with ALTGR LED for ALTGR keyboards */
1831 		if (sc->sc_mode == K_XLATE &&
1832 		    kbd->kb_keymap->n_keys > ALTGR_OFFSET) {
1833 			if (i & ALKED)
1834 				i |= CLKED;
1835 			else
1836 				i &= ~CLKED;
1837 		}
1838 		if (KBD_HAS_DEVICE(kbd))
1839 			ukbd_set_leds(sc, i);
1840 
1841 		KBD_LED_VAL(kbd) = *(int *)arg;
1842 		break;
1843 	case KDGKBSTATE:		/* get lock key state */
1844 		*(int *)arg = sc->sc_state & LOCK_MASK;
1845 		break;
1846 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1847     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1848 	case _IO('K', 20):
1849 		ival = IOCPARM_IVAL(arg);
1850 		arg = (caddr_t)&ival;
1851 		/* FALLTHROUGH */
1852 #endif
1853 	case KDSKBSTATE:		/* set lock key state */
1854 		if (*(int *)arg & ~LOCK_MASK) {
1855 			return (EINVAL);
1856 		}
1857 		sc->sc_state &= ~LOCK_MASK;
1858 		sc->sc_state |= *(int *)arg;
1859 
1860 		/* set LEDs and quit */
1861 		return (ukbd_ioctl(kbd, KDSETLED, arg));
1862 
1863 	case KDSETREPEAT:		/* set keyboard repeat rate (new
1864 					 * interface) */
1865 		if (!KBD_HAS_DEVICE(kbd)) {
1866 			return (0);
1867 		}
1868 		if (((int *)arg)[1] < 0) {
1869 			return (EINVAL);
1870 		}
1871 		if (((int *)arg)[0] < 0) {
1872 			return (EINVAL);
1873 		}
1874 		if (((int *)arg)[0] < 200)	/* fastest possible value */
1875 			kbd->kb_delay1 = 200;
1876 		else
1877 			kbd->kb_delay1 = ((int *)arg)[0];
1878 		kbd->kb_delay2 = ((int *)arg)[1];
1879 		return (0);
1880 
1881 #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \
1882     defined(COMPAT_FREEBSD4) || defined(COMPAT_43)
1883 	case _IO('K', 67):
1884 		ival = IOCPARM_IVAL(arg);
1885 		arg = (caddr_t)&ival;
1886 		/* FALLTHROUGH */
1887 #endif
1888 	case KDSETRAD:			/* set keyboard repeat rate (old
1889 					 * interface) */
1890 		return (ukbd_set_typematic(kbd, *(int *)arg));
1891 
1892 	case PIO_KEYMAP:		/* set keyboard translation table */
1893 	case OPIO_KEYMAP:		/* set keyboard translation table
1894 					 * (compat) */
1895 	case PIO_KEYMAPENT:		/* set keyboard translation table
1896 					 * entry */
1897 	case PIO_DEADKEYMAP:		/* set accent key translation table */
1898 		sc->sc_accents = 0;
1899 		/* FALLTHROUGH */
1900 	default:
1901 		return (genkbd_commonioctl(kbd, cmd, arg));
1902 	}
1903 
1904 	return (0);
1905 }
1906 
1907 static int
1908 ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
1909 {
1910 	int result;
1911 
1912 	/*
1913 	 * XXX Check if someone is calling us from a critical section:
1914 	 */
1915 	if (curthread->td_critnest != 0)
1916 		return (EDEADLK);
1917 
1918 	/*
1919 	 * XXX KDGKBSTATE, KDSKBSTATE and KDSETLED can be called from any
1920 	 * context where printf(9) can be called, which among other things
1921 	 * includes interrupt filters and threads with any kinds of locks
1922 	 * already held.  For this reason it would be dangerous to acquire
1923 	 * the Giant here unconditionally.  On the other hand we have to
1924 	 * have it to handle the ioctl.
1925 	 * So we make our best effort to auto-detect whether we can grab
1926 	 * the Giant or not.  Blame syscons(4) for this.
1927 	 */
1928 	switch (cmd) {
1929 	case KDGKBSTATE:
1930 	case KDSKBSTATE:
1931 	case KDSETLED:
1932 		if (!mtx_owned(&Giant) && !SCHEDULER_STOPPED())
1933 			return (EDEADLK);	/* best I could come up with */
1934 		/* FALLTHROUGH */
1935 	default:
1936 		UKBD_LOCK();
1937 		result = ukbd_ioctl_locked(kbd, cmd, arg);
1938 		UKBD_UNLOCK();
1939 		return (result);
1940 	}
1941 }
1942 
1943 
1944 /* clear the internal state of the keyboard */
1945 static void
1946 ukbd_clear_state(keyboard_t *kbd)
1947 {
1948 	struct ukbd_softc *sc = kbd->kb_data;
1949 
1950 	UKBD_CTX_LOCK_ASSERT();
1951 
1952 	sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
1953 	sc->sc_state &= LOCK_MASK;	/* preserve locking key state */
1954 	sc->sc_accents = 0;
1955 	sc->sc_composed_char = 0;
1956 #ifdef UKBD_EMULATE_ATSCANCODE
1957 	sc->sc_buffered_char[0] = 0;
1958 	sc->sc_buffered_char[1] = 0;
1959 #endif
1960 	memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
1961 	memset(&sc->sc_odata, 0, sizeof(sc->sc_odata));
1962 	memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime));
1963 	memset(&sc->sc_otime, 0, sizeof(sc->sc_otime));
1964 }
1965 
1966 /* save the internal state, not used */
1967 static int
1968 ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
1969 {
1970 	return (len == 0) ? 1 : -1;
1971 }
1972 
1973 /* set the internal state, not used */
1974 static int
1975 ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
1976 {
1977 	return (EINVAL);
1978 }
1979 
1980 static int
1981 ukbd_poll(keyboard_t *kbd, int on)
1982 {
1983 	struct ukbd_softc *sc = kbd->kb_data;
1984 
1985 	UKBD_LOCK();
1986 	if (on) {
1987 		sc->sc_flags |= UKBD_FLAG_POLLING;
1988 		sc->sc_poll_thread = curthread;
1989 	} else {
1990 		sc->sc_flags &= ~UKBD_FLAG_POLLING;
1991 		ukbd_start_timer(sc);	/* start timer */
1992 	}
1993 	UKBD_UNLOCK();
1994 
1995 	return (0);
1996 }
1997 
1998 /* local functions */
1999 
2000 static void
2001 ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
2002 {
2003 
2004 	UKBD_LOCK_ASSERT();
2005 	DPRINTF("leds=0x%02x\n", leds);
2006 
2007 	sc->sc_leds = leds;
2008 	sc->sc_flags |= UKBD_FLAG_SET_LEDS;
2009 
2010 	/* start transfer, if not already started */
2011 
2012 	usbd_transfer_start(sc->sc_xfer[UKBD_CTRL_LED]);
2013 }
2014 
2015 static int
2016 ukbd_set_typematic(keyboard_t *kbd, int code)
2017 {
2018 	static const int delays[] = {250, 500, 750, 1000};
2019 	static const int rates[] = {34, 38, 42, 46, 50, 55, 59, 63,
2020 		68, 76, 84, 92, 100, 110, 118, 126,
2021 		136, 152, 168, 184, 200, 220, 236, 252,
2022 	272, 304, 336, 368, 400, 440, 472, 504};
2023 
2024 	if (code & ~0x7f) {
2025 		return (EINVAL);
2026 	}
2027 	kbd->kb_delay1 = delays[(code >> 5) & 3];
2028 	kbd->kb_delay2 = rates[code & 0x1f];
2029 	return (0);
2030 }
2031 
2032 #ifdef UKBD_EMULATE_ATSCANCODE
2033 static int
2034 ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up)
2035 {
2036 	static const int scan[] = {
2037 		/* 89 */
2038 		0x11c,	/* Enter */
2039 		/* 90-99 */
2040 		0x11d,	/* Ctrl-R */
2041 		0x135,	/* Divide */
2042 		0x137 | SCAN_PREFIX_SHIFT,	/* PrintScreen */
2043 		0x138,	/* Alt-R */
2044 		0x147,	/* Home */
2045 		0x148,	/* Up */
2046 		0x149,	/* PageUp */
2047 		0x14b,	/* Left */
2048 		0x14d,	/* Right */
2049 		0x14f,	/* End */
2050 		/* 100-109 */
2051 		0x150,	/* Down */
2052 		0x151,	/* PageDown */
2053 		0x152,	/* Insert */
2054 		0x153,	/* Delete */
2055 		0x146,	/* XXX Pause/Break */
2056 		0x15b,	/* Win_L(Super_L) */
2057 		0x15c,	/* Win_R(Super_R) */
2058 		0x15d,	/* Application(Menu) */
2059 
2060 		/* SUN TYPE 6 USB KEYBOARD */
2061 		0x168,	/* Sun Type 6 Help */
2062 		0x15e,	/* Sun Type 6 Stop */
2063 		/* 110 - 119 */
2064 		0x15f,	/* Sun Type 6 Again */
2065 		0x160,	/* Sun Type 6 Props */
2066 		0x161,	/* Sun Type 6 Undo */
2067 		0x162,	/* Sun Type 6 Front */
2068 		0x163,	/* Sun Type 6 Copy */
2069 		0x164,	/* Sun Type 6 Open */
2070 		0x165,	/* Sun Type 6 Paste */
2071 		0x166,	/* Sun Type 6 Find */
2072 		0x167,	/* Sun Type 6 Cut */
2073 		0x125,	/* Sun Type 6 Mute */
2074 		/* 120 - 130 */
2075 		0x11f,	/* Sun Type 6 VolumeDown */
2076 		0x11e,	/* Sun Type 6 VolumeUp */
2077 		0x120,	/* Sun Type 6 PowerDown */
2078 
2079 		/* Japanese 106/109 keyboard */
2080 		0x73,	/* Keyboard Intl' 1 (backslash / underscore) */
2081 		0x70,	/* Keyboard Intl' 2 (Katakana / Hiragana) */
2082 		0x7d,	/* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */
2083 		0x79,	/* Keyboard Intl' 4 (Henkan) */
2084 		0x7b,	/* Keyboard Intl' 5 (Muhenkan) */
2085 		0x5c,	/* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */
2086 		0x71,   /* Apple Keyboard JIS (Kana) */
2087 		0x72,   /* Apple Keyboard JIS (Eisu) */
2088 	};
2089 
2090 	if ((code >= 89) && (code < (int)(89 + nitems(scan)))) {
2091 		code = scan[code - 89];
2092 	}
2093 	/* Pause/Break */
2094 	if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) {
2095 		code = (0x45 | SCAN_PREFIX_E1 | SCAN_PREFIX_CTL);
2096 	}
2097 	if (shift & (MOD_SHIFT_L | MOD_SHIFT_R)) {
2098 		code &= ~SCAN_PREFIX_SHIFT;
2099 	}
2100 	code |= (up ? SCAN_RELEASE : SCAN_PRESS);
2101 
2102 	if (code & SCAN_PREFIX) {
2103 		if (code & SCAN_PREFIX_CTL) {
2104 			/* Ctrl */
2105 			sc->sc_buffered_char[0] = (0x1d | (code & SCAN_RELEASE));
2106 			sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX);
2107 		} else if (code & SCAN_PREFIX_SHIFT) {
2108 			/* Shift */
2109 			sc->sc_buffered_char[0] = (0x2a | (code & SCAN_RELEASE));
2110 			sc->sc_buffered_char[1] = (code & ~SCAN_PREFIX_SHIFT);
2111 		} else {
2112 			sc->sc_buffered_char[0] = (code & ~SCAN_PREFIX);
2113 			sc->sc_buffered_char[1] = 0;
2114 		}
2115 		return ((code & SCAN_PREFIX_E0) ? 0xe0 : 0xe1);
2116 	}
2117 	return (code);
2118 
2119 }
2120 
2121 #endif					/* UKBD_EMULATE_ATSCANCODE */
2122 
2123 static keyboard_switch_t ukbdsw = {
2124 	.probe = &ukbd__probe,
2125 	.init = &ukbd_init,
2126 	.term = &ukbd_term,
2127 	.intr = &ukbd_intr,
2128 	.test_if = &ukbd_test_if,
2129 	.enable = &ukbd_enable,
2130 	.disable = &ukbd_disable,
2131 	.read = &ukbd_read,
2132 	.check = &ukbd_check,
2133 	.read_char = &ukbd_read_char,
2134 	.check_char = &ukbd_check_char,
2135 	.ioctl = &ukbd_ioctl,
2136 	.lock = &ukbd_lock,
2137 	.clear_state = &ukbd_clear_state,
2138 	.get_state = &ukbd_get_state,
2139 	.set_state = &ukbd_set_state,
2140 	.get_fkeystr = &genkbd_get_fkeystr,
2141 	.poll = &ukbd_poll,
2142 	.diag = &genkbd_diag,
2143 };
2144 
2145 KEYBOARD_DRIVER(ukbd, ukbdsw, ukbd_configure);
2146 
2147 static int
2148 ukbd_driver_load(module_t mod, int what, void *arg)
2149 {
2150 	switch (what) {
2151 	case MOD_LOAD:
2152 		kbd_add_driver(&ukbd_kbd_driver);
2153 		break;
2154 	case MOD_UNLOAD:
2155 		kbd_delete_driver(&ukbd_kbd_driver);
2156 		break;
2157 	}
2158 	return (0);
2159 }
2160 
2161 static devclass_t ukbd_devclass;
2162 
2163 static device_method_t ukbd_methods[] = {
2164 	DEVMETHOD(device_probe, ukbd_probe),
2165 	DEVMETHOD(device_attach, ukbd_attach),
2166 	DEVMETHOD(device_detach, ukbd_detach),
2167 	DEVMETHOD(device_resume, ukbd_resume),
2168 
2169 	DEVMETHOD_END
2170 };
2171 
2172 static driver_t ukbd_driver = {
2173 	.name = "ukbd",
2174 	.methods = ukbd_methods,
2175 	.size = sizeof(struct ukbd_softc),
2176 };
2177 
2178 DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
2179 MODULE_DEPEND(ukbd, usb, 1, 1, 1);
2180 MODULE_VERSION(ukbd, 1);
2181 USB_PNP_HOST_INFO(ukbd_devs);
2182