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